@rockclaver/sandcastle 0.7.0
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/LICENSE +21 -0
- package/README.md +1355 -0
- package/dist/MountConfig-CmXclHA5.d.ts +26 -0
- package/dist/SandboxProvider-EkSMuBp8.d.ts +243 -0
- package/dist/chunk-72UVAC7B.js +99 -0
- package/dist/chunk-72UVAC7B.js.map +1 -0
- package/dist/chunk-BIWNFKGV.js +22 -0
- package/dist/chunk-BIWNFKGV.js.map +1 -0
- package/dist/chunk-FKX3DRTL.js +362 -0
- package/dist/chunk-FKX3DRTL.js.map +1 -0
- package/dist/chunk-NGBM7T3E.js +76 -0
- package/dist/chunk-NGBM7T3E.js.map +1 -0
- package/dist/chunk-QCLZLPJ7.js +26431 -0
- package/dist/chunk-QCLZLPJ7.js.map +1 -0
- package/dist/chunk-VAKEM3U2.js +26997 -0
- package/dist/chunk-VAKEM3U2.js.map +1 -0
- package/dist/index.d.ts +943 -0
- package/dist/index.js +2393 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +19268 -0
- package/dist/main.js.map +1 -0
- package/dist/mountUtils-CCA-bbpK.d.ts +25 -0
- package/dist/sandboxes/daytona.d.ts +60 -0
- package/dist/sandboxes/daytona.js +122 -0
- package/dist/sandboxes/daytona.js.map +1 -0
- package/dist/sandboxes/docker.d.ts +110 -0
- package/dist/sandboxes/docker.js +9 -0
- package/dist/sandboxes/docker.js.map +1 -0
- package/dist/sandboxes/no-sandbox.d.ts +38 -0
- package/dist/sandboxes/no-sandbox.js +7 -0
- package/dist/sandboxes/no-sandbox.js.map +1 -0
- package/dist/sandboxes/podman.d.ts +124 -0
- package/dist/sandboxes/podman.js +299 -0
- package/dist/sandboxes/podman.js.map +1 -0
- package/dist/sandboxes/vercel.d.ts +104 -0
- package/dist/sandboxes/vercel.js +148 -0
- package/dist/sandboxes/vercel.js.map +1 -0
- package/dist/templates/blank/main.mts +14 -0
- package/dist/templates/blank/prompt.md +12 -0
- package/dist/templates/blank/template.json +4 -0
- package/dist/templates/parallel-planner/implement-prompt.md +62 -0
- package/dist/templates/parallel-planner/main.mts +204 -0
- package/dist/templates/parallel-planner/merge-prompt.md +26 -0
- package/dist/templates/parallel-planner/plan-prompt.md +37 -0
- package/dist/templates/parallel-planner/template.json +4 -0
- package/dist/templates/parallel-planner-with-review/CODING_STANDARDS.md +27 -0
- package/dist/templates/parallel-planner-with-review/implement-prompt.md +62 -0
- package/dist/templates/parallel-planner-with-review/main.mts +226 -0
- package/dist/templates/parallel-planner-with-review/merge-prompt.md +26 -0
- package/dist/templates/parallel-planner-with-review/plan-prompt.md +37 -0
- package/dist/templates/parallel-planner-with-review/review-prompt.md +55 -0
- package/dist/templates/parallel-planner-with-review/template.json +4 -0
- package/dist/templates/sequential-reviewer/CODING_STANDARDS.md +27 -0
- package/dist/templates/sequential-reviewer/implement-prompt.md +53 -0
- package/dist/templates/sequential-reviewer/main.mts +119 -0
- package/dist/templates/sequential-reviewer/review-prompt.md +55 -0
- package/dist/templates/sequential-reviewer/template.json +4 -0
- package/dist/templates/simple-loop/main.mts +49 -0
- package/dist/templates/simple-loop/prompt.md +53 -0
- package/dist/templates/simple-loop/template.json +4 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resumePrecheck.ts","../src/AgentStreamEmitter.ts","../src/PromptPreprocessor.ts","../src/TextDeltaBuffer.ts","../src/Orchestrator.ts","../src/PromptResolver.ts","../src/EnvResolver.ts","../src/mergeProviderEnv.ts","../src/PromptArgumentSubstitution.ts","../src/Output.ts","../src/extractStructuredOutput.ts","../src/run.ts","../src/raceAbortSignal.ts","../src/interactive.ts","../src/createSandbox.ts","../src/createWorktree.ts","../src/CwdError.ts"],"names":["text","join","prompt","result","ctx","hostRepoDir","worktreePath","providerHandle","sandbox","sandboxRepoDir","CwdError"],"mappings":"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","file":"index.js","sourcesContent":["import type { AgentProvider } from \"./AgentProvider.js\";\nimport type { SandboxProvider } from \"./SandboxProvider.js\";\n\n/**\n * Fail-fast validation that a resumable agent session exists on the host before\n * launching the agent. Throws a descriptive error when the session is missing.\n *\n * The lookup strategy depends on the sandbox:\n *\n * - **No-sandbox**: the agent runs directly on the host and writes its session\n * in place under a cwd-derived directory; Sandcastle never moves it. The\n * agent's own path encoding (realpath canonicalisation plus\n * non-alphanumeric → hyphen) is fragile and platform-specific to reconstruct,\n * so we locate the file by its globally-unique session id instead.\n * - **Sandboxed (bind-mount)**: Sandcastle's capture transfers the session into\n * the host store keyed on the host repo dir, so for a resumable run the file\n * lives at that exact encoded location — check it directly rather than\n * scanning. (Isolated sandboxes fall here too, but neither capture nor resume\n * transfer is wired for them today, so this is the host-repo-dir check by\n * default.)\n */\nexport const assertResumeSessionExists = async (params: {\n readonly provider: AgentProvider;\n readonly sandboxTag: SandboxProvider[\"tag\"];\n readonly hostRepoDir: string;\n readonly resumeSession: string;\n}): Promise<void> => {\n const { provider, sandboxTag, hostRepoDir, resumeSession } = params;\n\n if (!provider.sessionStorage) {\n throw new Error(`${provider.name} does not support resumeSession`);\n }\n\n if (sandboxTag === \"none\") {\n const found = await provider.sessionStorage.findByIdOnHost(resumeSession);\n if (!found.path) {\n throw new Error(\n `resumeSession \"${resumeSession}\" not found under ${found.searchedRoot}`,\n );\n }\n return;\n }\n\n const exists = await provider.sessionStorage.existsOnHost(\n hostRepoDir,\n resumeSession,\n );\n if (!exists) {\n const sessionPath = provider.sessionStorage.hostSessionFilePath(\n hostRepoDir,\n resumeSession,\n );\n throw new Error(\n sessionPath\n ? `resumeSession \"${resumeSession}\" not found: expected session file at ${sessionPath}`\n : `resumeSession \"${resumeSession}\" not found`,\n );\n }\n};\n","import { Context, Effect, Layer } from \"effect\";\n\n/**\n * A single event in the agent's output stream, surfaced to callers of `run()`\n * so they can forward it to their own observability system.\n *\n * Emitted only in log-to-file mode when an `onAgentStreamEvent` callback is\n * provided via `logging`. See `run()`.\n */\nexport type AgentStreamEvent =\n | {\n readonly type: \"text\";\n readonly message: string;\n readonly iteration: number;\n readonly timestamp: Date;\n }\n | {\n readonly type: \"toolCall\";\n readonly name: string;\n readonly formattedArgs: string;\n readonly iteration: number;\n readonly timestamp: Date;\n };\n\nexport interface AgentStreamEmitterService {\n readonly emit: (event: AgentStreamEvent) => Effect.Effect<void>;\n}\n\nexport class AgentStreamEmitter extends Context.Tag(\"AgentStreamEmitter\")<\n AgentStreamEmitter,\n AgentStreamEmitterService\n>() {}\n\n/**\n * Build a layer for the AgentStreamEmitter service.\n *\n * Called with no argument, returns a no-op layer that discards events.\n * Called with a callback, returns a layer that forwards each event to it.\n * The callback is invoked synchronously inside an `Effect.sync`; any error\n * thrown by the callback is caught and discarded so observability failures\n * cannot kill the run.\n */\nexport const agentStreamEmitterLayer = (\n onEvent?: (event: AgentStreamEvent) => void,\n): Layer.Layer<AgentStreamEmitter> =>\n Layer.succeed(AgentStreamEmitter, {\n emit: onEvent\n ? (event) =>\n Effect.sync(() => {\n try {\n onEvent(event);\n } catch {\n // Swallow callback errors — a broken forwarder must not kill the run.\n }\n })\n : () => Effect.void,\n });\n","import { Clock, Duration, Effect, Option } from \"effect\";\nimport { Display } from \"./Display.js\";\nimport { PromptError, PromptExpansionTimeoutError } from \"./errors.js\";\nimport type { ExecError } from \"./errors.js\";\nimport type { SandboxService } from \"./SandboxFactory.js\";\n\nconst PROMPT_EXPANSION_TIMEOUT_MS = 30_000;\n\n/**\n * @internal\n * Marker inserted between `!` and the opening backtick for shell blocks that\n * appear in the raw template. The preprocessor only executes marked blocks, so\n * `!`...`` patterns arriving via argument substitution are treated as data.\n * Used only by `substitutePromptArgs`; not part of the public API.\n */\nexport const SHELL_BLOCK_MARKER = \"\\x01\";\n\nconst MARKED_SHELL_BLOCK_PATTERN = new RegExp(\n `!${SHELL_BLOCK_MARKER}\\`([^\\`]+)\\``,\n \"g\",\n);\n\nexport const preprocessPrompt = (\n prompt: string,\n sandbox: SandboxService,\n cwd: string,\n): Effect.Effect<\n string,\n ExecError | PromptError | PromptExpansionTimeoutError,\n Display\n> => {\n const matches = [...prompt.matchAll(MARKED_SHELL_BLOCK_PATTERN)];\n\n if (matches.length === 0) {\n return Effect.succeed(prompt.replaceAll(SHELL_BLOCK_MARKER, \"\"));\n }\n\n return Effect.gen(function* () {\n const display = yield* Display;\n return yield* display.taskLog(\"Expanding shell expressions\", (message) =>\n Effect.gen(function* () {\n // Execute all commands in parallel\n const results = yield* Effect.all(\n matches.map((match) => {\n const command = match[1]!;\n return Effect.gen(function* () {\n const start = yield* Clock.currentTimeMillis;\n const maybeResult = yield* sandbox\n .exec(command, { cwd })\n .pipe(\n Effect.timeoutOption(\n Duration.millis(PROMPT_EXPANSION_TIMEOUT_MS),\n ),\n );\n if (Option.isNone(maybeResult)) {\n const elapsedMs = (yield* Clock.currentTimeMillis) - start;\n return yield* Effect.fail(\n new PromptExpansionTimeoutError({\n message: `Shell expression \\`${command}\\` timed out after ${elapsedMs}ms`,\n timeoutMs: PROMPT_EXPANSION_TIMEOUT_MS,\n expression: command,\n elapsedMs,\n }),\n );\n }\n const execResult = maybeResult.value;\n if (execResult.exitCode !== 0) {\n return yield* Effect.fail(\n new PromptError({\n message: `Command \\`${command}\\` exited with code ${execResult.exitCode}: ${execResult.stderr}`,\n exitCode: execResult.exitCode,\n }),\n );\n }\n return execResult.stdout.trimEnd();\n });\n }),\n { concurrency: \"unbounded\" },\n );\n\n // Log per-command token counts\n for (let i = 0; i < matches.length; i++) {\n const command = matches[i]![1]!;\n const tokens = Math.ceil(results[i]!.length / 4);\n message(`${command} → ~${tokens} tokens`);\n }\n\n // Replace all matches using original indices (process in reverse to preserve positions)\n let result = prompt;\n for (let i = matches.length - 1; i >= 0; i--) {\n const match = matches[i]!;\n const index = match.index!;\n result =\n result.slice(0, index) +\n results[i] +\n result.slice(index + match[0].length);\n }\n return result.replaceAll(SHELL_BLOCK_MARKER, \"\");\n }),\n );\n });\n};\n","const LENGTH_THRESHOLD = 80;\nconst DEBOUNCE_MS = 50;\n\n/**\n * Sentence-boundary pattern: period, exclamation, or question mark followed by a space.\n */\nconst SENTENCE_BOUNDARY_RE = /[.!?] $/;\n\n/**\n * Buffers streaming text deltas and flushes them as readable multi-word chunks.\n *\n * Flush triggers:\n * - Newline character in the accumulated buffer\n * - Sentence boundary (`. `, `! `, `? ` at end of buffer)\n * - Buffer exceeds ~80 characters\n * - Debounce timer (~50ms of no new writes)\n */\nexport class TextDeltaBuffer {\n private buffer = \"\";\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly onFlush: (text: string) => void;\n\n constructor(onFlush: (text: string) => void) {\n this.onFlush = onFlush;\n }\n\n write(text: string): void {\n if (text.length === 0) return;\n this.buffer += text;\n this.clearTimer();\n\n if (this.shouldFlush()) {\n this.doFlush();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.doFlush();\n }, DEBOUNCE_MS);\n }\n\n /** Force-flush any buffered text. */\n flush(): void {\n this.clearTimer();\n this.doFlush();\n }\n\n /** Flush remaining buffer and clean up. */\n dispose(): void {\n this.flush();\n }\n\n private shouldFlush(): boolean {\n if (this.buffer.includes(\"\\n\")) return true;\n if (SENTENCE_BOUNDARY_RE.test(this.buffer)) return true;\n if (this.buffer.length >= LENGTH_THRESHOLD) return true;\n return false;\n }\n\n private doFlush(): void {\n if (this.buffer.length === 0) return;\n const text = this.buffer;\n this.buffer = \"\";\n this.onFlush(text);\n }\n\n private clearTimer(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import { Deferred, Duration, Effect, Fiber } from \"effect\";\nimport { AgentStreamEmitter } from \"./AgentStreamEmitter.js\";\nimport { Display } from \"./Display.js\";\nimport { preprocessPrompt } from \"./PromptPreprocessor.js\";\nimport {\n AgentError,\n AgentIdleTimeoutError,\n SessionCaptureError,\n} from \"./errors.js\";\nimport type { SandboxError } from \"./errors.js\";\nimport type { SandboxService } from \"./SandboxFactory.js\";\nimport { SandboxFactory, SANDBOX_REPO_DIR } from \"./SandboxFactory.js\";\nimport { withSandboxLifecycle, type SandboxHooks } from \"./SandboxLifecycle.js\";\nimport type { AgentProvider, IterationUsage } from \"./AgentProvider.js\";\nimport type { Timeouts } from \"./run.js\";\nimport { TextDeltaBuffer } from \"./TextDeltaBuffer.js\";\n\nexport type { ParsedStreamEvent, IterationUsage } from \"./AgentProvider.js\";\n\nconst IDLE_WARNING_INTERVAL_MS = 60_000;\n\nconst invokeAgent = (\n sandbox: SandboxService,\n sandboxRepoDir: string,\n prompt: string,\n provider: AgentProvider,\n idleTimeoutMs: number,\n completionTimeoutMs: number,\n completionSignals: readonly string[],\n onText: (text: string) => void,\n onToolCall: (name: string, formattedArgs: string) => void,\n onIdleWarning: (minutes: number) => void,\n onCompletionTimeout: (timeoutMs: number) => void,\n idleWarningIntervalMs: number = IDLE_WARNING_INTERVAL_MS,\n resumeSession?: string,\n forkSession?: boolean,\n signal?: AbortSignal,\n): Effect.Effect<\n { result: string; sessionId?: string; usage?: IterationUsage },\n SandboxError\n> =>\n Effect.gen(function* () {\n let resultText = \"\";\n let sessionId: string | undefined;\n let usage: IterationUsage | undefined;\n // Accumulated text/result output, scanned for the completion signal so a\n // hanging process can be force-completed once the signal is in the buffer\n // (see ADR 0019).\n let accumulatedOutput = \"\";\n\n // Deferred that fails when the idle timer fires (no signal seen).\n const timeoutSignal = yield* Deferred.make<never, AgentIdleTimeoutError>();\n // Deferred that resolves successfully when the completion-grace timer\n // fires (signal seen but process hasn't exited). Resolving lets the race\n // hand control back to the orchestrator with the buffered output, which\n // still contains the signal so the existing completionSignal check works.\n const completionTimeoutDeferred = yield* Deferred.make<\n { result: string; sessionId?: string; usage?: IterationUsage },\n never\n >();\n let timeoutFiber: Fiber.RuntimeFiber<unknown, unknown> | null = null;\n let completionDetected = false;\n\n // Periodic idle warning state\n let warningFiber: Fiber.RuntimeFiber<unknown, unknown> | null = null;\n let idleMinuteCounter = 0;\n\n const interruptFiber = (\n fiber: Fiber.RuntimeFiber<unknown, unknown> | null,\n ) => {\n if (fiber !== null) Effect.runFork(Fiber.interrupt(fiber));\n };\n\n const startWarningInterval = () => {\n interruptFiber(warningFiber);\n idleMinuteCounter = 0;\n warningFiber = Effect.runFork(\n Effect.gen(function* () {\n while (true) {\n yield* Effect.sleep(Duration.millis(idleWarningIntervalMs));\n idleMinuteCounter++;\n onIdleWarning(idleMinuteCounter);\n }\n }),\n );\n };\n\n const resetTimer = () => {\n interruptFiber(timeoutFiber);\n if (completionDetected) {\n // Post-signal grace window — successful resolution on expiry.\n timeoutFiber = Effect.runFork(\n Effect.gen(function* () {\n yield* Effect.sleep(Duration.millis(completionTimeoutMs));\n onCompletionTimeout(completionTimeoutMs);\n yield* Deferred.succeed(completionTimeoutDeferred, {\n result: resultText || accumulatedOutput,\n sessionId,\n usage,\n });\n }),\n );\n } else {\n // Pre-signal idle window — failure on expiry.\n timeoutFiber = Effect.runFork(\n Effect.gen(function* () {\n yield* Effect.sleep(Duration.millis(idleTimeoutMs));\n yield* Deferred.fail(\n timeoutSignal,\n new AgentIdleTimeoutError({\n message: `Agent idle for ${idleTimeoutMs / 1000} seconds — no output received. Consider increasing the idle timeout with --idle-timeout.`,\n timeoutMs: idleTimeoutMs,\n }),\n );\n }),\n );\n // Reset warning interval on activity, idle-phase only.\n startWarningInterval();\n }\n };\n\n // Deferred that will be resolved (as a defect) when the AbortSignal fires.\n // Uses Effect.die so the abort reason propagates as-is to run().\n const abortDeferred = yield* Deferred.make<never, never>();\n let abortCleanup: (() => void) | null = null;\n if (signal) {\n if (signal.aborted) {\n return yield* Effect.die(signal.reason);\n }\n const onAbort = () => {\n Effect.runFork(Deferred.die(abortDeferred, signal.reason));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n abortCleanup = () => signal.removeEventListener(\"abort\", onAbort);\n }\n\n resetTimer();\n\n const execEffect = Effect.gen(function* () {\n const printCmd = provider.buildPrintCommand({\n prompt,\n dangerouslySkipPermissions: true,\n resumeSession,\n forkSession,\n });\n const execResult = yield* sandbox.exec(printCmd.command, {\n onLine: (line) => {\n for (const parsed of provider.parseStreamLine(line)) {\n if (parsed.type === \"text\") {\n onText(parsed.text);\n accumulatedOutput += parsed.text;\n } else if (parsed.type === \"result\") {\n resultText = parsed.result;\n accumulatedOutput += parsed.result;\n } else if (parsed.type === \"tool_call\") {\n onToolCall(parsed.name, parsed.args);\n } else if (parsed.type === \"session_id\") {\n sessionId = parsed.sessionId;\n } else if (parsed.type === \"usage\") {\n usage = parsed.usage;\n }\n }\n // Check for the completion signal AFTER parsing this line so the\n // accumulator contains everything seen so far. Flip to the\n // completion-grace timer the first time the signal appears.\n if (\n !completionDetected &&\n completionSignals.some((sig) => accumulatedOutput.includes(sig))\n ) {\n completionDetected = true;\n interruptFiber(warningFiber);\n warningFiber = null;\n }\n resetTimer();\n },\n cwd: sandboxRepoDir,\n stdin: printCmd.stdin,\n });\n\n if (execResult.exitCode !== 0) {\n // Prefer stderr; fall back to resultText (from parsed stream events),\n // then to the tail of raw stdout (last 20 non-empty lines).\n let errorDetail = execResult.stderr;\n if (!errorDetail.trim()) {\n errorDetail = resultText;\n }\n if (!errorDetail.trim()) {\n const lines = execResult.stdout.split(\"\\n\").filter((l) => l.trim());\n errorDetail = lines.slice(-20).join(\"\\n\");\n }\n return yield* Effect.fail(\n new AgentError({\n message: `${provider.name} exited with code ${execResult.exitCode}:\\n${errorDetail}`,\n }),\n );\n }\n\n return { result: resultText || execResult.stdout, sessionId, usage };\n }).pipe(\n Effect.ensuring(\n Effect.sync(() => {\n interruptFiber(timeoutFiber);\n timeoutFiber = null;\n interruptFiber(warningFiber);\n warningFiber = null;\n }),\n ),\n );\n\n let raced: Effect.Effect<\n { result: string; sessionId?: string; usage?: IterationUsage },\n AgentIdleTimeoutError | SandboxError\n > = Effect.raceFirst(execEffect, Deferred.await(timeoutSignal));\n raced = Effect.raceFirst(raced, Deferred.await(completionTimeoutDeferred));\n if (signal) {\n raced = Effect.raceFirst(\n raced,\n Deferred.await(abortDeferred) as Effect.Effect<never, never>,\n );\n }\n\n return yield* raced.pipe(\n Effect.ensuring(\n Effect.sync(() => {\n abortCleanup?.();\n interruptFiber(timeoutFiber);\n timeoutFiber = null;\n interruptFiber(warningFiber);\n warningFiber = null;\n }),\n ),\n );\n });\n\nconst DEFAULT_COMPLETION_SIGNAL = \"<promise>COMPLETE</promise>\";\nconst DEFAULT_IDLE_TIMEOUT_SECONDS = 10 * 60; // 600 seconds\nconst DEFAULT_COMPLETION_TIMEOUT_SECONDS = 60;\n\nexport interface OrchestrateOptions {\n readonly hostRepoDir: string;\n readonly iterations: number;\n readonly hooks?: SandboxHooks;\n readonly prompt: string;\n readonly branch?: string;\n readonly provider: AgentProvider;\n readonly completionSignal?: string | string[];\n /** Idle timeout in seconds. If the agent produces no output for this long, it fails with AgentIdleTimeoutError. Default: 600 (10 minutes) */\n readonly idleTimeoutSeconds?: number;\n /**\n * Grace window in seconds after a completion signal is observed in the\n * agent's output. The agent process is expected to exit shortly after\n * emitting the signal; if it does not (because a spawned child is keeping\n * stdout open — see ADR 0019), this timer fires and the iteration resolves\n * successfully with the buffered output. Resets on every subsequent output\n * line, so trailing data (token-usage events, terminal `result` events,\n * structured-output tags) is still captured. Default: 60 seconds.\n */\n readonly completionTimeoutSeconds?: number;\n /** Optional name for the run, prepended to status messages as [name] */\n readonly name?: string;\n /** @internal Test-only override for the idle warning interval in milliseconds. Default: 60000 (1 minute). */\n readonly _idleWarningIntervalMs?: number;\n /** Resume a prior Claude Code session by ID. Applied to iteration 1 only. */\n readonly resumeSession?: string;\n /**\n * When true alongside `resumeSession`, fork the session instead of mutating\n * it — the parent JSONL stays intact and the agent writes a new session\n * under a fresh id. Applied to iteration 1 only. See ADR 0018.\n */\n readonly forkSession?: boolean;\n /** An AbortSignal that cancels the orchestration when aborted. */\n readonly signal?: AbortSignal;\n /** When true, skip prompt expansion (shell expression evaluation). Set for dynamic inline prompts. */\n readonly skipPromptExpansion?: boolean;\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n}\n\n/** Per-iteration result carrying an optional session ID. */\nexport interface IterationResult {\n /** Claude Code session ID extracted from the init line, or undefined for non-Claude agents. */\n readonly sessionId?: string;\n /** Absolute host path to the captured session JSONL, or undefined when capture is disabled or provider is non-Claude. */\n readonly sessionFilePath?: string;\n /** Token usage snapshot from the last assistant message in the session, or undefined when capture is disabled or provider does not support usage parsing. */\n readonly usage?: IterationUsage;\n}\n\nexport interface OrchestrateResult {\n /** Per-iteration results (use `iterations.length` for the count). */\n readonly iterations: IterationResult[];\n /** The matched completion signal string, or undefined if none fired. */\n readonly completionSignal?: string;\n readonly stdout: string;\n readonly commits: { sha: string }[];\n readonly branch: string;\n /** Host path to the preserved worktree from the last iteration, set when the worktree was left behind due to uncommitted changes on a successful run. */\n readonly preservedWorktreePath?: string;\n}\n\nexport const orchestrate = (\n options: OrchestrateOptions,\n): Effect.Effect<\n OrchestrateResult,\n SandboxError,\n SandboxFactory | Display | AgentStreamEmitter\n> => {\n const idleTimeoutMs =\n (options.idleTimeoutSeconds ?? DEFAULT_IDLE_TIMEOUT_SECONDS) * 1000;\n const completionTimeoutMs =\n (options.completionTimeoutSeconds ?? DEFAULT_COMPLETION_TIMEOUT_SECONDS) *\n 1000;\n return Effect.gen(function* () {\n const factory = yield* SandboxFactory;\n const display = yield* Display;\n const streamEmitter = yield* AgentStreamEmitter;\n const { hostRepoDir, iterations, hooks, prompt, branch, provider } =\n options;\n let completionSignals: string[];\n if (options.completionSignal === undefined) {\n completionSignals = [DEFAULT_COMPLETION_SIGNAL];\n } else if (Array.isArray(options.completionSignal)) {\n completionSignals = options.completionSignal;\n } else {\n completionSignals = [options.completionSignal];\n }\n\n const label = (msg: string): string =>\n options.name ? `[${options.name}] ${msg}` : msg;\n\n const allCommits: { sha: string }[] = [];\n const allIterations: IterationResult[] = [];\n let allStdout = \"\";\n let resolvedBranch = \"\";\n let iterationPreservedPath: string | undefined;\n\n // Helper: check abort signal and bail via defect so run() can\n // re-throw the signal's reason verbatim (no Sandcastle wrapping).\n const checkAbort = (): Effect.Effect<void> =>\n options.signal?.aborted ? Effect.die(options.signal.reason) : Effect.void;\n\n for (let i = 1; i <= iterations; i++) {\n yield* checkAbort();\n yield* display.status(label(`Iteration ${i}/${iterations}`), \"info\");\n\n const sandboxResult = yield* factory.withSandbox(\n (\n { hostWorktreePath, sandboxRepoPath, applyToHost, bindMountHandle },\n sandbox,\n ) =>\n withSandboxLifecycle(\n {\n hostRepoDir,\n sandboxRepoDir: sandboxRepoPath,\n hooks,\n branch,\n hostWorktreePath,\n applyToHost,\n signal: options.signal,\n timeouts: options.timeouts,\n },\n sandbox,\n (ctx) =>\n Effect.gen(function* () {\n // Resume session: transfer JSONL from host to sandbox before iteration 1\n const iterationResumeSession =\n i === 1 ? options.resumeSession : undefined;\n const iterationForkSession =\n i === 1 ? options.forkSession : undefined;\n if (\n iterationResumeSession &&\n bindMountHandle &&\n provider.sessionStorage\n ) {\n yield* display.status(label(\"Resuming session\"), \"info\");\n yield* Effect.tryPromise({\n try: () =>\n provider.sessionStorage!.resumeIntoSandbox({\n hostCwd: hostRepoDir,\n sandboxCwd: ctx.sandboxRepoDir,\n sessionId: iterationResumeSession,\n handle: bindMountHandle,\n }),\n catch: (e) =>\n new SessionCaptureError({\n message: `Session resume failed: ${e instanceof Error ? e.message : String(e)}`,\n sessionId: iterationResumeSession,\n }),\n });\n }\n\n // Preprocess prompt (run !`command` expressions inside sandbox).\n // Inline prompts pass through literally — skip expansion.\n const fullPrompt = options.skipPromptExpansion\n ? prompt\n : yield* preprocessPrompt(\n prompt,\n ctx.sandbox,\n ctx.sandboxRepoDir,\n );\n\n yield* display.status(label(\"Agent started\"), \"success\");\n\n // Invoke the agent — buffer text deltas so Pi's single-token\n // chunks are displayed as readable multi-word lines.\n const textBuffer = new TextDeltaBuffer((chunk) => {\n Effect.runPromise(display.text(chunk));\n Effect.runPromise(\n streamEmitter.emit({\n type: \"text\",\n message: chunk,\n iteration: i,\n timestamp: new Date(),\n }),\n );\n });\n const onText = (text: string) => {\n textBuffer.write(text);\n };\n const onToolCall = (name: string, formattedArgs: string) => {\n textBuffer.flush();\n Effect.runPromise(display.toolCall(name, formattedArgs));\n Effect.runPromise(\n streamEmitter.emit({\n type: \"toolCall\",\n name,\n formattedArgs,\n iteration: i,\n timestamp: new Date(),\n }),\n );\n };\n const onIdleWarning = (minutes: number) => {\n const msg =\n minutes === 1\n ? \"Agent idle for 1 minute\"\n : `Agent idle for ${minutes} minutes`;\n Effect.runPromise(display.status(label(msg), \"warn\"));\n };\n const onCompletionTimeout = (timeoutMs: number) => {\n Effect.runPromise(\n display.status(\n label(\n `Completion signal seen but agent process is hanging — force-completing after ${timeoutMs / 1000}s grace window.`,\n ),\n \"warn\",\n ),\n );\n };\n const {\n result: agentOutput,\n sessionId,\n usage: streamUsage,\n } = yield* invokeAgent(\n ctx.sandbox,\n ctx.sandboxRepoDir,\n fullPrompt,\n provider,\n idleTimeoutMs,\n completionTimeoutMs,\n completionSignals,\n onText,\n onToolCall,\n onIdleWarning,\n onCompletionTimeout,\n options._idleWarningIntervalMs,\n iterationResumeSession,\n iterationForkSession,\n options.signal,\n );\n\n // Flush any remaining buffered text deltas\n textBuffer.dispose();\n\n yield* display.status(label(\"Agent stopped\"), \"info\");\n\n // Capture session while sandbox is still alive. Usage from the\n // stream (e.g. Codex's turn.completed) is the baseline; a\n // session-parsed value below overrides it when available.\n let sessionFilePath: string | undefined;\n let usage: IterationUsage | undefined = streamUsage;\n if (\n provider.captureSessions &&\n provider.sessionStorage &&\n sessionId &&\n bindMountHandle\n ) {\n yield* display.status(label(\"Capturing session\"), \"info\");\n yield* Effect.tryPromise({\n try: () =>\n provider.sessionStorage!.captureToHost({\n hostCwd: hostRepoDir,\n sandboxCwd: ctx.sandboxRepoDir,\n sessionId,\n handle: bindMountHandle,\n }),\n catch: (e) =>\n new SessionCaptureError({\n message: `Session capture failed: ${e instanceof Error ? e.message : String(e)}`,\n sessionId,\n }),\n });\n sessionFilePath = provider.sessionStorage.hostSessionFilePath(\n hostRepoDir,\n sessionId,\n );\n\n // Parse token usage from the captured session JSONL\n if (provider.parseSessionUsage) {\n const content = yield* Effect.promise(() =>\n provider\n .sessionStorage!.readHostSession(hostRepoDir, sessionId)\n .catch(() => undefined as string | undefined),\n );\n if (content) {\n const parsedUsage = provider.parseSessionUsage(content);\n if (parsedUsage) usage = parsedUsage;\n }\n }\n }\n\n // Check completion signal\n const matchedSignal = completionSignals.find((sig) =>\n agentOutput.includes(sig),\n );\n return {\n completionSignal: matchedSignal,\n stdout: agentOutput,\n sessionId,\n sessionFilePath,\n usage,\n } as const;\n }),\n ),\n );\n\n const lifecycleResult = sandboxResult.value;\n iterationPreservedPath = sandboxResult.preservedWorktreePath;\n\n allCommits.push(...lifecycleResult.commits);\n allStdout += lifecycleResult.result.stdout;\n resolvedBranch = lifecycleResult.branch;\n\n allIterations.push({\n sessionId: lifecycleResult.result.sessionId,\n sessionFilePath: lifecycleResult.result.sessionFilePath,\n usage: lifecycleResult.result.usage,\n });\n\n if (lifecycleResult.result.completionSignal !== undefined) {\n yield* display.status(\n label(`Agent signaled completion after ${i} iteration(s).`),\n \"success\",\n );\n return {\n iterations: allIterations,\n completionSignal: lifecycleResult.result.completionSignal,\n stdout: allStdout,\n commits: allCommits,\n branch: resolvedBranch,\n preservedWorktreePath: iterationPreservedPath,\n };\n }\n }\n\n yield* display.status(\n label(`Reached max iterations (${iterations}).`),\n \"info\",\n );\n return {\n iterations: allIterations,\n completionSignal: undefined,\n stdout: allStdout,\n commits: allCommits,\n branch: resolvedBranch,\n preservedWorktreePath: iterationPreservedPath,\n };\n });\n};\n","import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { PromptError } from \"./errors.js\";\n\nexport interface ResolvePromptOptions {\n readonly prompt?: string;\n readonly promptFile?: string;\n}\n\n/**\n * The resolved prompt text plus the source it came from.\n *\n * - `inline`: came from `prompt: \"...\"` — delivered to the agent verbatim.\n * No prompt argument substitution, no prompt expansion, no built-in args.\n * - `template`: came from `promptFile` — eligible for `{{KEY}}` substitution\n * and `` !`command` `` expansion.\n */\nexport interface ResolvedPrompt {\n readonly text: string;\n readonly source: \"inline\" | \"template\";\n}\n\nexport const resolvePrompt = (\n options: ResolvePromptOptions,\n): Effect.Effect<ResolvedPrompt, PromptError, FileSystem.FileSystem> => {\n const { prompt, promptFile } = options;\n\n if (prompt !== undefined && promptFile !== undefined) {\n return Effect.fail(\n new PromptError({\n message: \"Cannot provide both --prompt and --prompt-file\",\n }),\n );\n }\n\n if (prompt !== undefined) {\n return Effect.succeed({ text: prompt, source: \"inline\" });\n }\n\n if (promptFile === undefined) {\n return Effect.fail(\n new PromptError({\n message:\n \"Must provide either prompt or promptFile. Pass prompt: '...' or promptFile: './.sandcastle/prompt.md' to run().\",\n }),\n );\n }\n\n return Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const text = yield* fs.readFileString(promptFile).pipe(\n Effect.catchAll((e) =>\n Effect.fail(\n new PromptError({\n message: `Failed to read prompt from ${promptFile}: ${e}`,\n }),\n ),\n ),\n );\n return { text, source: \"template\" as const };\n });\n};\n","import { FileSystem } from \"@effect/platform\";\nimport { Effect } from \"effect\";\nimport { join } from \"node:path\";\n\nconst parseEnvFile = (\n filePath: string,\n): Effect.Effect<Record<string, string>, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const content = yield* fs\n .readFileString(filePath)\n .pipe(Effect.catchAll(() => Effect.succeed(null)));\n if (content === null) return {};\n const vars: Record<string, string> = {};\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n const isDoubleQuoted =\n value.length >= 2 &&\n value[0] === '\"' &&\n value[value.length - 1] === '\"';\n const isSingleQuoted =\n value.length >= 2 &&\n value[0] === \"'\" &&\n value[value.length - 1] === \"'\";\n if (isDoubleQuoted || isSingleQuoted) {\n value = value.slice(1, -1);\n }\n if (isDoubleQuoted) {\n value = value.replace(/\\\\([nrt\\\\])/g, (_, ch: string) => {\n const escapes: Record<string, string> = {\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n \"\\\\\": \"\\\\\",\n };\n return escapes[ch] ?? ch;\n });\n }\n vars[key] = value;\n }\n return vars;\n });\n\n/**\n * Resolve all env vars from .env files with process.env fallback.\n *\n * Precedence: .sandcastle/.env > process.env\n * Only keys declared in .sandcastle/.env are resolved from process.env.\n * Repo root .env is not part of the resolution chain.\n */\nexport const resolveEnv = (\n repoDir: string,\n): Effect.Effect<Record<string, string>, never, FileSystem.FileSystem> =>\n Effect.gen(function* () {\n const sandcastleEnv = yield* parseEnvFile(\n join(repoDir, \".sandcastle\", \".env\"),\n );\n\n const result: Record<string, string> = {};\n for (const key of Object.keys(sandcastleEnv)) {\n const value = sandcastleEnv[key] || process.env[key];\n if (value) {\n result[key] = value;\n }\n }\n\n return result;\n });\n","/**\n * Merge env vars from the env resolver, agent provider, and sandbox provider.\n *\n * Provider env (agent + sandbox) overrides env resolver output for shared keys.\n * Agent and sandbox provider env must NOT have overlapping keys — if they do,\n * this function throws.\n */\nexport const mergeProviderEnv = (options: {\n readonly resolvedEnv: Record<string, string>;\n readonly agentProviderEnv: Record<string, string>;\n readonly sandboxProviderEnv: Record<string, string>;\n}): Record<string, string> => {\n const { resolvedEnv, agentProviderEnv, sandboxProviderEnv } = options;\n\n // Check for overlapping keys between agent and sandbox provider env\n const agentKeys = Object.keys(agentProviderEnv);\n const sandboxKeys = new Set(Object.keys(sandboxProviderEnv));\n const overlapping = agentKeys.filter((k) => sandboxKeys.has(k));\n\n if (overlapping.length > 0) {\n throw new Error(\n `Overlapping env keys between agent provider and sandbox provider: ${overlapping.join(\", \")}`,\n );\n }\n\n return {\n ...resolvedEnv,\n ...sandboxProviderEnv,\n ...agentProviderEnv,\n };\n};\n","import { Effect } from \"effect\";\nimport { Display } from \"./Display.js\";\nimport { PromptError } from \"./errors.js\";\nimport { SHELL_BLOCK_MARKER } from \"./PromptPreprocessor.js\";\n\nconst SHELL_BLOCK_PATTERN = /!`([^`]+)`/g;\n\n/**\n * A map of named values used for prompt argument substitution.\n * Each key corresponds to a `{{KEY}}` placeholder in the prompt; the value\n * replaces it before the prompt is passed to the agent.\n */\nexport type PromptArgs = Record<string, string | number | boolean>;\n\n/**\n * Prompt argument keys that Sandcastle injects automatically.\n * These cannot be overridden via `promptArgs`.\n */\nexport const BUILT_IN_PROMPT_ARG_KEYS = [\n \"SOURCE_BRANCH\",\n \"TARGET_BRANCH\",\n] as const;\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\}\\}/g;\n\n/**\n * Validates that the user has not provided any built-in prompt argument keys.\n * Fails with a PromptError if any built-in key is found in `args`.\n */\n/**\n * Fails if the user passed any `promptArgs` alongside an inline prompt.\n * Inline prompts are delivered to the agent verbatim, so `promptArgs` would\n * silently do nothing. An empty object is treated as absent.\n */\nexport const validateNoArgsWithInlinePrompt = (\n args: PromptArgs,\n): Effect.Effect<void, PromptError> => {\n if (Object.keys(args).length === 0) return Effect.void;\n return Effect.fail(\n new PromptError({\n message:\n 'promptArgs is only supported with promptFile. Inline prompts (prompt: \"...\") are passed to the agent as-is — interpolate values directly in JavaScript, or switch to promptFile to use {{KEY}} substitution.',\n }),\n );\n};\n\nexport const validateNoBuiltInArgOverride = (\n args: PromptArgs,\n): Effect.Effect<void, PromptError> => {\n for (const key of BUILT_IN_PROMPT_ARG_KEYS) {\n if (key in args) {\n return Effect.fail(\n new PromptError({\n message: `\"${key}\" is a built-in prompt argument and cannot be overridden via promptArgs`,\n }),\n );\n }\n }\n return Effect.void;\n};\n\n/**\n * Scans a prompt for `{{KEY}}` placeholders and returns the keys that are\n * missing from `providedArgs`, excluding built-in keys.\n */\nexport const findMissingPromptArgKeys = (\n prompt: string,\n providedArgs: PromptArgs,\n): string[] => {\n const matches = [...prompt.matchAll(PLACEHOLDER_PATTERN)];\n const builtInSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n const seen = new Set<string>();\n const missing: string[] = [];\n\n for (const m of matches) {\n const key = m[1]!;\n if (seen.has(key)) continue;\n seen.add(key);\n if (builtInSet.has(key)) continue;\n if (key in providedArgs) continue;\n missing.push(key);\n }\n\n return missing;\n};\n\nexport const substitutePromptArgs = (\n prompt: string,\n args: PromptArgs,\n silentKeys?: ReadonlySet<string>,\n): Effect.Effect<string, PromptError, Display> => {\n // Mark shell blocks written in the raw template so the preprocessor can\n // distinguish them from `!`...`` patterns that arrive via arg substitution.\n // Strip any markers already present in raw input so they can't be forged.\n const markedPrompt = prompt\n .replaceAll(SHELL_BLOCK_MARKER, \"\")\n .replace(SHELL_BLOCK_PATTERN, `!${SHELL_BLOCK_MARKER}\\`$1\\``);\n const sanitizedArgs: PromptArgs = Object.fromEntries(\n Object.entries(args).map(([key, value]) => [\n key,\n typeof value === \"string\"\n ? value.replaceAll(SHELL_BLOCK_MARKER, \"\")\n : value,\n ]),\n );\n const matches = [...markedPrompt.matchAll(PLACEHOLDER_PATTERN)];\n\n if (matches.length === 0 && Object.keys(sanitizedArgs).length === 0) {\n return Effect.succeed(markedPrompt);\n }\n\n return Effect.gen(function* () {\n const display = yield* Display;\n\n // Collect all keys referenced in the prompt\n const referencedKeys = new Set(matches.map((m) => m[1]!));\n\n // Check for missing keys (placeholder in prompt but no matching arg)\n for (const key of referencedKeys) {\n if (!(key in sanitizedArgs)) {\n return yield* Effect.fail(\n new PromptError({\n message: `Prompt argument \"{{${key}}}\" has no matching value in promptArgs`,\n }),\n );\n }\n }\n\n // Warn about unused keys (arg provided but no matching placeholder)\n // Skip keys listed in silentKeys (e.g. built-in args)\n for (const key of Object.keys(sanitizedArgs)) {\n if (!referencedKeys.has(key) && !silentKeys?.has(key)) {\n yield* display.status(\n `Prompt argument \"${key}\" was provided but not referenced in the prompt`,\n \"warn\",\n );\n }\n }\n\n // Replace all placeholders with their values\n const result = markedPrompt.replace(PLACEHOLDER_PATTERN, (_match, key) =>\n sanitizedArgs[key as string]!.toString(),\n );\n\n return result;\n });\n};\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n// ---------------------------------------------------------------------------\n// Output definition types (branded values for run() overload discrimination)\n// ---------------------------------------------------------------------------\n\n/** Branded output definition for `Output.object({ tag, schema })`. */\nexport interface OutputObjectDefinition<T> {\n readonly _tag: \"object\";\n readonly tag: string;\n readonly schema: StandardSchemaV1<unknown, T>;\n}\n\n/** Branded output definition for `Output.string({ tag })`. */\nexport interface OutputStringDefinition {\n readonly _tag: \"string\";\n readonly tag: string;\n}\n\n/** Union of all output definition shapes accepted by `run()`. */\nexport type OutputDefinition =\n | OutputObjectDefinition<any>\n | OutputStringDefinition;\n\n// ---------------------------------------------------------------------------\n// Output namespace — public API\n// ---------------------------------------------------------------------------\n\n/**\n * Helpers for declaring structured output on `run()`.\n *\n * ```ts\n * import { Output, run } from \"@ai-hero/sandcastle\";\n * import { z } from \"zod\";\n *\n * const result = await run({\n * output: Output.object({ tag: \"result\", schema: z.object({ answer: z.number() }) }),\n * // ...\n * });\n * console.log(result.output.answer); // typed as number\n * ```\n */\nexport const Output = {\n /**\n * Declare an object-typed structured output extracted from an XML tag in\n * the agent's stdout. The tag contents are JSON-parsed (with fence-aware\n * unwrapping) and validated against the provided Standard Schema validator.\n */\n object: <Schema extends StandardSchemaV1>(opts: {\n tag: string;\n schema: Schema;\n }): OutputObjectDefinition<StandardSchemaV1.InferOutput<Schema>> => ({\n _tag: \"object\",\n tag: opts.tag,\n schema: opts.schema as StandardSchemaV1<\n unknown,\n StandardSchemaV1.InferOutput<Schema>\n >,\n }),\n\n /**\n * Declare a string-typed structured output extracted from an XML tag in\n * the agent's stdout. The tag contents are whitespace-trimmed and returned\n * as a plain string — no JSON parsing, no schema validation.\n */\n string: (opts: { tag: string }): OutputStringDefinition => ({\n _tag: \"string\",\n tag: opts.tag,\n }),\n} as const;\n\n// ---------------------------------------------------------------------------\n// StructuredOutputError\n// ---------------------------------------------------------------------------\n\nexport interface StructuredOutputErrorOptions {\n readonly tag: string;\n readonly rawMatched: string | undefined;\n readonly cause?: unknown;\n readonly commits: { sha: string }[];\n readonly branch: string;\n readonly preservedWorktreePath?: string;\n readonly sessionId?: string;\n readonly sessionFilePath?: string;\n}\n\n/**\n * Thrown by `run()` when structured output extraction or validation fails.\n *\n * Possible failure modes:\n * - The configured XML tag was not found in stdout (`rawMatched` is `undefined`).\n * - The tag contents failed `JSON.parse` (`cause` carries the parse error).\n * - The parsed JSON failed schema validation (`cause` carries the Standard Schema issues).\n *\n * The error carries `commits`, `branch`, and optionally `preservedWorktreePath`\n * so callers can decide recovery without losing the run's side effects.\n *\n * It also carries `sessionId` (and `sessionFilePath` when the session was\n * captured to the host) of the iteration that produced the bad output, so a\n * caller can resume that same session and ask the agent to re-emit corrected\n * output:\n *\n * ```ts\n * try {\n * return await run({ ...opts, output });\n * } catch (e) {\n * if (e instanceof StructuredOutputError && e.sessionId) {\n * return await run({\n * ...opts,\n * output,\n * resumeSession: e.sessionId,\n * prompt: feedback(e),\n * });\n * }\n * throw e;\n * }\n * ```\n */\nexport class StructuredOutputError extends Error {\n readonly tag: string;\n readonly rawMatched: string | undefined;\n override readonly cause: unknown;\n readonly commits: { sha: string }[];\n readonly branch: string;\n readonly preservedWorktreePath?: string;\n /** Session ID of the iteration that produced the bad output, when available. */\n readonly sessionId?: string;\n /** Host path to the captured session JSONL, when the session was captured. */\n readonly sessionFilePath?: string;\n\n constructor(message: string, options: StructuredOutputErrorOptions) {\n super(message);\n this.name = \"StructuredOutputError\";\n this.tag = options.tag;\n this.rawMatched = options.rawMatched;\n this.cause = options.cause;\n this.commits = options.commits;\n this.branch = options.branch;\n this.preservedWorktreePath = options.preservedWorktreePath;\n this.sessionId = options.sessionId;\n this.sessionFilePath = options.sessionFilePath;\n }\n}\n","import {\n StructuredOutputError,\n type OutputDefinition,\n type OutputObjectDefinition,\n type OutputStringDefinition,\n} from \"./Output.js\";\n\ninterface ExtractionContext {\n readonly commits: { sha: string }[];\n readonly branch: string;\n readonly preservedWorktreePath?: string;\n readonly sessionId?: string;\n readonly sessionFilePath?: string;\n}\n\n/**\n * Extract and validate structured output from the agent's stdout.\n *\n * - Finds the **last** occurrence of `<tag>...</tag>` in stdout.\n * - For `Output.object`: unwraps optional Markdown fences, JSON-parses,\n * and validates against the Standard Schema.\n * - For `Output.string`: trims whitespace only.\n *\n * Throws `StructuredOutputError` on missing tag, invalid JSON, or schema failure.\n */\nexport const extractStructuredOutput = async <T>(\n stdout: string,\n definition: OutputDefinition,\n context: ExtractionContext,\n): Promise<T> => {\n if (definition._tag === \"object\") {\n return extractObject(\n stdout,\n definition as OutputObjectDefinition<T>,\n context,\n );\n }\n return extractString(stdout, definition, context) as T;\n};\n\n// ---------------------------------------------------------------------------\n// Object extraction\n// ---------------------------------------------------------------------------\n\nconst extractObject = async <T>(\n stdout: string,\n definition: OutputObjectDefinition<T>,\n context: ExtractionContext,\n): Promise<T> => {\n const raw = findLastTagContent(stdout, definition.tag);\n\n if (raw === undefined) {\n throw new StructuredOutputError(\n `Structured output tag <${definition.tag}> not found in agent output`,\n { tag: definition.tag, rawMatched: undefined, ...context },\n );\n }\n\n // Fence-aware unwrap + JSON parse\n const unwrapped = unwrapFences(raw.trim());\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(unwrapped);\n } catch (cause) {\n throw new StructuredOutputError(\n `Structured output tag <${definition.tag}> contains invalid JSON`,\n { tag: definition.tag, rawMatched: raw, cause, ...context },\n );\n }\n\n // Standard Schema validation\n const result = await definition.schema[\"~standard\"].validate(parsed);\n\n if (result.issues) {\n throw new StructuredOutputError(\n `Structured output tag <${definition.tag}> failed schema validation`,\n {\n tag: definition.tag,\n rawMatched: raw,\n cause: result.issues,\n ...context,\n },\n );\n }\n\n return result.value;\n};\n\n// ---------------------------------------------------------------------------\n// String extraction\n// ---------------------------------------------------------------------------\n\nconst extractString = (\n stdout: string,\n definition: OutputStringDefinition,\n context: ExtractionContext,\n): string => {\n const raw = findLastTagContent(stdout, definition.tag);\n\n if (raw === undefined) {\n throw new StructuredOutputError(\n `Structured output tag <${definition.tag}> not found in agent output`,\n { tag: definition.tag, rawMatched: undefined, ...context },\n );\n }\n\n return raw.trim();\n};\n\n// ---------------------------------------------------------------------------\n// Tag extraction — last match wins\n// ---------------------------------------------------------------------------\n\n/**\n * Find the content between the **last** `<tag>` and `</tag>` pair in text.\n * Returns `undefined` if the tag is not found.\n */\nconst findLastTagContent = (text: string, tag: string): string | undefined => {\n const openTag = `<${tag}>`;\n const closeTag = `</${tag}>`;\n\n let lastContent: string | undefined;\n let searchFrom = 0;\n\n while (true) {\n const openIdx = text.indexOf(openTag, searchFrom);\n if (openIdx === -1) break;\n\n const contentStart = openIdx + openTag.length;\n const closeIdx = text.indexOf(closeTag, contentStart);\n if (closeIdx === -1) break;\n\n lastContent = text.slice(contentStart, closeIdx);\n searchFrom = closeIdx + closeTag.length;\n }\n\n return lastContent;\n};\n\n// ---------------------------------------------------------------------------\n// Fence-aware unwrap (object mode only)\n// ---------------------------------------------------------------------------\n\n/**\n * Strip an optional Markdown code fence from text.\n *\n * Recognises:\n * - ` ```json\\n...\\n``` `\n * - ` ```\\n...\\n``` `\n *\n * If no fence is detected, returns the input unchanged (already trimmed by caller).\n */\nconst unwrapFences = (text: string): string => {\n // Match ```json ... ``` or ``` ... ``` (with optional language hint)\n const fenceMatch = text.match(/^```(?:json)?\\s*\\n([\\s\\S]*?)\\n\\s*```\\s*$/);\n if (fenceMatch) {\n return fenceMatch[1]!.trim();\n }\n return text;\n};\n","import { NodeContext, NodeFileSystem } from \"@effect/platform-node\";\nimport path, { join } from \"node:path\";\nimport { styleText } from \"node:util\";\nimport { Effect, Layer } from \"effect\";\nimport { resolveCwd } from \"./resolveCwd.js\";\nimport { assertResumeSessionExists } from \"./resumePrecheck.js\";\nimport type { AgentProvider } from \"./AgentProvider.js\";\nimport {\n ClackDisplay,\n Display,\n FileDisplay,\n type Severity,\n} from \"./Display.js\";\nimport {\n orchestrate,\n type IterationResult,\n type IterationUsage,\n type OrchestrateResult,\n} from \"./Orchestrator.js\";\nimport { resolvePrompt } from \"./PromptResolver.js\";\nimport {\n WorktreeDockerSandboxFactory,\n SandboxConfig,\n} from \"./SandboxFactory.js\";\nimport type { SandboxProvider, BranchStrategy } from \"./SandboxProvider.js\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { formatErrorMessage } from \"./ErrorHandler.js\";\nimport type { SandboxError } from \"./errors.js\";\nimport {\n agentStreamEmitterLayer,\n type AgentStreamEvent,\n} from \"./AgentStreamEmitter.js\";\nimport type { SandboxHooks } from \"./SandboxLifecycle.js\";\nimport { mergeProviderEnv } from \"./mergeProviderEnv.js\";\nimport { generateTempBranchName, getCurrentBranch } from \"./WorktreeManager.js\";\nimport {\n type PromptArgs,\n substitutePromptArgs,\n validateNoArgsWithInlinePrompt,\n validateNoBuiltInArgOverride,\n BUILT_IN_PROMPT_ARG_KEYS,\n} from \"./PromptArgumentSubstitution.js\";\nimport type {\n OutputDefinition,\n OutputObjectDefinition,\n OutputStringDefinition,\n} from \"./Output.js\";\nimport { extractStructuredOutput } from \"./extractStructuredOutput.js\";\n\n/** Default maximum number of iterations for a run. */\nexport const DEFAULT_MAX_ITERATIONS = 1;\n\n/** Replace characters that are invalid or problematic in file paths with dashes. */\nexport const sanitizeBranchForFilename = (branch: string): string =>\n branch.replace(/[/\\\\:*?\"<>|]/g, \"-\");\n\nexport interface FileDisplayStartupOptions {\n readonly logPath: string;\n readonly agentName?: string;\n readonly branch?: string;\n /** Resolved host repo directory. When it differs from `process.cwd()`, the\n * log-file hint is printed as an absolute path so it can be pasted into any\n * terminal. When it equals `process.cwd()` (or is omitted), a relative path\n * is printed instead. */\n readonly hostRepoDir?: string;\n}\n\n/**\n * Print the startup message to the terminal when using file-based logging.\n * Uses styleText for lightweight bold/dim styling — does not use Clack.\n */\nexport const printFileDisplayStartup = (\n options: FileDisplayStartupOptions,\n): void => {\n const name = options.agentName ?? \"Agent\";\n const label = styleText(\"bold\", `[${name}]`);\n const branchPart = options.branch ? ` on branch ${options.branch}` : \"\";\n const hostRepoDir = options.hostRepoDir ?? process.cwd();\n const displayLogPath =\n hostRepoDir === process.cwd()\n ? path.relative(process.cwd(), options.logPath)\n : options.logPath;\n console.log(`${label} Started${branchPart}`);\n console.log(styleText(\"dim\", ` tail -f ${displayLogPath}`));\n};\n\n/**\n * Build the log filename for a run.\n * When a targetBranch is provided (temp branch mode), prefixes the filename\n * with the sanitized target branch name so developers can identify which\n * branch the run was targeting: `<targetBranch>-<resolvedBranch>.log`\n * When no targetBranch, uses just the resolved branch: `<resolvedBranch>.log`\n * When a name is provided, appends it to avoid collisions in multi-agent workflows.\n */\nexport const buildLogFilename = (\n resolvedBranch: string,\n targetBranch?: string,\n name?: string,\n): string => {\n const sanitized = sanitizeBranchForFilename(resolvedBranch);\n const nameSuffix = name\n ? `-${name.toLowerCase().replace(/[^a-z0-9_.-]/g, \"-\")}`\n : \"\";\n if (targetBranch) {\n return `${sanitizeBranchForFilename(targetBranch)}-${sanitized}${nameSuffix}.log`;\n }\n return `${sanitized}${nameSuffix}.log`;\n};\n\nexport interface RunSummaryRowsOptions {\n readonly name?: string;\n readonly agentName: string;\n readonly sandboxName: string;\n readonly maxIterations: number;\n readonly branch: string;\n}\n\n/**\n * Build the summary rows for a run, used in both terminal mode and\n * log-to-file mode. When a custom name is provided it appears as the\n * Agent value instead of the internal provider name.\n */\nexport const buildRunSummaryRows = (\n options: RunSummaryRowsOptions,\n): Record<string, string> => ({\n Agent: options.name ?? options.agentName,\n Sandbox: options.sandboxName,\n \"Max iterations\": String(options.maxIterations),\n Branch: options.branch,\n});\n\n/**\n * Build the completion status message for a run, used in both terminal mode\n * and log-to-file mode to record the final outcome.\n */\nexport const buildCompletionMessage = (\n completionSignal: string | undefined,\n iterationsRun: number,\n): { readonly message: string; readonly severity: Severity } => {\n if (completionSignal !== undefined) {\n return {\n message: `Run complete: agent finished after ${iterationsRun} iteration(s).`,\n severity: \"success\",\n };\n }\n return {\n message: `Run complete: reached ${iterationsRun} iteration(s) without completion signal.`,\n severity: \"warn\",\n };\n};\n\n/**\n * Format the context window size from an iteration's usage data.\n * Returns a string like \"103k\" representing the total input-side tokens\n * (inputTokens + cacheCreationInputTokens + cacheReadInputTokens)\n * rounded up to the nearest 1000.\n */\nexport const formatContextWindowSize = (usage: IterationUsage): string => {\n const total =\n usage.inputTokens +\n usage.cacheCreationInputTokens +\n usage.cacheReadInputTokens;\n return `${Math.ceil(total / 1000)}k`;\n};\n\n/**\n * Build \"Context window: NNNk\" lines for iterations that have usage data.\n * Returns an empty array when no iterations carry usage.\n */\nexport const buildContextWindowLines = (\n iterations: readonly Pick<IterationResult, \"usage\">[],\n): string[] =>\n iterations\n .filter((it): it is { usage: IterationUsage } => it.usage !== undefined)\n .map((it) => `Context window: ${formatContextWindowSize(it.usage)}`);\n\n/**\n * Controls where Sandcastle writes iteration progress and agent output.\n * Use `\"file\"` (log-to-file mode) to write to a log file on disk, or\n * `\"stdout\"` (terminal mode) to render an interactive UI in the terminal.\n */\nexport type LoggingOption =\n /** Write progress and agent output to a log file at the given path (log-to-file mode). */\n | {\n readonly type: \"file\";\n readonly path: string;\n /**\n * Optional callback invoked for each agent stream event (text chunk or\n * tool call) in addition to being written to the log file. Intended for\n * forwarding the agent's output stream to external observability\n * systems. Errors thrown by the callback are swallowed.\n */\n readonly onAgentStreamEvent?: (event: AgentStreamEvent) => void;\n }\n /** Render progress and agent output as an interactive UI in the terminal (terminal mode). */\n | { readonly type: \"stdout\" };\n\n/** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\nexport interface Timeouts {\n /** Timeout (ms) for the host-side copy of `copyToWorktree` paths into the worktree. Default: 60_000. */\n readonly copyToWorktreeMs?: number;\n /** Timeout (ms) for each in-sandbox git setup command (safe.directory, user.name/email, branch discovery). Default: 10_000. */\n readonly gitSetupMs?: number;\n /** Timeout (ms) for collecting the commits produced during the run. Default: 30_000. */\n readonly commitCollectionMs?: number;\n /** Timeout (ms) for merging the temp branch back to the host branch (merge-to-head strategy). Default: 30_000. */\n readonly mergeToHostMs?: number;\n}\n\nexport interface RunOptions<A extends AgentProvider = AgentProvider> {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")) */\n readonly agent: A;\n /** Sandbox provider (e.g. docker({ imageName: \"sandcastle:myrepo\" })). */\n readonly sandbox: SandboxProvider;\n /**\n * Host repo directory. Replaces `process.cwd()` as the anchor for\n * `.sandcastle/worktrees/`, `.sandcastle/.env`, `.sandcastle/logs/`,\n * `.sandcastle/patches/`, and git operations.\n *\n * - Relative paths are resolved against `process.cwd()`.\n * - Absolute paths are used as-is.\n * - Defaults to `process.cwd()` when omitted.\n */\n readonly cwd?: string;\n /** Inline prompt string (mutually exclusive with promptFile) */\n readonly prompt?: string;\n /**\n * Path to a prompt file (mutually exclusive with prompt).\n *\n * **Note:** `promptFile` is always resolved against `process.cwd()`, not\n * against the `cwd` option. If you set a custom `cwd`, pass an absolute\n * `promptFile` to avoid ambiguity.\n */\n readonly promptFile?: string;\n /** Maximum iterations to run (default: 1) */\n readonly maxIterations?: number;\n /** Lifecycle hooks grouped by execution location (host or sandbox). */\n readonly hooks?: SandboxHooks;\n /** Key-value map for {{KEY}} placeholder substitution in prompts */\n readonly promptArgs?: PromptArgs;\n /** Logging mode (default: { type: 'file' } with auto-generated path under .sandcastle/logs/) */\n readonly logging?: LoggingOption;\n /** Substring(s) the agent emits to stop the iteration loop early. Matched via `includes` against agent output. (default: `\"<promise>COMPLETE</promise>\"`) */\n readonly completionSignal?: string | string[];\n /** Idle timeout in seconds. If the agent produces no output for this long, it fails. Default: 600 (10 minutes) */\n readonly idleTimeoutSeconds?: number;\n /**\n * Grace window in seconds after a completion signal is observed in the\n * agent's output. The agent process is expected to exit shortly after\n * emitting the signal; if it does not (typically because a spawned child —\n * a `gh`/git subprocess or long-lived MCP server — keeps stdout open),\n * Sandcastle force-completes the iteration with a warning. Resets on every\n * subsequent output line so trailing data (token-usage events, terminal\n * `result` events, structured-output tags) is still captured. Independent\n * of `idleTimeoutSeconds`. Default: 60.\n */\n readonly completionTimeoutSeconds?: number;\n /** Optional name for the run, shown as a prefix in log output */\n readonly name?: string;\n /** Paths relative to the host repo root to copy into the worktree before sandbox start. */\n readonly copyToWorktree?: string[];\n /** Branch strategy — controls how the agent's changes relate to branches.\n * Defaults to { type: \"head\" } for bind-mount providers and { type: \"merge-to-head\" } for isolated providers. */\n readonly branchStrategy?: BranchStrategy;\n /** Resume a prior Claude Code session by ID. The session JSONL must exist on the host. Incompatible with maxIterations > 1. */\n readonly resumeSession?: string;\n /**\n * When true alongside `resumeSession`, fork the session instead of mutating\n * it. The parent session JSONL is left intact and the agent writes a new\n * session under a fresh id. Exposed as the public `.fork()` method on\n * `RunResult` rather than as a stand-alone caller option — see ADR 0018.\n *\n * @internal\n */\n readonly forkSession?: boolean;\n /**\n * An `AbortSignal` that cancels the run when aborted.\n *\n * - If `signal.aborted` is already `true` at entry, `run()` rejects\n * immediately without doing any setup work.\n * - Aborting mid-iteration kills the in-flight agent subprocess.\n * - Phase boundaries (between iterations) also check the signal.\n * - The rejected promise surfaces `signal.reason` via\n * `signal.throwIfAborted()` — no Sandcastle-specific wrapping.\n * - The worktree is preserved on disk after abort (error-path behavior).\n */\n readonly signal?: AbortSignal;\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n /**\n * Structured output definition. When provided, the agent's stdout is\n * scanned for the configured XML tag after the iteration completes, and the\n * result is parsed/validated and returned on `RunResult.output`.\n *\n * Use `Output.object({ tag, schema })` for JSON+schema or\n * `Output.string({ tag })` for raw string extraction.\n *\n * Constraints:\n * - `maxIterations` must be `1` (the default).\n * - The resolved prompt must contain the configured opening tag literal.\n *\n * See ADR 0010 for design rationale.\n */\n readonly output?: OutputDefinition;\n}\n\nexport type { IterationResult, IterationUsage } from \"./Orchestrator.js\";\n\nexport type ResumeRunResultOptions = Omit<\n RunOptions,\n | \"agent\"\n | \"sandbox\"\n | \"prompt\"\n | \"promptFile\"\n | \"resumeSession\"\n | \"forkSession\"\n | \"maxIterations\"\n>;\n\nexport interface RunResult {\n /** Per-iteration results (use `iterations.length` for the count). */\n readonly iterations: IterationResult[];\n /** The matched completion signal string, or undefined if no signal fired before the iteration limit. */\n readonly completionSignal?: string;\n /** Combined stdout output from all agent iterations. */\n readonly stdout: string;\n /** List of commits made by the agent during the run, each identified by its SHA. */\n readonly commits: { sha: string }[];\n /** The branch name the agent worked on inside the sandbox. */\n readonly branch: string;\n /** Path to the log file, if logging was drained to a file. */\n readonly logFilePath?: string;\n /** Host path to the preserved worktree, set when the run succeeded but the worktree had uncommitted changes. */\n readonly preservedWorktreePath?: string;\n /** Continue the last captured agent session for exactly one iteration.\n * Present only when the provider supports resume (`sessionStorage` populated). */\n readonly resume?: (\n prompt: string,\n options?: ResumeRunResultOptions,\n ) => Promise<RunResult>;\n /**\n * Fork the last captured agent session for exactly one iteration: the\n * parent session JSONL is left intact and the child run gets its own\n * session id, enabling fan-out patterns where multiple children diverge\n * from a single parent. Present only when the provider supports resume\n * (`sessionStorage` populated).\n *\n * Sessions only: fork isolates the agent session, not the branch or\n * sandbox. Safe concurrent fan-out (`Promise.all([r.fork(a), r.fork(b)])`)\n * requires the caller to give each fork a distinct `branch` — `head` and\n * `merge-to-head` are not safe for concurrent forks. See ADR 0018.\n */\n readonly fork?: (\n prompt: string,\n options?: ResumeRunResultOptions,\n ) => Promise<RunResult>;\n}\n\n/** Overload: with `Output.object`, returns `RunResult` with typed `output: T`. */\nexport function run<T, A extends AgentProvider>(\n options: RunOptions<A> & { output: OutputObjectDefinition<T> },\n): Promise<RunResult & { output: T }>;\n/** Overload: with `Output.string`, returns `RunResult` with `output: string`. */\nexport function run<A extends AgentProvider>(\n options: RunOptions<A> & { output: OutputStringDefinition },\n): Promise<RunResult & { output: string }>;\n/** Overload: without `output`, returns the standard `RunResult`. */\nexport function run<A extends AgentProvider>(\n options: RunOptions<A>,\n): Promise<RunResult>;\nexport async function run(\n options: RunOptions,\n): Promise<RunResult & { output?: unknown }> {\n // If signal is already aborted, reject immediately without any setup\n options.signal?.throwIfAborted();\n\n const {\n prompt,\n promptFile,\n maxIterations = DEFAULT_MAX_ITERATIONS,\n hooks,\n agent: provider,\n } = options;\n\n // Derive branch strategy: explicit option > default based on provider tag\n const branchStrategy: BranchStrategy =\n options.branchStrategy ??\n (options.sandbox.tag === \"isolated\"\n ? { type: \"merge-to-head\" }\n : { type: \"head\" });\n const effectiveBranchType = branchStrategy.type;\n\n // Validate: head strategy is not supported with isolated providers\n if (effectiveBranchType === \"head\" && options.sandbox.tag === \"isolated\") {\n throw new Error(\n \"head branch strategy is not supported with isolated providers\",\n );\n }\n\n // Validate: copyToWorktree is incompatible with head strategy\n if (\n effectiveBranchType === \"head\" &&\n options.copyToWorktree &&\n options.copyToWorktree.length > 0\n ) {\n throw new Error(\n \"copyToWorktree is not supported with head branch strategy. \" +\n \"In head mode the host working directory is bind-mounted directly.\",\n );\n }\n\n // Validate: resumeSession + maxIterations > 1 is not allowed\n if (options.resumeSession && maxIterations > 1) {\n throw new Error(\n \"resumeSession cannot be combined with maxIterations > 1. \" +\n \"Resume applies to iteration 1 only; multi-iteration resume semantics are not supported.\",\n );\n }\n\n // Validate: forkSession only makes sense alongside resumeSession.\n // It is wired internally by RunResult.fork() and never set on its own.\n if (options.forkSession && !options.resumeSession) {\n throw new Error(\n \"forkSession requires resumeSession. \" +\n \"Use RunResult.fork(prompt) to fork the last captured session.\",\n );\n }\n\n // Validate: output requires maxIterations === 1\n if (options.output && maxIterations !== 1) {\n throw new Error(\n \"output requires maxIterations to be 1. \" +\n \"Structured output is only supported for single-iteration runs.\",\n );\n }\n\n // Extract explicit branch when in branch mode\n const branch: string | undefined =\n branchStrategy.type === \"branch\" ? branchStrategy.branch : undefined;\n\n const hostRepoDir = await Effect.runPromise(\n resolveCwd(options.cwd).pipe(Effect.provide(NodeContext.layer)),\n );\n\n // Validate: resumeSession file must exist on the host\n if (options.resumeSession) {\n await assertResumeSessionExists({\n provider,\n sandboxTag: options.sandbox.tag,\n hostRepoDir,\n resumeSession: options.resumeSession,\n });\n }\n\n // Resolve prompt\n const resolved = await Effect.runPromise(\n resolvePrompt({ prompt, promptFile }).pipe(\n Effect.provide(NodeContext.layer),\n ),\n );\n const rawPrompt = resolved.text;\n const isInlinePrompt = resolved.source === \"inline\";\n\n // Validate: output tag must appear in the resolved prompt\n if (options.output) {\n const openTag = `<${options.output.tag}>`;\n if (!rawPrompt.includes(openTag)) {\n throw new Error(\n `output tag <${options.output.tag}> not found in the resolved prompt. ` +\n \"The caller must instruct the agent to emit the configured tag.\",\n );\n }\n }\n\n const agentName = provider.name;\n\n // Resolve env vars and merge with provider env\n const resolvedEnv = await Effect.runPromise(\n resolveEnv(hostRepoDir).pipe(Effect.provide(NodeContext.layer)),\n );\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: provider.env,\n sandboxProviderEnv: options.sandbox.env,\n });\n\n // Always capture the host's current branch for the TARGET_BRANCH built-in\n // prompt argument. When using a temp branch, it also prefixes the log filename.\n const currentHostBranch = await Effect.runPromise(\n getCurrentBranch(hostRepoDir),\n );\n\n // When in merge-to-head mode, generate a temporary branch name.\n // In head mode, use the host's current branch directly (no worktree).\n const resolvedBranch =\n effectiveBranchType === \"head\"\n ? currentHostBranch\n : (branch ?? generateTempBranchName(options.name));\n\n // When using a temp branch, prefix the log filename with the target branch\n // (the host's current branch) so developers can tell which branch was targeted.\n const targetBranch =\n effectiveBranchType === \"merge-to-head\" ? currentHostBranch : undefined;\n\n // Resolve logging option\n const resolvedLogging: LoggingOption = options.logging ?? {\n type: \"file\",\n path: join(\n hostRepoDir,\n \".sandcastle\",\n \"logs\",\n buildLogFilename(resolvedBranch, targetBranch, options.name),\n ),\n };\n const displayLayer =\n resolvedLogging.type === \"file\"\n ? (() => {\n printFileDisplayStartup({\n logPath: resolvedLogging.path,\n agentName: options.name,\n branch: resolvedBranch,\n hostRepoDir,\n });\n return Layer.provide(\n FileDisplay.layer(resolvedLogging.path),\n NodeFileSystem.layer,\n );\n })()\n : ClackDisplay.layer;\n\n const factoryLayer = Layer.provide(\n WorktreeDockerSandboxFactory.layer,\n Layer.mergeAll(\n Layer.succeed(SandboxConfig, {\n env,\n hostRepoDir,\n copyToWorktree: options.copyToWorktree,\n name: options.name,\n sandboxProvider: options.sandbox,\n branchStrategy,\n hooks,\n signal: options.signal,\n timeouts: options.timeouts,\n }),\n NodeFileSystem.layer,\n displayLayer,\n ),\n );\n\n const streamEmitterLayer = agentStreamEmitterLayer(\n resolvedLogging.type === \"file\"\n ? resolvedLogging.onAgentStreamEvent\n : undefined,\n );\n\n const runLayer = Layer.mergeAll(\n factoryLayer,\n displayLayer,\n streamEmitterLayer,\n );\n\n const baseEffect = Effect.gen(function* () {\n const d = yield* Display;\n yield* d.intro(options.name ?? \"sandcastle\");\n const rows = buildRunSummaryRows({\n name: options.name,\n agentName,\n sandboxName: options.sandbox.name,\n maxIterations,\n branch: resolvedBranch,\n });\n yield* d.summary(\"Sandcastle Run\", rows);\n\n const userArgs = options.promptArgs ?? {};\n\n // Inline prompts pass through to the agent literally — no substitution,\n // no built-in arg injection. Guard against silently ignoring promptArgs.\n let resolvedPrompt: string;\n if (isInlinePrompt) {\n yield* validateNoArgsWithInlinePrompt(userArgs);\n resolvedPrompt = rawPrompt;\n } else {\n yield* validateNoBuiltInArgOverride(userArgs);\n const effectiveArgs = {\n SOURCE_BRANCH: resolvedBranch,\n TARGET_BRANCH: currentHostBranch,\n ...userArgs,\n };\n const builtInArgKeysSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n resolvedPrompt = yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n }\n\n // In head mode, pass the host branch so SandboxLifecycle skips the merge step.\n // In merge-to-head mode, branch is undefined (triggers merge). In branch mode, it's the explicit branch.\n const orchestrateBranch =\n effectiveBranchType === \"head\" ? currentHostBranch : branch;\n\n const orchestrateResult = yield* orchestrate({\n hostRepoDir,\n iterations: maxIterations,\n hooks,\n prompt: resolvedPrompt,\n branch: orchestrateBranch,\n provider,\n completionSignal: options.completionSignal,\n idleTimeoutSeconds: options.idleTimeoutSeconds,\n completionTimeoutSeconds: options.completionTimeoutSeconds,\n name: options.name,\n resumeSession: options.resumeSession,\n forkSession: options.forkSession,\n signal: options.signal,\n skipPromptExpansion: isInlinePrompt,\n timeouts: options.timeouts,\n });\n\n const completion = buildCompletionMessage(\n orchestrateResult.completionSignal,\n orchestrateResult.iterations.length,\n );\n yield* d.status(completion.message, completion.severity);\n\n for (const line of buildContextWindowLines(orchestrateResult.iterations)) {\n yield* d.text(line);\n }\n\n return orchestrateResult;\n });\n\n // In file-logging mode, write errors to the log before they propagate.\n // In stdout mode (ClackDisplay), errors are already shown by withFriendlyErrors\n // in main.ts, so we skip to avoid duplicate terminal output.\n const withErrorLog =\n resolvedLogging.type === \"file\"\n ? baseEffect.pipe(\n Effect.tapError((error) =>\n Effect.gen(function* () {\n const d = yield* Display;\n yield* d.status(\n formatErrorMessage(error as SandboxError),\n \"error\",\n );\n }),\n ),\n )\n : baseEffect;\n\n let result: OrchestrateResult;\n try {\n result = await Effect.runPromise(\n withErrorLog.pipe(Effect.provide(runLayer)),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim (no wrapping)\n options.signal?.throwIfAborted();\n throw error;\n }\n\n const baseResult = {\n ...result,\n logFilePath:\n resolvedLogging.type === \"file\" ? resolvedLogging.path : undefined,\n resume: async (\n prompt: string,\n resumeOptions?: ResumeRunResultOptions,\n ): Promise<RunResult> => {\n const lastIteration = result.iterations.at(-1);\n if (!lastIteration?.sessionId) {\n throw new Error(\"Cannot resume: no sessionId was captured\");\n }\n return run({\n ...options,\n ...resumeOptions,\n prompt,\n promptFile: undefined,\n maxIterations: 1,\n resumeSession: lastIteration.sessionId,\n });\n },\n fork: async (\n prompt: string,\n forkOptions?: ResumeRunResultOptions,\n ): Promise<RunResult> => {\n const lastIteration = result.iterations.at(-1);\n if (!lastIteration?.sessionId) {\n throw new Error(\"Cannot fork: no sessionId was captured\");\n }\n return run({\n ...options,\n ...forkOptions,\n prompt,\n promptFile: undefined,\n maxIterations: 1,\n resumeSession: lastIteration.sessionId,\n forkSession: true,\n });\n },\n };\n\n // Extract structured output after the iteration completes (separate pass from completion signal)\n if (options.output) {\n // Structured output runs are single-iteration, so the last iteration is the\n // one that produced this stdout. Carry its session id onto the error so a\n // caller can resume the same session to re-emit corrected output.\n const lastIteration = baseResult.iterations.at(-1);\n const output = await extractStructuredOutput(\n baseResult.stdout,\n options.output,\n {\n commits: baseResult.commits,\n branch: baseResult.branch,\n preservedWorktreePath: baseResult.preservedWorktreePath,\n sessionId: lastIteration?.sessionId,\n sessionFilePath: lastIteration?.sessionFilePath,\n },\n );\n return { ...baseResult, output };\n }\n\n return baseResult;\n}\n","import { Deferred, Effect } from \"effect\";\n\n/**\n * Race an Effect against an optional `AbortSignal`.\n *\n * - If no signal is provided, the effect runs unmodified.\n * - If the signal is already aborted at call time, dies immediately with\n * `signal.reason`.\n * - Otherwise, races the effect against a Deferred that fires when the\n * signal aborts.\n *\n * Uses `Effect.die` so the abort reason propagates as a defect — callers\n * should use `signal.throwIfAborted()` in their catch handler to surface\n * the original reason without Sandcastle-specific wrapping.\n *\n * The abort listener is always cleaned up, even when the effect wins the race.\n */\nexport const raceAbortSignal = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n signal?: AbortSignal,\n): Effect.Effect<A, E, R> => {\n if (!signal) return effect;\n\n return Effect.gen(function* () {\n if (signal.aborted) {\n return yield* Effect.die(signal.reason);\n }\n\n const abortDeferred = yield* Deferred.make<never, never>();\n const onAbort = () => {\n Effect.runPromise(Deferred.die(abortDeferred, signal.reason)).catch(\n () => {},\n );\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n return yield* Effect.raceFirst(\n effect,\n Deferred.await(abortDeferred) as Effect.Effect<never, never, never>,\n ).pipe(\n Effect.ensuring(\n Effect.sync(() => signal.removeEventListener(\"abort\", onAbort)),\n ),\n );\n });\n};\n","import { NodeContext, NodeFileSystem } from \"@effect/platform-node\";\nimport { join } from \"node:path\";\nimport * as clack from \"@clack/prompts\";\nimport { Effect } from \"effect\";\nimport type { AgentProvider } from \"./AgentProvider.js\";\nimport { ClackDisplay, Display } from \"./Display.js\";\nimport { preprocessPrompt } from \"./PromptPreprocessor.js\";\nimport { resolvePrompt } from \"./PromptResolver.js\";\nimport {\n makeSandboxFromHandle,\n resolveGitMounts,\n SANDBOX_REPO_DIR,\n} from \"./SandboxFactory.js\";\nimport {\n withSandboxLifecycle,\n runHostHooks,\n type SandboxHooks,\n} from \"./SandboxLifecycle.js\";\nimport type {\n AnySandboxProvider,\n BranchStrategy,\n BindMountSandboxHandle,\n IsolatedSandboxHandle,\n NoSandboxHandle,\n} from \"./SandboxProvider.js\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { mergeProviderEnv } from \"./mergeProviderEnv.js\";\nimport { copyToWorktree } from \"./CopyToWorktree.js\";\nimport { startSandbox } from \"./startSandbox.js\";\nimport { syncOut } from \"./syncOut.js\";\nimport * as WorktreeManager from \"./WorktreeManager.js\";\nimport { generateTempBranchName, getCurrentBranch } from \"./WorktreeManager.js\";\nimport {\n type PromptArgs,\n substitutePromptArgs,\n validateNoArgsWithInlinePrompt,\n validateNoBuiltInArgOverride,\n findMissingPromptArgKeys,\n BUILT_IN_PROMPT_ARG_KEYS,\n} from \"./PromptArgumentSubstitution.js\";\nimport { noSandbox } from \"./sandboxes/no-sandbox.js\";\nimport { raceAbortSignal } from \"./raceAbortSignal.js\";\nimport { resolveCwd } from \"./resolveCwd.js\";\nimport type { Timeouts } from \"./run.js\";\n\nexport interface InteractiveOptions {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")) */\n readonly agent: AgentProvider;\n /** Sandbox provider (e.g. docker(), noSandbox()). */\n readonly sandbox?: AnySandboxProvider;\n /** Inline prompt string (mutually exclusive with promptFile). */\n readonly prompt?: string;\n /** Path to a prompt file (mutually exclusive with prompt). */\n readonly promptFile?: string;\n /** Optional name for the interactive session. */\n readonly name?: string;\n /** Branch strategy — controls how the agent's changes relate to branches.\n * Defaults to { type: \"head\" } for bind-mount providers and { type: \"merge-to-head\" } for isolated providers. */\n readonly branchStrategy?: BranchStrategy;\n /** Hooks to run during sandbox lifecycle */\n readonly hooks?: SandboxHooks;\n /** Paths relative to the host repo root to copy into the worktree before sandbox start. */\n readonly copyToWorktree?: string[];\n /** Key-value map for {{KEY}} placeholder substitution in prompts */\n readonly promptArgs?: PromptArgs;\n /** Environment variables to inject into the sandbox. */\n readonly env?: Record<string, string>;\n /**\n * Host repo directory to use instead of `process.cwd()`.\n *\n * Relative paths resolve against `process.cwd()`; absolute paths pass\n * through as-is. A {@link CwdError} is thrown if the path does not exist\n * or is not a directory.\n */\n readonly cwd?: string;\n /**\n * An `AbortSignal` that cancels the interactive session when aborted.\n *\n * - If `signal.aborted` is already `true` at entry, `interactive()` rejects\n * immediately without doing any setup work.\n * - Aborting during an active session kills the agent subprocess.\n * - The rejected promise surfaces `signal.reason` via\n * `signal.throwIfAborted()` — no Sandcastle-specific wrapping.\n * - The worktree is preserved on disk after abort (error-path behavior).\n */\n readonly signal?: AbortSignal;\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n}\n\nexport interface InteractiveResult {\n /** List of commits made during the interactive session. */\n readonly commits: { sha: string }[];\n /** The branch name the agent worked on. */\n readonly branch: string;\n /** Host path to the preserved worktree, if worktree had uncommitted changes. */\n readonly preservedWorktreePath?: string;\n /** Exit code of the interactive process. */\n readonly exitCode: number;\n}\n\n/**\n * Launch an interactive agent session inside a sandbox.\n *\n * The user sees the agent's TUI directly. When the session ends,\n * Sandcastle collects commits and handles branch merging, just like run().\n *\n * Full prompt preprocessing pipeline: PromptResolver -> PromptArgumentSubstitution\n * -> PromptPreprocessor (shell expressions inside sandbox).\n *\n * All three branch strategies are supported: head, merge-to-head, branch.\n */\nexport const interactive = async (\n options: InteractiveOptions,\n): Promise<InteractiveResult> => {\n // If signal is already aborted, reject immediately without any setup\n options.signal?.throwIfAborted();\n\n const { prompt, promptFile, hooks, agent: provider } = options;\n\n const resolvedSandbox = options.sandbox ?? noSandbox();\n\n // Derive branch strategy\n const branchStrategy: BranchStrategy =\n options.branchStrategy ??\n (resolvedSandbox.tag === \"isolated\"\n ? { type: \"merge-to-head\" }\n : { type: \"head\" }); // \"bind-mount\" and \"none\" both default to head\n\n // Validate: head strategy is not supported with isolated providers\n if (branchStrategy.type === \"head\" && resolvedSandbox.tag === \"isolated\") {\n throw new Error(\n \"head branch strategy is not supported with isolated providers\",\n );\n }\n\n // Validate: copyToWorktree is incompatible with head strategy\n if (\n branchStrategy.type === \"head\" &&\n options.copyToWorktree &&\n options.copyToWorktree.length > 0\n ) {\n throw new Error(\n \"copyToWorktree is not supported with head branch strategy. \" +\n \"In head mode the host working directory is bind-mounted directly.\",\n );\n }\n\n // Validate buildInteractiveArgs is available\n if (!provider.buildInteractiveArgs) {\n throw new Error(\n `Agent provider \"${provider.name}\" does not support buildInteractiveArgs, required for interactive sessions.`,\n );\n }\n\n const branch: string | undefined =\n branchStrategy.type === \"branch\" ? branchStrategy.branch : undefined;\n\n const isHeadMode = branchStrategy.type === \"head\";\n const sandboxProvider = resolvedSandbox;\n\n const inner = Effect.gen(function* () {\n const hostRepoDir = yield* resolveCwd(options.cwd);\n const d = yield* Display;\n\n // 1. Resolve prompt (from string or file), or skip if neither provided\n const hasPromptSource = prompt !== undefined || promptFile !== undefined;\n const resolved = hasPromptSource\n ? yield* resolvePrompt({ prompt, promptFile })\n : undefined;\n const rawPrompt = resolved?.text ?? \"\";\n const isInlinePrompt = resolved?.source === \"inline\";\n\n // 2. Resolve env vars\n const resolvedEnv = yield* resolveEnv(hostRepoDir);\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: provider.env,\n sandboxProviderEnv: sandboxProvider.env,\n });\n const effectiveEnv = { ...env, ...(options.env ?? {}) };\n\n // 3. Capture host's current branch\n const currentHostBranch = yield* getCurrentBranch(hostRepoDir);\n\n const resolvedBranch =\n branchStrategy.type === \"head\"\n ? currentHostBranch\n : (branch ?? generateTempBranchName(options.name));\n\n // 4. Validate prompt args and collect missing ones interactively (skip when no prompt).\n // Inline prompts pass through literally — skip scanning, substitution, and built-in args.\n let substitutedPrompt = rawPrompt;\n if (hasPromptSource && !isInlinePrompt) {\n const userArgs = options.promptArgs ?? {};\n yield* validateNoBuiltInArgOverride(userArgs);\n\n // Scan for missing keys and prompt the user for each one\n const missingKeys = findMissingPromptArgKeys(rawPrompt, userArgs);\n const collectedArgs: Record<string, string> = {};\n for (const key of missingKeys) {\n const value = yield* Effect.promise(() =>\n clack.text({\n message: `Enter value for {{${key}}}`,\n validate: (v) => {\n if (!v) return `A value is required for {{${key}}}`;\n },\n }),\n );\n if (clack.isCancel(value)) {\n clack.cancel(\"Prompt arg collection cancelled.\");\n return yield* Effect.fail(\n new Error(\"User cancelled prompt arg collection\"),\n );\n }\n collectedArgs[key] = value;\n }\n\n const mergedUserArgs = { ...userArgs, ...collectedArgs };\n const effectiveArgs = {\n SOURCE_BRANCH: resolvedBranch,\n TARGET_BRANCH: currentHostBranch,\n ...mergedUserArgs,\n };\n const builtInArgKeysSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n substitutedPrompt = yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n } else if (isInlinePrompt) {\n const userArgs = options.promptArgs ?? {};\n yield* validateNoArgsWithInlinePrompt(userArgs);\n }\n\n // In head mode, pass the host branch so SandboxLifecycle skips the merge step.\n const lifecycleBranch = isHeadMode ? currentHostBranch : branch;\n\n // Display intro and summary\n yield* d.intro(options.name ?? \"sandcastle interactive\");\n yield* d.summary(\"Interactive Session\", {\n Agent: options.name ?? provider.name,\n Sandbox: sandboxProvider.name,\n Branch: resolvedBranch,\n });\n\n // 5. Create worktree (unless head mode)\n let worktreeInfo: WorktreeManager.WorktreeInfo | undefined;\n\n if (!isHeadMode) {\n worktreeInfo = yield* d.taskLog(\"Creating worktree\", () =>\n WorktreeManager.pruneStale(hostRepoDir).pipe(\n Effect.catchAll(() => Effect.void),\n Effect.andThen(\n branch\n ? WorktreeManager.create(hostRepoDir, { branch })\n : WorktreeManager.create(hostRepoDir, { name: options.name }),\n ),\n ),\n );\n }\n\n // 6. Prepare the worktree and start the sandbox. If any step fails after the\n // worktree exists (copying, hooks, or sandbox start), remove the worktree so\n // it is not orphaned on disk.\n const handle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle = yield* Effect.gen(function* () {\n if (!isHeadMode) {\n // Copy files to worktree (bind-mount and no-sandbox, non-head)\n if (\n (sandboxProvider.tag === \"bind-mount\" ||\n sandboxProvider.tag === \"none\") &&\n options.copyToWorktree &&\n options.copyToWorktree.length > 0\n ) {\n yield* d.taskLog(\"Copying files to worktree\", () =>\n copyToWorktree(\n options.copyToWorktree!,\n hostRepoDir,\n worktreeInfo!.path,\n options.timeouts?.copyToWorktreeMs,\n ),\n );\n }\n\n // Run host.onWorktreeReady hooks\n if (hooks?.host?.onWorktreeReady?.length) {\n yield* runHostHooks(hooks.host.onWorktreeReady, worktreeInfo!.path);\n }\n } else if (hooks?.host?.onWorktreeReady?.length) {\n // Head strategy: cwd is the host repo root\n yield* runHostHooks(hooks.host.onWorktreeReady, hostRepoDir);\n }\n\n // Start sandbox\n if (sandboxProvider.tag === \"none\") {\n // No-sandbox: run directly on the host, no container\n const worktreePath = isHeadMode ? hostRepoDir : worktreeInfo!.path;\n return yield* Effect.promise(() =>\n sandboxProvider.create({\n worktreePath,\n env: effectiveEnv,\n }),\n );\n } else if (sandboxProvider.tag === \"isolated\") {\n const startResult = yield* d.taskLog(\"Starting sandbox\", () =>\n startSandbox({\n provider: sandboxProvider,\n hostRepoDir: worktreeInfo!.path,\n env: effectiveEnv,\n copyPaths: options.copyToWorktree,\n }),\n );\n return startResult.handle;\n } else {\n const gitPath = join(hostRepoDir, \".git\");\n const gitMounts = yield* resolveGitMounts(gitPath);\n const startResult = yield* d.taskLog(\"Starting sandbox\", () =>\n startSandbox({\n provider: sandboxProvider,\n hostRepoDir,\n env: effectiveEnv,\n worktreeOrRepoPath: isHeadMode ? hostRepoDir : worktreeInfo!.path,\n gitMounts,\n repoDir: SANDBOX_REPO_DIR,\n }),\n );\n return startResult.handle;\n }\n }).pipe(\n Effect.tapError(() =>\n worktreeInfo\n ? WorktreeManager.remove(worktreeInfo.path).pipe(\n Effect.catchAll(() => Effect.void),\n )\n : Effect.void,\n ),\n );\n\n // Run lifecycle with guaranteed cleanup of handle and worktree\n return yield* Effect.gen(function* () {\n // Check interactiveExec is available (no-sandbox always has it; bind-mount/isolated it's optional)\n if (!handle.interactiveExec) {\n throw new Error(\n `Sandbox provider does not support interactiveExec. ` +\n `The provider must implement the optional interactiveExec method to use interactive().`,\n );\n }\n const interactiveExecFn = handle.interactiveExec.bind(handle);\n\n // Build sandbox service and run withSandboxLifecycle\n const sandbox = makeSandboxFromHandle(handle);\n const worktreePath = handle.worktreePath;\n\n const applyToHost =\n sandboxProvider.tag === \"isolated\" && worktreeInfo\n ? () => syncOut(worktreeInfo!.path, handle as IsolatedSandboxHandle)\n : () => Effect.void; // bind-mount and no-sandbox don't need sync\n\n const lifecycleEffect = withSandboxLifecycle(\n {\n hostRepoDir,\n sandboxRepoDir: worktreePath,\n hooks,\n branch: lifecycleBranch,\n hostWorktreePath: isHeadMode ? hostRepoDir : worktreeInfo?.path,\n applyToHost,\n timeouts: options.timeouts,\n },\n sandbox,\n (ctx) =>\n Effect.gen(function* () {\n // Preprocess prompt (expand !`command` shell expressions inside sandbox).\n // Skip when no prompt source was provided, or when inline (literal passthrough).\n const fullPrompt =\n !hasPromptSource || isInlinePrompt\n ? substitutedPrompt\n : yield* preprocessPrompt(\n substitutedPrompt,\n ctx.sandbox,\n ctx.sandboxRepoDir,\n );\n\n // Build interactive args and run the session\n const interactiveArgs = provider.buildInteractiveArgs!({\n prompt: fullPrompt,\n dangerouslySkipPermissions: sandboxProvider.tag !== \"none\",\n });\n\n const result = yield* raceAbortSignal(\n Effect.promise(() =>\n interactiveExecFn(interactiveArgs, {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n cwd: worktreePath,\n }),\n ),\n options.signal,\n );\n\n return result.exitCode;\n }),\n );\n\n const lifecycleResult = yield* lifecycleEffect;\n\n const exitCode = lifecycleResult.result;\n\n // Check for uncommitted changes (worktree mode only)\n let preservedWorktreePath: string | undefined;\n if (worktreeInfo) {\n const hasUncommitted = yield* WorktreeManager.hasUncommittedChanges(\n worktreeInfo.path,\n ).pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (hasUncommitted) {\n preservedWorktreePath = worktreeInfo.path;\n }\n }\n\n // Clean up worktree if not preserved\n if (worktreeInfo && !preservedWorktreePath) {\n yield* WorktreeManager.remove(worktreeInfo.path).pipe(\n Effect.catchAll(() => Effect.void),\n );\n }\n\n // Final summary\n yield* d.summary(\"Session Complete\", {\n Commits: String(lifecycleResult.commits.length),\n Branch: lifecycleResult.branch,\n \"Exit code\": String(exitCode),\n ...(preservedWorktreePath\n ? { \"Preserved worktree\": preservedWorktreePath }\n : {}),\n });\n\n return {\n commits: lifecycleResult.commits,\n branch: lifecycleResult.branch,\n preservedWorktreePath,\n exitCode,\n };\n }).pipe(\n // On error, always clean up worktree (on success, handled above with preserve check)\n Effect.tapError(() =>\n worktreeInfo\n ? WorktreeManager.remove(worktreeInfo.path).pipe(\n Effect.catchAll(() => Effect.void),\n )\n : Effect.void,\n ),\n // Always close sandbox handle\n Effect.ensuring(Effect.promise(() => handle.close().catch(() => {}))),\n );\n });\n\n let result: InteractiveResult;\n try {\n result = await Effect.runPromise(\n inner.pipe(\n Effect.provide(ClackDisplay.layer),\n Effect.provide(NodeContext.layer),\n Effect.provide(NodeFileSystem.layer),\n ),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim (no wrapping)\n options.signal?.throwIfAborted();\n throw error;\n }\n\n return result;\n};\n","import { NodeContext, NodeFileSystem } from \"@effect/platform-node\";\nimport { join } from \"node:path\";\nimport { Effect, Layer, Ref } from \"effect\";\nimport type { AgentProvider } from \"./AgentProvider.js\";\nimport {\n ClackDisplay,\n Display,\n FileDisplay,\n SilentDisplay,\n type DisplayEntry,\n} from \"./Display.js\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { mergeProviderEnv } from \"./mergeProviderEnv.js\";\nimport { orchestrate, type IterationResult } from \"./Orchestrator.js\";\nimport { agentStreamEmitterLayer } from \"./AgentStreamEmitter.js\";\nimport {\n type PromptArgs,\n substitutePromptArgs,\n validateNoArgsWithInlinePrompt,\n validateNoBuiltInArgOverride,\n BUILT_IN_PROMPT_ARG_KEYS,\n} from \"./PromptArgumentSubstitution.js\";\nimport { resolvePrompt } from \"./PromptResolver.js\";\nimport { preprocessPrompt } from \"./PromptPreprocessor.js\";\nimport type { LoggingOption, Timeouts } from \"./run.js\";\nimport {\n buildCompletionMessage,\n buildContextWindowLines,\n buildLogFilename,\n printFileDisplayStartup,\n} from \"./run.js\";\nimport {\n withSandboxLifecycle,\n runHostHooks,\n type SandboxHooks,\n} from \"./SandboxLifecycle.js\";\nimport {\n type SandboxService,\n SandboxFactory,\n SANDBOX_REPO_DIR,\n resolveGitMounts,\n makeSandboxFromHandle,\n} from \"./SandboxFactory.js\";\nimport type {\n SandboxProvider,\n BindMountSandboxHandle,\n IsolatedSandboxHandle,\n NoSandboxHandle,\n} from \"./SandboxProvider.js\";\nimport { startSandbox } from \"./startSandbox.js\";\nimport { syncOut } from \"./syncOut.js\";\nimport * as WorktreeManager from \"./WorktreeManager.js\";\nimport { copyToWorktree } from \"./CopyToWorktree.js\";\nimport { resolveCwd } from \"./resolveCwd.js\";\nimport { patchGitMountsForWindows } from \"./mountUtils.js\";\nimport { registerShutdown } from \"./shutdownRegistry.js\";\n\nexport interface CreateSandboxOptions {\n /** Explicit branch for the worktree (required). */\n readonly branch: string;\n /**\n * Ref to fork from when `branch` does not yet exist. Ignored when the branch\n * already exists. Defaults to `HEAD`.\n */\n readonly baseBranch?: string;\n /** Sandbox provider (e.g. docker({ imageName: \"sandcastle:myrepo\" })). */\n readonly sandbox: SandboxProvider;\n /**\n * Host repo directory. Replaces `process.cwd()` as the anchor for\n * `.sandcastle/worktrees/`, `.sandcastle/.env`, and git operations.\n *\n * - Relative paths are resolved against `process.cwd()`.\n * - Absolute paths are used as-is.\n * - Defaults to `process.cwd()` when omitted.\n */\n readonly cwd?: string;\n /** Lifecycle hooks grouped by execution location (host or sandbox). */\n readonly hooks?: SandboxHooks;\n /** Paths relative to the host repo root to copy into the worktree at creation time. */\n readonly copyToWorktree?: string[];\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n /** @internal Test-only overrides to bypass the sandbox provider. */\n readonly _test?: {\n readonly buildSandbox?: (sandboxDir: string) => SandboxService;\n };\n}\n\nexport interface SandboxRunOptions {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")). */\n readonly agent: AgentProvider;\n /** Inline prompt string (mutually exclusive with promptFile). */\n readonly prompt?: string;\n /** Path to a prompt file (mutually exclusive with prompt). */\n readonly promptFile?: string;\n /** Key-value map for {{KEY}} placeholder substitution in prompts. */\n readonly promptArgs?: PromptArgs;\n /** Maximum iterations to run (default: 1). */\n readonly maxIterations?: number;\n /** Substring(s) the agent emits to stop the iteration loop early. */\n readonly completionSignal?: string | string[];\n /** Idle timeout in seconds. Default: 600. */\n readonly idleTimeoutSeconds?: number;\n /** Grace window in seconds after a completion signal is observed but the agent process has not exited. See ADR 0019. Default: 60. */\n readonly completionTimeoutSeconds?: number;\n /** Display name for this run. */\n readonly name?: string;\n /** Logging mode. */\n readonly logging?: LoggingOption;\n /**\n * An `AbortSignal` that cancels the run when aborted.\n *\n * - Pre-aborted signal rejects immediately without setup.\n * - Mid-iteration abort kills the in-flight agent subprocess.\n * - The rejected promise surfaces `signal.reason` verbatim.\n * - The `Sandbox` handle remains usable after abort — call `.run()` again\n * with a fresh signal, or `.close()` to tear down.\n */\n readonly signal?: AbortSignal;\n}\n\nexport interface SandboxRunResult {\n /** Per-iteration results (use `iterations.length` for the count). */\n readonly iterations: IterationResult[];\n /** The matched completion signal string, or undefined if none fired. */\n readonly completionSignal?: string;\n /** Combined stdout output from all agent iterations. */\n readonly stdout: string;\n /** List of commits made by the agent during the run. */\n readonly commits: { sha: string }[];\n /** Path to the log file, if logging was drained to a file. */\n readonly logFilePath?: string;\n}\n\nexport interface SandboxInteractiveOptions {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")). */\n readonly agent: AgentProvider;\n /** Inline prompt string (mutually exclusive with promptFile). */\n readonly prompt?: string;\n /** Path to a prompt file (mutually exclusive with prompt). */\n readonly promptFile?: string;\n /** Key-value map for {{KEY}} placeholder substitution in prompts. */\n readonly promptArgs?: PromptArgs;\n /** Display name for this interactive session. */\n readonly name?: string;\n /**\n * An `AbortSignal` that cancels the interactive session when aborted.\n *\n * - Pre-aborted signal rejects immediately without setup.\n * - The rejected promise surfaces `signal.reason` verbatim.\n * - The `Sandbox` handle remains usable after abort.\n */\n readonly signal?: AbortSignal;\n}\n\nexport interface SandboxInteractiveResult {\n /** List of commits made during the interactive session. */\n readonly commits: { sha: string }[];\n /** Exit code of the interactive process. */\n readonly exitCode: number;\n}\n\nexport interface CloseResult {\n /** Host path to the preserved worktree, set when the worktree had uncommitted changes. */\n readonly preservedWorktreePath?: string;\n}\n\nexport interface Sandbox {\n /** The branch the worktree is on. */\n readonly branch: string;\n /** Host path to the worktree. */\n readonly worktreePath: string;\n /** Invoke an agent inside the existing sandbox. */\n run(options: SandboxRunOptions): Promise<SandboxRunResult>;\n /** Launch an interactive agent session inside the existing sandbox. */\n interactive(\n options: SandboxInteractiveOptions,\n ): Promise<SandboxInteractiveResult>;\n /** Tear down the sandbox and worktree. */\n close(): Promise<CloseResult>;\n /** Auto teardown via `await using`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\n/** @internal Context for building Sandbox handle methods. */\ninterface SandboxHandleContext {\n readonly branch: string;\n readonly worktreePath: string;\n readonly hostRepoDir: string;\n readonly sandboxRepoDir: string;\n readonly sandbox: SandboxService;\n readonly providerHandle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle\n | undefined;\n readonly applyToHost: () => Effect.Effect<void, any>;\n readonly timeouts?: Timeouts;\n}\n\n/**\n * @internal Builds a Sandbox handle with run() and interactive() methods.\n * The close callback controls teardown behavior — top-level createSandbox()\n * cleans up both container and worktree, while worktree-backed sandboxes\n * only tear down the container.\n */\nconst buildSandboxHandle = (\n ctx: SandboxHandleContext,\n close: () => Promise<CloseResult>,\n): Sandbox => {\n const {\n branch,\n worktreePath,\n hostRepoDir,\n sandboxRepoDir,\n sandbox,\n providerHandle,\n applyToHost,\n timeouts,\n } = ctx;\n\n const sandboxHandle: Sandbox = {\n branch,\n worktreePath: worktreePath,\n\n run: async (runOptions: SandboxRunOptions): Promise<SandboxRunResult> => {\n // If signal is already aborted, reject immediately without any setup\n runOptions.signal?.throwIfAborted();\n\n const {\n agent: provider,\n prompt,\n promptFile,\n maxIterations = 1,\n } = runOptions;\n\n const resolved = await Effect.runPromise(\n resolvePrompt({ prompt, promptFile }).pipe(\n Effect.provide(NodeContext.layer),\n ),\n );\n const rawPrompt = resolved.text;\n const isInlinePrompt = resolved.source === \"inline\";\n\n const userArgs = runOptions.promptArgs ?? {};\n const currentHostBranch = await Effect.runPromise(\n WorktreeManager.getCurrentBranch(hostRepoDir),\n );\n\n const displayRef = Ref.unsafeMake<ReadonlyArray<DisplayEntry>>([]);\n const silentDisplayLayer = SilentDisplay.layer(displayRef);\n\n const resolvedPrompt = await Effect.runPromise(\n Effect.gen(function* () {\n if (isInlinePrompt) {\n yield* validateNoArgsWithInlinePrompt(userArgs);\n return rawPrompt;\n }\n yield* validateNoBuiltInArgOverride(userArgs);\n const effectiveArgs = {\n SOURCE_BRANCH: branch,\n TARGET_BRANCH: currentHostBranch,\n ...userArgs,\n };\n const builtInArgKeysSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n return yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n }).pipe(Effect.provide(silentDisplayLayer)),\n );\n\n const resolvedLogging: LoggingOption = runOptions.logging ?? {\n type: \"file\",\n path: join(\n hostRepoDir,\n \".sandcastle\",\n \"logs\",\n buildLogFilename(branch, undefined, runOptions.name),\n ),\n };\n\n const runDisplayLayer =\n resolvedLogging.type === \"file\"\n ? (() => {\n printFileDisplayStartup({\n logPath: resolvedLogging.path,\n agentName: runOptions.name,\n branch,\n });\n return Layer.provide(\n FileDisplay.layer(resolvedLogging.path),\n NodeFileSystem.layer,\n );\n })()\n : silentDisplayLayer;\n\n const reuseFactoryLayer = Layer.succeed(SandboxFactory, {\n withSandbox: (makeEffect) =>\n makeEffect(\n {\n hostWorktreePath: worktreePath,\n sandboxRepoPath: sandboxRepoDir,\n applyToHost,\n },\n sandbox,\n ).pipe(\n Effect.map((value) => ({\n value,\n preservedWorktreePath: undefined,\n })),\n ) as any,\n });\n\n const streamEmitterLayer = agentStreamEmitterLayer(\n resolvedLogging.type === \"file\"\n ? resolvedLogging.onAgentStreamEvent\n : undefined,\n );\n\n const runLayer = Layer.mergeAll(\n reuseFactoryLayer,\n runDisplayLayer,\n streamEmitterLayer,\n );\n\n let result;\n try {\n result = await Effect.runPromise(\n Effect.gen(function* () {\n const display = yield* Display;\n yield* display.intro(runOptions.name ?? \"sandcastle\");\n\n const orchestrateResult = yield* orchestrate({\n hostRepoDir,\n iterations: maxIterations,\n prompt: resolvedPrompt,\n branch,\n provider,\n completionSignal: runOptions.completionSignal,\n idleTimeoutSeconds: runOptions.idleTimeoutSeconds,\n completionTimeoutSeconds: runOptions.completionTimeoutSeconds,\n name: runOptions.name,\n signal: runOptions.signal,\n skipPromptExpansion: isInlinePrompt,\n timeouts,\n });\n\n const completion = buildCompletionMessage(\n orchestrateResult.completionSignal,\n orchestrateResult.iterations.length,\n );\n yield* display.status(completion.message, completion.severity);\n\n for (const line of buildContextWindowLines(\n orchestrateResult.iterations,\n )) {\n yield* display.text(line);\n }\n\n return orchestrateResult;\n }).pipe(Effect.provide(runLayer)),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim\n runOptions.signal?.throwIfAborted();\n throw error;\n }\n\n return {\n iterations: result.iterations,\n completionSignal: result.completionSignal,\n stdout: result.stdout,\n commits: result.commits,\n logFilePath:\n resolvedLogging.type === \"file\" ? resolvedLogging.path : undefined,\n };\n },\n\n interactive: async (\n interactiveOptions: SandboxInteractiveOptions,\n ): Promise<SandboxInteractiveResult> => {\n // If signal is already aborted, reject immediately without any setup\n interactiveOptions.signal?.throwIfAborted();\n\n const { agent: provider, prompt, promptFile } = interactiveOptions;\n\n if (!provider.buildInteractiveArgs) {\n throw new Error(\n `Agent provider \"${provider.name}\" does not support buildInteractiveArgs, required for interactive sessions.`,\n );\n }\n\n if (!providerHandle?.interactiveExec) {\n throw new Error(\n `Sandbox provider does not support interactiveExec. ` +\n `The provider must implement the optional interactiveExec method to use interactive().`,\n );\n }\n const interactiveExecFn =\n providerHandle.interactiveExec.bind(providerHandle);\n\n let lifecycleResult;\n try {\n lifecycleResult = await Effect.runPromise(\n Effect.gen(function* () {\n const resolved = yield* resolvePrompt({ prompt, promptFile });\n const rawPrompt = resolved.text;\n const isInlinePrompt = resolved.source === \"inline\";\n\n const userArgs = interactiveOptions.promptArgs ?? {};\n const currentHostBranch =\n yield* WorktreeManager.getCurrentBranch(hostRepoDir);\n\n let resolvedPrompt: string;\n if (isInlinePrompt) {\n yield* validateNoArgsWithInlinePrompt(userArgs);\n resolvedPrompt = rawPrompt;\n } else {\n yield* validateNoBuiltInArgOverride(userArgs);\n const effectiveArgs = {\n SOURCE_BRANCH: branch,\n TARGET_BRANCH: currentHostBranch,\n ...userArgs,\n };\n const builtInArgKeysSet = new Set<string>(\n BUILT_IN_PROMPT_ARG_KEYS,\n );\n resolvedPrompt = yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n }\n\n return yield* withSandboxLifecycle(\n {\n hostRepoDir,\n sandboxRepoDir,\n branch,\n hostWorktreePath: worktreePath,\n applyToHost,\n timeouts,\n },\n sandbox,\n (ctx) =>\n Effect.gen(function* () {\n const fullPrompt = isInlinePrompt\n ? resolvedPrompt\n : yield* preprocessPrompt(\n resolvedPrompt,\n ctx.sandbox,\n ctx.sandboxRepoDir,\n );\n\n const interactiveArgs = provider.buildInteractiveArgs!({\n prompt: fullPrompt,\n dangerouslySkipPermissions: true,\n });\n const execPromise = interactiveExecFn(interactiveArgs, {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n cwd: sandboxRepoDir,\n });\n\n // Race exec with abort signal if provided\n const signal = interactiveOptions.signal;\n const result = yield* Effect.promise(() => {\n if (!signal) return execPromise;\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise<{ exitCode: number }>(\n (resolve, reject) => {\n const onAbort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n execPromise.then(\n (r) => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve(r);\n },\n (e) => {\n signal.removeEventListener(\"abort\", onAbort);\n reject(e);\n },\n );\n },\n );\n });\n\n return result.exitCode;\n }),\n );\n }).pipe(\n Effect.provide(ClackDisplay.layer),\n Effect.provide(NodeContext.layer),\n ),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim\n interactiveOptions.signal?.throwIfAborted();\n throw error;\n }\n\n return {\n commits: lifecycleResult.commits,\n exitCode: lifecycleResult.result,\n };\n },\n\n close: async (): Promise<CloseResult> => close(),\n\n [Symbol.asyncDispose]: async (): Promise<void> => {\n await sandboxHandle.close();\n },\n };\n\n return sandboxHandle;\n};\n\n/** @internal Options for createSandboxFromWorktree — used by worktree.createSandbox(). */\nexport interface CreateSandboxFromWorktreeOptions {\n readonly branch: string;\n readonly worktreePath: string;\n readonly hostRepoDir: string;\n readonly sandbox: SandboxProvider;\n readonly hooks?: SandboxHooks;\n readonly copyToWorktree?: string[];\n readonly timeouts?: Timeouts;\n readonly _test?: {\n readonly buildSandbox?: (sandboxDir: string) => SandboxService;\n };\n}\n\n/**\n * @internal Creates a sandbox backed by an existing worktree.\n * Split ownership: close() tears down the container only, leaving the worktree intact.\n * Used by Worktree.createSandbox().\n */\nexport const createSandboxFromWorktree = async (\n options: CreateSandboxFromWorktreeOptions,\n): Promise<Sandbox> => {\n const { branch, worktreePath, hostRepoDir } = options;\n const isTestMode = !!options._test?.buildSandbox;\n\n // 1. Copy files if requested (bind-mount only)\n if (\n options.copyToWorktree &&\n options.copyToWorktree.length > 0 &&\n options.sandbox.tag !== \"isolated\"\n ) {\n await Effect.runPromise(\n copyToWorktree(\n options.copyToWorktree,\n hostRepoDir,\n worktreePath,\n options.timeouts?.copyToWorktreeMs,\n ),\n );\n }\n\n // 2. Start sandbox via provider or local sandbox layer (test mode)\n let providerHandle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle\n | undefined;\n let sandbox: SandboxService;\n let sandboxRepoDir: string;\n const isIsolated = options.sandbox.tag === \"isolated\";\n\n if (isTestMode) {\n sandbox = options._test!.buildSandbox!(worktreePath);\n sandboxRepoDir = worktreePath;\n } else {\n const resolvedEnv = await Effect.runPromise(\n resolveEnv(hostRepoDir).pipe(Effect.provide(NodeContext.layer)),\n );\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: {},\n sandboxProviderEnv: options.sandbox.env,\n });\n\n const provider = options.sandbox;\n\n let startEffect;\n if (provider.tag === \"isolated\") {\n startEffect = startSandbox({\n provider,\n hostRepoDir: worktreePath,\n env,\n copyPaths: options.copyToWorktree,\n });\n } else if (provider.tag === \"none\") {\n startEffect = startSandbox({\n provider,\n hostRepoDir,\n env,\n worktreeOrRepoPath: worktreePath,\n });\n } else {\n startEffect = resolveGitMounts(join(hostRepoDir, \".git\")).pipe(\n Effect.provide(NodeFileSystem.layer),\n Effect.catchAll(() => Effect.succeed([])),\n // Patch git mounts for Windows worktree compatibility (ADR-0006)\n Effect.flatMap((gitMounts) =>\n Effect.tryPromise({\n try: () =>\n patchGitMountsForWindows(\n gitMounts,\n worktreePath,\n SANDBOX_REPO_DIR,\n ),\n catch: (e) =>\n new Error(\n `Failed to patch git mounts: ${e instanceof Error ? e.message : String(e)}`,\n ),\n }),\n ),\n Effect.flatMap((gitMounts) =>\n startSandbox({\n provider,\n hostRepoDir,\n env,\n worktreeOrRepoPath: worktreePath,\n gitMounts,\n repoDir: SANDBOX_REPO_DIR,\n }),\n ),\n );\n }\n\n const startResult = await Effect.runPromise(startEffect);\n\n providerHandle = startResult.handle;\n sandbox = startResult.sandbox;\n sandboxRepoDir = startResult.worktreePath;\n }\n\n // 3. Run onSandboxReady hooks (sandbox-side and host-side in parallel)\n const sandboxOnReady = options.hooks?.sandbox?.onSandboxReady;\n const hostOnReady = options.hooks?.host?.onSandboxReady;\n\n if (sandboxOnReady?.length || hostOnReady?.length) {\n await Effect.runPromise(\n Effect.gen(function* () {\n yield* sandbox.exec(\n `git config --global --add safe.directory \"${sandboxRepoDir}\"`,\n );\n const sandboxEffects = (sandboxOnReady ?? []).map((hook) =>\n sandbox.exec(hook.command, {\n cwd: sandboxRepoDir,\n sudo: hook.sudo,\n }),\n );\n const allEffects = [...sandboxEffects] as Effect.Effect<\n unknown,\n unknown\n >[];\n if (hostOnReady?.length) {\n allEffects.push(runHostHooks(hostOnReady, worktreePath));\n }\n yield* Effect.all(allEffects, {\n concurrency: \"unbounded\",\n });\n }),\n );\n }\n\n // 4. Build applyToHost callback\n const applyToHost =\n isIsolated && providerHandle\n ? () => syncOut(worktreePath, providerHandle as IsolatedSandboxHandle)\n : () => Effect.void;\n\n // 5. Build and return sandbox handle — container-only close (worktree owns worktree)\n let closed = false;\n\n return buildSandboxHandle(\n {\n branch,\n worktreePath,\n hostRepoDir,\n sandboxRepoDir,\n sandbox,\n providerHandle,\n applyToHost,\n timeouts: options.timeouts,\n },\n async () => {\n if (closed) return { preservedWorktreePath: undefined };\n closed = true;\n if (providerHandle) await providerHandle.close();\n return { preservedWorktreePath: undefined };\n },\n );\n};\n\n/**\n * Eagerly creates a git worktree on the provided explicit branch and starts\n * a sandbox with the worktree bind-mounted. Returns a Sandbox handle that\n * can be reused across multiple `run()` calls.\n */\nexport const createSandbox = async (\n options: CreateSandboxOptions,\n): Promise<Sandbox> => {\n const { branch } = options;\n const isTestMode = !!options._test?.buildSandbox;\n const isIsolated = options.sandbox.tag === \"isolated\";\n\n // Resolve cwd, create the worktree, and set up the sandbox in a single Effect.\n // Once the worktree exists, any later failure (e.g. a missing image surfacing\n // when the provider creates the container) tears down the container — if it\n // started — and removes the worktree so it is not orphaned on disk.\n const { hostRepoDir, worktreePath, providerHandle, sandbox, sandboxRepoDir } =\n await Effect.runPromise(\n Effect.gen(function* () {\n const hostRepoDir = yield* resolveCwd(options.cwd);\n\n yield* WorktreeManager.pruneStale(hostRepoDir).pipe(\n Effect.catchAll(() => Effect.void),\n );\n const { path: worktreePath } = yield* WorktreeManager.create(\n hostRepoDir,\n { branch, baseBranch: options.baseBranch },\n );\n\n const prepared = yield* Effect.gen(function* () {\n // Copy files (bind-mount/no-sandbox only; isolated copies in startSandbox).\n if (\n options.copyToWorktree &&\n options.copyToWorktree.length > 0 &&\n options.sandbox.tag !== \"isolated\"\n ) {\n yield* copyToWorktree(\n options.copyToWorktree,\n hostRepoDir,\n worktreePath,\n options.timeouts?.copyToWorktreeMs,\n );\n }\n\n // Run host.onWorktreeReady hooks (after copy, before sandbox creation).\n if (options.hooks?.host?.onWorktreeReady?.length) {\n yield* runHostHooks(\n options.hooks.host.onWorktreeReady,\n worktreePath,\n );\n }\n\n // Start the sandbox via the test layer or the shared startSandbox helper.\n let providerHandle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle\n | undefined;\n let sandbox: SandboxService;\n let sandboxRepoDir: string;\n\n if (isTestMode) {\n sandbox = options._test!.buildSandbox!(worktreePath);\n sandboxRepoDir = worktreePath;\n } else {\n const resolvedEnv = yield* resolveEnv(hostRepoDir);\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: {},\n sandboxProviderEnv: options.sandbox.env,\n });\n\n const provider = options.sandbox;\n const startResult = yield* provider.tag === \"isolated\"\n ? startSandbox({\n provider,\n hostRepoDir: worktreePath,\n env,\n copyPaths: options.copyToWorktree,\n })\n : provider.tag === \"none\"\n ? startSandbox({\n provider,\n hostRepoDir,\n env,\n worktreeOrRepoPath: worktreePath,\n })\n : resolveGitMounts(join(hostRepoDir, \".git\")).pipe(\n Effect.provide(NodeFileSystem.layer),\n Effect.catchAll(() => Effect.succeed([])),\n // Patch git mounts for Windows worktree compatibility (ADR-0006)\n Effect.flatMap((gitMounts) =>\n Effect.tryPromise({\n try: () =>\n patchGitMountsForWindows(\n gitMounts,\n worktreePath,\n SANDBOX_REPO_DIR,\n ),\n catch: (e) =>\n new Error(\n `Failed to patch git mounts: ${e instanceof Error ? e.message : String(e)}`,\n ),\n }),\n ),\n Effect.flatMap((gitMounts) =>\n startSandbox({\n provider,\n hostRepoDir,\n env,\n worktreeOrRepoPath: worktreePath,\n gitMounts,\n repoDir: SANDBOX_REPO_DIR,\n }),\n ),\n );\n\n providerHandle = startResult.handle;\n sandbox = startResult.sandbox;\n sandboxRepoDir = startResult.worktreePath;\n }\n\n // Run onSandboxReady hooks (sandbox-side and host-side in parallel). If\n // they fail, tear down the container that just started before the outer\n // handler removes the worktree.\n const sandboxOnReady = options.hooks?.sandbox?.onSandboxReady;\n const hostOnReady = options.hooks?.host?.onSandboxReady;\n\n if (sandboxOnReady?.length || hostOnReady?.length) {\n yield* Effect.gen(function* () {\n yield* sandbox.exec(\n `git config --global --add safe.directory \"${sandboxRepoDir}\"`,\n );\n const sandboxEffects = (sandboxOnReady ?? []).map((hook) =>\n sandbox.exec(hook.command, {\n cwd: sandboxRepoDir,\n sudo: hook.sudo,\n }),\n );\n const allEffects = [...sandboxEffects] as Effect.Effect<\n unknown,\n unknown\n >[];\n if (hostOnReady?.length) {\n allEffects.push(runHostHooks(hostOnReady, worktreePath));\n }\n yield* Effect.all(allEffects, { concurrency: \"unbounded\" });\n }).pipe(\n Effect.onError(() =>\n providerHandle\n ? Effect.promise(() =>\n providerHandle!.close().catch(() => {}),\n )\n : Effect.void,\n ),\n );\n }\n\n return { providerHandle, sandbox, sandboxRepoDir };\n }).pipe(\n Effect.onError(() =>\n WorktreeManager.remove(worktreePath).pipe(\n Effect.catchAll(() => Effect.void),\n ),\n ),\n );\n\n return { hostRepoDir, worktreePath, ...prepared };\n }).pipe(Effect.provide(NodeContext.layer)),\n );\n\n // Build applyToHost callback (once, reused across runs)\n const applyToHost =\n isIsolated && providerHandle\n ? () => syncOut(worktreePath, providerHandle as IsolatedSandboxHandle)\n : () => Effect.void;\n\n let closed = false;\n\n const forceCleanup = () => {\n console.error(`\\nWorktree preserved at ${worktreePath}`);\n console.error(` To review: cd ${worktreePath}`);\n console.error(` To clean up: git worktree remove --force ${worktreePath}`);\n };\n\n // Route cleanup through the shared registry so concurrent sandboxes share one\n // SIGINT/SIGTERM/exit listener instead of tripping MaxListenersExceededWarning.\n const unregisterShutdown = registerShutdown(forceCleanup);\n\n // Build close function\n const doClose = async (): Promise<CloseResult> => {\n if (closed) return { preservedWorktreePath: undefined };\n closed = true;\n\n return Effect.runPromise(\n Effect.gen(function* () {\n if (providerHandle) {\n yield* Effect.promise(() => providerHandle.close());\n }\n\n // Preserve the worktree when it has uncommitted changes; otherwise remove it.\n const isDirty = yield* WorktreeManager.hasUncommittedChanges(\n worktreePath,\n ).pipe(Effect.catchAll(() => Effect.succeed(false)));\n if (isDirty) {\n return { preservedWorktreePath: worktreePath };\n }\n\n yield* WorktreeManager.remove(worktreePath).pipe(\n Effect.catchAll(() => Effect.void),\n );\n return { preservedWorktreePath: undefined };\n }),\n );\n };\n\n // Return the Sandbox handle\n return buildSandboxHandle(\n {\n branch,\n worktreePath,\n hostRepoDir,\n sandboxRepoDir,\n sandbox,\n providerHandle,\n applyToHost,\n timeouts: options.timeouts,\n },\n async () => {\n unregisterShutdown();\n return doClose();\n },\n );\n};\n","import { NodeContext, NodeFileSystem } from \"@effect/platform-node\";\nimport { join } from \"node:path\";\nimport { Effect, Layer } from \"effect\";\nimport type { AgentProvider } from \"./AgentProvider.js\";\nimport { ClackDisplay, Display, FileDisplay } from \"./Display.js\";\nimport { preprocessPrompt } from \"./PromptPreprocessor.js\";\nimport { resolvePrompt } from \"./PromptResolver.js\";\nimport {\n SandboxFactory,\n makeSandboxFromHandle,\n resolveGitMounts,\n SANDBOX_REPO_DIR,\n} from \"./SandboxFactory.js\";\nimport {\n withSandboxLifecycle,\n runHostHooks,\n type SandboxHooks,\n} from \"./SandboxLifecycle.js\";\nimport type {\n AnySandboxProvider,\n SandboxProvider,\n MergeToHeadBranchStrategy,\n NamedBranchStrategy,\n BindMountSandboxHandle,\n IsolatedSandboxHandle,\n NoSandboxHandle,\n} from \"./SandboxProvider.js\";\nimport type { CloseResult, Sandbox } from \"./createSandbox.js\";\nimport { createSandboxFromWorktree } from \"./createSandbox.js\";\nimport type { InteractiveResult } from \"./interactive.js\";\nimport {\n buildCompletionMessage,\n buildContextWindowLines,\n buildLogFilename,\n printFileDisplayStartup,\n} from \"./run.js\";\nimport type { LoggingOption } from \"./run.js\";\nimport { orchestrate, type IterationResult } from \"./Orchestrator.js\";\nimport { agentStreamEmitterLayer } from \"./AgentStreamEmitter.js\";\nimport { resolveEnv } from \"./EnvResolver.js\";\nimport { mergeProviderEnv } from \"./mergeProviderEnv.js\";\nimport { startSandbox } from \"./startSandbox.js\";\nimport { syncOut } from \"./syncOut.js\";\nimport * as WorktreeManager from \"./WorktreeManager.js\";\nimport { copyToWorktree } from \"./CopyToWorktree.js\";\nimport { resolveCwd } from \"./resolveCwd.js\";\nimport { assertResumeSessionExists } from \"./resumePrecheck.js\";\nimport {\n type PromptArgs,\n substitutePromptArgs,\n validateNoArgsWithInlinePrompt,\n validateNoBuiltInArgOverride,\n BUILT_IN_PROMPT_ARG_KEYS,\n} from \"./PromptArgumentSubstitution.js\";\nimport { noSandbox } from \"./sandboxes/no-sandbox.js\";\nimport { raceAbortSignal } from \"./raceAbortSignal.js\";\nimport type { Timeouts } from \"./run.js\";\n\n/** Branch strategies valid for createWorktree — head is excluded. */\nexport type WorktreeBranchStrategy =\n | MergeToHeadBranchStrategy\n | NamedBranchStrategy;\n\nexport interface CreateWorktreeOptions {\n /** Branch strategy — only 'branch' and 'merge-to-head' are allowed. */\n readonly branchStrategy: WorktreeBranchStrategy;\n /**\n * Host repo directory. Replaces `process.cwd()` as the anchor for\n * `.sandcastle/worktrees/`, `.sandcastle/.env`, and git operations.\n *\n * - Relative paths are resolved against `process.cwd()`.\n * - Absolute paths are used as-is.\n * - Defaults to `process.cwd()` when omitted.\n */\n readonly cwd?: string;\n /** Paths relative to the host repo root to copy into the worktree at creation time. */\n readonly copyToWorktree?: string[];\n /** Lifecycle hooks grouped by execution location (host or sandbox).\n * Only `host.onWorktreeReady` is executed here — other hooks are passed through\n * to `run()`, `interactive()`, or `createSandbox()`. */\n readonly hooks?: SandboxHooks;\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n}\n\nexport interface WorktreeInteractiveOptions {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")) */\n readonly agent: AgentProvider;\n /** Sandbox provider (e.g. docker(), noSandbox()). Defaults to noSandbox(). */\n readonly sandbox?: AnySandboxProvider;\n /** Inline prompt string (mutually exclusive with promptFile). */\n readonly prompt?: string;\n /** Path to a prompt file (mutually exclusive with prompt). */\n readonly promptFile?: string;\n /** Optional name for the interactive session. */\n readonly name?: string;\n /** Hooks to run during sandbox lifecycle */\n readonly hooks?: SandboxHooks;\n /** Key-value map for {{KEY}} placeholder substitution in prompts */\n readonly promptArgs?: PromptArgs;\n /** Environment variables to inject into the sandbox. */\n readonly env?: Record<string, string>;\n /**\n * An `AbortSignal` that cancels the interactive session when aborted.\n *\n * - If `signal.aborted` is already `true` at entry, rejects immediately.\n * - Aborting during an active session kills the agent subprocess.\n * - The worktree is preserved on disk after abort.\n * - The `Worktree` handle remains usable for subsequent operations.\n * - The rejected promise surfaces `signal.reason` via\n * `signal.throwIfAborted()` — no Sandcastle-specific wrapping.\n */\n readonly signal?: AbortSignal;\n}\n\nexport interface WorktreeRunOptions {\n /** Agent provider to use (e.g. claudeCode(\"claude-opus-4-7\")) */\n readonly agent: AgentProvider;\n /** Sandbox provider (e.g. docker()). Required — AFK agents should always be sandboxed. */\n readonly sandbox: SandboxProvider;\n /** Inline prompt string (mutually exclusive with promptFile). */\n readonly prompt?: string;\n /** Path to a prompt file (mutually exclusive with prompt). */\n readonly promptFile?: string;\n /** Key-value map for {{KEY}} placeholder substitution in prompts */\n readonly promptArgs?: PromptArgs;\n /** Maximum iterations to run (default: 1). */\n readonly maxIterations?: number;\n /** Substring(s) the agent emits to stop the iteration loop early. */\n readonly completionSignal?: string | string[];\n /** Idle timeout in seconds. Default: 600. */\n readonly idleTimeoutSeconds?: number;\n /** Grace window in seconds after a completion signal is observed but the agent process has not exited. See ADR 0019. Default: 60. */\n readonly completionTimeoutSeconds?: number;\n /** Optional name for the run. */\n readonly name?: string;\n /** Logging mode. */\n readonly logging?: LoggingOption;\n /** Hooks to run during sandbox lifecycle */\n readonly hooks?: SandboxHooks;\n /** Environment variables to inject into the sandbox. */\n readonly env?: Record<string, string>;\n /** Resume a prior Claude Code session by ID. The session JSONL must exist on the host. Incompatible with maxIterations > 1. */\n readonly resumeSession?: string;\n /**\n * An `AbortSignal` that cancels the run when aborted.\n *\n * - If `signal.aborted` is already `true` at entry, rejects immediately\n * without doing any setup work.\n * - Aborting mid-iteration kills the in-flight agent subprocess.\n * - The worktree is preserved on disk after abort.\n * - The `Worktree` handle remains usable for subsequent operations.\n */\n readonly signal?: AbortSignal;\n}\n\nexport interface WorktreeRunResult {\n /** Per-iteration results (use `iterations.length` for the count). */\n readonly iterations: IterationResult[];\n /** The matched completion signal string, or undefined if none fired. */\n readonly completionSignal?: string;\n /** Combined stdout output from all agent iterations. */\n readonly stdout: string;\n /** List of commits made by the agent during the run. */\n readonly commits: { sha: string }[];\n /** The branch name the agent worked on. */\n readonly branch: string;\n /** Path to the log file, if logging was drained to a file. */\n readonly logFilePath?: string;\n}\n\nexport interface WorktreeCreateSandboxOptions {\n /** Sandbox provider (e.g. docker({ imageName: \"sandcastle:myrepo\" })). */\n readonly sandbox: SandboxProvider;\n /** Lifecycle hooks grouped by execution location (host or sandbox). */\n readonly hooks?: SandboxHooks;\n /** Paths relative to the host repo root to copy into the worktree at creation time. */\n readonly copyToWorktree?: string[];\n /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */\n readonly timeouts?: Timeouts;\n /** @internal Test-only overrides to bypass the sandbox provider. */\n readonly _test?: {\n readonly buildSandbox?: (\n sandboxDir: string,\n ) => import(\"./SandboxFactory.js\").SandboxService;\n };\n}\n\nexport interface Worktree {\n /** The branch the worktree is on. */\n readonly branch: string;\n /** Host path to the worktree (worktree). */\n readonly worktreePath: string;\n /** Run an AFK agent in this worktree with a required sandbox. */\n run(options: WorktreeRunOptions): Promise<WorktreeRunResult>;\n /** Run an interactive agent session in this worktree. */\n interactive(options: WorktreeInteractiveOptions): Promise<InteractiveResult>;\n /** Create a long-lived sandbox backed by this worktree's worktree. */\n createSandbox(options: WorktreeCreateSandboxOptions): Promise<Sandbox>;\n /** Clean up the worktree. Preserves worktree if dirty. */\n close(): Promise<CloseResult>;\n /** Auto cleanup via `await using`. */\n [Symbol.asyncDispose](): Promise<void>;\n}\n\n/**\n * Creates a git worktree as an independent, first-class worktree.\n * Returns a Worktree handle with close() and [Symbol.asyncDispose]().\n *\n * Only accepts 'branch' and 'merge-to-head' strategies — 'head' is a\n * compile-time type error since head means no worktree.\n */\nexport const createWorktree = async (\n options: CreateWorktreeOptions,\n): Promise<Worktree> => {\n const branch =\n options.branchStrategy.type === \"branch\"\n ? options.branchStrategy.branch\n : undefined;\n\n const baseBranch =\n options.branchStrategy.type === \"branch\"\n ? options.branchStrategy.baseBranch\n : undefined;\n\n const { hostRepoDir, worktreeInfo } = await Effect.gen(function* () {\n const hostRepoDir = yield* resolveCwd(options.cwd);\n yield* WorktreeManager.pruneStale(hostRepoDir).pipe(\n Effect.catchAll(() => Effect.void),\n );\n const info = yield* WorktreeManager.create(hostRepoDir, {\n branch,\n baseBranch,\n });\n if (options.copyToWorktree && options.copyToWorktree.length > 0) {\n yield* copyToWorktree(\n options.copyToWorktree,\n hostRepoDir,\n info.path,\n options.timeouts?.copyToWorktreeMs,\n );\n }\n // Run host.onWorktreeReady hooks after copyToWorktree, before sandbox creation\n if (options.hooks?.host?.onWorktreeReady?.length) {\n yield* runHostHooks(options.hooks.host.onWorktreeReady, info.path);\n }\n return { hostRepoDir, worktreeInfo: info };\n }).pipe(Effect.provide(NodeContext.layer), Effect.runPromise);\n\n let closed = false;\n\n const close = async (): Promise<CloseResult> => {\n if (closed) return { preservedWorktreePath: undefined };\n closed = true;\n\n return Effect.gen(function* () {\n const isDirty = yield* WorktreeManager.hasUncommittedChanges(\n worktreeInfo.path,\n ).pipe(Effect.catchAll(() => Effect.succeed(false)));\n\n if (isDirty) {\n return { preservedWorktreePath: worktreeInfo.path } as CloseResult;\n }\n\n yield* WorktreeManager.remove(worktreeInfo.path).pipe(\n Effect.catchAll(() => Effect.void),\n );\n\n return { preservedWorktreePath: undefined } as CloseResult;\n }).pipe(Effect.runPromise);\n };\n\n const worktreeInteractive = async (\n opts: WorktreeInteractiveOptions,\n ): Promise<InteractiveResult> => {\n // If signal is already aborted, reject immediately without any setup\n opts.signal?.throwIfAborted();\n\n const { prompt, promptFile, hooks, agent: provider } = opts;\n const resolvedSandbox = opts.sandbox ?? noSandbox();\n\n // Validate buildInteractiveArgs is available\n if (!provider.buildInteractiveArgs) {\n throw new Error(\n `Agent provider \"${provider.name}\" does not support buildInteractiveArgs, required for interactive sessions.`,\n );\n }\n\n const inner = Effect.gen(function* () {\n const d = yield* Display;\n\n // 1. Resolve prompt (from string or file), or skip if neither provided\n const hasPromptSource = prompt !== undefined || promptFile !== undefined;\n const resolved = hasPromptSource\n ? yield* resolvePrompt({ prompt, promptFile })\n : undefined;\n const rawPrompt = resolved?.text ?? \"\";\n const isInlinePrompt = resolved?.source === \"inline\";\n\n // 2. Resolve env vars\n const resolvedEnv = yield* resolveEnv(hostRepoDir);\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: provider.env,\n sandboxProviderEnv: resolvedSandbox.env,\n });\n const effectiveEnv = { ...env, ...(opts.env ?? {}) };\n\n // 3. Prompt args substitution (skip when no prompt, or when inline passthrough)\n let substitutedPrompt = rawPrompt;\n if (hasPromptSource && !isInlinePrompt) {\n const userArgs = opts.promptArgs ?? {};\n yield* validateNoBuiltInArgOverride(userArgs);\n\n const effectiveArgs = {\n SOURCE_BRANCH: worktreeInfo.branch,\n TARGET_BRANCH: worktreeInfo.branch,\n ...userArgs,\n };\n const builtInArgKeysSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n substitutedPrompt = yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n } else if (isInlinePrompt) {\n yield* validateNoArgsWithInlinePrompt(opts.promptArgs ?? {});\n }\n\n // Display intro\n yield* d.intro(opts.name ?? \"sandcastle interactive\");\n yield* d.summary(\"Interactive Session\", {\n Agent: opts.name ?? provider.name,\n Sandbox: resolvedSandbox.name,\n Branch: worktreeInfo.branch,\n });\n\n // 4. Start sandbox\n let handle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle;\n\n if (resolvedSandbox.tag === \"none\") {\n handle = yield* Effect.promise(() =>\n resolvedSandbox.create({\n worktreePath: worktreeInfo.path,\n env: effectiveEnv,\n }),\n );\n } else if (resolvedSandbox.tag === \"isolated\") {\n const startResult = yield* d.taskLog(\"Starting sandbox\", () =>\n startSandbox({\n provider: resolvedSandbox,\n hostRepoDir: worktreeInfo.path,\n env: effectiveEnv,\n }),\n );\n handle = startResult.handle;\n } else {\n const gitPath = join(hostRepoDir, \".git\");\n const gitMounts = yield* resolveGitMounts(gitPath);\n const startResult = yield* d.taskLog(\"Starting sandbox\", () =>\n startSandbox({\n provider: resolvedSandbox,\n hostRepoDir,\n env: effectiveEnv,\n worktreeOrRepoPath: worktreeInfo.path,\n gitMounts,\n repoDir: SANDBOX_REPO_DIR,\n }),\n );\n handle = startResult.handle;\n }\n\n // Run lifecycle — worktree owns worktree, so no worktree cleanup here\n return yield* Effect.gen(function* () {\n if (!handle.interactiveExec) {\n throw new Error(\n `Sandbox provider does not support interactiveExec. ` +\n `The provider must implement the optional interactiveExec method to use interactive().`,\n );\n }\n const interactiveExecFn = handle.interactiveExec.bind(handle);\n const sandbox = makeSandboxFromHandle(handle);\n const worktreePath = handle.worktreePath;\n\n const applyToHost =\n resolvedSandbox.tag === \"isolated\"\n ? () => syncOut(worktreeInfo.path, handle as IsolatedSandboxHandle)\n : () => Effect.void;\n\n const lifecycleEffect = withSandboxLifecycle(\n {\n hostRepoDir,\n sandboxRepoDir: worktreePath,\n hooks,\n branch: worktreeInfo.branch,\n hostWorktreePath: worktreeInfo.path,\n applyToHost,\n timeouts: options.timeouts,\n },\n sandbox,\n (ctx) =>\n Effect.gen(function* () {\n const fullPrompt =\n !hasPromptSource || isInlinePrompt\n ? substitutedPrompt\n : yield* preprocessPrompt(\n substitutedPrompt,\n ctx.sandbox,\n ctx.sandboxRepoDir,\n );\n\n const interactiveArgs = provider.buildInteractiveArgs!({\n prompt: fullPrompt,\n dangerouslySkipPermissions: resolvedSandbox.tag !== \"none\",\n });\n\n const result = yield* raceAbortSignal(\n Effect.promise(() =>\n interactiveExecFn(interactiveArgs, {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n cwd: worktreePath,\n }),\n ),\n opts.signal,\n );\n\n return result.exitCode;\n }),\n );\n\n const lifecycleResult = yield* lifecycleEffect;\n\n const exitCode = lifecycleResult.result;\n\n // Summary\n yield* d.summary(\"Session Complete\", {\n Commits: String(lifecycleResult.commits.length),\n Branch: lifecycleResult.branch,\n \"Exit code\": String(exitCode),\n });\n\n return {\n commits: lifecycleResult.commits,\n branch: lifecycleResult.branch,\n preservedWorktreePath: undefined,\n exitCode,\n } satisfies InteractiveResult;\n }).pipe(\n // Always close sandbox handle\n Effect.ensuring(Effect.promise(() => handle.close().catch(() => {}))),\n );\n });\n\n try {\n return await Effect.runPromise(\n inner.pipe(\n Effect.provide(ClackDisplay.layer),\n Effect.provide(NodeContext.layer),\n Effect.provide(NodeFileSystem.layer),\n ),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim (no wrapping)\n opts.signal?.throwIfAborted();\n throw error;\n }\n };\n\n const worktreeRun = async (\n opts: WorktreeRunOptions,\n ): Promise<WorktreeRunResult> => {\n // If signal is already aborted, reject immediately without any setup\n opts.signal?.throwIfAborted();\n\n const { prompt, promptFile, hooks, agent: provider } = opts;\n const sandboxProvider = opts.sandbox;\n const maxIterations = opts.maxIterations ?? 1;\n\n if (opts.resumeSession && maxIterations > 1) {\n throw new Error(\n \"resumeSession cannot be combined with maxIterations > 1. \" +\n \"Resume applies to iteration 1 only; multi-iteration resume semantics are not supported.\",\n );\n }\n\n if (opts.resumeSession) {\n await assertResumeSessionExists({\n provider,\n sandboxTag: sandboxProvider.tag,\n hostRepoDir,\n resumeSession: opts.resumeSession,\n });\n }\n\n const inner = Effect.gen(function* () {\n // 1. Resolve prompt\n const resolved = yield* resolvePrompt({ prompt, promptFile });\n const rawPrompt = resolved.text;\n const isInlinePrompt = resolved.source === \"inline\";\n\n // 2. Resolve env vars\n const resolvedEnv = yield* resolveEnv(hostRepoDir);\n const env = mergeProviderEnv({\n resolvedEnv,\n agentProviderEnv: provider.env,\n sandboxProviderEnv: sandboxProvider.env,\n });\n const effectiveEnv = { ...env, ...(opts.env ?? {}) };\n\n // 3. Prompt args substitution (skipped for inline prompts — passthrough)\n const userArgs = opts.promptArgs ?? {};\n let resolvedPrompt: string;\n if (isInlinePrompt) {\n yield* validateNoArgsWithInlinePrompt(userArgs);\n resolvedPrompt = rawPrompt;\n } else {\n yield* validateNoBuiltInArgOverride(userArgs);\n const effectiveArgs = {\n SOURCE_BRANCH: worktreeInfo.branch,\n TARGET_BRANCH: worktreeInfo.branch,\n ...userArgs,\n };\n const builtInArgKeysSet = new Set<string>(BUILT_IN_PROMPT_ARG_KEYS);\n resolvedPrompt = yield* substitutePromptArgs(\n rawPrompt,\n effectiveArgs,\n builtInArgKeysSet,\n );\n }\n\n // 4. Start sandbox\n let handle:\n | BindMountSandboxHandle\n | IsolatedSandboxHandle\n | NoSandboxHandle;\n let sandboxRepoDir: string;\n\n if (sandboxProvider.tag === \"isolated\") {\n const startResult = yield* startSandbox({\n provider: sandboxProvider,\n hostRepoDir: worktreeInfo.path,\n env: effectiveEnv,\n });\n handle = startResult.handle;\n sandboxRepoDir = startResult.worktreePath;\n } else if (sandboxProvider.tag === \"none\") {\n const startResult = yield* startSandbox({\n provider: sandboxProvider,\n hostRepoDir,\n env: effectiveEnv,\n worktreeOrRepoPath: worktreeInfo.path,\n });\n handle = startResult.handle;\n sandboxRepoDir = startResult.worktreePath;\n } else {\n const gitPath = join(hostRepoDir, \".git\");\n const gitMounts = yield* resolveGitMounts(gitPath);\n const startResult = yield* startSandbox({\n provider: sandboxProvider,\n hostRepoDir,\n env: effectiveEnv,\n worktreeOrRepoPath: worktreeInfo.path,\n gitMounts,\n repoDir: SANDBOX_REPO_DIR,\n });\n handle = startResult.handle;\n sandboxRepoDir = startResult.worktreePath;\n }\n\n const sandbox = makeSandboxFromHandle(handle);\n const applyToHost =\n sandboxProvider.tag === \"isolated\"\n ? () => syncOut(worktreeInfo.path, handle as IsolatedSandboxHandle)\n : () => Effect.void;\n\n // 5. Resolve logging\n const resolvedLogging: LoggingOption = opts.logging ?? {\n type: \"file\",\n path: join(\n hostRepoDir,\n \".sandcastle\",\n \"logs\",\n buildLogFilename(worktreeInfo.branch, undefined, opts.name),\n ),\n };\n\n const runDisplayLayer =\n resolvedLogging.type === \"file\"\n ? (() => {\n printFileDisplayStartup({\n logPath: resolvedLogging.path,\n agentName: opts.name,\n branch: worktreeInfo.branch,\n });\n return Layer.provide(\n FileDisplay.layer(resolvedLogging.path),\n NodeFileSystem.layer,\n );\n })()\n : ClackDisplay.layer;\n\n // 6. Build a SandboxFactory that reuses the started sandbox\n const reuseFactoryLayer = Layer.succeed(SandboxFactory, {\n withSandbox: (makeEffect) =>\n makeEffect(\n {\n hostWorktreePath: worktreeInfo.path,\n sandboxRepoPath: sandboxRepoDir,\n applyToHost,\n },\n sandbox,\n ).pipe(\n Effect.map((value) => ({\n value,\n preservedWorktreePath: undefined,\n })),\n ) as any,\n });\n\n const streamEmitterLayer = agentStreamEmitterLayer(\n resolvedLogging.type === \"file\"\n ? resolvedLogging.onAgentStreamEvent\n : undefined,\n );\n\n const runLayer = Layer.mergeAll(\n reuseFactoryLayer,\n runDisplayLayer,\n streamEmitterLayer,\n );\n\n // 7. Run orchestration\n const result = yield* Effect.gen(function* () {\n const display = yield* Display;\n yield* display.intro(opts.name ?? \"sandcastle\");\n\n const orchestrateResult = yield* orchestrate({\n hostRepoDir,\n iterations: maxIterations,\n hooks,\n prompt: resolvedPrompt,\n branch: worktreeInfo.branch,\n provider,\n completionSignal: opts.completionSignal,\n idleTimeoutSeconds: opts.idleTimeoutSeconds,\n completionTimeoutSeconds: opts.completionTimeoutSeconds,\n name: opts.name,\n resumeSession: opts.resumeSession,\n signal: opts.signal,\n skipPromptExpansion: isInlinePrompt,\n timeouts: options.timeouts,\n });\n\n const completion = buildCompletionMessage(\n orchestrateResult.completionSignal,\n orchestrateResult.iterations.length,\n );\n yield* display.status(completion.message, completion.severity);\n\n for (const line of buildContextWindowLines(\n orchestrateResult.iterations,\n )) {\n yield* display.text(line);\n }\n\n return orchestrateResult;\n }).pipe(\n Effect.provide(runLayer),\n // Always close sandbox handle\n Effect.ensuring(Effect.promise(() => handle.close().catch(() => {}))),\n );\n\n return {\n iterations: result.iterations,\n completionSignal: result.completionSignal,\n stdout: result.stdout,\n commits: result.commits,\n branch: result.branch,\n logFilePath:\n resolvedLogging.type === \"file\" ? resolvedLogging.path : undefined,\n } satisfies WorktreeRunResult;\n });\n\n try {\n return await Effect.runPromise(\n inner.pipe(\n Effect.provide(ClackDisplay.layer),\n Effect.provide(NodeContext.layer),\n Effect.provide(NodeFileSystem.layer),\n ),\n );\n } catch (error: unknown) {\n // If the signal was aborted, surface its reason verbatim (no wrapping)\n opts.signal?.throwIfAborted();\n throw error;\n }\n };\n\n const worktreeCreateSandbox = async (\n opts: WorktreeCreateSandboxOptions,\n ): Promise<Sandbox> => {\n return createSandboxFromWorktree({\n branch: worktreeInfo.branch,\n worktreePath: worktreeInfo.path,\n hostRepoDir,\n sandbox: opts.sandbox,\n hooks: opts.hooks,\n copyToWorktree: opts.copyToWorktree,\n timeouts: opts.timeouts,\n _test: opts._test,\n });\n };\n\n return {\n branch: worktreeInfo.branch,\n worktreePath: worktreeInfo.path,\n run: worktreeRun,\n interactive: worktreeInteractive,\n createSandbox: worktreeCreateSandbox,\n close,\n async [Symbol.asyncDispose]() {\n await close();\n },\n };\n};\n","import { CwdError as CwdErrorImpl } from \"./resolveCwd.js\";\n\n/**\n * The provided `cwd` path does not exist or is not a directory.\n *\n * Public-facing type for `CwdError`. The runtime class is the same\n * `Data.TaggedError` from `resolveCwd.ts`, but we re-declare its public\n * shape here as a plain `Error` subclass so that Effect's type machinery\n * does not leak into Sandcastle's published `.d.ts` files.\n */\nexport interface CwdError extends Error {\n readonly _tag: \"CwdError\";\n readonly message: string;\n readonly cwd: string;\n}\n\ninterface CwdErrorConstructor {\n new (args: { readonly message: string; readonly cwd: string }): CwdError;\n readonly prototype: CwdError;\n}\n\n/** The provided `cwd` path does not exist or is not a directory. */\nexport const CwdError: CwdErrorConstructor =\n CwdErrorImpl as unknown as CwdErrorConstructor;\n"]}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|