@ai-hero/sandcastle 0.6.5 → 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.
Files changed (229) hide show
  1. package/README.md +137 -62
  2. package/dist/{MountConfig.d.ts → MountConfig-CmXclHA5.d.ts} +3 -2
  3. package/dist/{SandboxProvider.d.ts → SandboxProvider-EkSMuBp8.d.ts} +25 -39
  4. package/dist/chunk-52CIJF45.js +25569 -0
  5. package/dist/chunk-52CIJF45.js.map +1 -0
  6. package/dist/chunk-5VM5QZ26.js +26988 -0
  7. package/dist/chunk-5VM5QZ26.js.map +1 -0
  8. package/dist/chunk-72UVAC7B.js +99 -0
  9. package/dist/chunk-72UVAC7B.js.map +1 -0
  10. package/dist/chunk-BIWNFKGV.js +22 -0
  11. package/dist/chunk-BIWNFKGV.js.map +1 -0
  12. package/dist/chunk-NGBM7T3E.js +76 -0
  13. package/dist/chunk-NGBM7T3E.js.map +1 -0
  14. package/dist/chunk-NSFQW6ML.js +362 -0
  15. package/dist/chunk-NSFQW6ML.js.map +1 -0
  16. package/dist/index.d.ts +920 -22
  17. package/dist/index.js +3212 -9
  18. package/dist/index.js.map +1 -1
  19. package/dist/main.d.ts +0 -2
  20. package/dist/main.js +19349 -13
  21. package/dist/main.js.map +1 -1
  22. package/dist/mountUtils-CCA-bbpK.d.ts +25 -0
  23. package/dist/sandboxes/daytona.d.ts +8 -5
  24. package/dist/sandboxes/daytona.js +118 -124
  25. package/dist/sandboxes/daytona.js.map +1 -1
  26. package/dist/sandboxes/docker.d.ts +10 -8
  27. package/dist/sandboxes/docker.js +8 -255
  28. package/dist/sandboxes/docker.js.map +1 -1
  29. package/dist/sandboxes/no-sandbox.d.ts +7 -4
  30. package/dist/sandboxes/no-sandbox.js +6 -114
  31. package/dist/sandboxes/no-sandbox.js.map +1 -1
  32. package/dist/sandboxes/podman.d.ts +10 -8
  33. package/dist/sandboxes/podman.js +287 -297
  34. package/dist/sandboxes/podman.js.map +1 -1
  35. package/dist/sandboxes/vercel.d.ts +7 -4
  36. package/dist/sandboxes/vercel.js +144 -165
  37. package/dist/sandboxes/vercel.js.map +1 -1
  38. package/dist/templates/sequential-reviewer/implement-prompt.md +2 -2
  39. package/dist/templates/simple-loop/prompt.md +2 -2
  40. package/package.json +15 -14
  41. package/dist/AgentProvider.d.ts +0 -134
  42. package/dist/AgentProvider.d.ts.map +0 -1
  43. package/dist/AgentProvider.js +0 -647
  44. package/dist/AgentProvider.js.map +0 -1
  45. package/dist/AgentStreamEmitter.d.ts +0 -36
  46. package/dist/AgentStreamEmitter.d.ts.map +0 -1
  47. package/dist/AgentStreamEmitter.js +0 -21
  48. package/dist/AgentStreamEmitter.js.map +0 -1
  49. package/dist/CopyToWorktree.d.ts +0 -15
  50. package/dist/CopyToWorktree.d.ts.map +0 -1
  51. package/dist/CopyToWorktree.js +0 -60
  52. package/dist/CopyToWorktree.js.map +0 -1
  53. package/dist/Display.d.ts +0 -58
  54. package/dist/Display.d.ts.map +0 -1
  55. package/dist/Display.js +0 -142
  56. package/dist/Display.js.map +0 -1
  57. package/dist/DockerLifecycle.d.ts +0 -54
  58. package/dist/DockerLifecycle.d.ts.map +0 -1
  59. package/dist/DockerLifecycle.js +0 -123
  60. package/dist/DockerLifecycle.js.map +0 -1
  61. package/dist/EnvResolver.d.ts +0 -11
  62. package/dist/EnvResolver.d.ts.map +0 -1
  63. package/dist/EnvResolver.js +0 -63
  64. package/dist/EnvResolver.js.map +0 -1
  65. package/dist/ErrorHandler.d.ts +0 -15
  66. package/dist/ErrorHandler.d.ts.map +0 -1
  67. package/dist/ErrorHandler.js +0 -85
  68. package/dist/ErrorHandler.js.map +0 -1
  69. package/dist/InitService.d.ts +0 -92
  70. package/dist/InitService.d.ts.map +0 -1
  71. package/dist/InitService.js +0 -836
  72. package/dist/InitService.js.map +0 -1
  73. package/dist/MountConfig.d.ts.map +0 -1
  74. package/dist/MountConfig.js +0 -7
  75. package/dist/MountConfig.js.map +0 -1
  76. package/dist/Orchestrator.d.ts +0 -56
  77. package/dist/Orchestrator.d.ts.map +0 -1
  78. package/dist/Orchestrator.js +0 -293
  79. package/dist/Orchestrator.js.map +0 -1
  80. package/dist/Output.d.ts +0 -107
  81. package/dist/Output.d.ts.map +0 -1
  82. package/dist/Output.js +0 -95
  83. package/dist/Output.js.map +0 -1
  84. package/dist/PodmanLifecycle.d.ts +0 -17
  85. package/dist/PodmanLifecycle.d.ts.map +0 -1
  86. package/dist/PodmanLifecycle.js +0 -45
  87. package/dist/PodmanLifecycle.js.map +0 -1
  88. package/dist/PromptArgumentSubstitution.d.ts +0 -32
  89. package/dist/PromptArgumentSubstitution.d.ts.map +0 -1
  90. package/dist/PromptArgumentSubstitution.js +0 -104
  91. package/dist/PromptArgumentSubstitution.js.map +0 -1
  92. package/dist/PromptPreprocessor.d.ts +0 -15
  93. package/dist/PromptPreprocessor.d.ts.map +0 -1
  94. package/dist/PromptPreprocessor.js +0 -55
  95. package/dist/PromptPreprocessor.js.map +0 -1
  96. package/dist/PromptResolver.d.ts +0 -21
  97. package/dist/PromptResolver.d.ts.map +0 -1
  98. package/dist/PromptResolver.js +0 -27
  99. package/dist/PromptResolver.js.map +0 -1
  100. package/dist/RecoveryMessage.d.ts +0 -15
  101. package/dist/RecoveryMessage.d.ts.map +0 -1
  102. package/dist/RecoveryMessage.js +0 -81
  103. package/dist/RecoveryMessage.js.map +0 -1
  104. package/dist/SandboxFactory.d.ts +0 -90
  105. package/dist/SandboxFactory.d.ts.map +0 -1
  106. package/dist/SandboxFactory.js +0 -324
  107. package/dist/SandboxFactory.js.map +0 -1
  108. package/dist/SandboxLifecycle.d.ts +0 -65
  109. package/dist/SandboxLifecycle.d.ts.map +0 -1
  110. package/dist/SandboxLifecycle.js +0 -296
  111. package/dist/SandboxLifecycle.js.map +0 -1
  112. package/dist/SandboxProvider.d.ts.map +0 -1
  113. package/dist/SandboxProvider.js +0 -28
  114. package/dist/SandboxProvider.js.map +0 -1
  115. package/dist/SessionStore.d.ts +0 -110
  116. package/dist/SessionStore.d.ts.map +0 -1
  117. package/dist/SessionStore.js +0 -330
  118. package/dist/SessionStore.js.map +0 -1
  119. package/dist/TextDeltaBuffer.d.ts +0 -24
  120. package/dist/TextDeltaBuffer.d.ts.map +0 -1
  121. package/dist/TextDeltaBuffer.js +0 -68
  122. package/dist/TextDeltaBuffer.js.map +0 -1
  123. package/dist/WorktreeManager.d.ts +0 -79
  124. package/dist/WorktreeManager.d.ts.map +0 -1
  125. package/dist/WorktreeManager.js +0 -283
  126. package/dist/WorktreeManager.js.map +0 -1
  127. package/dist/boundedTail.d.ts +0 -48
  128. package/dist/boundedTail.d.ts.map +0 -1
  129. package/dist/boundedTail.js +0 -64
  130. package/dist/boundedTail.js.map +0 -1
  131. package/dist/cli.d.ts +0 -30
  132. package/dist/cli.d.ts.map +0 -1
  133. package/dist/cli.js +0 -340
  134. package/dist/cli.js.map +0 -1
  135. package/dist/createSandbox.d.ts +0 -154
  136. package/dist/createSandbox.d.ts.map +0 -1
  137. package/dist/createSandbox.js +0 -476
  138. package/dist/createSandbox.js.map +0 -1
  139. package/dist/createWorktree.d.ts +0 -154
  140. package/dist/createWorktree.d.ts.map +0 -1
  141. package/dist/createWorktree.js +0 -391
  142. package/dist/createWorktree.js.map +0 -1
  143. package/dist/errors.d.ts +0 -227
  144. package/dist/errors.d.ts.map +0 -1
  145. package/dist/errors.js +0 -81
  146. package/dist/errors.js.map +0 -1
  147. package/dist/extractStructuredOutput.d.ts +0 -23
  148. package/dist/extractStructuredOutput.d.ts.map +0 -1
  149. package/dist/extractStructuredOutput.js +0 -102
  150. package/dist/extractStructuredOutput.js.map +0 -1
  151. package/dist/index.d.ts.map +0 -1
  152. package/dist/interactive.d.ts +0 -74
  153. package/dist/interactive.d.ts.map +0 -1
  154. package/dist/interactive.js +0 -279
  155. package/dist/interactive.js.map +0 -1
  156. package/dist/main.d.ts.map +0 -1
  157. package/dist/mergeProviderEnv.d.ts +0 -13
  158. package/dist/mergeProviderEnv.d.ts.map +0 -1
  159. package/dist/mergeProviderEnv.js +0 -23
  160. package/dist/mergeProviderEnv.js.map +0 -1
  161. package/dist/mountUtils.d.ts +0 -146
  162. package/dist/mountUtils.d.ts.map +0 -1
  163. package/dist/mountUtils.js +0 -301
  164. package/dist/mountUtils.js.map +0 -1
  165. package/dist/raceAbortSignal.d.ts +0 -18
  166. package/dist/raceAbortSignal.d.ts.map +0 -1
  167. package/dist/raceAbortSignal.js +0 -32
  168. package/dist/raceAbortSignal.js.map +0 -1
  169. package/dist/resolveCwd.d.ts +0 -24
  170. package/dist/resolveCwd.d.ts.map +0 -1
  171. package/dist/resolveCwd.js +0 -32
  172. package/dist/resolveCwd.js.map +0 -1
  173. package/dist/resumePrecheck.d.ts +0 -26
  174. package/dist/resumePrecheck.d.ts.map +0 -1
  175. package/dist/resumePrecheck.js +0 -40
  176. package/dist/resumePrecheck.js.map +0 -1
  177. package/dist/run.d.ts +0 -216
  178. package/dist/run.d.ts.map +0 -1
  179. package/dist/run.js +0 -313
  180. package/dist/run.js.map +0 -1
  181. package/dist/sandboxExec.d.ts +0 -12
  182. package/dist/sandboxExec.d.ts.map +0 -1
  183. package/dist/sandboxExec.js +0 -26
  184. package/dist/sandboxExec.js.map +0 -1
  185. package/dist/sandboxes/daytona.d.ts.map +0 -1
  186. package/dist/sandboxes/docker.d.ts.map +0 -1
  187. package/dist/sandboxes/no-sandbox.d.ts.map +0 -1
  188. package/dist/sandboxes/podman.d.ts.map +0 -1
  189. package/dist/sandboxes/test-bind-mount.d.ts +0 -17
  190. package/dist/sandboxes/test-bind-mount.d.ts.map +0 -1
  191. package/dist/sandboxes/test-bind-mount.js +0 -92
  192. package/dist/sandboxes/test-bind-mount.js.map +0 -1
  193. package/dist/sandboxes/test-isolated.d.ts +0 -17
  194. package/dist/sandboxes/test-isolated.d.ts.map +0 -1
  195. package/dist/sandboxes/test-isolated.js +0 -98
  196. package/dist/sandboxes/test-isolated.js.map +0 -1
  197. package/dist/sandboxes/vercel.d.ts.map +0 -1
  198. package/dist/shutdownRegistry.d.ts +0 -30
  199. package/dist/shutdownRegistry.d.ts.map +0 -1
  200. package/dist/shutdownRegistry.js +0 -73
  201. package/dist/shutdownRegistry.js.map +0 -1
  202. package/dist/startSandbox.d.ts +0 -50
  203. package/dist/startSandbox.d.ts.map +0 -1
  204. package/dist/startSandbox.js +0 -117
  205. package/dist/startSandbox.js.map +0 -1
  206. package/dist/syncIn.d.ts +0 -24
  207. package/dist/syncIn.d.ts.map +0 -1
  208. package/dist/syncIn.js +0 -107
  209. package/dist/syncIn.js.map +0 -1
  210. package/dist/syncOut.d.ts +0 -27
  211. package/dist/syncOut.d.ts.map +0 -1
  212. package/dist/syncOut.js +0 -271
  213. package/dist/syncOut.js.map +0 -1
  214. package/dist/templates.d.ts +0 -2
  215. package/dist/templates.d.ts.map +0 -1
  216. package/dist/templates.js +0 -26
  217. package/dist/templates.js.map +0 -1
  218. package/dist/terminalCleanup.d.ts +0 -30
  219. package/dist/terminalCleanup.d.ts.map +0 -1
  220. package/dist/terminalCleanup.js +0 -37
  221. package/dist/terminalCleanup.js.map +0 -1
  222. package/dist/testSandbox.d.ts +0 -8
  223. package/dist/testSandbox.d.ts.map +0 -1
  224. package/dist/testSandbox.js +0 -109
  225. package/dist/testSandbox.js.map +0 -1
  226. package/dist/testSetup.d.ts +0 -2
  227. package/dist/testSetup.d.ts.map +0 -1
  228. package/dist/testSetup.js +0 -29
  229. package/dist/testSetup.js.map +0 -1
@@ -1,476 +0,0 @@
1
- import { NodeContext, NodeFileSystem } from "@effect/platform-node";
2
- import { join } from "node:path";
3
- import { Effect, Layer, Ref } from "effect";
4
- import { ClackDisplay, Display, FileDisplay, SilentDisplay, } from "./Display.js";
5
- import { resolveEnv } from "./EnvResolver.js";
6
- import { mergeProviderEnv } from "./mergeProviderEnv.js";
7
- import { orchestrate } from "./Orchestrator.js";
8
- import { callbackAgentStreamEmitterLayer, noopAgentStreamEmitterLayer, } from "./AgentStreamEmitter.js";
9
- import { substitutePromptArgs, validateNoArgsWithInlinePrompt, validateNoBuiltInArgOverride, BUILT_IN_PROMPT_ARG_KEYS, } from "./PromptArgumentSubstitution.js";
10
- import { resolvePrompt } from "./PromptResolver.js";
11
- import { preprocessPrompt } from "./PromptPreprocessor.js";
12
- import { buildLogFilename, printFileDisplayStartup } from "./run.js";
13
- import { withSandboxLifecycle, runHostHooks, } from "./SandboxLifecycle.js";
14
- import { Sandbox as SandboxTag, SandboxFactory, SANDBOX_REPO_DIR, resolveGitMounts, } from "./SandboxFactory.js";
15
- import { startSandbox } from "./startSandbox.js";
16
- import { syncOut } from "./syncOut.js";
17
- import * as WorktreeManager from "./WorktreeManager.js";
18
- import { copyToWorktree } from "./CopyToWorktree.js";
19
- import { resolveCwd } from "./resolveCwd.js";
20
- import { patchGitMountsForWindows } from "./mountUtils.js";
21
- import { registerShutdown } from "./shutdownRegistry.js";
22
- /**
23
- * @internal Builds a Sandbox handle with run() and interactive() methods.
24
- * The close callback controls teardown behavior — top-level createSandbox()
25
- * cleans up both container and worktree, while worktree-backed sandboxes
26
- * only tear down the container.
27
- */
28
- const buildSandboxHandle = (ctx, close) => {
29
- const { branch, worktreePath, hostRepoDir, sandboxRepoDir, sandboxLayer, providerHandle, applyToHost, timeouts, } = ctx;
30
- const sandboxHandle = {
31
- branch,
32
- worktreePath: worktreePath,
33
- run: async (runOptions) => {
34
- // If signal is already aborted, reject immediately without any setup
35
- runOptions.signal?.throwIfAborted();
36
- const { agent: provider, prompt, promptFile, maxIterations = 1, } = runOptions;
37
- const resolved = await Effect.runPromise(resolvePrompt({ prompt, promptFile }).pipe(Effect.provide(NodeContext.layer)));
38
- const rawPrompt = resolved.text;
39
- const isInlinePrompt = resolved.source === "inline";
40
- const userArgs = runOptions.promptArgs ?? {};
41
- const currentHostBranch = await Effect.runPromise(WorktreeManager.getCurrentBranch(hostRepoDir));
42
- const displayRef = Ref.unsafeMake([]);
43
- const silentDisplayLayer = SilentDisplay.layer(displayRef);
44
- const resolvedPrompt = await Effect.runPromise(Effect.gen(function* () {
45
- if (isInlinePrompt) {
46
- yield* validateNoArgsWithInlinePrompt(userArgs);
47
- return rawPrompt;
48
- }
49
- yield* validateNoBuiltInArgOverride(userArgs);
50
- const effectiveArgs = {
51
- SOURCE_BRANCH: branch,
52
- TARGET_BRANCH: currentHostBranch,
53
- ...userArgs,
54
- };
55
- const builtInArgKeysSet = new Set(BUILT_IN_PROMPT_ARG_KEYS);
56
- return yield* substitutePromptArgs(rawPrompt, effectiveArgs, builtInArgKeysSet);
57
- }).pipe(Effect.provide(silentDisplayLayer)));
58
- const resolvedLogging = runOptions.logging ?? {
59
- type: "file",
60
- path: join(hostRepoDir, ".sandcastle", "logs", buildLogFilename(branch, undefined, runOptions.name)),
61
- };
62
- const runDisplayLayer = resolvedLogging.type === "file"
63
- ? (() => {
64
- printFileDisplayStartup({
65
- logPath: resolvedLogging.path,
66
- agentName: runOptions.name,
67
- branch,
68
- });
69
- return Layer.provide(FileDisplay.layer(resolvedLogging.path), NodeFileSystem.layer);
70
- })()
71
- : silentDisplayLayer;
72
- const reuseFactoryLayer = Layer.succeed(SandboxFactory, {
73
- withSandbox: (makeEffect) => makeEffect({
74
- hostWorktreePath: worktreePath,
75
- sandboxRepoPath: sandboxRepoDir,
76
- applyToHost,
77
- }).pipe(Effect.provide(sandboxLayer), Effect.map((value) => ({
78
- value,
79
- preservedWorktreePath: undefined,
80
- }))),
81
- });
82
- const agentStreamEmitterLayer = resolvedLogging.type === "file" && resolvedLogging.onAgentStreamEvent
83
- ? callbackAgentStreamEmitterLayer(resolvedLogging.onAgentStreamEvent)
84
- : noopAgentStreamEmitterLayer;
85
- const runLayer = Layer.mergeAll(reuseFactoryLayer, runDisplayLayer, agentStreamEmitterLayer);
86
- let result;
87
- try {
88
- result = await Effect.runPromise(Effect.gen(function* () {
89
- const display = yield* Display;
90
- yield* display.intro(runOptions.name ?? "sandcastle");
91
- return yield* orchestrate({
92
- hostRepoDir,
93
- iterations: maxIterations,
94
- prompt: resolvedPrompt,
95
- branch,
96
- provider,
97
- completionSignal: runOptions.completionSignal,
98
- idleTimeoutSeconds: runOptions.idleTimeoutSeconds,
99
- name: runOptions.name,
100
- signal: runOptions.signal,
101
- skipPromptExpansion: isInlinePrompt,
102
- timeouts,
103
- });
104
- }).pipe(Effect.provide(runLayer)));
105
- }
106
- catch (error) {
107
- // If the signal was aborted, surface its reason verbatim
108
- runOptions.signal?.throwIfAborted();
109
- throw error;
110
- }
111
- return {
112
- iterations: result.iterations,
113
- completionSignal: result.completionSignal,
114
- stdout: result.stdout,
115
- commits: result.commits,
116
- logFilePath: resolvedLogging.type === "file" ? resolvedLogging.path : undefined,
117
- };
118
- },
119
- interactive: async (interactiveOptions) => {
120
- // If signal is already aborted, reject immediately without any setup
121
- interactiveOptions.signal?.throwIfAborted();
122
- const { agent: provider, prompt, promptFile } = interactiveOptions;
123
- if (!provider.buildInteractiveArgs) {
124
- throw new Error(`Agent provider "${provider.name}" does not support buildInteractiveArgs, required for interactive sessions.`);
125
- }
126
- if (!providerHandle?.interactiveExec) {
127
- throw new Error(`Sandbox provider does not support interactiveExec. ` +
128
- `The provider must implement the optional interactiveExec method to use interactive().`);
129
- }
130
- const interactiveExecFn = providerHandle.interactiveExec.bind(providerHandle);
131
- let lifecycleResult;
132
- try {
133
- lifecycleResult = await Effect.runPromise(Effect.gen(function* () {
134
- const resolved = yield* resolvePrompt({ prompt, promptFile });
135
- const rawPrompt = resolved.text;
136
- const isInlinePrompt = resolved.source === "inline";
137
- const userArgs = interactiveOptions.promptArgs ?? {};
138
- const currentHostBranch = yield* WorktreeManager.getCurrentBranch(hostRepoDir);
139
- let resolvedPrompt;
140
- if (isInlinePrompt) {
141
- yield* validateNoArgsWithInlinePrompt(userArgs);
142
- resolvedPrompt = rawPrompt;
143
- }
144
- else {
145
- yield* validateNoBuiltInArgOverride(userArgs);
146
- const effectiveArgs = {
147
- SOURCE_BRANCH: branch,
148
- TARGET_BRANCH: currentHostBranch,
149
- ...userArgs,
150
- };
151
- const builtInArgKeysSet = new Set(BUILT_IN_PROMPT_ARG_KEYS);
152
- resolvedPrompt = yield* substitutePromptArgs(rawPrompt, effectiveArgs, builtInArgKeysSet);
153
- }
154
- return yield* withSandboxLifecycle({
155
- hostRepoDir,
156
- sandboxRepoDir,
157
- branch,
158
- hostWorktreePath: worktreePath,
159
- applyToHost,
160
- timeouts,
161
- }, (ctx) => Effect.gen(function* () {
162
- const fullPrompt = isInlinePrompt
163
- ? resolvedPrompt
164
- : yield* preprocessPrompt(resolvedPrompt, ctx.sandbox, ctx.sandboxRepoDir);
165
- const interactiveArgs = provider.buildInteractiveArgs({
166
- prompt: fullPrompt,
167
- dangerouslySkipPermissions: true,
168
- });
169
- const execPromise = interactiveExecFn(interactiveArgs, {
170
- stdin: process.stdin,
171
- stdout: process.stdout,
172
- stderr: process.stderr,
173
- cwd: sandboxRepoDir,
174
- });
175
- // Race exec with abort signal if provided
176
- const signal = interactiveOptions.signal;
177
- const result = yield* Effect.promise(() => {
178
- if (!signal)
179
- return execPromise;
180
- if (signal.aborted)
181
- return Promise.reject(signal.reason);
182
- return new Promise((resolve, reject) => {
183
- const onAbort = () => reject(signal.reason);
184
- signal.addEventListener("abort", onAbort, {
185
- once: true,
186
- });
187
- execPromise.then((r) => {
188
- signal.removeEventListener("abort", onAbort);
189
- resolve(r);
190
- }, (e) => {
191
- signal.removeEventListener("abort", onAbort);
192
- reject(e);
193
- });
194
- });
195
- });
196
- return result.exitCode;
197
- }));
198
- }).pipe(Effect.provide(sandboxLayer), Effect.provide(ClackDisplay.layer), Effect.provide(NodeContext.layer)));
199
- }
200
- catch (error) {
201
- // If the signal was aborted, surface its reason verbatim
202
- interactiveOptions.signal?.throwIfAborted();
203
- throw error;
204
- }
205
- return {
206
- commits: lifecycleResult.commits,
207
- exitCode: lifecycleResult.result,
208
- };
209
- },
210
- close: async () => close(),
211
- [Symbol.asyncDispose]: async () => {
212
- await sandboxHandle.close();
213
- },
214
- };
215
- return sandboxHandle;
216
- };
217
- /**
218
- * @internal Creates a sandbox backed by an existing worktree.
219
- * Split ownership: close() tears down the container only, leaving the worktree intact.
220
- * Used by Worktree.createSandbox().
221
- */
222
- export const createSandboxFromWorktree = async (options) => {
223
- const { branch, worktreePath, hostRepoDir } = options;
224
- const isTestMode = !!options._test?.buildSandboxLayer;
225
- // 1. Copy files if requested (bind-mount only)
226
- if (options.copyToWorktree &&
227
- options.copyToWorktree.length > 0 &&
228
- options.sandbox.tag !== "isolated") {
229
- await Effect.runPromise(copyToWorktree(options.copyToWorktree, hostRepoDir, worktreePath, options.timeouts?.copyToWorktreeMs));
230
- }
231
- // 2. Start sandbox via provider or local sandbox layer (test mode)
232
- let providerHandle;
233
- let sandboxLayer;
234
- let sandboxRepoDir;
235
- const isIsolated = options.sandbox.tag === "isolated";
236
- if (isTestMode) {
237
- sandboxLayer = options._test.buildSandboxLayer(worktreePath);
238
- sandboxRepoDir = worktreePath;
239
- }
240
- else {
241
- const resolvedEnv = await Effect.runPromise(resolveEnv(hostRepoDir).pipe(Effect.provide(NodeContext.layer)));
242
- const env = mergeProviderEnv({
243
- resolvedEnv,
244
- agentProviderEnv: {},
245
- sandboxProviderEnv: options.sandbox.env,
246
- });
247
- const provider = options.sandbox;
248
- let startEffect;
249
- if (provider.tag === "isolated") {
250
- startEffect = startSandbox({
251
- provider,
252
- hostRepoDir: worktreePath,
253
- env,
254
- copyPaths: options.copyToWorktree,
255
- });
256
- }
257
- else if (provider.tag === "none") {
258
- startEffect = startSandbox({
259
- provider,
260
- hostRepoDir,
261
- env,
262
- worktreeOrRepoPath: worktreePath,
263
- });
264
- }
265
- else {
266
- startEffect = resolveGitMounts(join(hostRepoDir, ".git")).pipe(Effect.provide(NodeFileSystem.layer), Effect.catchAll(() => Effect.succeed([])),
267
- // Patch git mounts for Windows worktree compatibility (ADR-0006)
268
- Effect.flatMap((gitMounts) => Effect.tryPromise({
269
- try: () => patchGitMountsForWindows(gitMounts, worktreePath, SANDBOX_REPO_DIR),
270
- catch: (e) => new Error(`Failed to patch git mounts: ${e instanceof Error ? e.message : String(e)}`),
271
- })), Effect.flatMap((gitMounts) => startSandbox({
272
- provider,
273
- hostRepoDir,
274
- env,
275
- worktreeOrRepoPath: worktreePath,
276
- gitMounts,
277
- repoDir: SANDBOX_REPO_DIR,
278
- })));
279
- }
280
- const startResult = await Effect.runPromise(startEffect);
281
- providerHandle = startResult.handle;
282
- sandboxLayer = startResult.sandboxLayer;
283
- sandboxRepoDir = startResult.worktreePath;
284
- }
285
- // 3. Run onSandboxReady hooks (sandbox-side and host-side in parallel)
286
- const sandboxOnReady = options.hooks?.sandbox?.onSandboxReady;
287
- const hostOnReady = options.hooks?.host?.onSandboxReady;
288
- if (sandboxOnReady?.length || hostOnReady?.length) {
289
- await Effect.runPromise(Effect.gen(function* () {
290
- const sandbox = yield* SandboxTag;
291
- yield* sandbox.exec(`git config --global --add safe.directory "${sandboxRepoDir}"`);
292
- const sandboxEffects = (sandboxOnReady ?? []).map((hook) => sandbox.exec(hook.command, {
293
- cwd: sandboxRepoDir,
294
- sudo: hook.sudo,
295
- }));
296
- const allEffects = [...sandboxEffects];
297
- if (hostOnReady?.length) {
298
- allEffects.push(runHostHooks(hostOnReady, worktreePath));
299
- }
300
- yield* Effect.all(allEffects, {
301
- concurrency: "unbounded",
302
- });
303
- }).pipe(Effect.provide(sandboxLayer)));
304
- }
305
- // 4. Build applyToHost callback
306
- const applyToHost = isIsolated && providerHandle
307
- ? () => syncOut(worktreePath, providerHandle)
308
- : () => Effect.void;
309
- // 5. Build and return sandbox handle — container-only close (worktree owns worktree)
310
- let closed = false;
311
- return buildSandboxHandle({
312
- branch,
313
- worktreePath,
314
- hostRepoDir,
315
- sandboxRepoDir,
316
- sandboxLayer,
317
- providerHandle,
318
- applyToHost,
319
- timeouts: options.timeouts,
320
- }, async () => {
321
- if (closed)
322
- return { preservedWorktreePath: undefined };
323
- closed = true;
324
- if (providerHandle)
325
- await providerHandle.close();
326
- return { preservedWorktreePath: undefined };
327
- });
328
- };
329
- /**
330
- * Eagerly creates a git worktree on the provided explicit branch and starts
331
- * a sandbox with the worktree bind-mounted. Returns a Sandbox handle that
332
- * can be reused across multiple `run()` calls.
333
- */
334
- export const createSandbox = async (options) => {
335
- const { branch } = options;
336
- const isTestMode = !!options._test?.buildSandboxLayer;
337
- const isIsolated = options.sandbox.tag === "isolated";
338
- // Resolve cwd, create the worktree, and set up the sandbox in a single Effect.
339
- // Once the worktree exists, any later failure (e.g. a missing image surfacing
340
- // when the provider creates the container) tears down the container — if it
341
- // started — and removes the worktree so it is not orphaned on disk.
342
- const { hostRepoDir, worktreePath, providerHandle, sandboxLayer, sandboxRepoDir, } = await Effect.runPromise(Effect.gen(function* () {
343
- const hostRepoDir = yield* resolveCwd(options.cwd);
344
- yield* WorktreeManager.pruneStale(hostRepoDir).pipe(Effect.catchAll(() => Effect.void));
345
- const { path: worktreePath } = yield* WorktreeManager.create(hostRepoDir, { branch, baseBranch: options.baseBranch });
346
- const prepared = yield* Effect.gen(function* () {
347
- // Copy files (bind-mount/no-sandbox only; isolated copies in startSandbox).
348
- if (options.copyToWorktree &&
349
- options.copyToWorktree.length > 0 &&
350
- options.sandbox.tag !== "isolated") {
351
- yield* copyToWorktree(options.copyToWorktree, hostRepoDir, worktreePath, options.timeouts?.copyToWorktreeMs);
352
- }
353
- // Run host.onWorktreeReady hooks (after copy, before sandbox creation).
354
- if (options.hooks?.host?.onWorktreeReady?.length) {
355
- yield* runHostHooks(options.hooks.host.onWorktreeReady, worktreePath);
356
- }
357
- // Start the sandbox via the test layer or the shared startSandbox helper.
358
- let providerHandle;
359
- let sandboxLayer;
360
- let sandboxRepoDir;
361
- if (isTestMode) {
362
- sandboxLayer = options._test.buildSandboxLayer(worktreePath);
363
- sandboxRepoDir = worktreePath;
364
- }
365
- else {
366
- const resolvedEnv = yield* resolveEnv(hostRepoDir);
367
- const env = mergeProviderEnv({
368
- resolvedEnv,
369
- agentProviderEnv: {},
370
- sandboxProviderEnv: options.sandbox.env,
371
- });
372
- const provider = options.sandbox;
373
- const startResult = yield* provider.tag === "isolated"
374
- ? startSandbox({
375
- provider,
376
- hostRepoDir: worktreePath,
377
- env,
378
- copyPaths: options.copyToWorktree,
379
- })
380
- : provider.tag === "none"
381
- ? startSandbox({
382
- provider,
383
- hostRepoDir,
384
- env,
385
- worktreeOrRepoPath: worktreePath,
386
- })
387
- : resolveGitMounts(join(hostRepoDir, ".git")).pipe(Effect.provide(NodeFileSystem.layer), Effect.catchAll(() => Effect.succeed([])),
388
- // Patch git mounts for Windows worktree compatibility (ADR-0006)
389
- Effect.flatMap((gitMounts) => Effect.tryPromise({
390
- try: () => patchGitMountsForWindows(gitMounts, worktreePath, SANDBOX_REPO_DIR),
391
- catch: (e) => new Error(`Failed to patch git mounts: ${e instanceof Error ? e.message : String(e)}`),
392
- })), Effect.flatMap((gitMounts) => startSandbox({
393
- provider,
394
- hostRepoDir,
395
- env,
396
- worktreeOrRepoPath: worktreePath,
397
- gitMounts,
398
- repoDir: SANDBOX_REPO_DIR,
399
- })));
400
- providerHandle = startResult.handle;
401
- sandboxLayer = startResult.sandboxLayer;
402
- sandboxRepoDir = startResult.worktreePath;
403
- }
404
- // Run onSandboxReady hooks (sandbox-side and host-side in parallel). If
405
- // they fail, tear down the container that just started before the outer
406
- // handler removes the worktree.
407
- const sandboxOnReady = options.hooks?.sandbox?.onSandboxReady;
408
- const hostOnReady = options.hooks?.host?.onSandboxReady;
409
- if (sandboxOnReady?.length || hostOnReady?.length) {
410
- yield* Effect.gen(function* () {
411
- const sandbox = yield* SandboxTag;
412
- yield* sandbox.exec(`git config --global --add safe.directory "${sandboxRepoDir}"`);
413
- const sandboxEffects = (sandboxOnReady ?? []).map((hook) => sandbox.exec(hook.command, {
414
- cwd: sandboxRepoDir,
415
- sudo: hook.sudo,
416
- }));
417
- const allEffects = [...sandboxEffects];
418
- if (hostOnReady?.length) {
419
- allEffects.push(runHostHooks(hostOnReady, worktreePath));
420
- }
421
- yield* Effect.all(allEffects, { concurrency: "unbounded" });
422
- }).pipe(Effect.provide(sandboxLayer), Effect.onError(() => providerHandle
423
- ? Effect.promise(() => providerHandle.close().catch(() => { }))
424
- : Effect.void));
425
- }
426
- return { providerHandle, sandboxLayer, sandboxRepoDir };
427
- }).pipe(Effect.onError(() => WorktreeManager.remove(worktreePath).pipe(Effect.catchAll(() => Effect.void))));
428
- return { hostRepoDir, worktreePath, ...prepared };
429
- }).pipe(Effect.provide(NodeContext.layer)));
430
- // Build applyToHost callback (once, reused across runs)
431
- const applyToHost = isIsolated && providerHandle
432
- ? () => syncOut(worktreePath, providerHandle)
433
- : () => Effect.void;
434
- let closed = false;
435
- const forceCleanup = () => {
436
- console.error(`\nWorktree preserved at ${worktreePath}`);
437
- console.error(` To review: cd ${worktreePath}`);
438
- console.error(` To clean up: git worktree remove --force ${worktreePath}`);
439
- };
440
- // Route cleanup through the shared registry so concurrent sandboxes share one
441
- // SIGINT/SIGTERM/exit listener instead of tripping MaxListenersExceededWarning.
442
- const unregisterShutdown = registerShutdown(forceCleanup);
443
- // Build close function
444
- const doClose = async () => {
445
- if (closed)
446
- return { preservedWorktreePath: undefined };
447
- closed = true;
448
- return Effect.runPromise(Effect.gen(function* () {
449
- if (providerHandle) {
450
- yield* Effect.promise(() => providerHandle.close());
451
- }
452
- // Preserve the worktree when it has uncommitted changes; otherwise remove it.
453
- const isDirty = yield* WorktreeManager.hasUncommittedChanges(worktreePath).pipe(Effect.catchAll(() => Effect.succeed(false)));
454
- if (isDirty) {
455
- return { preservedWorktreePath: worktreePath };
456
- }
457
- yield* WorktreeManager.remove(worktreePath).pipe(Effect.catchAll(() => Effect.void));
458
- return { preservedWorktreePath: undefined };
459
- }));
460
- };
461
- // Return the Sandbox handle
462
- return buildSandboxHandle({
463
- branch,
464
- worktreePath,
465
- hostRepoDir,
466
- sandboxRepoDir,
467
- sandboxLayer,
468
- providerHandle,
469
- applyToHost,
470
- timeouts: options.timeouts,
471
- }, async () => {
472
- unregisterShutdown();
473
- return doClose();
474
- });
475
- };
476
- //# sourceMappingURL=createSandbox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSandbox.js","sourceRoot":"","sources":["../src/createSandbox.ts"],"names":[],"mappings":"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"}
@@ -1,154 +0,0 @@
1
- import type { AgentProvider } from "./AgentProvider.js";
2
- import { type SandboxHooks } from "./SandboxLifecycle.js";
3
- import type { AnySandboxProvider, SandboxProvider, MergeToHeadBranchStrategy, NamedBranchStrategy } from "./SandboxProvider.js";
4
- import type { CloseResult, Sandbox } from "./createSandbox.js";
5
- import type { InteractiveResult } from "./interactive.js";
6
- import type { LoggingOption } from "./run.js";
7
- import { type IterationResult } from "./Orchestrator.js";
8
- import { type PromptArgs } from "./PromptArgumentSubstitution.js";
9
- import type { Timeouts } from "./run.js";
10
- /** Branch strategies valid for createWorktree — head is excluded. */
11
- export type WorktreeBranchStrategy = MergeToHeadBranchStrategy | NamedBranchStrategy;
12
- export interface CreateWorktreeOptions {
13
- /** Branch strategy — only 'branch' and 'merge-to-head' are allowed. */
14
- readonly branchStrategy: WorktreeBranchStrategy;
15
- /**
16
- * Host repo directory. Replaces `process.cwd()` as the anchor for
17
- * `.sandcastle/worktrees/`, `.sandcastle/.env`, and git operations.
18
- *
19
- * - Relative paths are resolved against `process.cwd()`.
20
- * - Absolute paths are used as-is.
21
- * - Defaults to `process.cwd()` when omitted.
22
- */
23
- readonly cwd?: string;
24
- /** Paths relative to the host repo root to copy into the worktree at creation time. */
25
- readonly copyToWorktree?: string[];
26
- /** Lifecycle hooks grouped by execution location (host or sandbox).
27
- * Only `host.onWorktreeReady` is executed here — other hooks are passed through
28
- * to `run()`, `interactive()`, or `createSandbox()`. */
29
- readonly hooks?: SandboxHooks;
30
- /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */
31
- readonly timeouts?: Timeouts;
32
- }
33
- export interface WorktreeInteractiveOptions {
34
- /** Agent provider to use (e.g. claudeCode("claude-opus-4-7")) */
35
- readonly agent: AgentProvider;
36
- /** Sandbox provider (e.g. docker(), noSandbox()). Defaults to noSandbox(). */
37
- readonly sandbox?: AnySandboxProvider;
38
- /** Inline prompt string (mutually exclusive with promptFile). */
39
- readonly prompt?: string;
40
- /** Path to a prompt file (mutually exclusive with prompt). */
41
- readonly promptFile?: string;
42
- /** Optional name for the interactive session. */
43
- readonly name?: string;
44
- /** Hooks to run during sandbox lifecycle */
45
- readonly hooks?: SandboxHooks;
46
- /** Key-value map for {{KEY}} placeholder substitution in prompts */
47
- readonly promptArgs?: PromptArgs;
48
- /** Environment variables to inject into the sandbox. */
49
- readonly env?: Record<string, string>;
50
- /**
51
- * An `AbortSignal` that cancels the interactive session when aborted.
52
- *
53
- * - If `signal.aborted` is already `true` at entry, rejects immediately.
54
- * - Aborting during an active session kills the agent subprocess.
55
- * - The worktree is preserved on disk after abort.
56
- * - The `Worktree` handle remains usable for subsequent operations.
57
- * - The rejected promise surfaces `signal.reason` via
58
- * `signal.throwIfAborted()` — no Sandcastle-specific wrapping.
59
- */
60
- readonly signal?: AbortSignal;
61
- }
62
- export interface WorktreeRunOptions {
63
- /** Agent provider to use (e.g. claudeCode("claude-opus-4-7")) */
64
- readonly agent: AgentProvider;
65
- /** Sandbox provider (e.g. docker()). Required — AFK agents should always be sandboxed. */
66
- readonly sandbox: SandboxProvider;
67
- /** Inline prompt string (mutually exclusive with promptFile). */
68
- readonly prompt?: string;
69
- /** Path to a prompt file (mutually exclusive with prompt). */
70
- readonly promptFile?: string;
71
- /** Key-value map for {{KEY}} placeholder substitution in prompts */
72
- readonly promptArgs?: PromptArgs;
73
- /** Maximum iterations to run (default: 1). */
74
- readonly maxIterations?: number;
75
- /** Substring(s) the agent emits to stop the iteration loop early. */
76
- readonly completionSignal?: string | string[];
77
- /** Idle timeout in seconds. Default: 600. */
78
- readonly idleTimeoutSeconds?: number;
79
- /** Optional name for the run. */
80
- readonly name?: string;
81
- /** Logging mode. */
82
- readonly logging?: LoggingOption;
83
- /** Hooks to run during sandbox lifecycle */
84
- readonly hooks?: SandboxHooks;
85
- /** Environment variables to inject into the sandbox. */
86
- readonly env?: Record<string, string>;
87
- /** Resume a prior Claude Code session by ID. The session JSONL must exist on the host. Incompatible with maxIterations > 1. */
88
- readonly resumeSession?: string;
89
- /**
90
- * An `AbortSignal` that cancels the run when aborted.
91
- *
92
- * - If `signal.aborted` is already `true` at entry, rejects immediately
93
- * without doing any setup work.
94
- * - Aborting mid-iteration kills the in-flight agent subprocess.
95
- * - The worktree is preserved on disk after abort.
96
- * - The `Worktree` handle remains usable for subsequent operations.
97
- */
98
- readonly signal?: AbortSignal;
99
- }
100
- export interface WorktreeRunResult {
101
- /** Per-iteration results (use `iterations.length` for the count). */
102
- readonly iterations: IterationResult[];
103
- /** The matched completion signal string, or undefined if none fired. */
104
- readonly completionSignal?: string;
105
- /** Combined stdout output from all agent iterations. */
106
- readonly stdout: string;
107
- /** List of commits made by the agent during the run. */
108
- readonly commits: {
109
- sha: string;
110
- }[];
111
- /** The branch name the agent worked on. */
112
- readonly branch: string;
113
- /** Path to the log file, if logging was drained to a file. */
114
- readonly logFilePath?: string;
115
- }
116
- export interface WorktreeCreateSandboxOptions {
117
- /** Sandbox provider (e.g. docker({ imageName: "sandcastle:myrepo" })). */
118
- readonly sandbox: SandboxProvider;
119
- /** Lifecycle hooks grouped by execution location (host or sandbox). */
120
- readonly hooks?: SandboxHooks;
121
- /** Paths relative to the host repo root to copy into the worktree at creation time. */
122
- readonly copyToWorktree?: string[];
123
- /** Override default timeouts for built-in lifecycle steps. Unset keys keep their defaults. */
124
- readonly timeouts?: Timeouts;
125
- /** @internal Test-only overrides to bypass the sandbox provider. */
126
- readonly _test?: {
127
- readonly buildSandboxLayer?: (sandboxDir: string) => import("effect").Layer.Layer<import("./SandboxFactory.js").Sandbox>;
128
- };
129
- }
130
- export interface Worktree {
131
- /** The branch the worktree is on. */
132
- readonly branch: string;
133
- /** Host path to the worktree (worktree). */
134
- readonly worktreePath: string;
135
- /** Run an AFK agent in this worktree with a required sandbox. */
136
- run(options: WorktreeRunOptions): Promise<WorktreeRunResult>;
137
- /** Run an interactive agent session in this worktree. */
138
- interactive(options: WorktreeInteractiveOptions): Promise<InteractiveResult>;
139
- /** Create a long-lived sandbox backed by this worktree's worktree. */
140
- createSandbox(options: WorktreeCreateSandboxOptions): Promise<Sandbox>;
141
- /** Clean up the worktree. Preserves worktree if dirty. */
142
- close(): Promise<CloseResult>;
143
- /** Auto cleanup via `await using`. */
144
- [Symbol.asyncDispose](): Promise<void>;
145
- }
146
- /**
147
- * Creates a git worktree as an independent, first-class worktree.
148
- * Returns a Worktree handle with close() and [Symbol.asyncDispose]().
149
- *
150
- * Only accepts 'branch' and 'merge-to-head' strategies — 'head' is a
151
- * compile-time type error since head means no worktree.
152
- */
153
- export declare const createWorktree: (options: CreateWorktreeOptions) => Promise<Worktree>;
154
- //# sourceMappingURL=createWorktree.d.ts.map