@snappedly-tools/shipyard 0.5.0 → 0.7.0-staging.36081473933
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -117
- package/dist/MountConfig-BHnKnA4h.d.ts +145 -0
- package/dist/{chunk-WAXEMZUV.js → chunk-44I2BL6E.js} +225 -33
- package/dist/chunk-44I2BL6E.js.map +1 -0
- package/dist/{chunk-56TDSWFU.js → chunk-JI3HDDMS.js} +3 -3
- package/dist/{chunk-56TDSWFU.js.map → chunk-JI3HDDMS.js.map} +1 -1
- package/dist/{chunk-FDYOTN55.js → chunk-L6PX5QTU.js} +253 -878
- package/dist/chunk-L6PX5QTU.js.map +1 -0
- package/dist/index.d.ts +117 -97
- package/dist/index.js +349 -353
- package/dist/index.js.map +1 -1
- package/dist/main.js +285 -153
- package/dist/main.js.map +1 -1
- package/dist/sandboxes/docker.d.ts +1 -3
- package/dist/sandboxes/docker.js +2 -4
- package/dist/templates/parallel-planner/block-scope.sh +160 -0
- package/dist/templates/parallel-planner/conflict-prompt.md +22 -0
- package/dist/templates/parallel-planner/handoff.sh +175 -0
- package/dist/templates/parallel-planner/implement-prompt.md +10 -56
- package/dist/templates/parallel-planner/main.mts +493 -189
- package/dist/templates/parallel-planner/merge-prompt.md +9 -21
- package/dist/templates/parallel-planner/plan-prompt.md +5 -31
- package/dist/templates/parallel-planner/planner-branch.mts +151 -0
- package/dist/templates/parallel-planner/select-issues.mjs +788 -0
- package/dist/templates/parallel-planner/setup.sh +51 -0
- package/dist/templates/parallel-planner/spec-wave-prompt.md +16 -0
- package/dist/templates/parallel-planner/template.json +1 -1
- package/dist/templates/parallel-planner/triage-prompt.md +5 -0
- package/dist/templates/parallel-planner/verify-triage.sh +19 -0
- package/dist/templates/parallel-planner-with-review/block-scope.sh +160 -0
- package/dist/templates/parallel-planner-with-review/conflict-prompt.md +22 -0
- package/dist/templates/parallel-planner-with-review/handoff.sh +175 -0
- package/dist/templates/parallel-planner-with-review/implement-prompt.md +10 -56
- package/dist/templates/parallel-planner-with-review/main.mts +533 -207
- package/dist/templates/parallel-planner-with-review/merge-prompt.md +9 -21
- package/dist/templates/parallel-planner-with-review/plan-prompt.md +5 -31
- package/dist/templates/parallel-planner-with-review/planner-branch.mts +151 -0
- package/dist/templates/parallel-planner-with-review/review-prompt.md +11 -49
- package/dist/templates/parallel-planner-with-review/select-issues.mjs +788 -0
- package/dist/templates/parallel-planner-with-review/setup.sh +51 -0
- package/dist/templates/parallel-planner-with-review/spec-wave-prompt.md +16 -0
- package/dist/templates/parallel-planner-with-review/template.json +1 -1
- package/dist/templates/parallel-planner-with-review/triage-prompt.md +5 -0
- package/dist/templates/parallel-planner-with-review/verify-triage.sh +19 -0
- package/dist/templates/sequential-reviewer/block-scope.sh +160 -0
- package/dist/templates/sequential-reviewer/handoff.sh +175 -0
- package/dist/templates/sequential-reviewer/implement-prompt.md +12 -46
- package/dist/templates/sequential-reviewer/main.mts +248 -103
- package/dist/templates/sequential-reviewer/review-prompt.md +11 -49
- package/dist/templates/sequential-reviewer/select-issues.mjs +788 -0
- package/dist/templates/sequential-reviewer/setup.sh +51 -0
- package/dist/templates/sequential-reviewer/template.json +1 -1
- package/dist/templates/sequential-reviewer/triage-prompt.md +5 -0
- package/dist/templates/sequential-reviewer/verify-triage.sh +19 -0
- package/dist/templates/shared/block-scope.sh +160 -0
- package/dist/templates/shared/handoff.sh +175 -0
- package/dist/templates/shared/select-issues.mjs +788 -0
- package/dist/templates/shared/setup.sh +51 -0
- package/dist/templates/shared/triage-prompt.md +5 -0
- package/dist/templates/shared/verify-triage.sh +19 -0
- package/dist/templates/simple-loop/block-scope.sh +160 -0
- package/dist/templates/simple-loop/handoff.sh +175 -0
- package/dist/templates/simple-loop/main.mts +239 -45
- package/dist/templates/simple-loop/prompt.md +12 -46
- package/dist/templates/simple-loop/select-issues.mjs +788 -0
- package/dist/templates/simple-loop/setup.sh +51 -0
- package/dist/templates/simple-loop/template.json +1 -1
- package/dist/templates/simple-loop/triage-prompt.md +5 -0
- package/dist/templates/simple-loop/verify-triage.sh +19 -0
- package/package.json +1 -17
- package/dist/MountConfig-bZoCs4Dd.d.ts +0 -26
- package/dist/SandboxProvider-XJQqEdSf.d.ts +0 -261
- package/dist/chunk-ACD46ZM4.js +0 -136
- package/dist/chunk-ACD46ZM4.js.map +0 -1
- package/dist/chunk-FDYOTN55.js.map +0 -1
- package/dist/chunk-KMGNFXKN.js +0 -38
- package/dist/chunk-KMGNFXKN.js.map +0 -1
- package/dist/chunk-SOJTAJTF.js +0 -78
- package/dist/chunk-SOJTAJTF.js.map +0 -1
- package/dist/chunk-WAXEMZUV.js.map +0 -1
- package/dist/sandboxes/no-sandbox.d.ts +0 -37
- package/dist/sandboxes/no-sandbox.js +0 -4
- package/dist/sandboxes/no-sandbox.js.map +0 -1
- package/dist/sandboxes/vercel.d.ts +0 -104
- package/dist/sandboxes/vercel.js +0 -166
- package/dist/sandboxes/vercel.js.map +0 -1
- package/dist/templates/blank/main.mts +0 -13
- package/dist/templates/blank/prompt.md +0 -12
- package/dist/templates/blank/template.json +0 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Display.ts","../src/SandboxProvider.ts","../src/shutdownRegistry.ts","../src/resolveCwd.ts","../src/errors.ts","../src/runtimeNames.ts","../src/pathSecurity.ts","../src/hostGit.ts","../src/WorktreeManager.ts","../src/shellQuote.ts","../src/runnerSecurity.ts","../src/RecoveryMessage.ts","../src/syncOut.ts","../src/SandboxLifecycle.ts","../src/SandboxFactory.ts","../src/syncIn.ts","../src/startSandbox.ts"],"names":["progress","log","Effect","FileSystem","stat","Data","resolve","join","execHostGit","posix","dirname","constants","execOk","Duration","Context","Layer","rm","existsSync"],"mappings":"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","file":"chunk-L6PX5QTU.js","sourcesContent":["import { constants } from \"node:fs\";\nimport { open } from \"node:fs/promises\";\nimport * as clack from \"@clack/prompts\";\nimport { FileSystem } from \"@effect/platform\";\nimport { dirname } from \"node:path\";\nimport { Context, Effect, Layer, Ref } from \"effect\";\nimport { styleText } from \"node:util\";\n\nexport type Severity = \"info\" | \"success\" | \"warn\" | \"error\";\n\nexport interface DisplayProgressUpdate {\n readonly current: number;\n readonly total: number;\n readonly message: string;\n}\n\nexport type DisplayEntry =\n | { readonly _tag: \"intro\"; readonly title: string }\n | {\n readonly _tag: \"status\";\n readonly message: string;\n readonly severity: Severity;\n }\n | { readonly _tag: \"spinner\"; readonly message: string }\n | {\n readonly _tag: \"progress\";\n readonly title: string;\n readonly updates: ReadonlyArray<DisplayProgressUpdate>;\n }\n | {\n readonly _tag: \"summary\";\n readonly title: string;\n readonly rows: Record<string, string>;\n }\n | {\n readonly _tag: \"taskLog\";\n readonly title: string;\n readonly messages: ReadonlyArray<string>;\n }\n | { readonly _tag: \"text\"; readonly message: string }\n | { readonly _tag: \"textChunk\"; readonly message: string }\n | {\n readonly _tag: \"toolCall\";\n readonly name: string;\n readonly formattedArgs: string;\n };\n\nexport interface DisplayService {\n readonly intro: (title: string) => Effect.Effect<void>;\n\n readonly status: (message: string, severity: Severity) => Effect.Effect<void>;\n\n readonly spinner: <A, E, R>(\n message: string,\n effect: Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E, R>;\n\n readonly progress: <A, E, R>(\n title: string,\n effect: (\n report: (update: DisplayProgressUpdate) => void,\n ) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E, R>;\n\n readonly summary: (\n title: string,\n rows: Record<string, string>,\n ) => Effect.Effect<void>;\n\n readonly taskLog: <A, E, R>(\n title: string,\n effect: (message: (msg: string) => void) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<A, E, R>;\n\n readonly text: (message: string) => Effect.Effect<void>;\n\n /**\n * Writes a raw streaming chunk with no implied line break. Used for\n * token-by-token agent output, where consecutive chunks must flow together\n * as contiguous prose rather than each landing on its own line.\n */\n readonly textChunk: (chunk: string) => Effect.Effect<void>;\n\n readonly toolCall: (\n name: string,\n formattedArgs: string,\n ) => Effect.Effect<void>;\n}\n\nexport class Display extends Context.Tag(\"Display\")<\n Display,\n DisplayService\n>() {}\n\nexport const SilentDisplay = {\n layer: (ref: Ref.Ref<ReadonlyArray<DisplayEntry>>): Layer.Layer<Display> =>\n Layer.succeed(Display, {\n intro: (title) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"intro\" as const, title },\n ]),\n\n status: (message, severity) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"status\" as const, message, severity },\n ]),\n\n spinner: (message, effect) =>\n Effect.flatMap(\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"spinner\" as const, message },\n ]),\n () => effect,\n ),\n\n progress: (title, effect) =>\n Effect.gen(function* () {\n const updates: DisplayProgressUpdate[] = [];\n const result = yield* effect((update) => updates.push(update));\n yield* Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"progress\" as const, title, updates: [...updates] },\n ]);\n return result;\n }),\n\n summary: (title, rows) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"summary\" as const, title, rows },\n ]),\n\n taskLog: (title, effect) => {\n const messages: string[] = [];\n return Effect.flatMap(\n effect((msg) => messages.push(msg)),\n (result) =>\n Effect.map(\n Ref.update(ref, (entries) => [\n ...entries,\n {\n _tag: \"taskLog\" as const,\n title,\n messages: [...messages],\n },\n ]),\n () => result,\n ),\n );\n },\n\n text: (message) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"text\" as const, message },\n ]),\n\n textChunk: (chunk) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"textChunk\" as const, message: chunk },\n ]),\n\n toolCall: (name, formattedArgs) =>\n Ref.update(ref, (entries) => [\n ...entries,\n { _tag: \"toolCall\" as const, name, formattedArgs },\n ]),\n }),\n};\n\nexport const FileDisplay = {\n layer: (\n filePath: string,\n ): Layer.Layer<Display, never, FileSystem.FileSystem> =>\n Layer.scoped(\n Display,\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const logFileIsSymlink = yield* fs.readLink(filePath).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n if (logFileIsSymlink) {\n yield* Effect.die(\n new Error(\n `Refusing to write through symlinked log file: ${filePath}`,\n ),\n );\n }\n yield* fs\n .makeDirectory(dirname(filePath), { recursive: true, mode: 0o700 })\n .pipe(Effect.orDie);\n const delimiter = `\\n--- Run started: ${new Date().toISOString()} ---\\n`;\n const file = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n open(\n filePath,\n constants.O_WRONLY |\n constants.O_APPEND |\n constants.O_CREAT |\n constants.O_NOFOLLOW,\n 0o600,\n ),\n ).pipe(Effect.orDie),\n (handle) => Effect.promise(() => handle.close()).pipe(Effect.orDie),\n );\n yield* Effect.tryPromise(async () => {\n if (!(await file.stat()).isFile())\n throw new Error(\"Log must be a regular file\");\n await file.chmod(0o600);\n await file.appendFile(delimiter);\n }).pipe(Effect.orDie);\n\n // Tracks whether the last write left the cursor mid-line (a raw chunk\n // with no trailing newline). Line-oriented entries consult this so they\n // always begin on a fresh line, keeping structured output (tool calls,\n // status, context-window summaries) off the tail of streamed prose.\n let midLine = false;\n\n const appendToLog = (line: string): Effect.Effect<void> =>\n Effect.suspend(() => {\n const prefix = midLine ? \"\\n\" : \"\";\n midLine = false;\n return Effect.tryPromise(() =>\n file.appendFile(`${prefix}${line}\\n`),\n ).pipe(Effect.ignore);\n });\n\n const appendRaw = (chunk: string): Effect.Effect<void> =>\n Effect.suspend(() => {\n if (chunk.length === 0) return Effect.void;\n midLine = !chunk.endsWith(\"\\n\");\n return Effect.tryPromise(() => file.appendFile(chunk)).pipe(\n Effect.ignore,\n );\n });\n\n return {\n intro: () => Effect.void,\n\n status: (message, _severity) =>\n appendToLog(message.replace(/^\\[[^\\]]+\\] /, \"\")),\n\n spinner: (message, effect) =>\n Effect.gen(function* () {\n yield* appendToLog(`${message}...`);\n const start = Date.now();\n const result = yield* effect;\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n yield* appendToLog(`${message} done (${elapsed}s)`);\n return result;\n }),\n\n progress: (title, effect) =>\n Effect.gen(function* () {\n yield* appendToLog(`${title}...`);\n const start = Date.now();\n const updates: DisplayProgressUpdate[] = [];\n const result = yield* effect((update) => updates.push(update));\n for (const update of updates) {\n yield* appendToLog(\n ` ${update.message} (${update.current}/${update.total})`,\n );\n }\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n yield* appendToLog(`${title} done (${elapsed}s)`);\n return result;\n }),\n\n summary: (title, rows) => {\n const lines = Object.entries(rows)\n .map(([key, value]) => ` ${key}: ${value}`)\n .join(\"\\n\");\n return appendToLog(`${title}\\n${lines}`);\n },\n\n taskLog: (title, effect) =>\n Effect.gen(function* () {\n yield* appendToLog(title);\n const start = Date.now();\n const messages: string[] = [];\n const result = yield* effect((msg) => {\n messages.push(msg);\n });\n const elapsed = ((Date.now() - start) / 1000).toFixed(1);\n for (const msg of messages) {\n yield* appendToLog(` ${msg}`);\n }\n yield* appendToLog(`${title} done (${elapsed}s)`);\n return result;\n }),\n\n text: (message) => appendToLog(message),\n\n textChunk: (chunk) => appendRaw(chunk),\n\n toolCall: (name, formattedArgs) =>\n appendToLog(`${name}(${formattedArgs})`),\n };\n }),\n ),\n};\n\nconst severityToClack: Record<Severity, (message: string) => void> = {\n info: clack.log.info,\n success: clack.log.success,\n warn: clack.log.warning,\n error: clack.log.error,\n};\n\nexport const terminalStyle = {\n status: (message: string): string => styleText(\"bold\", message),\n summaryTitle: (title: string): string => styleText(\"bold\", title),\n summaryRow: (key: string, value: string): string =>\n `${styleText(\"bold\", key)}: ${styleText(\"dim\", value)}`,\n toolCall: (text: string): string => styleText(\"dim\", text),\n};\n\nexport const ClackDisplay = {\n layer: Layer.succeed(Display, {\n intro: (title) =>\n Effect.sync(() => clack.intro(styleText(\"inverse\", ` ${title} `))),\n\n status: (message, severity) =>\n Effect.sync(() =>\n severityToClack[severity](terminalStyle.status(message)),\n ),\n\n spinner: (message, effect) =>\n Effect.acquireUseRelease(\n Effect.sync(() => {\n const s = clack.spinner();\n s.start(message);\n return s;\n }),\n () => effect,\n (s, exit) =>\n Effect.sync(() => {\n if (exit._tag === \"Success\") {\n s.stop(message);\n } else {\n s.stop(`${message} (failed)`);\n }\n }),\n ),\n\n progress: (title, effect) =>\n Effect.acquireUseRelease(\n Effect.sync(() => {\n const progress = clack.progress({ max: 100 });\n let percent = 0;\n progress.start(title);\n const report = (update: DisplayProgressUpdate): void => {\n const total = Math.max(1, update.total);\n const current = Math.min(total, Math.max(0, update.current));\n const nextPercent = Math.round((current / total) * 100);\n const message = `${update.message} (${current}/${total})`;\n if (nextPercent > percent) {\n progress.advance(nextPercent - percent, message);\n } else {\n progress.message(message);\n }\n percent = nextPercent;\n };\n return { progress, report };\n }),\n ({ report }) => effect(report),\n ({ progress }, exit) =>\n Effect.sync(() => {\n if (exit._tag === \"Success\") {\n progress.stop(`${title} complete`);\n } else {\n progress.error(`${title} failed`);\n }\n }),\n ),\n\n summary: (title, rows) =>\n Effect.sync(() => {\n const lines = Object.entries(rows)\n .map(([key, value]) => terminalStyle.summaryRow(key, value))\n .join(\"\\n\");\n clack.note(lines, terminalStyle.summaryTitle(title));\n }),\n\n taskLog: (title, effect) =>\n Effect.acquireUseRelease(\n Effect.sync(() => clack.taskLog({ title })),\n (log) => effect((msg) => log.message(msg)),\n (log, exit) =>\n Effect.sync(() => {\n if (exit._tag === \"Success\") {\n log.success(title, { showLog: true });\n } else {\n log.error(title, { showLog: true });\n }\n }),\n ),\n\n text: (message) => Effect.sync(() => clack.log.message(message)),\n\n textChunk: (chunk) => Effect.sync(() => clack.log.message(chunk)),\n\n toolCall: (name, formattedArgs) =>\n Effect.sync(() =>\n clack.log.step(terminalStyle.toolCall(`${name}(${formattedArgs})`)),\n ),\n }),\n};\n","/** Result of executing a command inside a sandbox. */\nexport interface ExecResult {\n /** Collected standard output. */\n readonly stdout: string;\n /** Collected standard error. */\n readonly stderr: string;\n /** Process exit status. */\n readonly exitCode: number;\n}\n\n/** Streams supplied when launching an interactive agent process. */\nexport interface InteractiveExecOptions {\n /** Input stream forwarded to the agent process. */\n readonly stdin: NodeJS.ReadableStream;\n /** Output stream receiving agent standard output. */\n readonly stdout: NodeJS.WritableStream;\n /** Output stream receiving agent standard error. */\n readonly stderr: NodeJS.WritableStream;\n /** Working directory inside Docker. */\n readonly cwd?: string;\n /** Abort signal that terminates the interactive process. */\n readonly signal?: AbortSignal;\n}\n\n/** Handle to a running isolated sandbox. Docker implements this contract. */\nexport interface IsolatedSandboxHandle {\n /** Absolute Git workspace path inside Docker. */\n readonly worktreePath: string;\n /**\n * Execute a command in Docker. Deliver `onLine` as output arrives so idle\n * timeouts and live feedback work; buffered delivery does not satisfy this\n * contract. Pipe `stdin` to the child rather than passing it as an argument.\n */\n exec(\n command: string,\n options?: {\n /** Live output callback. */\n onLine?: (line: string) => void;\n /** Working directory inside Docker. */\n cwd?: string;\n /** Execute as root when supported. */\n sudo?: boolean;\n /** Input piped to the child process. */\n stdin?: string;\n /** Abort signal that terminates the command. */\n signal?: AbortSignal;\n /** Maximum combined output bytes before termination. */\n maxOutputBytes?: number;\n },\n ): Promise<ExecResult>;\n /** Launch an interactive process and terminate it when `signal` aborts. */\n interactiveExec?(\n args: string[],\n options: InteractiveExecOptions,\n ): Promise<{ exitCode: number }>;\n /** Copy a file or directory from the host into Docker. */\n copyIn(hostPath: string, sandboxPath: string): Promise<void>;\n /** Copy a file from Docker to the host. */\n copyFileOut(sandboxPath: string, hostPath: string): Promise<void>;\n /** Tear down the container. */\n close(): Promise<void>;\n}\n\n/** File transfer shape used by agent session storage. */\nexport interface SessionTransferHandle {\n /** Absolute Git workspace path inside Docker. */\n readonly worktreePath: string;\n /** Run a command in the sandbox. */\n exec: IsolatedSandboxHandle[\"exec\"];\n /** Launch an interactive command when available. */\n interactiveExec?: IsolatedSandboxHandle[\"interactiveExec\"];\n /** Copy one host file into the sandbox. */\n copyFileIn(hostPath: string, sandboxPath: string): Promise<void>;\n /** Copy one sandbox file to the host. */\n copyFileOut(sandboxPath: string, hostPath: string): Promise<void>;\n /** Tear down the sandbox. */\n close(): Promise<void>;\n}\n\n/** Inputs to Docker sandbox creation. */\nexport interface IsolatedCreateOptions {\n /** Original repository path used to derive the image name; never mounted. */\n readonly hostRepoPath?: string;\n /** Environment injected into the Docker container. */\n readonly env: Record<string, string>;\n}\n\n/** Configuration for the isolated Docker provider contract. */\nexport interface IsolatedSandboxProviderConfig {\n /** Human-readable provider name. */\n readonly name: string;\n /** Provider environment merged into sandbox startup. */\n readonly env?: Record<string, string>;\n /** Start a sandbox and return its command and file-transfer handle. */\n readonly create: (\n options: IsolatedCreateOptions,\n ) => Promise<IsolatedSandboxHandle>;\n}\n\n/** Docker's isolated filesystem provider contract. */\nexport interface IsolatedSandboxProvider {\n /** Isolated filesystem discriminator. */\n readonly tag: \"isolated\";\n /** Human-readable provider name. */\n readonly name: string;\n /** Environment variables injected into Docker. */\n readonly env: Record<string, string>;\n /** Start a sandbox. */\n readonly create: (\n options: IsolatedCreateOptions,\n ) => Promise<IsolatedSandboxHandle>;\n}\n\n/** Provider accepted by Shipyard's Docker execution path. */\nexport type SandboxProvider = IsolatedSandboxProvider;\n\n/** Create a temporary branch and merge its commits back to host HEAD. */\nexport interface MergeToHeadBranchStrategy {\n /** Branch strategy discriminator. */\n readonly type: \"merge-to-head\";\n}\n\n/** Run on a caller-named branch. */\nexport interface NamedBranchStrategy {\n /** Branch strategy discriminator. */\n readonly type: \"branch\";\n /** Branch to create or reuse. */\n readonly branch: string;\n /** Starting ref for a new branch. */\n readonly baseBranch?: string;\n}\n\n/** Supported Docker branch strategies. */\nexport type BranchStrategy = MergeToHeadBranchStrategy | NamedBranchStrategy;\n\n/** Construct the isolated provider contract used by Docker. */\nexport const createIsolatedSandboxProvider = (\n config: IsolatedSandboxProviderConfig,\n): IsolatedSandboxProvider => ({\n tag: \"isolated\",\n name: config.name,\n env: config.env ?? {},\n create: config.create,\n});\n\n/** Adapt Docker file transfer to the agent session storage interface. */\nexport const toSessionTransferHandle = (\n handle: IsolatedSandboxHandle | SessionTransferHandle | undefined,\n): SessionTransferHandle | undefined =>\n handle === undefined\n ? undefined\n : \"copyFileIn\" in handle\n ? handle\n : {\n worktreePath: handle.worktreePath,\n exec: (command, options) => handle.exec(command, options),\n interactiveExec: handle.interactiveExec?.bind(handle),\n copyFileIn: (source, destination) =>\n handle.copyIn(source, destination),\n copyFileOut: (source, destination) =>\n handle.copyFileOut(source, destination),\n close: () => handle.close(),\n };\n","/**\n * Process-wide shutdown registry.\n *\n * Sandboxes need to run synchronous cleanup (remove a container, print\n * worktree-recovery guidance) when the host process is interrupted. Registering\n * `SIGINT`/`SIGTERM`/`exit` listeners per sandbox makes Node emit a\n * `MaxListenersExceededWarning` once more than ~10 sandboxes exist concurrently.\n *\n * This module installs exactly one listener per signal — no matter how many\n * sandboxes are alive — and fans out to a set of teardown callbacks. On\n * `SIGINT`/`SIGTERM` it runs every teardown and then exits once with code 1;\n * on a plain `exit` it runs every teardown without forcing the exit code.\n */\n\n/**\n * A synchronous cleanup step run during shutdown. It must not call\n * `process.exit` — the registry owns the single exit — and must not rely on\n * async work completing, because a signal handler cannot await before the\n * process exits.\n */\nexport type ShutdownCallback = () => void;\n\nconst teardownCallbacks = new Set<ShutdownCallback>();\nlet listenersInstalled = false;\n\nconst runTeardowns = (): void => {\n for (const teardown of teardownCallbacks) {\n try {\n teardown();\n } catch {\n // Best-effort: one teardown failing must not block the others.\n }\n }\n};\n\nconst handleExit = (): void => {\n runTeardowns();\n};\n\nconst handleSignal = (): void => {\n // Detach first so the synchronous \"exit\" event triggered by process.exit()\n // below does not run the same teardowns a second time.\n detachListeners();\n runTeardowns();\n process.exit(1);\n};\n\nconst attachListeners = (): void => {\n if (listenersInstalled) return;\n listenersInstalled = true;\n process.on(\"exit\", handleExit);\n process.on(\"SIGINT\", handleSignal);\n process.on(\"SIGTERM\", handleSignal);\n};\n\nconst detachListeners = (): void => {\n if (!listenersInstalled) return;\n listenersInstalled = false;\n process.removeListener(\"exit\", handleExit);\n process.removeListener(\"SIGINT\", handleSignal);\n process.removeListener(\"SIGTERM\", handleSignal);\n};\n\n/**\n * Register a teardown to run when the process receives `SIGINT`/`SIGTERM` or\n * exits. The first registration installs the shared listeners; the last\n * unregistration removes them, restoring the default signal behavior.\n *\n * @param teardown Synchronous cleanup to run on shutdown.\n * @returns An idempotent function that unregisters the teardown.\n */\nexport const registerShutdown = (teardown: ShutdownCallback): (() => void) => {\n teardownCallbacks.add(teardown);\n attachListeners();\n\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n teardownCallbacks.delete(teardown);\n if (teardownCallbacks.size === 0) detachListeners();\n };\n};\n","import { FileSystem } from \"@effect/platform\";\nimport { resolve } from \"node:path\";\nimport { Data, Effect } from \"effect\";\n\n/** The provided `cwd` path does not exist or is not a directory. */\nexport class CwdError extends Data.TaggedError(\"CwdError\")<{\n readonly message: string;\n readonly cwd: string;\n}> {}\n\n/**\n * Resolve an optional `cwd` string to an absolute, validated host repo directory.\n *\n * - `undefined` → `process.cwd()` (resolved to absolute).\n * - Relative path → resolved against `process.cwd()`.\n * - Absolute path → passed through.\n *\n * Stats the result via Effect's `FileSystem`; fails with {@link CwdError}\n * when the path is missing or is not a directory.\n */\nexport const resolveCwd = (\n cwd: string | undefined,\n): Effect.Effect<string, CwdError, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const resolved =\n cwd !== undefined ? resolve(process.cwd(), cwd) : resolve(process.cwd());\n\n const fs = yield* FileSystem.FileSystem;\n\n const stat = yield* fs.stat(resolved).pipe(\n Effect.mapError(\n () =>\n new CwdError({\n message: `cwd does not exist: ${resolved}`,\n cwd: resolved,\n }),\n ),\n );\n if (stat.type !== \"Directory\") {\n return yield* new CwdError({\n message: `cwd is not a directory: ${resolved}`,\n cwd: resolved,\n });\n }\n\n return resolved;\n });\n","import { Data, Duration, Effect } from \"effect\";\n\n/** Command execution failed in the sandbox */\nexport class ExecError extends Data.TaggedError(\"ExecError\")<{\n readonly message: string;\n readonly command: string;\n /** Exit code of the failed command, when the command ran but returned non-zero.\n * Absent when the failure was the exec itself (e.g. the SDK threw before a code was available). */\n readonly exitCode?: number;\n}> {}\n\n/** Command execution failed on the host */\nexport class ExecHostError extends Data.TaggedError(\"ExecHostError\")<{\n readonly message: string;\n readonly command: string;\n}> {}\n\n/** File copy between host and sandbox failed */\nexport class CopyError extends Data.TaggedError(\"CopyError\")<{\n readonly message: string;\n}> {}\n\n/** Docker infrastructure operation failed */\nexport class DockerError extends Data.TaggedError(\"DockerError\")<{\n readonly message: string;\n}> {}\n\n/** Git sync-in or sync-out operation failed */\nexport class SyncError extends Data.TaggedError(\"SyncError\")<{\n readonly message: string;\n}> {}\n\n/** Git worktree operation failed */\nexport class WorktreeError extends Data.TaggedError(\"WorktreeError\")<{\n readonly message: string;\n}> {}\n\n/** Prompt resolution or preprocessing failed */\nexport class PromptError extends Data.TaggedError(\"PromptError\")<{\n readonly message: string;\n /** Exit code of the failing shell expression, set when the failure is a non-zero\n * exit from a `` !`command` `` expansion. Absent for other prompt-resolution failures\n * (missing template arg, file not readable, etc.). Mirrors the optional `exitCode` on `ExecError`. */\n readonly exitCode?: number;\n}> {}\n\n/** Agent invocation failed */\nexport class AgentError extends Data.TaggedError(\"AgentError\")<{\n readonly message: string;\n /** Host path to the preserved worktree, set when the worktree was kept after failure. */\n readonly preservedWorktreePath?: string;\n}> {}\n\n/** Shipyard config directory is missing or requires explicit migration. */\nexport class ConfigDirError extends Data.TaggedError(\"ConfigDirError\")<{\n readonly message: string;\n}> {}\n\n/** Initialization or setup operation failed */\nexport class InitError extends Data.TaggedError(\"InitError\")<{\n readonly message: string;\n}> {}\n\n/** Run exceeded the configured agent idle timeout */\nexport class AgentIdleTimeoutError extends Data.TaggedError(\n \"AgentIdleTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n /** Host path to the preserved worktree, set when the worktree was kept after failure. */\n readonly preservedWorktreePath?: string;\n}> {}\n\n/** Git worktree create or prune timed out */\nexport class WorktreeTimeoutError extends Data.TaggedError(\n \"WorktreeTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly path: string;\n readonly operation: \"create\" | \"prune\";\n}> {}\n\n/** Sandbox container start timed out */\nexport class ContainerStartTimeoutError extends Data.TaggedError(\n \"ContainerStartTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n}> {}\n\n/** Copying files to worktree timed out */\nexport class CopyToWorktreeTimeoutError extends Data.TaggedError(\n \"CopyToWorktreeTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly paths: string[];\n}> {}\n\n/** Fallback cp -R to worktree failed */\nexport class CopyToWorktreeError extends Data.TaggedError(\n \"CopyToWorktreeError\",\n)<{\n readonly message: string;\n readonly path: string;\n readonly stderr: string;\n readonly exitCode: number | null;\n}> {}\n\n/** Git sync-in for isolated providers timed out */\nexport class SyncInTimeoutError extends Data.TaggedError(\"SyncInTimeoutError\")<{\n readonly message: string;\n readonly timeoutMs: number;\n}> {}\n\n/** onSandboxReady hook command timed out */\nexport class HookTimeoutError extends Data.TaggedError(\"HookTimeoutError\")<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly command: string;\n}> {}\n\n/** Git config setup command timed out */\nexport class GitSetupTimeoutError extends Data.TaggedError(\n \"GitSetupTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly command: string;\n}> {}\n\n/** Prompt shell expression expansion timed out */\nexport class PromptExpansionTimeoutError extends Data.TaggedError(\n \"PromptExpansionTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly expression: string;\n /** Wall-clock time the shell expression actually ran before timing out, measured at the throw site.\n * Distinct from `timeoutMs` (the configured deadline) so a downstream orchestrator can tell a\n * genuine contention timeout from a near-instant abort. */\n readonly elapsedMs: number;\n}> {}\n\n/** Commit collection timed out */\nexport class CommitCollectionTimeoutError extends Data.TaggedError(\n \"CommitCollectionTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n}> {}\n\n/** Merge-to-host branch timed out */\nexport class MergeToHostTimeoutError extends Data.TaggedError(\n \"MergeToHostTimeoutError\",\n)<{\n readonly message: string;\n readonly timeoutMs: number;\n readonly sourceBranch: string;\n readonly targetBranch: string;\n}> {}\n\n/**\n * Wrap an effect with a timeout that fails with a specific error on expiry.\n * Uses `Effect.timeoutFail` under the hood.\n */\nexport const withTimeout =\n <E>(timeoutMs: number, onTimeout: () => E) =>\n <A, E2, R>(effect: Effect.Effect<A, E2, R>): Effect.Effect<A, E | E2, R> =>\n effect.pipe(\n Effect.timeoutFail({\n duration: Duration.millis(timeoutMs),\n onTimeout,\n }),\n );\n\n/** Session capture (read, rewrite, or write) failed */\nexport class SessionCaptureError extends Data.TaggedError(\n \"SessionCaptureError\",\n)<{\n readonly message: string;\n readonly sessionId: string;\n}> {}\n\n/** The provided `cwd` path does not exist or is not a directory. */\nexport { CwdError } from \"./resolveCwd.js\";\nimport type { CwdError } from \"./resolveCwd.js\";\n\n/** Union of all sandbox-related errors */\nexport type SandboxError =\n | CwdError\n | ExecError\n | ExecHostError\n | CopyError\n | DockerError\n | SyncError\n | WorktreeError\n | PromptError\n | AgentError\n | ConfigDirError\n | InitError\n | AgentIdleTimeoutError\n | WorktreeTimeoutError\n | ContainerStartTimeoutError\n | CopyToWorktreeTimeoutError\n | CopyToWorktreeError\n | SyncInTimeoutError\n | HookTimeoutError\n | GitSetupTimeoutError\n | PromptExpansionTimeoutError\n | CommitCollectionTimeoutError\n | MergeToHostTimeoutError\n | SessionCaptureError;\n","/** Canonical runtime names used by the Shipyard CLI and generated workflows. */\nexport const PRODUCT_NAME = \"Shipyard\";\nexport const CLI_NAME = \"shipyard\";\nexport const RUNTIME_NAMESPACE = \"shipyard\";\nexport const ACTIVATION_LABEL = \"shipyard\";\n\nexport const CONFIG_DIR = \".shipyard\";\nexport const LOGS_DIR = \"logs\";\nexport const WORKTREES_DIR = \"worktrees\";\nexport const PATCHES_DIR = \"patches\";\nexport const LOCKS_DIR = \"locks\";\nexport const RUNNER_DIR = \"runner\";\n\nexport const SYNC_BASE_REF = \"refs/shipyard/sync-base\";\n","import { lstat } from \"node:fs/promises\";\nimport { isAbsolute, join, relative, resolve, sep } from \"node:path\";\n\nconst WINDOWS_DRIVE_PATH = /^[A-Za-z]:/;\n\n/** Validate a path that is expected to be relative to an application root. */\nexport const assertSafeRelativePath = (\n relativePath: string,\n label = \"relative path\",\n): void => {\n if (\n relativePath.length === 0 ||\n relativePath.includes(\"\\0\") ||\n isAbsolute(relativePath) ||\n WINDOWS_DRIVE_PATH.test(relativePath) ||\n relativePath.startsWith(\"\\\\\\\\\") ||\n relativePath.split(/[\\\\/]/).some((part) => part === \"..\")\n ) {\n throw new Error(`${label} must stay within its root: ${relativePath}`);\n }\n};\n\n/** Validate a filename that must not contain a directory separator. */\nexport const assertSafePathSegment = (\n segment: string,\n label = \"path segment\",\n): void => {\n assertSafeRelativePath(segment, label);\n if (segment.includes(\"/\") || segment.includes(\"\\\\\")) {\n throw new Error(`${label} must be a single filename: ${segment}`);\n }\n};\n\n/** Resolve a user- or sandbox-supplied relative path without allowing escape. */\nexport const resolveSafeRelativePath = (\n root: string,\n relativePath: string,\n label = \"relative path\",\n): string => {\n assertSafeRelativePath(relativePath, label);\n const rootPath = resolve(root);\n const candidate = resolve(rootPath, relativePath);\n const fromRoot = relative(rootPath, candidate);\n if (\n fromRoot.length === 0 ||\n fromRoot === \"..\" ||\n fromRoot.startsWith(`..${sep}`) ||\n isAbsolute(fromRoot)\n ) {\n throw new Error(`${label} must stay within its root: ${relativePath}`);\n }\n return candidate;\n};\n\n/** Reject existing symlink components before writing below a trusted root. */\nexport const assertNoSymlinkComponents = async (\n root: string,\n target: string,\n label = \"path\",\n): Promise<void> => {\n const rootPath = resolve(root);\n const targetPath = resolve(target);\n const fromRoot = relative(rootPath, targetPath);\n if (\n fromRoot === \"..\" ||\n fromRoot.startsWith(`..${sep}`) ||\n isAbsolute(fromRoot)\n ) {\n throw new Error(`${label} escapes its root`);\n }\n\n let current = rootPath;\n for (const part of fromRoot.split(sep).filter(Boolean)) {\n current = join(current, part);\n try {\n const info = await lstat(current);\n if (info.isSymbolicLink()) {\n throw new Error(`${label} contains a symbolic link: ${current}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") break;\n throw error;\n }\n }\n};\n\n/** Sandbox file lists must never address Git administrative data, including\n * common case-insensitive, NTFS and HFS aliases. Git itself validates patches;\n * raw untracked-file copies need this separate guard. */\nexport const assertSafeGitWorktreePath = (path: string): void => {\n assertSafeRelativePath(path, \"untracked path\");\n for (const component of path.split(/[\\\\/]/)) {\n const normalized = component\n .replace(/[\\u200c-\\u200f\\u202a-\\u202e\\u206a-\\u206f\\ufeff]/g, \"\")\n .toLowerCase()\n .split(\":\")[0]!\n .replace(/[ .]+$/, \"\");\n if (normalized === \".git\" || /^git~[0-9]+$/.test(normalized)) {\n throw new Error(`Untracked path addresses Git metadata: ${path}`);\n }\n }\n};\n","import { execFile } from \"node:child_process\";\n\nconst MAX_BUFFER = 10 * 1024 * 1024;\n\n/**\n * Git configuration that can execute programs while Shipyard processes files\n * authored inside a sandbox. Command-line configuration has the highest\n * priority, so these values override repository and user configuration.\n */\nconst SAFE_CONFIG: ReadonlyArray<readonly [string, string]> = [\n [\"core.hooksPath\", \"/dev/null\"],\n [\"core.fsmonitor\", \"false\"],\n [\"core.pager\", \"cat\"],\n [\"core.alternateRefsCommand\", \"false\"],\n [\"commit.gpgSign\", \"false\"],\n [\"tag.gpgSign\", \"false\"],\n [\"gpg.program\", \"false\"],\n [\"gpg.ssh.program\", \"false\"],\n [\"gpg.ssh.defaultKeyCommand\", \"false\"],\n [\"merge.autoEdit\", \"no\"],\n [\"interactive.diffFilter\", \"\"],\n [\"diff.external\", \"\"],\n [\"maintenance.auto\", \"false\"],\n [\"gc.auto\", \"0\"],\n [\"submodule.recurse\", \"false\"],\n [\"checkout.recurseSubmodules\", \"false\"],\n];\n\nconst COMMAND_CONFIG_PATTERN =\n \"^(filter\\\\..*\\\\.(clean|smudge|process|required)|merge\\\\..*\\\\.driver|diff\\\\..*\\\\.(command|textconv)|difftool\\\\..*\\\\.cmd|mergetool\\\\..*\\\\.cmd)$\";\n\nexport interface HostGitOptions {\n readonly env?: NodeJS.ProcessEnv;\n readonly maxBuffer?: number;\n}\n\ninterface GitResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}\n\nconst runGit = (\n args: readonly string[],\n cwd: string,\n options: HostGitOptions = {},\n): Promise<GitResult> =>\n new Promise((resolve, reject) => {\n execFile(\n \"git\",\n [...args],\n {\n cwd,\n env: {\n ...process.env,\n ...options.env,\n GIT_EDITOR: \"true\",\n GIT_SEQUENCE_EDITOR: \"true\",\n GIT_PAGER: \"cat\",\n GIT_TERMINAL_PROMPT: \"0\",\n },\n maxBuffer: options.maxBuffer ?? MAX_BUFFER,\n },\n (error, stdout, stderr) => {\n if (!error) {\n resolve({ stdout, stderr, exitCode: 0 });\n return;\n }\n\n if (typeof error.code === \"number\") {\n resolve({ stdout, stderr, exitCode: error.code });\n return;\n }\n\n reject(error);\n },\n );\n });\n\nconst configArgs = (entries: ReadonlyArray<readonly [string, string]>) =>\n entries.flatMap(([key, value]) => [\"-c\", `${key}=${value}`]);\n\n/**\n * Discover named drivers because Git has no wildcard command-line override for\n * filter, diff, or merge driver sections. Discovery itself only reads config;\n * it does not inspect the index or working tree and cannot invoke those\n * drivers.\n */\nconst commandDriverOverrides = async (\n cwd: string,\n options: HostGitOptions,\n): Promise<string[]> => {\n const result = await runGit(\n [\"config\", \"--null\", \"--name-only\", \"--get-regexp\", COMMAND_CONFIG_PATTERN],\n cwd,\n options,\n );\n if (result.exitCode === 1) return [];\n if (result.exitCode !== 0) {\n throw new Error(\n result.stderr.trim() || \"Failed to inspect Git configuration\",\n );\n }\n\n const overrides = new Map<string, string>();\n for (const key of result.stdout.split(\"\\0\").filter(Boolean)) {\n const filterMatch = /^(filter\\..*)\\.(clean|smudge|process|required)$/i.exec(\n key,\n );\n if (filterMatch) {\n const section = filterMatch[1]!;\n overrides.set(`${section}.clean`, \"cat\");\n overrides.set(`${section}.smudge`, \"cat\");\n overrides.set(`${section}.process`, \"\");\n overrides.set(`${section}.required`, \"false\");\n continue;\n }\n\n // If a sandbox-authored .gitattributes file selects one of these named\n // drivers, fail that optional driver instead of launching a host program.\n overrides.set(key, \"false\");\n }\n\n return configArgs([...overrides.entries()]);\n};\n\n/**\n * Run an internal host-side Git operation without a shell or executable Git\n * callbacks. User identity and other inert configuration remain available.\n */\nexport const execHostGit = async (\n args: readonly string[],\n cwd: string,\n options: HostGitOptions = {},\n): Promise<string> => {\n const driverArgs = await commandDriverOverrides(cwd, options);\n const safeArgs = [...configArgs(SAFE_CONFIG), ...driverArgs, ...args];\n const result = await runGit(safeArgs, cwd, options);\n if (result.exitCode !== 0) {\n throw new Error(\n result.stderr.trim() ||\n `git ${args.join(\" \")} failed with exit ${result.exitCode}`,\n );\n }\n return result.stdout;\n};\n","import { Effect, Option } from \"effect\";\nimport { FileSystem } from \"@effect/platform\";\nimport { randomBytes } from \"node:crypto\";\nimport { join, normalize, resolve } from \"node:path\";\nimport { WorktreeError, WorktreeTimeoutError, withTimeout } from \"./errors.js\";\nimport {\n CONFIG_DIR,\n RUNTIME_NAMESPACE,\n WORKTREES_DIR,\n} from \"./runtimeNames.js\";\nimport { assertNoSymlinkComponents } from \"./pathSecurity.js\";\nimport { execHostGit } from \"./hostGit.js\";\n\nconst WORKTREE_TIMEOUT_MS = 30_000;\n\n/**\n * Git global flags that prevent `git worktree add -b` from writing upstream\n * tracking config to `.git/config`. Without these, a user's global\n * `branch.autoSetupMerge` or `push.autoSetupRemote` can cause a config write\n * that races with other processes holding `.git/config.lock`.\n */\nconst NO_CONFIG_LOCK_FLAGS = [\n \"-c\",\n \"branch.autoSetupMerge=false\",\n \"-c\",\n \"push.autoSetupRemote=false\",\n];\n\n/** Format a timestamp as YYYYMMDD-HHMMSS */\nconst formatTimestamp = (date: Date): string => {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return (\n `${date.getFullYear()}${pad(date.getMonth() + 1)}${pad(date.getDate())}-` +\n `${pad(date.getHours())}${pad(date.getMinutes())}${pad(date.getSeconds())}`\n );\n};\n\n/**\n * Short random hex suffix appended to generated temp branch names. Three\n * bytes (six hex chars) is enough entropy to keep concurrent `run()` /\n * `RunResult.fork()` calls within the same second from colliding on branch\n * names — the second-granularity timestamp alone is not (see ADR 0018).\n */\nconst randomBranchSuffix = (): string => randomBytes(3).toString(\"hex\");\n\n/** Sanitize a name for use in branch names and directory names. */\nexport const sanitizeName = (name: string): string =>\n name.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n\nconst execGit = (\n args: string[],\n cwd: string,\n): Effect.Effect<string, WorktreeError> =>\n Effect.tryPromise({\n // Force the C locale so git emits English, machine-stable messages. Several\n // callers match git's stderr (e.g. \"invalid reference\") to decide control\n // flow; under a localized locale gettext translates those strings and the\n // matches silently fail, breaking worktree creation (issue #595).\n try: () => execHostGit(args, cwd, { env: { LC_ALL: \"C\" } }),\n catch: (error) =>\n new WorktreeError({\n message: error instanceof Error ? error.message : String(error),\n }),\n });\n\n/**\n * Generates a temporary branch name.\n * When name is provided: `shipyard/<sanitized-name>/<YYYYMMDD-HHMMSS>-<random>`.\n * Otherwise: `shipyard/<YYYYMMDD-HHMMSS>-<random>`.\n *\n * The random suffix prevents collisions between concurrent calls within the\n * same wall-clock second — relevant for fan-out via `RunResult.fork()` and\n * for plain `Promise.all([run(), run()])` callers.\n */\nexport const generateTempBranchName = (name?: string): string => {\n const ts = formatTimestamp(new Date());\n const suffix = randomBranchSuffix();\n if (name) {\n return `${RUNTIME_NAMESPACE}/${sanitizeName(name)}/${ts}-${suffix}`;\n }\n return `${RUNTIME_NAMESPACE}/${ts}-${suffix}`;\n};\n\n/** Returns the name of the currently checked-out branch in the given repo directory. */\nexport const getCurrentBranch = (\n repoDir: string,\n): Effect.Effect<string, WorktreeError> =>\n execGit([\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], repoDir).pipe(\n Effect.map((output) => output.trim()),\n );\n\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n}\n\n/** A single entry parsed from `git worktree list --porcelain`. */\nexport interface WorktreeEntry {\n path: string;\n /** `null` for a detached HEAD (e.g. mid-rebase). */\n branch: string | null;\n}\n\n/**\n * Normalizes path separators to forward slashes.\n *\n * `git worktree list --porcelain` reports paths with forward slashes on every\n * platform, but `node:path.join` produces backslashes on Windows. macOS also\n * reports paths below `/private` while Node may retain the `/var` symlink\n * spelling. Comparing the two without normalizing fails on those platforms,\n * so all path comparisons in this module run both sides through this first.\n */\nconst normalizePath = (p: string): string => {\n const normalized = p.replace(/\\\\/g, \"/\");\n if (process.platform === \"darwin\" && normalized.startsWith(\"/private/\")) {\n return normalized.slice(\"/private\".length);\n }\n return normalized;\n};\n\n/**\n * Finds an existing worktree that collides with `branch` or `worktreePath`.\n *\n * Matches by branch first, then falls back to a path match — covering the\n * mid-rebase detached-HEAD case where git reports a `null` branch. The path\n * fallback normalizes separators so it works on Windows.\n */\nexport const findCollidingWorktree = (\n existing: readonly WorktreeEntry[],\n branch: string,\n worktreePath: string,\n): WorktreeEntry | undefined =>\n existing.find((wt) => wt.branch === branch) ??\n existing.find((wt) => normalizePath(wt.path) === normalizePath(worktreePath));\n\n/**\n * Whether `worktreePath` lives under `worktreesDir` (i.e. is a worktree managed\n * by Shipyard rather than the main working tree or an external worktree).\n * Separators are normalized so the check holds on Windows.\n */\nexport const isManagedWorktreePath = (\n worktreePath: string,\n worktreesDir: string,\n): boolean => {\n const candidate = normalizePath(worktreePath).replace(/\\/+$/, \"\");\n const root = normalizePath(worktreesDir).replace(/\\/+$/, \"\");\n return candidate === root || candidate.startsWith(`${root}/`);\n};\n\n/**\n * Whether a directory entry under `.shipyard/worktrees/` is orphaned — not\n * present in the set of active worktree paths reported by git. Both sides are\n * normalized so paths from `join` (backslashes on Windows) match git's\n * forward-slash output.\n */\nexport const isOrphanedWorktreePath = (\n entryPath: string,\n activeWorktreePaths: Iterable<string>,\n): boolean => {\n const normalizedEntry = normalizePath(entryPath);\n for (const active of activeWorktreePaths) {\n if (normalizePath(active) === normalizedEntry) return false;\n }\n return true;\n};\n\n/** Parses `git worktree list --porcelain` output into structured entries. */\nconst listWorktrees = (\n repoDir: string,\n): Effect.Effect<WorktreeEntry[], WorktreeError> =>\n execGit([\"worktree\", \"list\", \"--porcelain\"], repoDir).pipe(\n Effect.map((output) => {\n const entries: WorktreeEntry[] = [];\n let currentPath: string | null = null;\n let currentBranch: string | null = null;\n\n for (const line of output.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (currentPath !== null) {\n entries.push({ path: currentPath, branch: currentBranch });\n }\n currentPath = line.slice(\"worktree \".length).trim();\n currentBranch = null;\n } else if (line.startsWith(\"branch \")) {\n // \"branch refs/heads/my-branch\" -> \"my-branch\"\n currentBranch = line.slice(\"branch refs/heads/\".length).trim();\n }\n }\n\n if (currentPath !== null) {\n entries.push({ path: currentPath, branch: currentBranch });\n }\n\n return entries;\n }),\n );\n\n/**\n * On the clean-reuse path, fetches `origin/<branch>` into the worktree and\n * fast-forwards local HEAD. Skipped silently (with an explanatory log) when:\n *\n * - HEAD is not attached to `<branch>` — a mid-rebase worktree paused at an\n * `edit`/`exec`/`break` instruction has a clean working tree but a detached\n * HEAD pointing at the pause point. `git merge --ff-only` there would\n * silently advance HEAD past the pause and break `git rebase --continue`;\n * - the fetch fails (no `origin`, unreachable network, branch missing on\n * origin) — the worktree is reused as-is, never breaking the run; or\n * - the local branch has diverged from `origin/<branch>` (unpushed commits +\n * moved origin), in which case `--ff-only` refuses and the unpushed work\n * is preserved exactly as it was.\n *\n * Errors here are non-fatal by design (ADR 0003): the worst case is the same\n * stale-but-usable worktree the caller would have had before this refresh\n * existed.\n */\nconst fastForwardFromOrigin = (\n worktreePath: string,\n branch: string,\n): Effect.Effect<void, never> =>\n Effect.gen(function* () {\n // `symbolic-ref --quiet HEAD` exits non-zero when HEAD is detached;\n // map both failure and an unexpected target to \"\" so the predicate\n // below treats them the same as \"not on this branch\".\n const headRef = yield* execGit(\n [\"symbolic-ref\", \"--quiet\", \"HEAD\"],\n worktreePath,\n ).pipe(\n Effect.map((s) => s.trim()),\n Effect.orElseSucceed(() => \"\"),\n );\n if (headRef !== `refs/heads/${branch}`) {\n console.log(\n `Reusing worktree at ${worktreePath} (branch '${branch}') — HEAD is not on '${branch}', skipping origin refresh`,\n );\n return;\n }\n const fetchResult = yield* Effect.either(\n execGit(\n [...NO_CONFIG_LOCK_FLAGS, \"fetch\", \"origin\", branch],\n worktreePath,\n ),\n );\n if (fetchResult._tag === \"Left\") {\n console.log(\n `Could not fetch from origin (reusing worktree at ${worktreePath} as-is, branch '${branch}')`,\n );\n return;\n }\n const before = yield* execGit([\"rev-parse\", \"HEAD\"], worktreePath).pipe(\n Effect.map((s) => s.trim()),\n Effect.orElseSucceed(() => \"\"),\n );\n const mergeResult = yield* Effect.either(\n execGit(\n [...NO_CONFIG_LOCK_FLAGS, \"merge\", \"--ff-only\", `origin/${branch}`],\n worktreePath,\n ),\n );\n if (mergeResult._tag === \"Left\") {\n console.log(\n `Branch '${branch}' has diverged from origin (reusing worktree at ${worktreePath} as-is)`,\n );\n return;\n }\n const after = yield* execGit([\"rev-parse\", \"HEAD\"], worktreePath).pipe(\n Effect.map((s) => s.trim()),\n Effect.orElseSucceed(() => \"\"),\n );\n if (before && after && before !== after) {\n console.log(\n `Fast-forwarded worktree at ${worktreePath} (branch '${branch}') to origin/${branch}`,\n );\n } else {\n console.log(\n `Reusing existing worktree at ${worktreePath} (branch '${branch}')`,\n );\n }\n });\n\n/**\n * Creates a git worktree at `.shipyard/worktrees/<name>/`.\n *\n * - If `branch` is specified, checks out that branch.\n * - If not, creates a temporary `shipyard/<timestamp>` branch.\n *\n * When `branch` collides with an existing managed worktree:\n * - Clean → reuses the existing worktree and fast-forwards it from\n * `origin/<branch>` when it is strictly behind (ADR 0003). A failed fetch\n * or a diverged branch is non-fatal and falls back to plain reuse.\n * - Dirty (uncommitted changes) → reuses with a console warning, no refresh.\n *\n * Collisions with the main working tree or external worktrees always throw.\n */\nexport const create = (\n repoDir: string,\n opts?: {\n branch?: string;\n baseBranch?: string;\n name?: string;\n },\n): Effect.Effect<\n WorktreeInfo,\n WorktreeError | WorktreeTimeoutError,\n FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const configDir = join(repoDir, CONFIG_DIR);\n const fs = yield* FileSystem.FileSystem;\n const worktreesDir = join(configDir, WORKTREES_DIR);\n yield* Effect.tryPromise({\n try: () =>\n assertNoSymlinkComponents(\n configDir,\n worktreesDir,\n \"Shipyard worktree directory\",\n ),\n catch: (e) =>\n new WorktreeError({\n message: `Refusing symlinked Shipyard worktree directory: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n yield* fs\n .makeDirectory(worktreesDir, { recursive: true })\n .pipe(Effect.mapError((e) => new WorktreeError({ message: e.message })));\n yield* Effect.tryPromise({\n try: () =>\n assertNoSymlinkComponents(\n configDir,\n worktreesDir,\n \"Shipyard worktree directory\",\n ),\n catch: (e) =>\n new WorktreeError({\n message: `Refusing symlinked Shipyard worktree directory: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n let branch: string;\n let worktreeName: string;\n\n if (opts?.branch) {\n branch = opts.branch;\n // Validate before deriving a filesystem path. Git ref names reject path\n // traversal and shell metacharacters, but constructing worktreeName first\n // would still let a malformed Windows branch escape via backslashes.\n yield* execGit([\"check-ref-format\", \"--branch\", branch], repoDir);\n worktreeName = branch.replace(/\\//g, \"-\");\n } else {\n const timestamp = formatTimestamp(new Date());\n const suffix = randomBranchSuffix();\n if (opts?.name) {\n const sanitized = sanitizeName(opts.name);\n branch = `${RUNTIME_NAMESPACE}/${sanitized}/${timestamp}-${suffix}`;\n worktreeName = `${RUNTIME_NAMESPACE}-${sanitized}-${timestamp}-${suffix}`;\n } else {\n branch = `${RUNTIME_NAMESPACE}/${timestamp}-${suffix}`;\n worktreeName = `${RUNTIME_NAMESPACE}-${timestamp}-${suffix}`;\n }\n }\n\n const worktreePath = join(worktreesDir, worktreeName);\n const assertWorktreePathIsSafe = () =>\n assertNoSymlinkComponents(configDir, worktreePath, \"worktree path\");\n\n yield* Effect.tryPromise({\n try: assertWorktreePathIsSafe,\n catch: (e) =>\n new WorktreeError({\n message: `Refusing symlinked worktree path: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n if (opts?.branch) {\n // Proactively detect collision before git produces a confusing error.\n // Match by branch first; fall back to target path (covers mid-rebase\n // detached-HEAD state where the branch field is null).\n const existing = yield* listWorktrees(repoDir);\n const collision = findCollidingWorktree(existing, branch, worktreePath);\n if (collision) {\n // Only reuse worktrees managed by Shipyard (under .shipyard/worktrees/)\n if (isManagedWorktreePath(collision.path, worktreesDir)) {\n const dirty = yield* hasUncommittedChanges(collision.path);\n if (dirty) {\n console.warn(\n `Reusing worktree at ${collision.path} (branch '${branch}') — worktree has uncommitted changes`,\n );\n } else {\n yield* fastForwardFromOrigin(collision.path, branch);\n }\n // Git reports forward slashes even on Windows, and macOS may spell\n // the same temp path as /private/var. Return the comparison-\n // canonical spelling in the platform-native format so reused\n // worktrees stay consistent with newly-created ones.\n return { path: normalize(normalizePath(collision.path)), branch };\n }\n // Branch is checked out in the main working tree or external worktree\n yield* Effect.fail(\n new WorktreeError({\n message:\n `Branch '${branch}' is already checked out in worktree at '${collision.path}'. ` +\n `Shipyard's branch and merge-to-head strategies run the agent in a git worktree under .shipyard/worktrees/, ` +\n `and git refuses to check out the same branch in two worktrees at once (HEAD would become ambiguous). ` +\n `Pick a different branch, or switch the main working tree to a different branch before re-running.`,\n }),\n );\n }\n yield* execGit(\n [...NO_CONFIG_LOCK_FLAGS, \"worktree\", \"add\", worktreePath, branch],\n repoDir,\n ).pipe(\n Effect.catchAll((e) => {\n if (e.message.includes(\"invalid reference\")) {\n return execGit(\n [\n ...NO_CONFIG_LOCK_FLAGS,\n \"worktree\",\n \"add\",\n \"-b\",\n branch,\n worktreePath,\n opts?.baseBranch ?? \"HEAD\",\n ],\n repoDir,\n );\n }\n return Effect.fail(e);\n }),\n );\n } else {\n yield* execGit(\n [\n ...NO_CONFIG_LOCK_FLAGS,\n \"worktree\",\n \"add\",\n \"-b\",\n branch,\n worktreePath,\n \"HEAD\",\n ],\n repoDir,\n ).pipe(\n Effect.catchAll((e) => {\n if (\n e.message.includes(\"already checked out\") ||\n e.message.includes(\"already exists\")\n ) {\n return Effect.fail(\n new WorktreeError({\n message:\n `Branch '${branch}' is already checked out in another worktree. ` +\n `Use a different branch name, or wait for the other run to finish.`,\n }),\n );\n }\n return Effect.fail(e);\n }),\n );\n }\n\n yield* Effect.tryPromise({\n try: assertWorktreePathIsSafe,\n catch: (e) =>\n new WorktreeError({\n message: `Refusing symlinked worktree path: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n return { path: worktreePath, branch };\n }).pipe(\n withTimeout(\n WORKTREE_TIMEOUT_MS,\n () =>\n new WorktreeTimeoutError({\n message: `Worktree creation timed out after ${WORKTREE_TIMEOUT_MS}ms`,\n timeoutMs: WORKTREE_TIMEOUT_MS,\n path: repoDir,\n operation: \"create\",\n }),\n ),\n );\n\n/**\n * Returns true if the worktree at `worktreePath` has any uncommitted changes:\n * unstaged modifications, staged changes, or untracked files.\n */\nexport const hasUncommittedChanges = (\n worktreePath: string,\n): Effect.Effect<boolean, WorktreeError> =>\n execGit([\"status\", \"--porcelain\"], worktreePath).pipe(\n Effect.map((output) => output.trim().length > 0),\n );\n\n/**\n * Removes a worktree and its git metadata.\n *\n * The `worktreePath` must be a path inside `.shipyard/worktrees/` so that\n * the main repository directory can be derived from it.\n */\nexport const remove = (\n worktreePath: string,\n): Effect.Effect<void, WorktreeError> => {\n // Derive the main repo dir: worktreePath = <repoDir>/.shipyard/worktrees/<name>\n // and verify the derivation before allowing git to remove anything. The old\n // code accepted sibling prefixes such as `.shipyard/worktrees-evil`.\n const candidate = resolve(worktreePath);\n const repoDir = resolve(candidate, \"..\", \"..\", \"..\");\n const worktreesDir = resolve(repoDir, \".shipyard\", WORKTREES_DIR);\n if (\n !isManagedWorktreePath(candidate, worktreesDir) ||\n candidate === worktreesDir\n ) {\n return Effect.fail(\n new WorktreeError({\n message: `Refusing to remove worktree outside ${worktreesDir}: ${worktreePath}`,\n }),\n );\n }\n return Effect.tryPromise({\n try: () =>\n assertNoSymlinkComponents(worktreesDir, candidate, \"worktree path\"),\n catch: (e) =>\n new WorktreeError({\n message: `Refusing symlinked worktree path: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }).pipe(\n Effect.andThen(\n execGit([\"worktree\", \"remove\", \"--force\", candidate], repoDir),\n ),\n Effect.asVoid,\n );\n};\n\n/**\n * Prunes stale git worktree metadata and removes orphaned directories under\n * `.shipyard/worktrees/`.\n */\nexport const pruneStale = (\n repoDir: string,\n): Effect.Effect<\n void,\n WorktreeError | WorktreeTimeoutError,\n FileSystem.FileSystem\n> =>\n Effect.gen(function* () {\n const configDir = join(repoDir, CONFIG_DIR);\n const fs = yield* FileSystem.FileSystem;\n\n // Let git clean up metadata for worktrees whose directories are gone\n yield* execGit([\"worktree\", \"prune\"], repoDir);\n\n const worktreesDir = join(configDir, WORKTREES_DIR);\n\n // Never recursively delete through a configurable symlink. A symlinked\n // `.shipyard` is supported for active worktrees, but its target may be an\n // unrelated directory; skip orphan-directory cleanup in that case.\n const configDirIsSymlink = yield* fs.readLink(configDir).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n const worktreesDirIsSymlink = yield* fs.readLink(worktreesDir).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n if (configDirIsSymlink || worktreesDirIsSymlink) return;\n\n // Read directory entries — return null if directory doesn't exist\n const entries: string[] | null = yield* fs.readDirectory(worktreesDir).pipe(\n Effect.map((es): string[] | null => es),\n Effect.catchSome((e) =>\n e._tag === \"SystemError\" && e.reason === \"NotFound\"\n ? Option.some(Effect.succeed(null as string[] | null))\n : Option.none(),\n ),\n Effect.mapError((e) => new WorktreeError({ message: e.message })),\n );\n\n if (entries === null) return;\n\n // `git worktree list` canonicalizes paths via realpath. If repoDir or\n // .shipyard is a symlink, joining the un-canonicalized prefix produces\n // strings that never match git's output, and every active worktree looks\n // orphaned. Resolve the prefix once so the Set lookup below works.\n const realWorktreesDir = yield* fs\n .realPath(worktreesDir)\n .pipe(Effect.catchAll(() => Effect.succeed(worktreesDir)));\n\n // Get the list of active worktree paths from git\n const worktreeList = yield* execGit(\n [\"worktree\", \"list\", \"--porcelain\"],\n repoDir,\n );\n const activeWorktreePaths = new Set(\n worktreeList\n .split(\"\\n\")\n .filter((line) => line.startsWith(\"worktree \"))\n .map((line) => line.slice(\"worktree \".length).trim()),\n );\n\n // Remove any directory under .shipyard/worktrees/ that is not an active worktree\n for (const entry of entries) {\n const entryPath = join(realWorktreesDir, entry);\n const entryIsSymlink = yield* fs.readLink(entryPath).pipe(\n Effect.map(() => true),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n if (entryIsSymlink) continue;\n const isDir = yield* fs.stat(entryPath).pipe(\n Effect.map((s) => s.type === \"Directory\"),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n if (isDir && isOrphanedWorktreePath(entryPath, activeWorktreePaths)) {\n yield* fs.remove(entryPath, { recursive: true, force: true }).pipe(\n Effect.mapError(\n (e) =>\n new WorktreeError({\n message: `Failed to remove ${entryPath}: ${e.message}`,\n }),\n ),\n );\n }\n }\n }).pipe(\n withTimeout(\n WORKTREE_TIMEOUT_MS,\n () =>\n new WorktreeTimeoutError({\n message: `Worktree prune timed out after ${WORKTREE_TIMEOUT_MS}ms`,\n timeoutMs: WORKTREE_TIMEOUT_MS,\n path: repoDir,\n operation: \"prune\",\n }),\n ),\n );\n","/** Quote a value for use as one POSIX-shell argument. */\nexport const shellQuote = (value: string): string => {\n if (value.includes(\"\\0\")) {\n throw new Error(\"Cannot quote a string containing a NUL byte\");\n }\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n};\n","import { posix } from \"node:path\";\nimport { CONFIG_DIR, RUNNER_DIR } from \"./runtimeNames.js\";\n\nconst PROTECTED_RUNNER_PATH = `${CONFIG_DIR}/${RUNNER_DIR}`;\nconst pathKey = (value: string): string =>\n value.normalize(\"NFC\").toLocaleLowerCase(\"en-US\");\nconst SAFE_RUNNER_ENV_KEYS = new Set([\n \"HOME\",\n \"LANG\",\n \"LC_ALL\",\n \"LOGNAME\",\n \"PATH\",\n \"SHELL\",\n \"TEMP\",\n \"TERM\",\n \"TMP\",\n \"TMPDIR\",\n \"USER\",\n]);\n\n/** Keep repository credentials and agent secrets out of official runner processes. */\nexport const repositoryRunnerEnvironment = (\n source: NodeJS.ProcessEnv,\n): NodeJS.ProcessEnv =>\n Object.fromEntries(\n Object.entries(source).filter(\n ([key, value]) => SAFE_RUNNER_ENV_KEYS.has(key) && value !== undefined,\n ),\n );\n\n/** Reject a copy root that is the repository runner, contains it, or sits inside it. */\nexport const assertExcludesRepositoryRunner = (relativePath: string): void => {\n const normalized = pathKey(\n posix\n .normalize(relativePath.replace(/\\\\/g, \"/\"))\n .replace(/^\\.\\//, \"\")\n .replace(/\\/$/, \"\"),\n );\n const protectedPath = pathKey(PROTECTED_RUNNER_PATH);\n if (\n normalized === \".\" ||\n normalized === protectedPath ||\n normalized.startsWith(`${protectedPath}/`) ||\n protectedPath.startsWith(`${normalized}/`)\n ) {\n throw new Error(\n `Copy path ${relativePath} would expose the protected repository runner to an agent sandbox.`,\n );\n }\n};\n\nexport interface ProtectedDirectoryIdentity {\n readonly realPath: string;\n readonly directory: boolean;\n readonly symbolicLink: boolean;\n}\n\n/** Adapter-friendly equivalent used by install and lifecycle boundaries. */\nexport const assertProtectedDirectoryIdentities = async (\n runnerDir: string,\n inspect?: (path: string) => Promise<ProtectedDirectoryIdentity>,\n): Promise<void> => {\n if (!inspect) return;\n const runner = await inspect(runnerDir);\n if (!runner.directory || runner.symbolicLink) {\n throw new Error(\n `The protected repository runner path must be a real directory: ${runnerDir}`,\n );\n }\n};\n","export type FailedStep = \"commits\" | \"diff\" | \"untracked\";\n\nexport interface RecoveryInput {\n readonly patchDir: string;\n readonly failedStep: FailedStep;\n readonly hasCommits: boolean;\n readonly hasDiff: boolean;\n readonly hasUntracked: boolean;\n readonly branch?: string;\n}\n\n/**\n * Build copy-pastable recovery commands for a failed sync-out.\n * Pure function: takes failure state, returns formatted terminal output.\n */\nexport const buildRecoveryMessage = (input: RecoveryInput): string => {\n const { patchDir, failedStep, hasCommits, hasDiff, hasUntracked, branch } =\n input;\n\n // When --branch is set, commands run inside .shipyard/worktree,\n // so patch paths need ../../ prefix to reach repo root\n const cmdPatchDir = branch ? `../../${patchDir}` : patchDir;\n\n // Determine the step number for the failed step\n const steps: { key: FailedStep; label: string; has: boolean }[] = [];\n if (hasCommits)\n steps.push({ key: \"commits\", label: \"committed changes\", has: true });\n if (hasDiff)\n steps.push({ key: \"diff\", label: \"uncommitted changes\", has: true });\n if (hasUntracked)\n steps.push({ key: \"untracked\", label: \"untracked files\", has: true });\n\n const failedIndex = steps.findIndex((s) => s.key === failedStep);\n const failedStepInfo = steps[failedIndex]!;\n const stepNumber = failedIndex + 1;\n\n const lines: string[] = [];\n lines.push(\n `Patch application failed at step ${stepNumber} (${failedStepInfo.label}).`,\n );\n lines.push(\"\");\n\n // Add worktree setup preamble for --branch\n if (branch) {\n lines.push(\"Set up worktree, then resolve:\");\n lines.push(\n formatCommandBlock([\n `git worktree add .shipyard/worktree ${branch}`,\n `cd .shipyard/worktree`,\n ]),\n );\n lines.push(\"\");\n }\n\n if (failedStep === \"commits\") {\n // git am failure — lean on git's built-in workflow\n lines.push(\"Resolve conflicts, then continue with:\");\n lines.push(` git am --continue`);\n\n // Remaining steps after git am resolves\n const remaining = buildRemainingCommands(\n cmdPatchDir,\n steps.slice(failedIndex + 1),\n );\n if (remaining.length > 0) {\n lines.push(\"\");\n lines.push(\"After all commits are applied, run the remaining steps:\");\n lines.push(formatCommandBlock(remaining));\n }\n } else {\n // diff or untracked failure — print remaining commands from failed step onward\n const remaining = buildRemainingCommands(\n cmdPatchDir,\n steps.slice(failedIndex),\n );\n if (remaining.length > 0) {\n lines.push(\"Run the remaining steps:\");\n lines.push(formatCommandBlock(remaining));\n }\n }\n\n if (steps.slice(failedIndex).some((step) => step.key === \"untracked\")) {\n lines.push(\"\");\n lines.push(\n \"The untracked-file command includes dotfiles and does not overwrite existing paths; review skipped conflicts manually.\",\n );\n }\n\n return lines.join(\"\\n\");\n};\n\nconst buildRemainingCommands = (\n patchDir: string,\n steps: { key: FailedStep; has: boolean }[],\n): string[] => {\n const commands: string[] = [];\n for (const step of steps) {\n if (!step.has) continue;\n if (step.key === \"commits\") {\n commands.push(`git am --3way ${patchDir}/*.patch`);\n } else if (step.key === \"diff\") {\n commands.push(`git apply ${patchDir}/changes.patch`);\n } else if (step.key === \"untracked\") {\n commands.push(`cp -Rn ${patchDir}/untracked/. .`);\n }\n }\n return commands;\n};\n\nconst formatCommandBlock = (commands: string[]): string => {\n if (commands.length === 1) {\n return ` ${commands[0]}`;\n }\n // Join with && \\ continuation\n return commands\n .map((cmd, i) => (i < commands.length - 1 ? ` ${cmd} && \\\\` : ` ${cmd}`))\n .join(\"\\n\");\n};\n","/**\n * Sync-out: extract changes from an isolated sandbox back to the host.\n *\n * Two-phase approach:\n * 1. Save phase: eagerly save all artifacts (patches, diff, untracked files)\n * to `.shipyard/patches/<timestamp>/` before attempting to apply.\n * 2. Apply phase: apply from the saved directory.\n * - On success: clean up the patch directory.\n * - On failure: preserve the patch directory and print recovery commands.\n *\n * Three-prong extraction within each phase:\n * 1. Committed changes: `git format-patch` + `git am --3way`\n * 2. Uncommitted changes (staged + unstaged): `git diff HEAD` + `git apply`\n * 3. Untracked files: `git ls-files --others` + `copyFileOut` each file\n */\n\nimport { constants, existsSync } from \"node:fs\";\nimport {\n copyFile,\n mkdir,\n readdir,\n readFile,\n rm,\n stat,\n chmod,\n writeFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, posix } from \"node:path\";\nimport { Effect } from \"effect\";\nimport type { ExecResult, SandboxService } from \"./SandboxFactory.js\";\nimport type { IsolatedSandboxHandle } from \"./SandboxProvider.js\";\nimport { buildRecoveryMessage, type FailedStep } from \"./RecoveryMessage.js\";\nimport { SyncError } from \"./errors.js\";\nimport { execHostGit as execSafeHostGit } from \"./hostGit.js\";\nimport {\n assertNoSymlinkComponents,\n assertSafePathSegment,\n assertSafeGitWorktreePath,\n resolveSafeRelativePath,\n} from \"./pathSecurity.js\";\nimport { shellQuote } from \"./shellQuote.js\";\nimport {\n CONFIG_DIR,\n PATCHES_DIR,\n RUNTIME_NAMESPACE,\n SYNC_BASE_REF,\n} from \"./runtimeNames.js\";\nimport { assertExcludesRepositoryRunner } from \"./runnerSecurity.js\";\n\nexport { SYNC_BASE_REF } from \"./runtimeNames.js\";\n\n/**\n * Sandbox-owned ref tracking the last-synced commit. Lives inside the sandbox's\n * git repo (not the host's), survives across `run()` calls on the same handle,\n * and never crosses to the host — sync-out ships commits, not refs. ADR 0017.\n */\n\n/**\n * Execute a command on the host side, returning stdout.\n * Fails with SyncError on non-zero exit.\n */\nconst execHostGit = (\n args: string[],\n cwd: string,\n): Effect.Effect<string, SyncError> =>\n Effect.tryPromise({\n try: () => execSafeHostGit(args, cwd),\n catch: (e) =>\n new SyncError({\n message: `Host command failed: git ${args.join(\" \")}\\n${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n/**\n * Execute a command in the sandbox, failing with SyncError if it exits non-zero.\n */\nconst execOk = (\n handle: IsolatedSandboxHandle,\n command: string,\n options?: { cwd?: string },\n): Effect.Effect<\n { stdout: string; stderr: string; exitCode: number },\n SyncError\n> =>\n Effect.tryPromise({\n try: () => handle.exec(command, options),\n catch: (e) =>\n new SyncError({\n message: `Sandbox exec failed: ${command}\\n${e instanceof Error ? e.message : String(e)}`,\n }),\n }).pipe(\n Effect.flatMap((result) =>\n result.exitCode !== 0\n ? Effect.fail(\n new SyncError({\n message: `Sandbox command failed (exit ${result.exitCode}): ${command}\\n${result.stderr}`,\n }),\n )\n : Effect.succeed(result),\n ),\n );\n\n/**\n * Execute a command in the sandbox, returning the result without failing on non-zero exit.\n */\nconst execSandbox = (\n handle: IsolatedSandboxHandle,\n command: string,\n options?: { cwd?: string },\n): Effect.Effect<\n { stdout: string; stderr: string; exitCode: number },\n SyncError\n> =>\n Effect.tryPromise({\n try: () => handle.exec(command, options),\n catch: (e) =>\n new SyncError({\n message: `Sandbox exec failed: ${command}\\n${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n/**\n * Check if a patch file is empty or header-only.\n * Merge commits produce patches with headers but no diff content.\n * A patch is considered empty if it has no lines starting with \"diff --git\".\n */\nconst isEmptyPatch = (patchPath: string): Effect.Effect<boolean, SyncError> =>\n Effect.tryPromise({\n try: async () => {\n const info = await stat(patchPath);\n if (info.size === 0) return true;\n const content = await readFile(patchPath, \"utf-8\");\n return !content.includes(\"diff --git\");\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to check patch ${patchPath}: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n/**\n * Generate a YYYYMMDD-HHMMSS timestamp directory name.\n * Appends a counter suffix (-1, -2, ...) if the directory already exists.\n */\nconst createPatchDir = (\n hostRepoDir: string,\n): Effect.Effect<string, SyncError> =>\n Effect.tryPromise({\n try: async () => {\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const base = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n\n const patchesRoot = join(hostRepoDir, CONFIG_DIR, PATCHES_DIR);\n await assertNoSymlinkComponents(\n hostRepoDir,\n patchesRoot,\n \"patch directory\",\n );\n await mkdir(patchesRoot, { recursive: true, mode: 0o700 });\n await assertNoSymlinkComponents(\n hostRepoDir,\n patchesRoot,\n \"patch directory\",\n );\n\n let dirName = base;\n let counter = 0;\n while (existsSync(join(patchesRoot, dirName))) {\n counter++;\n dirName = `${base}-${counter}`;\n }\n\n const patchDir = join(patchesRoot, dirName);\n await mkdir(patchDir, { recursive: true, mode: 0o700 });\n // The directory may be replaced between mkdir and the first artifact\n // write. Validate it from the trusted repository root as well as the\n // patches root so a raced symlink cannot redirect saved artifacts.\n await assertNoSymlinkComponents(hostRepoDir, patchDir, \"patch directory\");\n return patchDir;\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to create patch directory: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n/**\n * Count commits that `syncOut` would emit on the next run. Uses the same base\n * resolution as `syncOut` itself so the pre-flight count and the actual sync\n * stay in lockstep — SandboxLifecycle calls this to label \"Syncing N commits\n * to host\" without re-implementing the ref fallback.\n *\n * Degrades to 0 (rather than throwing) when either git command fails, matching\n * the prior inline behaviour at the call site. A missing sync-base ref is a\n * normal first-run state, so the rev-parse failure path falls back to hostHead.\n */\nexport const countCommitsToSync = (\n sandbox: SandboxService,\n cwd: string,\n hostHead: string,\n): Effect.Effect<number, never> =>\n Effect.gen(function* () {\n const baseResult = yield* sandbox\n .exec(`git rev-parse --verify --quiet ${shellQuote(SYNC_BASE_REF)}`, {\n cwd,\n })\n .pipe(\n Effect.catchAll(() =>\n Effect.succeed<ExecResult>({\n stdout: \"\",\n stderr: \"\",\n exitCode: 1,\n }),\n ),\n );\n const base =\n baseResult.exitCode === 0 && baseResult.stdout.trim().length > 0\n ? baseResult.stdout.trim()\n : hostHead;\n const countResult = yield* sandbox\n .exec(`git rev-list ${shellQuote(`${base}..HEAD`)} --count`, { cwd })\n .pipe(\n Effect.catchAll(() =>\n Effect.succeed<ExecResult>({\n stdout: \"0\",\n stderr: \"\",\n exitCode: 1,\n }),\n ),\n );\n if (countResult.exitCode !== 0) return 0;\n const parsed = parseInt(countResult.stdout.trim(), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n });\n\n/**\n * Sync changes from an isolated sandbox back to the host repo.\n *\n * Two-phase extraction with artifact persistence:\n * 1. Save all artifacts to `.shipyard/patches/<timestamp>/`\n * 2. Apply from saved directory; on failure, preserve artifacts and print recovery\n */\nexport const syncOut = (\n hostRepoDir: string,\n handle: IsolatedSandboxHandle,\n): Effect.Effect<void, SyncError> =>\n Effect.gen(function* () {\n const worktreePath = handle.worktreePath;\n\n const hostHead = (yield* execHostGit(\n [\"rev-parse\", \"HEAD\"],\n hostRepoDir,\n )).trim();\n const sandboxHead = (yield* execOk(handle, \"git rev-parse HEAD\", {\n cwd: worktreePath,\n })).stdout.trim();\n\n // Resolve the format-patch base from a sandbox-owned ref. `git am` rewrites\n // host SHAs, so after run 1 the host HEAD is unknown to the sandbox; the\n // ref pins the last commit we actually shipped. Absent on run 1 — and that\n // is the only run where host HEAD is still a valid base (sync-in just\n // copied it in). The two conditions are coupled. See ADR 0017.\n const baseRefResult = yield* execSandbox(\n handle,\n `git rev-parse --verify --quiet ${shellQuote(SYNC_BASE_REF)}`,\n { cwd: worktreePath },\n );\n const base =\n baseRefResult.exitCode === 0 && baseRefResult.stdout.trim().length > 0\n ? baseRefResult.stdout.trim()\n : hostHead;\n\n const hasCommits = base !== sandboxHead;\n\n // Check for uncommitted changes\n const diffResult = yield* execOk(handle, \"git diff --binary HEAD\", {\n cwd: worktreePath,\n }).pipe(\n Effect.mapError(\n (error) =>\n new SyncError({\n message: `Failed to inspect sandbox diff: ${error.message}`,\n }),\n ),\n );\n const hasDiff = diffResult.stdout.trim().length > 0;\n\n // Check for untracked files\n const lsFilesResult = yield* execOk(\n handle,\n \"git ls-files --others --exclude-standard -z\",\n { cwd: worktreePath },\n ).pipe(\n Effect.mapError(\n (error) =>\n new SyncError({\n message: `Failed to inspect sandbox untracked files: ${error.message}`,\n }),\n ),\n );\n const hasUntracked = lsFilesResult.stdout.length > 0;\n\n const untrackedFiles = hasUntracked\n ? lsFilesResult.stdout.split(\"\\0\").filter((f) => f.length > 0)\n : [];\n\n yield* Effect.try({\n try: () =>\n untrackedFiles.forEach((path) => {\n assertSafeGitWorktreePath(path);\n assertExcludesRepositoryRunner(path);\n }),\n catch: (error) => new SyncError({ message: String(error) }),\n });\n\n const changedPaths: string[] = [];\n if (hasCommits) {\n const committedNames = yield* execOk(\n handle,\n `git diff --name-only -z ${shellQuote(`${base}..HEAD`)}`,\n { cwd: worktreePath },\n );\n changedPaths.push(\n ...committedNames.stdout.split(\"\\0\").filter((path) => path.length > 0),\n );\n }\n if (hasDiff) {\n const uncommittedNames = yield* execOk(\n handle,\n \"git diff --name-only -z HEAD\",\n { cwd: worktreePath },\n );\n changedPaths.push(\n ...uncommittedNames.stdout\n .split(\"\\0\")\n .filter((path) => path.length > 0),\n );\n }\n yield* Effect.try({\n try: () => changedPaths.forEach(assertExcludesRepositoryRunner),\n catch: (error) => new SyncError({ message: String(error) }),\n });\n\n // Nothing to sync\n if (!hasCommits && !hasDiff && !hasUntracked) {\n return;\n }\n\n // --- Phase 1: Save all artifacts ---\n const patchDir = yield* createPatchDir(hostRepoDir);\n const relativePatchDir = join(CONFIG_DIR, PATCHES_DIR, basename(patchDir));\n\n const nonEmptyPatches: string[] = [];\n\n // Save committed patches\n if (hasCommits) {\n const mkTempResult = yield* execOk(\n handle,\n `mktemp -d -t ${RUNTIME_NAMESPACE}-patches-XXXXXX`,\n );\n const sandboxPatchDir = mkTempResult.stdout.trim();\n\n try {\n yield* execOk(\n handle,\n `git format-patch ${shellQuote(`${base}..HEAD`)} -o ${shellQuote(sandboxPatchDir)}`,\n { cwd: worktreePath },\n );\n\n const lsResult = yield* execOk(\n handle,\n `find ${shellQuote(sandboxPatchDir)} -maxdepth 1 -type f -print0`,\n );\n const patchPaths = lsResult.stdout\n .split(\"\\0\")\n .filter((path) => path.length > 0)\n .sort((left, right) => left.localeCompare(right));\n const patchPrefix = `${sandboxPatchDir.replace(/\\/+$/, \"\")}/`;\n\n for (const sandboxPatchPath of patchPaths) {\n if (!sandboxPatchPath.startsWith(patchPrefix)) {\n return yield* Effect.fail(\n new SyncError({\n message: `Sandbox returned a patch outside its patch directory: ${sandboxPatchPath}`,\n }),\n );\n }\n const patchName = sandboxPatchPath.slice(patchPrefix.length);\n try {\n assertSafePathSegment(patchName, \"patch filename\");\n } catch (error) {\n return yield* Effect.fail(\n new SyncError({\n message: `Refusing unsafe patch filename ${patchName}: ${error instanceof Error ? error.message : String(error)}`,\n }),\n );\n }\n const hostPatchPath = join(patchDir, patchName);\n yield* Effect.tryPromise({\n try: async () => {\n await assertNoSymlinkComponents(\n hostRepoDir,\n hostPatchPath,\n \"patch path\",\n );\n await handle.copyFileOut(sandboxPatchPath, hostPatchPath);\n await assertNoSymlinkComponents(\n hostRepoDir,\n hostPatchPath,\n \"patch path\",\n );\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to copy patch ${patchName}: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n if (!(yield* isEmptyPatch(hostPatchPath))) {\n nonEmptyPatches.push(hostPatchPath);\n }\n }\n } finally {\n yield* execSandbox(handle, `rm -rf ${shellQuote(sandboxPatchDir)}`);\n }\n }\n\n // Save uncommitted diff\n if (hasDiff) {\n const diffPath = join(patchDir, \"changes.patch\");\n yield* Effect.tryPromise({\n try: async () => {\n await assertNoSymlinkComponents(hostRepoDir, diffPath, \"diff patch\");\n await writeFile(diffPath, diffResult.stdout, { mode: 0o600 });\n await chmod(diffPath, 0o600);\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to write diff patch: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n }\n\n // Save untracked files\n if (hasUntracked) {\n const untrackedDir = join(patchDir, \"untracked\");\n for (const relPath of untrackedFiles) {\n let hostFilePath: string;\n try {\n assertSafeGitWorktreePath(relPath);\n hostFilePath = resolveSafeRelativePath(\n untrackedDir,\n relPath,\n \"untracked path\",\n );\n } catch (error) {\n return yield* Effect.fail(\n new SyncError({\n message: `Refusing unsafe untracked path ${relPath}: ${error instanceof Error ? error.message : String(error)}`,\n }),\n );\n }\n const sandboxFilePath = posix.join(worktreePath, relPath);\n const quotedSandboxFilePath = shellQuote(sandboxFilePath);\n const modeResult = yield* execOk(\n handle,\n `mode=$(stat -c '%a' -- ${quotedSandboxFilePath} 2>/dev/null || stat -f '%Lp' ${quotedSandboxFilePath}) && printf '%s\\\\n' \"$mode\"`,\n );\n const sandboxMode = Number.parseInt(modeResult.stdout.trim(), 8);\n if (!Number.isInteger(sandboxMode) || sandboxMode < 0) {\n return yield* Effect.fail(\n new SyncError({\n message: `Failed to read mode for untracked file ${relPath}`,\n }),\n );\n }\n yield* Effect.tryPromise({\n try: async () => {\n await mkdir(dirname(hostFilePath), {\n recursive: true,\n mode: 0o700,\n });\n await assertNoSymlinkComponents(\n hostRepoDir,\n hostFilePath,\n \"untracked path\",\n );\n await handle.copyFileOut(sandboxFilePath, hostFilePath);\n await chmod(hostFilePath, sandboxMode & 0o777);\n await assertNoSymlinkComponents(\n hostRepoDir,\n hostFilePath,\n \"untracked path\",\n );\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to save untracked file ${relPath}: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n }\n }\n\n // --- Phase 2: Apply from saved directory ---\n let failedStep: FailedStep | undefined;\n\n // Apply committed patches\n if (nonEmptyPatches.length > 0) {\n const abortResult = yield* Effect.either(\n execHostGit([\"am\", \"--abort\"], hostRepoDir),\n );\n void abortResult; // ignore abort failures\n const applyResult = yield* Effect.either(\n execHostGit([\"am\", \"--3way\", ...nonEmptyPatches], hostRepoDir),\n );\n if (applyResult._tag === \"Left\") {\n failedStep = \"commits\";\n }\n }\n\n // Apply uncommitted diff\n if (!failedStep && hasDiff) {\n const diffPath = join(patchDir, \"changes.patch\");\n const applyResult = yield* Effect.either(\n execHostGit([\"apply\", diffPath], hostRepoDir),\n );\n if (applyResult._tag === \"Left\") {\n failedStep = \"diff\";\n }\n }\n\n // Copy untracked files\n if (!failedStep && hasUntracked) {\n const copyResult = yield* Effect.either(\n Effect.tryPromise({\n try: async () => {\n const untrackedDir = join(patchDir, \"untracked\");\n for (const relPath of untrackedFiles) {\n const srcPath = resolveSafeRelativePath(\n untrackedDir,\n relPath,\n \"untracked path\",\n );\n const destPath = resolveSafeRelativePath(\n hostRepoDir,\n relPath,\n \"untracked path\",\n );\n await mkdir(dirname(destPath), { recursive: true, mode: 0o700 });\n await assertNoSymlinkComponents(\n hostRepoDir,\n srcPath,\n \"saved untracked path\",\n );\n await assertNoSymlinkComponents(\n hostRepoDir,\n destPath,\n \"untracked path\",\n );\n const sourceMode = (await stat(srcPath)).mode & 0o777;\n await copyFile(srcPath, destPath, constants.COPYFILE_EXCL);\n await chmod(destPath, sourceMode);\n }\n },\n catch: (e) =>\n new SyncError({\n message: `Failed to copy untracked files: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }),\n );\n if (copyResult._tag === \"Left\") {\n failedStep = \"untracked\";\n }\n }\n\n // Advance the sync-base ref whenever commits were actually shipped (or\n // there were none new to ship in this slice). Skipped only when `git am`\n // itself failed — those commits never landed on the host, and the next\n // run must retry from the same base. Diff/untracked failures don't undo\n // the commits that already landed; the ref must move so we don't re-emit.\n if (hasCommits && failedStep !== \"commits\") {\n yield* execOk(\n handle,\n `git update-ref ${shellQuote(SYNC_BASE_REF)} ${shellQuote(sandboxHead)}`,\n {\n cwd: worktreePath,\n },\n );\n }\n\n // --- Cleanup or preserve ---\n if (failedStep) {\n const msg = buildRecoveryMessage({\n patchDir: relativePatchDir,\n failedStep,\n hasCommits: nonEmptyPatches.length > 0,\n hasDiff,\n hasUntracked,\n });\n console.error(`\\n${msg}`);\n const description =\n failedStep === \"commits\"\n ? \"committed changes\"\n : failedStep === \"diff\"\n ? \"uncommitted changes\"\n : \"untracked files\";\n return yield* Effect.fail(\n new SyncError({\n message: `Failed to sync ${description}; recovery artifacts preserved at ${relativePatchDir}`,\n }),\n );\n } else {\n yield* Effect.tryPromise({\n try: async () => {\n await assertNoSymlinkComponents(\n hostRepoDir,\n patchDir,\n \"patch directory\",\n );\n await rm(patchDir, { recursive: true, force: true });\n const patchesRoot = join(hostRepoDir, CONFIG_DIR, PATCHES_DIR);\n try {\n const remaining = await readdir(patchesRoot);\n if (remaining.length === 0) {\n await assertNoSymlinkComponents(\n hostRepoDir,\n patchesRoot,\n \"patch directory\",\n );\n await rm(patchesRoot, {\n recursive: true,\n force: true,\n });\n }\n } catch {\n // ignore\n }\n },\n catch: () =>\n new SyncError({ message: \"Failed to clean up patch directory\" }),\n });\n }\n });\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { Deferred, Duration, Effect, Schedule } from \"effect\";\nimport { Display } from \"./Display.js\";\nimport {\n CommitCollectionTimeoutError,\n ExecError,\n GitSetupTimeoutError,\n HookTimeoutError,\n MergeToHostTimeoutError,\n SyncError,\n withTimeout,\n type SandboxError,\n} from \"./errors.js\";\nimport { type ExecResult, type SandboxService } from \"./SandboxFactory.js\";\nimport type { Timeouts } from \"./run.js\";\nimport { countCommitsToSync } from \"./syncOut.js\";\nimport { shellQuote } from \"./shellQuote.js\";\nimport { execHostGit } from \"./hostGit.js\";\n\nconst GIT_SETUP_TIMEOUT_MS = 10_000;\nconst HOOK_TIMEOUT_MS = 60_000;\nconst COMMIT_COLLECTION_TIMEOUT_MS = 30_000;\nconst MERGE_TO_HOST_TIMEOUT_MS = 30_000;\n\n/** Number of times a transient git setup exec is retried after the first attempt. */\nconst GIT_SETUP_MAX_RETRIES = 2;\n/** Delay between git setup retries — long enough to let a transient exec race clear. */\nconst GIT_SETUP_RETRY_DELAY_MS = 250;\n\n/**\n * Exit codes that indicate the shell could not exec the command rather than the\n * command itself failing — symptoms of a transient race under heavy container\n * load (e.g. overlayfs not yet ready, or the process being killed). Worth a retry.\n * 126: command found but not executable / exec failed. 137: killed (128 + SIGKILL).\n */\nconst TRANSIENT_EXEC_EXIT_CODES = new Set([126, 137]);\n\nconst isTransientExecError = (err: ExecError | GitSetupTimeoutError): boolean =>\n err._tag === \"ExecError\" &&\n err.exitCode !== undefined &&\n TRANSIENT_EXEC_EXIT_CODES.has(err.exitCode);\n\nconst execOk = (\n sandbox: SandboxService,\n command: string,\n options?: { cwd?: string; sudo?: boolean },\n): Effect.Effect<ExecResult, ExecError> =>\n Effect.flatMap(sandbox.exec(command, options), (result) =>\n result.exitCode !== 0\n ? Effect.fail(\n new ExecError({\n command,\n exitCode: result.exitCode,\n message: `Command failed (exit ${result.exitCode}): ${command}\\n${result.stderr}`,\n }),\n )\n : Effect.succeed(result),\n );\n\nconst execOkWithGitTimeout = (\n sandbox: SandboxService,\n command: string,\n gitSetupTimeoutMs: number,\n options?: { cwd?: string },\n): Effect.Effect<ExecResult, ExecError | GitSetupTimeoutError> =>\n execOk(sandbox, command, options).pipe(\n withTimeout(\n gitSetupTimeoutMs,\n () =>\n new GitSetupTimeoutError({\n message: `Git command timed out after ${gitSetupTimeoutMs}ms: ${command}`,\n timeoutMs: gitSetupTimeoutMs,\n command,\n }),\n ),\n // Each attempt is bounded by its own timeout (above); retry only transient\n // exec races, so a genuine git error or a hung exec still fails fast.\n Effect.retry({\n while: isTransientExecError,\n times: GIT_SETUP_MAX_RETRIES,\n schedule: Schedule.spaced(Duration.millis(GIT_SETUP_RETRY_DELAY_MS)),\n }),\n );\n\nconst execAsync = promisify(exec);\n\nexport type SandboxHooks = {\n readonly host?: {\n readonly onWorktreeReady?: ReadonlyArray<{\n readonly command: string;\n readonly timeoutMs?: number;\n }>;\n readonly onSandboxReady?: ReadonlyArray<{\n readonly command: string;\n readonly timeoutMs?: number;\n }>;\n };\n readonly sandbox?: {\n readonly onSandboxReady?: ReadonlyArray<{\n readonly command: string;\n readonly sudo?: boolean;\n readonly timeoutMs?: number;\n }>;\n };\n};\n\n/**\n * Runs an array of host-side hook commands sequentially.\n * Each command runs on the host with the given cwd.\n * Fails fast on non-zero exit.\n */\nexport const runHostHooks = (\n hooks: ReadonlyArray<{\n readonly command: string;\n readonly timeoutMs?: number;\n }>,\n cwd: string,\n signal?: AbortSignal,\n): Effect.Effect<void, ExecError | HookTimeoutError> =>\n Effect.gen(function* () {\n for (const hook of hooks) {\n const timeout = hook.timeoutMs ?? HOOK_TIMEOUT_MS;\n yield* Effect.tryPromise({\n try: () => execAsync(hook.command, { cwd, signal }),\n catch: (err) =>\n new ExecError({\n command: hook.command,\n message: `Host hook failed: ${hook.command}\\n${err instanceof Error ? err.message : String(err)}`,\n }),\n }).pipe(\n withTimeout(\n timeout,\n () =>\n new HookTimeoutError({\n message: `Host hook '${hook.command}' timed out after ${timeout}ms`,\n timeoutMs: timeout,\n command: hook.command,\n }),\n ),\n );\n }\n });\n\nexport interface SandboxLifecycleOptions {\n readonly hostRepoDir: string;\n readonly sandboxRepoDir: string;\n readonly hooks?: SandboxHooks;\n readonly branch?: string;\n /** Host-side path to the worktree directory. Required when sandboxRepoDir\n * is a sandbox path that doesn't exist on the host (e.g. /home/agent/workspace). */\n readonly hostWorktreePath?: string;\n /** Called after agent work completes but before host-side git operations (merge, commit collection).\n * Syncs changes from the Docker sandbox to the host worktree. */\n readonly applyToHost?: () => Effect.Effect<void, SyncError>;\n /** AbortSignal passed through to lifecycle hooks so they can cooperatively cancel.\n * When omitted, hooks receive a never-aborted signal. */\n readonly signal?: AbortSignal;\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n /** When true (used by `createWorktree`'s merge-to-head path), skip the post-merge\n * detach-and-delete of the source branch so the worktree handle stays usable for\n * subsequent `wt.run()` / `wt.interactive()` calls. */\n readonly keepSourceBranch?: boolean;\n}\n\nexport interface SandboxContext {\n readonly sandbox: SandboxService;\n readonly sandboxRepoDir: string;\n readonly baseHead: string;\n}\n\nexport interface SandboxLifecycleResult<A> {\n readonly result: A;\n readonly branch: string;\n readonly commits: { sha: string }[];\n}\n\nexport const withSandboxLifecycle = <A>(\n options: SandboxLifecycleOptions,\n sandbox: SandboxService,\n work: (ctx: SandboxContext) => Effect.Effect<A, SandboxError, Display>,\n): Effect.Effect<SandboxLifecycleResult<A>, SandboxError, Display> =>\n Effect.gen(function* () {\n const display = yield* Display;\n const { hostRepoDir, sandboxRepoDir, hooks, branch, hostWorktreePath } =\n options;\n\n // Resolve effective timeouts, falling back to the built-in defaults.\n const gitSetupTimeoutMs =\n options.timeouts?.gitSetupMs ?? GIT_SETUP_TIMEOUT_MS;\n const commitCollectionTimeoutMs =\n options.timeouts?.commitCollectionMs ?? COMMIT_COLLECTION_TIMEOUT_MS;\n const mergeToHostTimeoutMs =\n options.timeouts?.mergeToHostMs ?? MERGE_TO_HOST_TIMEOUT_MS;\n\n // Resolve signal: use caller's signal or a never-aborted one so hooks\n // can unconditionally reference it without null-checking.\n const signal = options.signal ?? new AbortController().signal;\n\n // Without an explicit branch, record host's current branch for cherry-pick\n const hostCurrentBranch: string | null = !branch\n ? yield* Effect.promise(async () => {\n return (\n await execHostGit(\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n hostRepoDir,\n )\n ).trim();\n })\n : null;\n\n // Read host git identity before entering the sandbox\n const [hostGitName, hostGitEmail] = yield* Effect.promise(async () => {\n const [nameResult, emailResult] = await Promise.all([\n execHostGit([\"config\", \"user.name\"], hostRepoDir)\n .then((stdout) => stdout.trim())\n .catch(() => \"\"),\n execHostGit([\"config\", \"user.email\"], hostRepoDir)\n .then((stdout) => stdout.trim())\n .catch(() => \"\"),\n ]);\n return [nameResult, emailResult] as const;\n });\n\n // For host-side operations, use hostWorktreePath (the real path on the host)\n // instead of sandboxRepoDir (which may be a sandbox path like /home/agent/workspace).\n const hostSideWorktreePath = hostWorktreePath ?? sandboxRepoDir;\n\n // Setup: onSandboxReady hooks\n let resolvedBranch = \"\";\n yield* display.taskLog(\"Setting up sandbox\", (message) =>\n Effect.gen(function* () {\n // Allow the sandbox user to use its synced Git workspace.\n yield* execOkWithGitTimeout(\n sandbox,\n `git config --global --add safe.directory ${shellQuote(sandboxRepoDir)}`,\n gitSetupTimeoutMs,\n );\n\n // Propagate host git identity into the sandbox so commits are attributed\n // to the actual developer without requiring manual setup.\n if (hostGitName) {\n yield* execOkWithGitTimeout(\n sandbox,\n `git config --global user.name ${shellQuote(hostGitName)}`,\n gitSetupTimeoutMs,\n );\n }\n if (hostGitEmail) {\n yield* execOkWithGitTimeout(\n sandbox,\n `git config --global user.email ${shellQuote(hostGitEmail)}`,\n gitSetupTimeoutMs,\n );\n }\n\n // Discover the branch in the synced sandbox repository\n resolvedBranch = (yield* execOkWithGitTimeout(\n sandbox,\n \"git rev-parse --abbrev-ref HEAD\",\n gitSetupTimeoutMs,\n { cwd: sandboxRepoDir },\n )).stdout.trim();\n\n // Run sandbox.onSandboxReady and host.onSandboxReady in parallel\n const sandboxHooks = hooks?.sandbox?.onSandboxReady;\n const hostOnSandboxReady = hooks?.host?.onSandboxReady;\n\n if (sandboxHooks?.length) {\n for (const hook of sandboxHooks) {\n message(hook.command);\n }\n }\n if (hostOnSandboxReady?.length) {\n for (const hook of hostOnSandboxReady) {\n message(`[host] ${hook.command}`);\n }\n }\n\n // Set up abort racing for sandbox hooks (sandbox.exec doesn't\n // natively support AbortSignal, so we race via Deferred).\n const abortDeferred = yield* Deferred.make<never, ExecError>();\n let abortCleanup: (() => void) | null = null;\n if (signal.aborted) {\n yield* Deferred.fail(\n abortDeferred,\n new ExecError({\n command: \"abort\",\n message: `Aborted: ${signal.reason}`,\n }),\n );\n } else {\n const onAbort = () => {\n Effect.runPromise(\n Deferred.fail(\n abortDeferred,\n new ExecError({\n command: \"abort\",\n message: `Aborted: ${signal.reason}`,\n }),\n ),\n ).catch(() => {});\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n abortCleanup = () => signal.removeEventListener(\"abort\", onAbort);\n }\n\n const sandboxHookEffects = (sandboxHooks ?? []).map((hook) => {\n const timeout = hook.timeoutMs ?? HOOK_TIMEOUT_MS;\n return Effect.raceFirst(\n execOk(sandbox, hook.command, {\n cwd: sandboxRepoDir,\n sudo: hook.sudo,\n }).pipe(\n withTimeout(\n timeout,\n () =>\n new HookTimeoutError({\n message: `Hook '${hook.command}' timed out after ${timeout}ms`,\n timeoutMs: timeout,\n command: hook.command,\n }),\n ),\n ),\n Deferred.await(abortDeferred) as Effect.Effect<\n never,\n ExecError,\n never\n >,\n );\n });\n\n const hostHookEffects = (hostOnSandboxReady ?? []).map((hook) => {\n const timeout = hook.timeoutMs ?? HOOK_TIMEOUT_MS;\n return Effect.tryPromise({\n try: () =>\n execAsync(hook.command, {\n cwd: hostSideWorktreePath,\n signal,\n }),\n catch: (err) =>\n new ExecError({\n command: hook.command,\n message: `Host hook failed: ${hook.command}\\n${err instanceof Error ? err.message : String(err)}`,\n }),\n }).pipe(\n withTimeout(\n timeout,\n () =>\n new HookTimeoutError({\n message: `Host hook '${hook.command}' timed out after ${timeout}ms`,\n timeoutMs: timeout,\n command: hook.command,\n }),\n ),\n );\n });\n\n const allOnSandboxReady = [...sandboxHookEffects, ...hostHookEffects];\n yield* (\n allOnSandboxReady.length > 0\n ? Effect.all(allOnSandboxReady, { concurrency: \"unbounded\" })\n : Effect.void\n ).pipe(Effect.ensuring(Effect.sync(() => abortCleanup?.())));\n }),\n );\n\n const targetBranch = branch ?? resolvedBranch;\n\n // Record base HEAD from the host worktree. syncOut may rewrite commit SHAs\n // through format-patch/am, so the host SHA is the merge baseline.\n const baseHead = yield* Effect.promise(async () => {\n return (\n await execHostGit([\"rev-parse\", \"HEAD\"], hostSideWorktreePath)\n ).trim();\n });\n\n // Run the caller's work\n const result = yield* work({ sandbox, sandboxRepoDir, baseHead });\n\n // Sync changes from sandbox to host worktree (isolated sandbox only).\n // The count resolves the base from the same sandbox-owned ref `syncOut`\n // uses, so on run 2+ we don't anchor to the host's `am`-rewritten HEAD\n // (which the sandbox has never seen) and silently degrade to 0.\n if (options.applyToHost) {\n const commitCount = yield* countCommitsToSync(\n sandbox,\n sandboxRepoDir,\n baseHead,\n );\n\n yield* display.taskLog(\n commitCount > 0\n ? `Syncing ${commitCount} commit${commitCount !== 1 ? \"s\" : \"\"} to host`\n : \"No commits to sync out\",\n () => options.applyToHost!(),\n );\n }\n\n // Collect commits and handle cherry-pick for temp branches\n let commits: { sha: string }[];\n let finalBranch: string;\n\n if (hostCurrentBranch !== null) {\n // Temp branch mode: merge temp branch into host branch, then delete temp branch.\n // We use merge instead of cherry-pick because cherry-pick breaks when the\n // temp branch contains merge commits (e.g. a merge agent merging multiple parallel\n // branches). A regular merge handles both the fast-forward case (host branch hasn't\n // moved) and the diverged case (host branch has new commits since the worktree started).\n\n // Check if there are any new commits on the temp branch\n const hasNewCommits = yield* Effect.promise(async () => {\n try {\n const stdout = await execHostGit(\n [\"rev-list\", `${baseHead}..HEAD`, \"--count\"],\n hostSideWorktreePath,\n );\n return parseInt(stdout.trim(), 10) > 0;\n } catch {\n return false;\n }\n });\n\n // Detach the worktree from the temp branch so the branch can be deleted.\n // Skipped when `keepSourceBranch` is set (createWorktree's merge-to-head\n // path) so the worktree stays on its source branch for re-use.\n if (!options.keepSourceBranch) {\n if (options.applyToHost) {\n // Sync-out leaves the host worktree attached to the source branch.\n // Detaching only the sandbox cannot release that host branch.\n yield* Effect.tryPromise({\n try: () =>\n execHostGit([\"checkout\", \"--detach\"], hostSideWorktreePath),\n catch: (error) =>\n new SyncError({\n message: `Failed to detach host worktree: ${String(error)}`,\n }),\n });\n } else {\n yield* execOk(sandbox, \"git checkout --detach\", {\n cwd: sandboxRepoDir,\n });\n }\n }\n\n if (hasNewCommits) {\n // Fast-forward host's current branch to the temp branch\n yield* display.taskLog(`Merging to ${hostCurrentBranch}`, () =>\n Effect.tryPromise({\n try: async () => {\n try {\n await execHostGit([\"merge\", \"--\", resolvedBranch], hostRepoDir);\n } catch {\n throw new Error(\n `Merge of '${resolvedBranch}' onto '${hostCurrentBranch}' failed. ` +\n `The temporary branch '${resolvedBranch}' has been preserved. ` +\n `To retry: git merge ${resolvedBranch}, ` +\n `then clean up: git branch -D ${resolvedBranch}`,\n );\n }\n },\n catch: (e) =>\n new SyncError({\n message: String(e instanceof Error ? e.message : e),\n }),\n }).pipe(\n withTimeout(\n mergeToHostTimeoutMs,\n () =>\n new MergeToHostTimeoutError({\n message: `Merge of '${resolvedBranch}' to '${hostCurrentBranch}' timed out after ${mergeToHostTimeoutMs}ms`,\n timeoutMs: mergeToHostTimeoutMs,\n sourceBranch: resolvedBranch,\n targetBranch: hostCurrentBranch,\n }),\n ),\n ),\n );\n }\n\n // Delete the temp branch (now merged into host branch). Skipped when\n // `keepSourceBranch` is set: the source branch is the worktree's active\n // branch and the worktree's lifetime outlives the lifecycle.\n if (!options.keepSourceBranch) {\n yield* Effect.promise(() =>\n execHostGit(\n [\"branch\", \"-D\", \"--\", resolvedBranch],\n hostRepoDir,\n ).catch(() => {}),\n );\n }\n\n // Collect the commits now on the host branch\n commits = yield* display.taskLog(\"Collecting commits\", () =>\n Effect.promise(async () => {\n try {\n const stdout = await execHostGit(\n [\"rev-list\", `${baseHead}..HEAD`, \"--reverse\"],\n hostRepoDir,\n );\n const lines = stdout.trim();\n if (!lines) return [];\n return lines.split(\"\\n\").map((sha) => ({ sha }));\n } catch {\n return [];\n }\n }).pipe(\n withTimeout(\n commitCollectionTimeoutMs,\n () =>\n new CommitCollectionTimeoutError({\n message: `Commit collection timed out after ${commitCollectionTimeoutMs}ms`,\n timeoutMs: commitCollectionTimeoutMs,\n }),\n ),\n ),\n );\n\n finalBranch = hostCurrentBranch;\n } else {\n // Explicit branch: commits stay on that branch\n commits = yield* display.taskLog(\"Collecting commits\", () =>\n Effect.promise(async () => {\n try {\n const stdout = await execHostGit(\n [\n \"rev-list\",\n `${baseHead}..refs/heads/${targetBranch}`,\n \"--reverse\",\n ],\n hostRepoDir,\n );\n const lines = stdout.trim();\n if (!lines) return [];\n return lines.split(\"\\n\").map((sha) => ({ sha }));\n } catch {\n // Branch doesn't exist on host (no commits were produced)\n return [];\n }\n }).pipe(\n withTimeout(\n commitCollectionTimeoutMs,\n () =>\n new CommitCollectionTimeoutError({\n message: `Commit collection timed out after ${commitCollectionTimeoutMs}ms`,\n timeoutMs: commitCollectionTimeoutMs,\n }),\n ),\n ),\n );\n\n finalBranch = targetBranch;\n }\n\n return { result, branch: finalBranch, commits };\n });\n","import { toSessionTransferHandle } from \"./SandboxProvider.js\";\nimport { Context, Effect, Exit, Layer } from \"effect\";\nimport { FileSystem } from \"@effect/platform\";\nimport {\n AgentError,\n AgentIdleTimeoutError,\n CopyError,\n ExecError,\n SyncError,\n WorktreeError,\n type SandboxError,\n} from \"./errors.js\";\nimport type { Timeouts } from \"./run.js\";\nimport * as WorktreeManager from \"./WorktreeManager.js\";\nimport type {\n SandboxProvider,\n BranchStrategy,\n SessionTransferHandle,\n IsolatedSandboxHandle,\n} from \"./SandboxProvider.js\";\nimport { runHostHooks, type SandboxHooks } from \"./SandboxLifecycle.js\";\nimport { startSandbox } from \"./startSandbox.js\";\nimport { syncOut } from \"./syncOut.js\";\n\nexport interface ExecResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly exitCode: number;\n}\n\nexport interface SandboxService {\n readonly exec: (\n command: string,\n options?: {\n onLine?: (line: string) => void;\n cwd?: string;\n sudo?: boolean;\n stdin?: string;\n signal?: AbortSignal;\n /** Reject/terminate the command after this many combined output bytes. */\n maxOutputBytes?: number;\n },\n ) => Effect.Effect<ExecResult, ExecError>;\n\n /** Copy a file or directory from the host into the sandbox. */\n readonly copyIn: (\n hostPath: string,\n sandboxPath: string,\n ) => Effect.Effect<void, CopyError>;\n\n /** Copy a single file from the sandbox to the host. */\n readonly copyFileOut: (\n sandboxPath: string,\n hostPath: string,\n ) => Effect.Effect<void, CopyError>;\n}\n\n/** Wrap the Docker handle in the Effect service used by execution. */\nexport const makeSandboxFromHandle = (\n handle: IsolatedSandboxHandle,\n): SandboxService => ({\n exec: (command, options) =>\n Effect.tryPromise({\n try: () => handle.exec(command, options),\n catch: (e) =>\n new ExecError({\n command,\n message: `exec failed: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }),\n copyIn: (hostPath, sandboxPath) =>\n Effect.tryPromise({\n try: () => handle.copyIn(hostPath, sandboxPath),\n catch: (e) =>\n new CopyError({\n message: `copyIn failed: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }),\n copyFileOut: (sandboxPath, hostPath) =>\n Effect.tryPromise({\n try: () => handle.copyFileOut(sandboxPath, hostPath),\n catch: (e) =>\n new CopyError({\n message: `copyFileOut failed: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }),\n});\n\n/** The project path inside the Docker sandbox. */\nexport const SANDBOX_REPO_DIR = \"/home/agent/workspace\";\n\nexport interface SandboxInfo {\n /** Host-side path to the worktree directory (worktree/branch mode only). */\n readonly hostWorktreePath?: string;\n /** Absolute path to the worktree inside the sandbox, as reported by the provider. */\n readonly sandboxRepoPath: string;\n /** Sync changes from the sandbox to the host worktree (isolated providers only). */\n readonly applyToHost?: () => Effect.Effect<void, SyncError>;\n /** File-transfer handle for agent session capture and resume. */\n readonly sessionTransferHandle?: SessionTransferHandle;\n}\n\nexport interface WithSandboxResult<A> {\n readonly value: A;\n /** Host path to the preserved worktree, set when the worktree was left behind due to uncommitted changes. */\n readonly preservedWorktreePath?: string;\n}\n\nexport class SandboxFactory extends Context.Tag(\"SandboxFactory\")<\n SandboxFactory,\n {\n readonly withSandbox: <A, E, R>(\n makeEffect: (\n info: SandboxInfo,\n sandbox: SandboxService,\n ) => Effect.Effect<A, E, R>,\n ) => Effect.Effect<WithSandboxResult<A>, E | SandboxError, R>;\n }\n>() {}\n\nexport class SandboxConfig extends Context.Tag(\"SandboxConfig\")<\n SandboxConfig,\n {\n readonly env: Record<string, string>;\n readonly hostRepoDir: string;\n /** Paths relative to the host repo root to copy into the worktree before sandbox start. */\n readonly copyToWorktree?: string[];\n /** When specified, the run name is included in the auto-generated branch and worktree names. */\n readonly name?: string;\n /** Sandbox provider — delegates sandbox lifecycle to the provider. */\n readonly sandboxProvider: SandboxProvider;\n /** Branch strategy — controls how the agent's changes relate to branches. */\n readonly branchStrategy: BranchStrategy;\n /** Lifecycle hooks grouped by execution location (host or sandbox). */\n readonly hooks?: SandboxHooks;\n /** AbortSignal threaded to lifecycle hooks so they can cooperatively cancel. */\n readonly signal?: AbortSignal;\n /** Override default timeouts for built-in lifecycle steps. */\n readonly timeouts?: Timeouts;\n }\n>() {}\n\n/**\n * Print a message to stderr about a preserved worktree, with review and cleanup instructions.\n */\nconst printWorktreePreservedMessage = (\n worktreePath: string,\n reason: string,\n): void => {\n console.error(`\\n${reason}`);\n console.error(` To review: cd ${worktreePath}`);\n console.error(` To clean up: git worktree remove --force ${worktreePath}`);\n};\n\n/**\n * Check for uncommitted changes and either preserve or remove the worktree.\n * Returns the preserved path if preserved, undefined if removed.\n */\nconst cleanupWorktree = (\n worktreePath: string,\n exit: Exit.Exit<unknown, unknown>,\n): Effect.Effect<string | undefined, WorktreeError> =>\n WorktreeManager.hasUncommittedChanges(worktreePath).pipe(\n Effect.catchAll(() => Effect.succeed(false)),\n Effect.flatMap((isDirty) => {\n if (isDirty) {\n printWorktreePreservedMessage(\n worktreePath,\n Exit.isSuccess(exit)\n ? `Run succeeded but worktree has uncommitted changes at ${worktreePath}`\n : `Worktree preserved at ${worktreePath}`,\n );\n return Effect.succeed(worktreePath as string | undefined);\n }\n if (!Exit.isSuccess(exit)) {\n console.error(`\\nWorktree removed (no uncommitted changes)`);\n }\n return WorktreeManager.remove(worktreePath).pipe(\n Effect.map(() => undefined as string | undefined),\n );\n }),\n );\n\n/**\n * Attach the preserved worktree path to AgentIdleTimeoutError and AgentError so\n * programmatic callers can build on top of the preserved worktree.\n */\nconst attachPreservedPath = <E>(\n path: string | undefined,\n e: E | SandboxError,\n): E | SandboxError => {\n if (path !== undefined) {\n if (e instanceof AgentIdleTimeoutError) {\n return new AgentIdleTimeoutError({\n message: e.message,\n timeoutMs: e.timeoutMs,\n preservedWorktreePath: path,\n }) as unknown as E | SandboxError;\n }\n if (e instanceof AgentError) {\n return new AgentError({\n message: e.message,\n preservedWorktreePath: path,\n }) as unknown as E | SandboxError;\n }\n }\n return e;\n};\n\nexport const WorktreeDockerSandboxFactory = {\n layer: Layer.effect(\n SandboxFactory,\n Effect.gen(function* () {\n const {\n env,\n hostRepoDir,\n copyToWorktree: copyPaths,\n name,\n sandboxProvider,\n branchStrategy,\n hooks,\n signal,\n timeouts,\n } = yield* SandboxConfig;\n\n const branch =\n branchStrategy.type === \"branch\" ? branchStrategy.branch : undefined;\n const baseBranch =\n branchStrategy.type === \"branch\"\n ? branchStrategy.baseBranch\n : undefined;\n const fileSystem = yield* FileSystem.FileSystem;\n\n /** Prune stale worktrees (best-effort), then create a fresh one. */\n const pruneAndCreate = () =>\n WorktreeManager.pruneStale(hostRepoDir).pipe(\n Effect.catchAll((e) =>\n Effect.sync(() => {\n console.error(\n \"[shipyard] Warning: failed to prune stale worktrees:\",\n e.message,\n );\n }),\n ),\n Effect.andThen(\n branch\n ? WorktreeManager.create(hostRepoDir, { branch, baseBranch })\n : WorktreeManager.create(hostRepoDir, { name }),\n ),\n Effect.provideService(FileSystem.FileSystem, fileSystem),\n );\n\n return {\n withSandbox: <A, E, R>(\n makeEffect: (\n info: SandboxInfo,\n sandbox: SandboxService,\n ) => Effect.Effect<A, E, R>,\n ): Effect.Effect<WithSandboxResult<A>, E | SandboxError, R> => {\n // Docker creates a worktree and transfers it through a Git bundle.\n {\n let preservedPath: string | undefined;\n\n // Nested so the worktree is always cleaned up (outer release) even\n // when hooks or sandbox start fail. The provider handle is closed by\n // the inner release, which only runs once it exists.\n return Effect.acquireUseRelease(\n pruneAndCreate(),\n (worktreeInfo) =>\n (hooks?.host?.onWorktreeReady?.length\n ? runHostHooks(\n hooks.host.onWorktreeReady,\n worktreeInfo.path,\n signal,\n )\n : Effect.void\n ).pipe(\n Effect.andThen(\n Effect.acquireUseRelease(\n startSandbox({\n provider: sandboxProvider,\n hostRepoDir: worktreeInfo.path,\n sourceRepoDir: hostRepoDir,\n env,\n copyPaths,\n copyTimeoutMs: timeouts?.copyToWorktreeMs,\n }),\n ({ sandbox, worktreePath, handle }) =>\n makeEffect(\n {\n hostWorktreePath: worktreeInfo.path,\n sandboxRepoPath: worktreePath,\n sessionTransferHandle:\n toSessionTransferHandle(handle),\n applyToHost: () =>\n syncOut(\n worktreeInfo.path,\n handle as IsolatedSandboxHandle,\n ),\n },\n sandbox,\n ),\n ({ handle }) =>\n Effect.tryPromise({\n try: () => handle.close(),\n catch: () => undefined,\n }).pipe(Effect.orDie),\n ),\n ),\n ) as Effect.Effect<A, E | SandboxError, R>,\n (worktreeInfo, exit) =>\n cleanupWorktree(worktreeInfo.path, exit).pipe(\n Effect.tap((p) => {\n preservedPath = p;\n }),\n Effect.asVoid,\n Effect.orDie,\n ),\n ).pipe(\n Effect.map((value) => ({\n value,\n preservedWorktreePath: preservedPath,\n })),\n Effect.mapError((e: E | SandboxError) =>\n attachPreservedPath(preservedPath, e),\n ),\n );\n }\n },\n };\n }),\n ),\n};\n","/**\n * Sync-in: transfer a host git repo into an isolated sandbox via git bundle.\n *\n * Creates a git bundle capturing all refs from the host repo,\n * copies it into the sandbox via the provider's copyIn, and\n * clones from the bundle inside the sandbox.\n */\n\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { Effect } from \"effect\";\nimport type { IsolatedSandboxHandle } from \"./SandboxProvider.js\";\nimport { SyncError } from \"./errors.js\";\nimport { execHostGit as execSafeHostGit } from \"./hostGit.js\";\nimport { CONFIG_DIR, RUNNER_DIR, RUNTIME_NAMESPACE } from \"./runtimeNames.js\";\nimport { shellQuote } from \"./shellQuote.js\";\n\n/**\n * Execute a command on the host side, returning stdout.\n * Fails with SyncError on non-zero exit.\n */\nconst execHostGit = (\n args: string[],\n cwd: string,\n): Effect.Effect<string, SyncError> =>\n Effect.tryPromise({\n try: () => execSafeHostGit(args, cwd),\n catch: (e) =>\n new SyncError({\n message: `Host command failed: git ${args.join(\" \")}\\n${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n/**\n * Execute a command in the sandbox, failing with SyncError if it exits non-zero.\n */\nconst execOk = (\n handle: IsolatedSandboxHandle,\n command: string,\n options?: { cwd?: string },\n): Effect.Effect<\n { stdout: string; stderr: string; exitCode: number },\n SyncError\n> =>\n Effect.tryPromise({\n try: () => handle.exec(command, options),\n catch: (e) =>\n new SyncError({\n message: `Sandbox exec failed: ${command}\\n${e instanceof Error ? e.message : String(e)}`,\n }),\n }).pipe(\n Effect.flatMap((result) =>\n result.exitCode !== 0\n ? Effect.fail(\n new SyncError({\n message: `Sandbox command failed (exit ${result.exitCode}): ${command}\\n${result.stderr}`,\n }),\n )\n : Effect.succeed(result),\n ),\n );\n\n/**\n * Sync a host git repo into an isolated sandbox.\n *\n * 1. `git bundle create --all` on the host\n * 2. `copyIn` the bundle to the sandbox\n * 3. `git clone` from the bundle inside the sandbox\n * 4. Verify HEAD matches\n *\n * @returns The branch name that was checked out\n */\nexport const syncIn = (\n hostRepoDir: string,\n handle: IsolatedSandboxHandle,\n): Effect.Effect<{ branch: string }, SyncError> =>\n Effect.gen(function* () {\n const protectedRunnerPath = `${CONFIG_DIR}/${RUNNER_DIR}`;\n const runnerObjects = yield* execHostGit(\n [\"rev-list\", \"--objects\", \"--all\", \"--\", protectedRunnerPath],\n hostRepoDir,\n );\n if (runnerObjects.trim().length > 0) {\n return yield* Effect.fail(\n new SyncError({\n message: `Refusing to copy repository history into the sandbox because it contains protected repository runner files under ${protectedRunnerPath}. Remove those files from all refs before retrying.`,\n }),\n );\n }\n\n // Get current branch from host\n const branch = (yield* execHostGit(\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n hostRepoDir,\n )).trim();\n\n // Create git bundle on host capturing all refs\n const bundleDir = yield* Effect.tryPromise({\n try: () => mkdtemp(join(tmpdir(), `${RUNTIME_NAMESPACE}-bundle-`)),\n catch: (e) =>\n new SyncError({\n message: `Failed to create temp dir: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n const bundleHostPath = join(bundleDir, \"repo.bundle\");\n\n yield* Effect.ensuring(\n Effect.gen(function* () {\n yield* execHostGit(\n [\"bundle\", \"create\", bundleHostPath, \"--all\"],\n hostRepoDir,\n );\n\n // Create temp dir in sandbox and copy bundle in\n const mkTempResult = yield* execOk(\n handle,\n `mktemp -d -t ${RUNTIME_NAMESPACE}-XXXXXX`,\n );\n const sandboxTmpDir = mkTempResult.stdout.trim();\n const bundleSandboxPath = `${sandboxTmpDir}/repo.bundle`;\n\n yield* Effect.tryPromise({\n try: () => handle.copyIn(bundleHostPath, bundleSandboxPath),\n catch: (e) =>\n new SyncError({\n message: `Failed to copy bundle into sandbox: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n\n // Clone from bundle into the worktree\n const worktreePath = handle.worktreePath;\n yield* execOk(\n handle,\n `git clone ${shellQuote(bundleSandboxPath)} ${shellQuote(`${worktreePath}_clone`)}`,\n );\n\n // Move contents from clone into worktree (git clone requires empty target)\n yield* execOk(\n handle,\n `rm -rf ${shellQuote(worktreePath)} && mv ${shellQuote(`${worktreePath}_clone`)} ${shellQuote(worktreePath)}`,\n );\n\n // Checkout the correct branch\n yield* execOk(handle, `git checkout ${shellQuote(branch)}`, {\n cwd: worktreePath,\n });\n\n // Clean up sandbox temp files\n yield* Effect.tryPromise({\n try: () => handle.exec(`rm -rf ${shellQuote(sandboxTmpDir)}`),\n catch: () =>\n new SyncError({ message: \"Failed to clean up sandbox temp dir\" }),\n });\n\n // Verify sync succeeded\n const hostHead = (yield* execHostGit(\n [\"rev-parse\", \"HEAD\"],\n hostRepoDir,\n )).trim();\n const sandboxHead = (yield* execOk(handle, \"git rev-parse HEAD\", {\n cwd: worktreePath,\n })).stdout.trim();\n\n if (hostHead !== sandboxHead) {\n yield* Effect.fail(\n new SyncError({\n message: `HEAD mismatch after sync-in: host=${hostHead} sandbox=${sandboxHead}`,\n }),\n );\n }\n }),\n // Clean up host-side bundle temp dir (runs regardless of success/failure)\n Effect.promise(() => rm(bundleDir, { recursive: true, force: true })),\n );\n\n return { branch };\n });\n","import { Effect } from \"effect\";\nimport { existsSync } from \"node:fs\";\nimport { posix } from \"node:path\";\nimport {\n ContainerStartTimeoutError,\n CopyToWorktreeTimeoutError,\n SyncError,\n SyncInTimeoutError,\n WorktreeError,\n withTimeout,\n type DockerError,\n} from \"./errors.js\";\nimport type {\n IsolatedSandboxProvider,\n IsolatedSandboxHandle,\n} from \"./SandboxProvider.js\";\nimport {\n type SandboxService,\n makeSandboxFromHandle,\n} from \"./SandboxFactory.js\";\nimport { syncIn } from \"./syncIn.js\";\nimport {\n assertNoSymlinkComponents,\n resolveSafeRelativePath,\n} from \"./pathSecurity.js\";\nimport { assertExcludesRepositoryRunner } from \"./runnerSecurity.js\";\n\nexport interface StartSandboxOptions {\n readonly sourceRepoDir?: string;\n /** Source for selected files; defaults to the original repository. */\n readonly copySourceDir?: string;\n readonly provider: IsolatedSandboxProvider;\n readonly hostRepoDir: string;\n readonly env: Record<string, string>;\n readonly copyPaths?: string[];\n readonly copyTimeoutMs?: number;\n}\n\nexport interface StartSandboxResult {\n readonly handle: IsolatedSandboxHandle;\n readonly sandbox: SandboxService;\n readonly worktreePath: string;\n}\n\nconst CONTAINER_START_TIMEOUT_MS = 120_000;\nconst SYNC_IN_TIMEOUT_MS = 120_000;\nexport const COPY_PATHS_TIMEOUT_MS = 60_000;\n\nexport const startSandbox = (\n options: StartSandboxOptions,\n): Effect.Effect<\n StartSandboxResult,\n | DockerError\n | WorktreeError\n | SyncError\n | ContainerStartTimeoutError\n | SyncInTimeoutError\n | CopyToWorktreeTimeoutError\n> =>\n Effect.gen(function* () {\n const handle = yield* Effect.tryPromise({\n try: () =>\n options.provider.create({\n env: options.env,\n hostRepoPath: options.sourceRepoDir ?? options.hostRepoDir,\n }),\n catch: (e) =>\n new WorktreeError({\n message: `Isolated provider '${options.provider.name}' setup failed: ${e instanceof Error ? e.message : String(e)}`,\n }),\n }).pipe(\n withTimeout(\n CONTAINER_START_TIMEOUT_MS,\n () =>\n new ContainerStartTimeoutError({\n message: `Isolated sandbox container start timed out after ${CONTAINER_START_TIMEOUT_MS}ms`,\n timeoutMs: CONTAINER_START_TIMEOUT_MS,\n }),\n ),\n );\n\n return yield* Effect.gen(function* () {\n yield* syncIn(options.hostRepoDir, handle).pipe(\n withTimeout(\n SYNC_IN_TIMEOUT_MS,\n () =>\n new SyncInTimeoutError({\n message: `Sync-in timed out after ${SYNC_IN_TIMEOUT_MS}ms`,\n timeoutMs: SYNC_IN_TIMEOUT_MS,\n }),\n ),\n );\n\n if (options.copyPaths && options.copyPaths.length > 0) {\n const pathsToCopy = options.copyPaths;\n const copySourceDir =\n options.copySourceDir ?? options.sourceRepoDir ?? options.hostRepoDir;\n const copyTimeoutMs = options.copyTimeoutMs ?? COPY_PATHS_TIMEOUT_MS;\n yield* Effect.gen(function* () {\n for (const relativePath of pathsToCopy) {\n let hostPath: string;\n let sandboxPath: string;\n try {\n assertExcludesRepositoryRunner(relativePath);\n hostPath = resolveSafeRelativePath(\n copySourceDir,\n relativePath,\n \"copy path\",\n );\n resolveSafeRelativePath(\n handle.worktreePath,\n relativePath,\n \"copy path\",\n );\n // Sandbox paths are POSIX even when Shipyard is running on Windows.\n sandboxPath = posix.join(handle.worktreePath, relativePath);\n } catch (error) {\n return yield* Effect.fail(\n new WorktreeError({\n message: `Refusing unsafe copy path ${relativePath}: ${error instanceof Error ? error.message : String(error)}`,\n }),\n );\n }\n if (!existsSync(hostPath)) {\n continue;\n }\n yield* Effect.tryPromise({\n try: async () => {\n await assertNoSymlinkComponents(\n copySourceDir,\n hostPath,\n \"copy source\",\n );\n },\n catch: (error) =>\n new WorktreeError({\n message: `Refusing symlinked copy path ${relativePath}: ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n yield* Effect.tryPromise({\n try: () => handle.copyIn(hostPath, sandboxPath),\n catch: (e) =>\n new WorktreeError({\n message: `Failed to copy ${relativePath} into sandbox: ${e instanceof Error ? e.message : String(e)}`,\n }),\n });\n }\n }).pipe(\n withTimeout(\n copyTimeoutMs,\n () =>\n new CopyToWorktreeTimeoutError({\n message: `Copying paths to sandbox timed out after ${copyTimeoutMs}ms`,\n timeoutMs: copyTimeoutMs,\n paths: pathsToCopy,\n }),\n ),\n );\n }\n\n return {\n handle,\n sandbox: makeSandboxFromHandle(handle),\n worktreePath: handle.worktreePath,\n };\n }).pipe(Effect.onError(() => Effect.promise(() => handle.close())));\n });\n"]}
|