diff --git a/src/core/checkpoints/index.ts b/src/core/checkpoints/index.ts index bc842c9f18..6233862be1 100644 --- a/src/core/checkpoints/index.ts +++ b/src/core/checkpoints/index.ts @@ -18,7 +18,11 @@ import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../../se export async function getCheckpointService( task: Task, - { interval = 250, timeout = 15_000 }: { interval?: number; timeout?: number } = {}, + { + interval = 250, + timeout = 15_000, + isInitialCall = false, + }: { interval?: number; timeout?: number; isInitialCall?: boolean } = {}, ) { if (!task.enableCheckpoints) { return undefined @@ -67,13 +71,14 @@ export async function getCheckpointService( } if (task.checkpointServiceInitializing) { - await pWaitFor( - () => { - console.log("[Task#getCheckpointService] waiting for service to initialize") - return !!task.checkpointService && !!task?.checkpointService?.isInitialized - }, - { interval, timeout }, - ) + // If this is the initial call from initiateTaskLoop, don't apply a timeout + // to allow large repositories to complete initialization + const waitOptions = isInitialCall ? { interval } : { interval, timeout } + + await pWaitFor(() => { + console.log("[Task#getCheckpointService] waiting for service to initialize") + return !!task.checkpointService && !!task?.checkpointService?.isInitialized + }, waitOptions) if (!task?.checkpointService) { task.enableCheckpoints = false return undefined diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index c5be865731..ca8906da6c 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -1661,7 +1661,8 @@ export class Task extends EventEmitter implements TaskLike { private async initiateTaskLoop(userContent: Anthropic.Messages.ContentBlockParam[]): Promise { // Kicks off the checkpoints initialization process in the background. - getCheckpointService(this) + // Pass isInitialCall=true to avoid timeout for large repositories + getCheckpointService(this, { isInitialCall: true }) let nextUserContent = userContent let includeFileDetails = true diff --git a/src/services/checkpoints/ShadowCheckpointService.ts b/src/services/checkpoints/ShadowCheckpointService.ts index ba56b8abc6..68f43dc333 100644 --- a/src/services/checkpoints/ShadowCheckpointService.ts +++ b/src/services/checkpoints/ShadowCheckpointService.ts @@ -145,7 +145,9 @@ export abstract class ShadowCheckpointService extends EventEmitter { private async stageAll(git: SimpleGit) { try { - await git.add(".") + // Use --ignore-errors to continue even if some files can't be added (e.g., permission issues) + // This prevents the operation from failing in large repositories with problematic files + await git.add([".", "--ignore-errors"]) } catch (error) { this.log( `[${this.constructor.name}#stageAll] failed to add files to git: ${error instanceof Error ? error.message : String(error)}`,