@ai-hero/sandcastle 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +384 -58
- package/dist/AgentProvider.d.ts +22 -12
- package/dist/AgentProvider.d.ts.map +1 -1
- package/dist/AgentProvider.js +46 -47
- package/dist/AgentProvider.js.map +1 -1
- package/dist/DockerLifecycle.d.ts +5 -1
- package/dist/DockerLifecycle.d.ts.map +1 -1
- package/dist/DockerLifecycle.js +8 -1
- package/dist/DockerLifecycle.js.map +1 -1
- package/dist/InitService.d.ts.map +1 -1
- package/dist/InitService.js +57 -6
- package/dist/InitService.js.map +1 -1
- package/dist/MountConfig.d.ts +15 -0
- package/dist/MountConfig.d.ts.map +1 -0
- package/dist/MountConfig.js +7 -0
- package/dist/MountConfig.js.map +1 -0
- package/dist/Orchestrator.d.ts +0 -1
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +28 -29
- package/dist/Orchestrator.js.map +1 -1
- package/dist/SandboxFactory.d.ts +21 -17
- package/dist/SandboxFactory.d.ts.map +1 -1
- package/dist/SandboxFactory.js +48 -50
- package/dist/SandboxFactory.js.map +1 -1
- package/dist/SandboxLifecycle.d.ts +1 -1
- package/dist/SandboxLifecycle.d.ts.map +1 -1
- package/dist/SandboxLifecycle.js +2 -2
- package/dist/SandboxLifecycle.js.map +1 -1
- package/dist/SandboxProvider.d.ts +50 -13
- package/dist/SandboxProvider.d.ts.map +1 -1
- package/dist/SandboxProvider.js +2 -0
- package/dist/SandboxProvider.js.map +1 -1
- package/dist/TextDeltaBuffer.d.ts +24 -0
- package/dist/TextDeltaBuffer.d.ts.map +1 -0
- package/dist/TextDeltaBuffer.js +68 -0
- package/dist/TextDeltaBuffer.js.map +1 -0
- package/dist/WorktreeManager.d.ts +2 -0
- package/dist/WorktreeManager.d.ts.map +1 -1
- package/dist/WorktreeManager.js +3 -0
- package/dist/WorktreeManager.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -6
- package/dist/cli.js.map +1 -1
- package/dist/createSandbox.d.ts +6 -5
- package/dist/createSandbox.d.ts.map +1 -1
- package/dist/createSandbox.js +14 -6
- package/dist/createSandbox.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mergeProviderEnv.d.ts +13 -0
- package/dist/mergeProviderEnv.d.ts.map +1 -0
- package/dist/mergeProviderEnv.js +23 -0
- package/dist/mergeProviderEnv.js.map +1 -0
- package/dist/run.d.ts +7 -18
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +35 -22
- package/dist/run.js.map +1 -1
- package/dist/sandboxes/daytona.d.ts +48 -0
- package/dist/sandboxes/daytona.d.ts.map +1 -0
- package/dist/sandboxes/daytona.js +125 -0
- package/dist/sandboxes/daytona.js.map +1 -0
- package/dist/sandboxes/docker.d.ts +10 -0
- package/dist/sandboxes/docker.d.ts.map +1 -1
- package/dist/sandboxes/docker.js +69 -42
- package/dist/sandboxes/docker.js.map +1 -1
- package/dist/sandboxes/podman.d.ts +46 -0
- package/dist/sandboxes/podman.d.ts.map +1 -0
- package/dist/sandboxes/podman.js +195 -0
- package/dist/sandboxes/podman.js.map +1 -0
- package/dist/sandboxes/test-isolated.d.ts +1 -1
- package/dist/sandboxes/test-isolated.d.ts.map +1 -1
- package/dist/sandboxes/test-isolated.js +56 -45
- package/dist/sandboxes/test-isolated.js.map +1 -1
- package/dist/sandboxes/vercel.d.ts +92 -0
- package/dist/sandboxes/vercel.d.ts.map +1 -0
- package/dist/sandboxes/vercel.js +165 -0
- package/dist/sandboxes/vercel.js.map +1 -0
- package/dist/syncIn.d.ts +4 -2
- package/dist/syncIn.d.ts.map +1 -1
- package/dist/syncIn.js +72 -22
- package/dist/syncIn.js.map +1 -1
- package/dist/syncOut.d.ts +4 -2
- package/dist/syncOut.d.ts.map +1 -1
- package/dist/syncOut.js +156 -77
- package/dist/syncOut.js.map +1 -1
- package/dist/templates/blank/.env.example +1 -0
- package/dist/templates/parallel-planner/.env.example +1 -0
- package/dist/templates/parallel-planner/main.mts +3 -3
- package/dist/templates/parallel-planner-with-review/.env.example +5 -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 +249 -0
- package/dist/templates/parallel-planner-with-review/merge-prompt.md +22 -0
- package/dist/templates/parallel-planner-with-review/plan-prompt.md +33 -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/.env.example +1 -0
- package/dist/templates/sequential-reviewer/CODING_STANDARDS.md +27 -0
- package/dist/templates/sequential-reviewer/implement-prompt.md +34 -45
- package/dist/templates/sequential-reviewer/main.mts +2 -2
- package/dist/templates/sequential-reviewer/review-prompt.md +1 -1
- package/dist/templates/simple-loop/.env.example +1 -0
- package/dist/testSandbox.d.ts.map +1 -1
- package/dist/testSandbox.js +58 -53
- package/dist/testSandbox.js.map +1 -1
- package/package.json +25 -1
package/dist/run.js
CHANGED
|
@@ -5,8 +5,9 @@ import { Effect, Layer } from "effect";
|
|
|
5
5
|
import { ClackDisplay, Display, FileDisplay, } from "./Display.js";
|
|
6
6
|
import { orchestrate } from "./Orchestrator.js";
|
|
7
7
|
import { resolvePrompt } from "./PromptResolver.js";
|
|
8
|
-
import { WorktreeDockerSandboxFactory,
|
|
8
|
+
import { WorktreeDockerSandboxFactory, SandboxConfig, SANDBOX_WORKSPACE_DIR, } from "./SandboxFactory.js";
|
|
9
9
|
import { resolveEnv } from "./EnvResolver.js";
|
|
10
|
+
import { mergeProviderEnv } from "./mergeProviderEnv.js";
|
|
10
11
|
import { generateTempBranchName, getCurrentBranch } from "./WorktreeManager.js";
|
|
11
12
|
import { substitutePromptArgs, validateNoBuiltInArgOverride, BUILT_IN_PROMPT_ARG_KEYS, } from "./PromptArgumentSubstitution.js";
|
|
12
13
|
/** Default maximum number of iterations for a run. */
|
|
@@ -72,36 +73,47 @@ export const buildCompletionMessage = (completionSignal, iterationsRun) => {
|
|
|
72
73
|
};
|
|
73
74
|
export const run = async (options) => {
|
|
74
75
|
const { prompt, promptFile, maxIterations = DEFAULT_MAX_ITERATIONS, hooks, agent: provider, } = options;
|
|
75
|
-
//
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
// Derive branch strategy: explicit option > default based on provider tag
|
|
77
|
+
const branchStrategy = options.branchStrategy ??
|
|
78
|
+
(options.sandbox.tag === "isolated"
|
|
79
|
+
? { type: "merge-to-head" }
|
|
80
|
+
: { type: "head" });
|
|
81
|
+
const effectiveBranchType = branchStrategy.type;
|
|
82
|
+
// Validate: head strategy is not supported with isolated providers
|
|
83
|
+
if (effectiveBranchType === "head" && options.sandbox.tag === "isolated") {
|
|
84
|
+
throw new Error("head branch strategy is not supported with isolated providers");
|
|
85
|
+
}
|
|
86
|
+
// Validate: copyToSandbox is incompatible with head strategy
|
|
87
|
+
if (effectiveBranchType === "head" &&
|
|
81
88
|
options.copyToSandbox &&
|
|
82
89
|
options.copyToSandbox.length > 0) {
|
|
83
|
-
throw new Error("copyToSandbox is not supported with
|
|
84
|
-
"In mode
|
|
90
|
+
throw new Error("copyToSandbox is not supported with head branch strategy. " +
|
|
91
|
+
"In head mode the host working directory is bind-mounted directly.");
|
|
85
92
|
}
|
|
86
|
-
// Extract explicit branch when in branch mode
|
|
87
|
-
const branch =
|
|
93
|
+
// Extract explicit branch when in branch mode
|
|
94
|
+
const branch = branchStrategy.type === "branch" ? branchStrategy.branch : undefined;
|
|
88
95
|
const hostRepoDir = process.cwd();
|
|
89
96
|
// Resolve prompt
|
|
90
97
|
const rawPrompt = await Effect.runPromise(resolvePrompt({ prompt, promptFile }).pipe(Effect.provide(NodeContext.layer)));
|
|
91
98
|
const agentName = provider.name;
|
|
92
|
-
// Resolve env vars
|
|
93
|
-
const
|
|
99
|
+
// Resolve env vars and merge with provider env
|
|
100
|
+
const resolvedEnv = await Effect.runPromise(resolveEnv(hostRepoDir).pipe(Effect.provide(NodeContext.layer)));
|
|
101
|
+
const env = mergeProviderEnv({
|
|
102
|
+
resolvedEnv,
|
|
103
|
+
agentProviderEnv: provider.env,
|
|
104
|
+
sandboxProviderEnv: options.sandbox.env,
|
|
105
|
+
});
|
|
94
106
|
// Always capture the host's current branch for the TARGET_BRANCH built-in
|
|
95
107
|
// prompt argument. When using a temp branch, it also prefixes the log filename.
|
|
96
108
|
const currentHostBranch = await Effect.runPromise(getCurrentBranch(hostRepoDir));
|
|
97
|
-
// When in
|
|
98
|
-
// In
|
|
99
|
-
const resolvedBranch =
|
|
109
|
+
// When in merge-to-head mode, generate a temporary branch name.
|
|
110
|
+
// In head mode, use the host's current branch directly (no worktree).
|
|
111
|
+
const resolvedBranch = effectiveBranchType === "head"
|
|
100
112
|
? currentHostBranch
|
|
101
113
|
: (branch ?? generateTempBranchName(options.name));
|
|
102
114
|
// When using a temp branch, prefix the log filename with the target branch
|
|
103
115
|
// (the host's current branch) so developers can tell which branch was targeted.
|
|
104
|
-
const targetBranch =
|
|
116
|
+
const targetBranch = effectiveBranchType === "merge-to-head" ? currentHostBranch : undefined;
|
|
105
117
|
// Resolve logging option
|
|
106
118
|
const resolvedLogging = options.logging ?? {
|
|
107
119
|
type: "file",
|
|
@@ -117,13 +129,14 @@ export const run = async (options) => {
|
|
|
117
129
|
return Layer.provide(FileDisplay.layer(resolvedLogging.path), NodeFileSystem.layer);
|
|
118
130
|
})()
|
|
119
131
|
: ClackDisplay.layer;
|
|
120
|
-
const factoryLayer = Layer.provide(WorktreeDockerSandboxFactory.layer, Layer.mergeAll(Layer.succeed(
|
|
132
|
+
const factoryLayer = Layer.provide(WorktreeDockerSandboxFactory.layer, Layer.mergeAll(Layer.succeed(SandboxConfig, {
|
|
121
133
|
env,
|
|
122
134
|
hostRepoDir,
|
|
123
|
-
worktree: worktreeMode,
|
|
124
135
|
copyToSandbox: options.copyToSandbox,
|
|
125
136
|
name: options.name,
|
|
126
137
|
sandboxProvider: options.sandbox,
|
|
138
|
+
branchStrategy,
|
|
139
|
+
throwOnDuplicateWorktree: options.throwOnDuplicateWorktree,
|
|
127
140
|
}), NodeFileSystem.layer, displayLayer));
|
|
128
141
|
const runLayer = Layer.merge(factoryLayer, displayLayer);
|
|
129
142
|
const result = await Effect.runPromise(Effect.gen(function* () {
|
|
@@ -150,9 +163,9 @@ export const run = async (options) => {
|
|
|
150
163
|
};
|
|
151
164
|
const builtInArgKeysSet = new Set(BUILT_IN_PROMPT_ARG_KEYS);
|
|
152
165
|
const resolvedPrompt = yield* substitutePromptArgs(rawPrompt, effectiveArgs, builtInArgKeysSet);
|
|
153
|
-
// In
|
|
154
|
-
// In
|
|
155
|
-
const orchestrateBranch =
|
|
166
|
+
// In head mode, pass the host branch so SandboxLifecycle skips the merge step.
|
|
167
|
+
// In merge-to-head mode, branch is undefined (triggers merge). In branch mode, it's the explicit branch.
|
|
168
|
+
const orchestrateBranch = effectiveBranchType === "head" ? currentHostBranch : branch;
|
|
156
169
|
const orchestrateResult = yield* orchestrate({
|
|
157
170
|
hostRepoDir,
|
|
158
171
|
sandboxRepoDir: SANDBOX_WORKSPACE_DIR,
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EACL,YAAY,EACZ,OAAO,EACP,WAAW,GAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daytona isolated sandbox provider.
|
|
3
|
+
*
|
|
4
|
+
* Creates ephemeral Daytona sandboxes via `@daytona/sdk`.
|
|
5
|
+
* Requires `@daytona/sdk` as a peer dependency.
|
|
6
|
+
*/
|
|
7
|
+
import { type IsolatedSandboxProvider } from "../SandboxProvider.js";
|
|
8
|
+
import type { CreateSandboxFromImageParams, CreateSandboxFromSnapshotParams } from "@daytona/sdk";
|
|
9
|
+
/** Options for the Daytona sandbox provider. */
|
|
10
|
+
export interface DaytonaOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Daytona API key for authentication.
|
|
13
|
+
* Falls back to the `DAYTONA_API_KEY` environment variable if not provided.
|
|
14
|
+
*/
|
|
15
|
+
readonly apiKey?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Daytona API URL.
|
|
18
|
+
* Falls back to the `DAYTONA_API_URL` environment variable if not provided.
|
|
19
|
+
*/
|
|
20
|
+
readonly apiUrl?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Target environment for sandboxes.
|
|
23
|
+
* Falls back to the `DAYTONA_TARGET` environment variable if not provided.
|
|
24
|
+
*/
|
|
25
|
+
readonly target?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Options passed through to the Daytona SDK when creating a sandbox.
|
|
28
|
+
* Supports both image-based and snapshot-based creation.
|
|
29
|
+
*/
|
|
30
|
+
readonly create?: CreateSandboxFromImageParams | CreateSandboxFromSnapshotParams;
|
|
31
|
+
/** Environment variables injected by this provider. Merged at launch time with env resolver and agent provider env. */
|
|
32
|
+
readonly env?: Record<string, string>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a Daytona isolated sandbox provider.
|
|
36
|
+
*
|
|
37
|
+
* Sandboxes are ephemeral — each `create()` call spins up a new Daytona
|
|
38
|
+
* sandbox and `close()` destroys it.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* import { daytona } from "@ai-hero/sandcastle/sandboxes/daytona";
|
|
43
|
+
*
|
|
44
|
+
* const provider = daytona({ apiKey: "dyt_my_key" });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare const daytona: (options?: DaytonaOptions | undefined) => IsolatedSandboxProvider;
|
|
48
|
+
//# sourceMappingURL=daytona.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daytona.d.ts","sourceRoot":"","sources":["../../src/sandboxes/daytona.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAIL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAGV,4BAA4B,EAC5B,+BAA+B,EAChC,MAAM,cAAc,CAAC;AAEtB,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EACZ,4BAA4B,GAC5B,+BAA+B,CAAC;IAEpC,uHAAuH;IACvH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO,mEAyIhB,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daytona isolated sandbox provider.
|
|
3
|
+
*
|
|
4
|
+
* Creates ephemeral Daytona sandboxes via `@daytona/sdk`.
|
|
5
|
+
* Requires `@daytona/sdk` as a peer dependency.
|
|
6
|
+
*/
|
|
7
|
+
import { readdir, stat } from "node:fs/promises";
|
|
8
|
+
import { join, relative } from "node:path";
|
|
9
|
+
import { createIsolatedSandboxProvider, } from "../SandboxProvider.js";
|
|
10
|
+
/**
|
|
11
|
+
* Create a Daytona isolated sandbox provider.
|
|
12
|
+
*
|
|
13
|
+
* Sandboxes are ephemeral — each `create()` call spins up a new Daytona
|
|
14
|
+
* sandbox and `close()` destroys it.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { daytona } from "@ai-hero/sandcastle/sandboxes/daytona";
|
|
19
|
+
*
|
|
20
|
+
* const provider = daytona({ apiKey: "dyt_my_key" });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export const daytona = (options) => createIsolatedSandboxProvider({
|
|
24
|
+
name: "daytona",
|
|
25
|
+
env: options?.env,
|
|
26
|
+
create: async () => {
|
|
27
|
+
const { Daytona } = (await import("@daytona/sdk"));
|
|
28
|
+
const config = {};
|
|
29
|
+
if (options?.apiKey)
|
|
30
|
+
config.apiKey = options.apiKey;
|
|
31
|
+
if (options?.apiUrl)
|
|
32
|
+
config.apiUrl = options.apiUrl;
|
|
33
|
+
if (options?.target)
|
|
34
|
+
config.target = options.target;
|
|
35
|
+
const client = new Daytona(config);
|
|
36
|
+
const sandbox = await client.create(options?.create);
|
|
37
|
+
const workspacePath = (await sandbox.getWorkDir()) ??
|
|
38
|
+
(await sandbox.getUserHomeDir()) ??
|
|
39
|
+
"/home/daytona";
|
|
40
|
+
return {
|
|
41
|
+
workspacePath,
|
|
42
|
+
exec: async (command, opts) => {
|
|
43
|
+
if (opts?.onLine) {
|
|
44
|
+
const onLine = opts.onLine;
|
|
45
|
+
const sessionId = `sandcastle-${crypto.randomUUID()}`;
|
|
46
|
+
await sandbox.process.createSession(sessionId);
|
|
47
|
+
try {
|
|
48
|
+
const execResponse = await sandbox.process.executeSessionCommand(sessionId, {
|
|
49
|
+
command: `cd ${opts?.cwd ?? workspacePath} && ${command}`,
|
|
50
|
+
async: true,
|
|
51
|
+
});
|
|
52
|
+
const cmdId = execResponse.cmdId;
|
|
53
|
+
const stdoutLines = [];
|
|
54
|
+
const stderrChunks = [];
|
|
55
|
+
let partial = "";
|
|
56
|
+
await sandbox.process.getSessionCommandLogs(sessionId, cmdId, (chunk) => {
|
|
57
|
+
const text = partial + chunk;
|
|
58
|
+
const lines = text.split("\n");
|
|
59
|
+
partial = lines.pop() ?? "";
|
|
60
|
+
for (const line of lines) {
|
|
61
|
+
stdoutLines.push(line);
|
|
62
|
+
onLine(line);
|
|
63
|
+
}
|
|
64
|
+
}, (chunk) => {
|
|
65
|
+
stderrChunks.push(chunk);
|
|
66
|
+
});
|
|
67
|
+
if (partial) {
|
|
68
|
+
stdoutLines.push(partial);
|
|
69
|
+
onLine(partial);
|
|
70
|
+
}
|
|
71
|
+
const cmdInfo = await sandbox.process.getSessionCommand(sessionId, cmdId);
|
|
72
|
+
return {
|
|
73
|
+
stdout: stdoutLines.join("\n"),
|
|
74
|
+
stderr: stderrChunks.join(""),
|
|
75
|
+
exitCode: cmdInfo.exitCode ?? 0,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await sandbox.process.deleteSession(sessionId).catch(() => { });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const response = await sandbox.process.executeCommand(command, opts?.cwd ?? workspacePath);
|
|
83
|
+
return {
|
|
84
|
+
stdout: response.result,
|
|
85
|
+
stderr: "",
|
|
86
|
+
exitCode: response.exitCode,
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
copyIn: async (hostPath, sandboxPath) => {
|
|
90
|
+
const info = await stat(hostPath);
|
|
91
|
+
if (info.isDirectory()) {
|
|
92
|
+
const walk = async (dir) => {
|
|
93
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
94
|
+
const files = [];
|
|
95
|
+
for (const entry of entries) {
|
|
96
|
+
const full = join(dir, entry.name);
|
|
97
|
+
if (entry.isDirectory()) {
|
|
98
|
+
files.push(...(await walk(full)));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
files.push(full);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return files;
|
|
105
|
+
};
|
|
106
|
+
const files = await walk(hostPath);
|
|
107
|
+
for (const file of files) {
|
|
108
|
+
const rel = relative(hostPath, file);
|
|
109
|
+
await sandbox.fs.uploadFile(file, join(sandboxPath, rel));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
await sandbox.fs.uploadFile(hostPath, sandboxPath);
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
copyFileOut: async (sandboxPath, hostPath) => {
|
|
117
|
+
await sandbox.fs.downloadFile(sandboxPath, hostPath);
|
|
118
|
+
},
|
|
119
|
+
close: async () => {
|
|
120
|
+
await client.delete(sandbox);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
//# sourceMappingURL=daytona.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daytona.js","sourceRoot":"","sources":["../../src/sandboxes/daytona.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,9 +6,19 @@
|
|
|
6
6
|
* await run({ agent: claudeCode("claude-opus-4-6"), sandbox: docker() });
|
|
7
7
|
*/
|
|
8
8
|
import { type SandboxProvider } from "../SandboxProvider.js";
|
|
9
|
+
import type { MountConfig } from "../MountConfig.js";
|
|
9
10
|
export interface DockerOptions {
|
|
10
11
|
/** Docker image name (default: derived from repo directory name). */
|
|
11
12
|
readonly imageName?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Additional host directories to bind-mount into the sandbox.
|
|
15
|
+
*
|
|
16
|
+
* Each entry specifies a `hostPath` (tilde-expanded) and `sandboxPath`.
|
|
17
|
+
* If `hostPath` does not exist, sandbox creation fails with a clear error.
|
|
18
|
+
*/
|
|
19
|
+
readonly mounts?: readonly MountConfig[];
|
|
20
|
+
/** Environment variables injected by this provider. Merged at launch time with env resolver and agent provider env. */
|
|
21
|
+
readonly env?: Record<string, string>;
|
|
12
22
|
}
|
|
13
23
|
/**
|
|
14
24
|
* Create a Docker sandbox provider.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/sandboxes/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAEL,KAAK,eAAe,EAIrB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/sandboxes/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,OAAO,EAEL,KAAK,eAAe,EAIrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,uHAAuH;IACvH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,0DAsJlB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6BAI5B,CAAC"}
|
package/dist/sandboxes/docker.js
CHANGED
|
@@ -11,6 +11,8 @@ import { createInterface } from "node:readline";
|
|
|
11
11
|
import { Effect } from "effect";
|
|
12
12
|
import { startContainer, removeContainer, chownInContainer, } from "../DockerLifecycle.js";
|
|
13
13
|
import { createBindMountSandboxProvider, } from "../SandboxProvider.js";
|
|
14
|
+
import { existsSync } from "node:fs";
|
|
15
|
+
import { homedir } from "node:os";
|
|
14
16
|
/**
|
|
15
17
|
* Create a Docker sandbox provider.
|
|
16
18
|
*
|
|
@@ -19,13 +21,16 @@ import { createBindMountSandboxProvider, } from "../SandboxProvider.js";
|
|
|
19
21
|
*/
|
|
20
22
|
export const docker = (options) => {
|
|
21
23
|
const configuredImageName = options?.imageName;
|
|
24
|
+
const userMounts = options?.mounts ? resolveUserMounts(options.mounts) : [];
|
|
22
25
|
return createBindMountSandboxProvider({
|
|
23
26
|
name: "docker",
|
|
27
|
+
env: options?.env,
|
|
24
28
|
create: async (createOptions) => {
|
|
25
29
|
const containerName = `sandcastle-${randomUUID()}`;
|
|
26
30
|
const workspacePath = createOptions.mounts.find((m) => m.hostPath === createOptions.worktreePath)?.sandboxPath ?? "/home/agent/workspace";
|
|
27
|
-
// Build volume mount strings
|
|
28
|
-
const
|
|
31
|
+
// Build volume mount strings (internal mounts + user-provided mounts)
|
|
32
|
+
const allMounts = [...createOptions.mounts, ...userMounts];
|
|
33
|
+
const volumeMounts = allMounts.map((m) => {
|
|
29
34
|
const base = `${m.hostPath}:${m.sandboxPath}`;
|
|
30
35
|
return m.readonly ? `${base}:ro` : base;
|
|
31
36
|
});
|
|
@@ -62,53 +67,54 @@ export const docker = (options) => {
|
|
|
62
67
|
process.on("SIGTERM", onSignal);
|
|
63
68
|
const handle = {
|
|
64
69
|
workspacePath,
|
|
65
|
-
exec: (command, opts) =>
|
|
70
|
+
exec: (command, opts) => {
|
|
66
71
|
const args = ["exec"];
|
|
67
72
|
if (opts?.cwd)
|
|
68
73
|
args.push("-w", opts.cwd);
|
|
69
74
|
args.push(containerName, "sh", "-c", command);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
resolve({
|
|
76
|
-
stdout: stdout.toString(),
|
|
77
|
-
stderr: stderr.toString(),
|
|
78
|
-
exitCode: typeof error?.code === "number" ? error.code : 0,
|
|
75
|
+
if (opts?.onLine) {
|
|
76
|
+
const onLine = opts.onLine;
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const proc = spawn("docker", args, {
|
|
79
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
79
80
|
});
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
81
|
+
const stdoutChunks = [];
|
|
82
|
+
const stderrChunks = [];
|
|
83
|
+
const rl = createInterface({ input: proc.stdout });
|
|
84
|
+
rl.on("line", (line) => {
|
|
85
|
+
stdoutChunks.push(line);
|
|
86
|
+
onLine(line);
|
|
87
|
+
});
|
|
88
|
+
proc.stderr.on("data", (chunk) => {
|
|
89
|
+
stderrChunks.push(chunk.toString());
|
|
90
|
+
});
|
|
91
|
+
proc.on("error", (error) => {
|
|
92
|
+
reject(new Error(`docker exec failed: ${error.message}`));
|
|
93
|
+
});
|
|
94
|
+
proc.on("close", (code) => {
|
|
95
|
+
resolve({
|
|
96
|
+
stdout: stdoutChunks.join("\n"),
|
|
97
|
+
stderr: stderrChunks.join(""),
|
|
98
|
+
exitCode: code ?? 0,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
execFile("docker", args, { maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
105
|
+
if (error && error.code === undefined) {
|
|
106
|
+
reject(new Error(`docker exec failed: ${error.message}`));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
resolve({
|
|
110
|
+
stdout: stdout.toString(),
|
|
111
|
+
stderr: stderr.toString(),
|
|
112
|
+
exitCode: typeof error?.code === "number" ? error.code : 0,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
109
115
|
});
|
|
110
116
|
});
|
|
111
|
-
}
|
|
117
|
+
},
|
|
112
118
|
close: async () => {
|
|
113
119
|
process.removeListener("exit", onExit);
|
|
114
120
|
process.removeListener("SIGINT", onSignal);
|
|
@@ -130,4 +136,25 @@ export const defaultImageName = (repoDir) => {
|
|
|
130
136
|
const sanitized = dirName.toLowerCase().replace(/[^a-z0-9_.-]/g, "-");
|
|
131
137
|
return `sandcastle:${sanitized}`;
|
|
132
138
|
};
|
|
139
|
+
const expandTilde = (p) => {
|
|
140
|
+
if (p === "~")
|
|
141
|
+
return homedir();
|
|
142
|
+
if (p.startsWith("~/"))
|
|
143
|
+
return homedir() + p.slice(1);
|
|
144
|
+
return p;
|
|
145
|
+
};
|
|
146
|
+
const resolveUserMounts = (mounts) => mounts.map((m) => {
|
|
147
|
+
const resolvedHostPath = expandTilde(m.hostPath);
|
|
148
|
+
if (!existsSync(resolvedHostPath)) {
|
|
149
|
+
throw new Error(`Mount hostPath does not exist: ${m.hostPath}` +
|
|
150
|
+
(m.hostPath !== resolvedHostPath
|
|
151
|
+
? ` (resolved to ${resolvedHostPath})`
|
|
152
|
+
: ""));
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
hostPath: resolvedHostPath,
|
|
156
|
+
sandboxPath: m.sandboxPath,
|
|
157
|
+
...(m.readonly ? { readonly: true } : {}),
|
|
158
|
+
};
|
|
159
|
+
});
|
|
133
160
|
//# sourceMappingURL=docker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/sandboxes/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,GAK/B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/sandboxes/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Podman sandbox provider — creates Podman containers with bind-mounts.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { podman } from "sandcastle/sandboxes/podman";
|
|
6
|
+
* await run({ agent: claudeCode("claude-opus-4-6"), sandbox: podman() });
|
|
7
|
+
*/
|
|
8
|
+
import { type SandboxProvider } from "../SandboxProvider.js";
|
|
9
|
+
import type { MountConfig } from "../MountConfig.js";
|
|
10
|
+
export interface PodmanOptions {
|
|
11
|
+
/** Podman image name (default: derived from repo directory name). */
|
|
12
|
+
readonly imageName?: string;
|
|
13
|
+
/**
|
|
14
|
+
* SELinux volume label suffix applied to bind mounts.
|
|
15
|
+
*
|
|
16
|
+
* - `"z"` — shared label (default). No-op on non-SELinux systems.
|
|
17
|
+
* - `"Z"` — private label; only this container can access the mount.
|
|
18
|
+
* - `false` — disable labeling entirely.
|
|
19
|
+
*/
|
|
20
|
+
readonly selinuxLabel?: "z" | "Z" | false;
|
|
21
|
+
/**
|
|
22
|
+
* Additional host directories to bind-mount into the sandbox.
|
|
23
|
+
*
|
|
24
|
+
* Each entry specifies a `hostPath` (tilde-expanded) and `sandboxPath`.
|
|
25
|
+
* If `hostPath` does not exist, sandbox creation fails with a clear error.
|
|
26
|
+
*/
|
|
27
|
+
readonly mounts?: readonly MountConfig[];
|
|
28
|
+
/** Environment variables injected by this provider. Merged at launch time with env resolver and agent provider env. */
|
|
29
|
+
readonly env?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a Podman sandbox provider.
|
|
33
|
+
*
|
|
34
|
+
* The returned provider creates Podman containers with bind-mounts
|
|
35
|
+
* for the worktree and git directories. Calls the `podman` binary
|
|
36
|
+
* on PATH directly — no Podman Machine detection or special
|
|
37
|
+
* macOS/Windows handling.
|
|
38
|
+
*/
|
|
39
|
+
export declare const podman: (options?: PodmanOptions | undefined) => SandboxProvider;
|
|
40
|
+
/**
|
|
41
|
+
* Derive the default Podman image name from the repo directory.
|
|
42
|
+
* Returns `sandcastle:<dir-name>` where dir-name is the last path segment,
|
|
43
|
+
* lowercased and sanitized for image tag rules.
|
|
44
|
+
*/
|
|
45
|
+
export declare const defaultImageName: (repoDir: string) => string;
|
|
46
|
+
//# sourceMappingURL=podman.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"podman.d.ts","sourceRoot":"","sources":["../../src/sandboxes/podman.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAEL,KAAK,eAAe,EAIrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,uHAAuH;IACvH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,0DA4KlB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6BAI5B,CAAC"}
|