@ai-hero/sandcastle 0.0.1 → 0.1.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 +132 -87
- package/dist/AgentProvider.d.ts.map +1 -1
- package/dist/CopyToSandbox.d.ts +1 -1
- package/dist/CopyToSandbox.d.ts.map +1 -1
- package/dist/Display.d.ts +7 -1
- package/dist/Display.d.ts.map +1 -1
- package/dist/Display.js +7 -0
- package/dist/Display.js.map +1 -1
- package/dist/DockerLifecycle.d.ts +6 -6
- package/dist/DockerLifecycle.d.ts.map +1 -1
- package/dist/EnvResolver.d.ts.map +1 -1
- package/dist/ErrorHandler.d.ts.map +1 -1
- package/dist/InitService.d.ts.map +1 -1
- package/dist/InitService.js +3 -3
- package/dist/InitService.js.map +1 -1
- package/dist/Orchestrator.d.ts +16 -3
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +76 -18
- package/dist/Orchestrator.js.map +1 -1
- package/dist/PromptArgumentSubstitution.d.ts +5 -0
- package/dist/PromptArgumentSubstitution.d.ts.map +1 -1
- package/dist/PromptArgumentSubstitution.js.map +1 -1
- package/dist/PromptPreprocessor.d.ts.map +1 -1
- package/dist/PromptResolver.d.ts.map +1 -1
- package/dist/RecoveryMessage.d.ts.map +1 -1
- package/dist/SandboxFactory.d.ts +3 -3
- package/dist/SandboxFactory.d.ts.map +1 -1
- package/dist/SandboxLifecycle.d.ts +1 -1
- package/dist/SandboxLifecycle.d.ts.map +1 -1
- package/dist/SandboxLifecycle.js +7 -7
- package/dist/SandboxLifecycle.js.map +1 -1
- package/dist/WorktreeManager.d.ts +6 -6
- package/dist/WorktreeManager.d.ts.map +1 -1
- package/dist/cli.d.ts +1 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -15
- package/dist/cli.js.map +1 -1
- package/dist/run.d.ts +31 -5
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +27 -11
- package/dist/run.js.map +1 -1
- package/dist/templates/parallel-planner/implement-prompt.md +1 -1
- package/dist/templates/parallel-planner/main.ts +3 -3
- package/dist/templates/parallel-planner/merge-prompt.md +1 -1
- package/dist/templates/sequential-reviewer/implement-prompt.md +1 -1
- package/dist/templates/sequential-reviewer/main.ts +3 -3
- package/dist/templates/simple-loop/main.ts +3 -3
- package/dist/templates/simple-loop/prompt.md +1 -1
- package/dist/terminalCleanup.d.ts +2 -2
- package/dist/terminalCleanup.d.ts.map +1 -1
- package/dist/testSandbox.d.ts +1 -1
- package/dist/testSandbox.d.ts.map +1 -1
- package/package.json +15 -15
- package/dist/Config.d.ts +0 -35
- package/dist/Config.d.ts.map +0 -1
- package/dist/Config.js +0 -56
- package/dist/Config.js.map +0 -1
- package/dist/DockerSandbox.d.ts +0 -6
- package/dist/DockerSandbox.d.ts.map +0 -1
- package/dist/DockerSandbox.js +0 -122
- package/dist/DockerSandbox.js.map +0 -1
- package/dist/FilesystemSandbox.d.ts +0 -6
- package/dist/FilesystemSandbox.d.ts.map +0 -1
- package/dist/FilesystemSandbox.js +0 -83
- package/dist/FilesystemSandbox.js.map +0 -1
- package/dist/Sandbox.d.ts +0 -23
- package/dist/Sandbox.d.ts.map +0 -1
- package/dist/Sandbox.js +0 -5
- package/dist/Sandbox.js.map +0 -1
- package/dist/SyncService.d.ts +0 -20
- package/dist/SyncService.d.ts.map +0 -1
- package/dist/SyncService.js +0 -504
- package/dist/SyncService.js.map +0 -1
- package/dist/TokenResolver.d.ts +0 -6
- package/dist/TokenResolver.d.ts.map +0 -1
- package/dist/TokenResolver.js +0 -43
- package/dist/TokenResolver.js.map +0 -1
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAUtB,OAAO,EACL,KAAK,UAAU,EAEhB,MAAM,iCAAiC,CAAC;AAEzC,sDAAsD;AACtD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
package/dist/run.js
CHANGED
|
@@ -50,6 +50,22 @@ export const buildLogFilename = (resolvedBranch, targetBranch) => {
|
|
|
50
50
|
}
|
|
51
51
|
return `${sanitized}.log`;
|
|
52
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Build the summary rows for a run, used in both terminal mode and
|
|
55
|
+
* log-to-file mode. When a custom name is provided it appears as the
|
|
56
|
+
* Agent value instead of the internal provider name.
|
|
57
|
+
*/
|
|
58
|
+
export const buildRunSummaryRows = (options) => {
|
|
59
|
+
const rows = {
|
|
60
|
+
Agent: options.name ?? options.agentName,
|
|
61
|
+
Image: options.imageName,
|
|
62
|
+
"Max iterations": String(options.maxIterations),
|
|
63
|
+
Branch: options.branch,
|
|
64
|
+
};
|
|
65
|
+
if (options.model)
|
|
66
|
+
rows["Model"] = options.model;
|
|
67
|
+
return rows;
|
|
68
|
+
};
|
|
53
69
|
/**
|
|
54
70
|
* Build the completion status message for a run, used in both terminal mode
|
|
55
71
|
* and log-to-file mode to record the final outcome.
|
|
@@ -67,14 +83,14 @@ export const buildCompletionMessage = (wasCompletionSignalDetected, iterationsRu
|
|
|
67
83
|
};
|
|
68
84
|
};
|
|
69
85
|
export const run = async (options) => {
|
|
70
|
-
const { prompt, promptFile, maxIterations = DEFAULT_MAX_ITERATIONS, hooks, branch, model,
|
|
86
|
+
const { prompt, promptFile, maxIterations = DEFAULT_MAX_ITERATIONS, hooks, branch, model, } = options;
|
|
71
87
|
const hostRepoDir = process.cwd();
|
|
72
88
|
// Resolve prompt
|
|
73
89
|
const rawPrompt = await Effect.runPromise(resolvePrompt({ prompt, promptFile }).pipe(Effect.provide(NodeContext.layer)));
|
|
74
90
|
// Resolve model: explicit option > default
|
|
75
91
|
const resolvedModel = model;
|
|
76
|
-
//
|
|
77
|
-
const agentName =
|
|
92
|
+
// Agent is hardcoded to claude-code (agent selection is not part of the public API)
|
|
93
|
+
const agentName = "claude-code";
|
|
78
94
|
const provider = getAgentProvider(agentName);
|
|
79
95
|
// Resolve image name: explicit option > default
|
|
80
96
|
const resolvedImageName = options.imageName ?? defaultImageName(hostRepoDir);
|
|
@@ -118,14 +134,14 @@ export const run = async (options) => {
|
|
|
118
134
|
const result = await Effect.runPromise(Effect.gen(function* () {
|
|
119
135
|
const d = yield* Display;
|
|
120
136
|
yield* d.intro(options.name ?? "sandcastle");
|
|
121
|
-
const rows = {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
137
|
+
const rows = buildRunSummaryRows({
|
|
138
|
+
name: options.name,
|
|
139
|
+
agentName,
|
|
140
|
+
imageName: resolvedImageName,
|
|
141
|
+
maxIterations,
|
|
142
|
+
branch: resolvedBranch,
|
|
143
|
+
model: resolvedModel,
|
|
144
|
+
});
|
|
129
145
|
yield* d.summary("Sandcastle Run", rows);
|
|
130
146
|
// Substitute prompt arguments ({{KEY}} placeholders) before orchestration
|
|
131
147
|
const resolvedPrompt = options.promptArgs
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ If applicable, use RGR to complete the task.
|
|
|
35
35
|
|
|
36
36
|
# FEEDBACK LOOPS
|
|
37
37
|
|
|
38
|
-
Before committing, run `
|
|
38
|
+
Before committing, run `pnpm run typecheck` and `pnpm run test` to ensure the tests pass.
|
|
39
39
|
|
|
40
40
|
# COMMIT
|
|
41
41
|
|
|
@@ -27,13 +27,13 @@ import * as sandcastle from "@ai-hero/sandcastle";
|
|
|
27
27
|
const MAX_ITERATIONS = 10;
|
|
28
28
|
|
|
29
29
|
// Hooks run inside the sandbox before the agent starts each iteration.
|
|
30
|
-
//
|
|
30
|
+
// pnpm install ensures the sandbox always has fresh dependencies.
|
|
31
31
|
const hooks = {
|
|
32
|
-
onSandboxReady: [{ command: "
|
|
32
|
+
onSandboxReady: [{ command: "pnpm install" }],
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
// Copy node_modules from the host into the worktree before each sandbox
|
|
36
|
-
// starts. Avoids a full
|
|
36
|
+
// starts. Avoids a full pnpm install from scratch; the hook above handles
|
|
37
37
|
// platform-specific binaries and any packages added since the last copy.
|
|
38
38
|
const copyToSandbox = ["node_modules"];
|
|
39
39
|
|
|
@@ -8,7 +8,7 @@ For each branch:
|
|
|
8
8
|
|
|
9
9
|
1. Run `git merge <branch> --no-edit`
|
|
10
10
|
2. If there are merge conflicts, resolve them intelligently by reading both sides and choosing the correct resolution
|
|
11
|
-
3. After resolving conflicts, run `
|
|
11
|
+
3. After resolving conflicts, run `pnpm run typecheck` and `pnpm run test` to verify everything works
|
|
12
12
|
4. If tests fail, fix the issues before proceeding to the next branch
|
|
13
13
|
|
|
14
14
|
After all branches are merged, make a single commit summarizing the merge.
|
|
@@ -35,7 +35,7 @@ If applicable, use RGR to complete the task.
|
|
|
35
35
|
|
|
36
36
|
# FEEDBACK LOOPS
|
|
37
37
|
|
|
38
|
-
Before committing, run `
|
|
38
|
+
Before committing, run `pnpm run typecheck` and `pnpm run test` to ensure the tests pass.
|
|
39
39
|
|
|
40
40
|
# COMMIT
|
|
41
41
|
|
|
@@ -27,13 +27,13 @@ import * as sandcastle from "@ai-hero/sandcastle";
|
|
|
27
27
|
const MAX_ITERATIONS = 10;
|
|
28
28
|
|
|
29
29
|
// Hooks run inside the sandbox before the agent starts each iteration.
|
|
30
|
-
//
|
|
30
|
+
// pnpm install ensures the sandbox always has fresh dependencies.
|
|
31
31
|
const hooks = {
|
|
32
|
-
onSandboxReady: [{ command: "
|
|
32
|
+
onSandboxReady: [{ command: "pnpm install" }],
|
|
33
33
|
};
|
|
34
34
|
|
|
35
35
|
// Copy node_modules from the host into the worktree before each sandbox
|
|
36
|
-
// starts. Avoids a full
|
|
36
|
+
// starts. Avoids a full pnpm install from scratch; the hook above handles
|
|
37
37
|
// platform-specific binaries and any packages added since the last copy.
|
|
38
38
|
const copyToSandbox = ["node_modules"];
|
|
39
39
|
|
|
@@ -22,8 +22,8 @@ await run({
|
|
|
22
22
|
model: "claude-sonnet-4-6",
|
|
23
23
|
|
|
24
24
|
// Copy node_modules from the host into the worktree before the sandbox
|
|
25
|
-
// starts. This avoids a full
|
|
26
|
-
// The onSandboxReady hook still runs
|
|
25
|
+
// starts. This avoids a full pnpm install from scratch on every iteration.
|
|
26
|
+
// The onSandboxReady hook still runs pnpm install as a safety net to handle
|
|
27
27
|
// platform-specific binaries and any packages added since the last copy.
|
|
28
28
|
copyToSandbox: ["node_modules"],
|
|
29
29
|
|
|
@@ -32,6 +32,6 @@ await run({
|
|
|
32
32
|
// onSandboxReady runs once after the sandbox is initialised and the repo is
|
|
33
33
|
// synced in, before the agent starts. Use it to install dependencies or run
|
|
34
34
|
// any other setup steps your project needs.
|
|
35
|
-
onSandboxReady: [{ command: "
|
|
35
|
+
onSandboxReady: [{ command: "pnpm install" }],
|
|
36
36
|
},
|
|
37
37
|
});
|
|
@@ -28,7 +28,7 @@ Pick the highest-priority open issue that is not blocked by another open issue.
|
|
|
28
28
|
1. **Explore** — read the issue carefully. Pull in the parent PRD if referenced. Read the relevant source files and tests before writing any code.
|
|
29
29
|
2. **Plan** — decide what to change and why. Keep the change as small as possible.
|
|
30
30
|
3. **Execute** — use RGR (Red → Green → Repeat → Refactor): write a failing test first, then write the implementation to pass it.
|
|
31
|
-
4. **Verify** — run `
|
|
31
|
+
4. **Verify** — run `pnpm run typecheck` and `pnpm run test` before committing. Fix any failures before proceeding.
|
|
32
32
|
5. **Commit** — make a single git commit. The message MUST:
|
|
33
33
|
- Start with `RALPH:` prefix
|
|
34
34
|
- Include the task completed and any PRD reference
|
|
@@ -17,8 +17,8 @@ export declare const SHOW_CURSOR = "\u001B[?25h";
|
|
|
17
17
|
* Extracted as a pure function so it can be unit-tested without side effects.
|
|
18
18
|
*/
|
|
19
19
|
export declare const makeTerminalCleanupHandler: (stdin: {
|
|
20
|
-
isTTY?: boolean
|
|
21
|
-
setRawMode?: (
|
|
20
|
+
isTTY?: boolean;
|
|
21
|
+
setRawMode?: (raw: boolean) => void;
|
|
22
22
|
}, stdout: {
|
|
23
23
|
write: (data: string) => boolean;
|
|
24
24
|
}) => () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminalCleanup.d.ts","sourceRoot":"","sources":["../src/terminalCleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,oDAAoD;AACpD,eAAO,MAAM,WAAW,gBAAc,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,0BAA0B
|
|
1
|
+
{"version":3,"file":"terminalCleanup.d.ts","sourceRoot":"","sources":["../src/terminalCleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,oDAAoD;AACpD,eAAO,MAAM,WAAW,gBAAc,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,0BAA0B,UAE5B;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,UACvD;IAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,WAE1C,IASH,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAO,IAEvC,CAAC"}
|
package/dist/testSandbox.d.ts
CHANGED
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Layer } from "effect";
|
|
6
6
|
import { Sandbox } from "./SandboxFactory.js";
|
|
7
|
-
export declare const makeLocalSandboxLayer: (sandboxDir: string) => Layer.Layer<Sandbox
|
|
7
|
+
export declare const makeLocalSandboxLayer: (sandboxDir: string) => Layer.Layer<Sandbox>;
|
|
8
8
|
//# sourceMappingURL=testSandbox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testSandbox.d.ts","sourceRoot":"","sources":["../src/testSandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQvC,OAAO,EAAmB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAa/D,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"testSandbox.d.ts","sourceRoot":"","sources":["../src/testSandbox.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAQvC,OAAO,EAAmB,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAa/D,eAAO,MAAM,qBAAqB,eACpB,MAAM,KACjB,KAAK,CAAC,KAAK,CAAC,OAAO,CA4GrB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-hero/sandcastle",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "CLI for orchestrating AI agents in isolated sandbox environments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -14,18 +14,6 @@
|
|
|
14
14
|
"bin": {
|
|
15
15
|
"sandcastle": "dist/main.js"
|
|
16
16
|
},
|
|
17
|
-
"scripts": {
|
|
18
|
-
"build": "tsgo --project tsconfig.build.json",
|
|
19
|
-
"postbuild": "rm -rf dist/templates && cp -r src/templates dist/templates",
|
|
20
|
-
"test": "vitest run",
|
|
21
|
-
"test:watch": "vitest",
|
|
22
|
-
"typecheck": "tsgo --noEmit",
|
|
23
|
-
"format": "prettier --write .",
|
|
24
|
-
"format:check": "prettier --check .",
|
|
25
|
-
"prepare": "husky",
|
|
26
|
-
"release": "changeset publish",
|
|
27
|
-
"run-sandcastle": "tsx .sandcastle/run.ts"
|
|
28
|
-
},
|
|
29
17
|
"keywords": [
|
|
30
18
|
"cli",
|
|
31
19
|
"sandbox",
|
|
@@ -37,6 +25,7 @@
|
|
|
37
25
|
"devDependencies": {
|
|
38
26
|
"@changesets/cli": "^2.30.0",
|
|
39
27
|
"@effect/vitest": "^0.28.0",
|
|
28
|
+
"@types/node": "^25.5.0",
|
|
40
29
|
"@typescript/native-preview": "^7.0.0-dev.20260317.1",
|
|
41
30
|
"husky": "^9.1.7",
|
|
42
31
|
"lint-staged": "^15.5.1",
|
|
@@ -58,5 +47,16 @@
|
|
|
58
47
|
},
|
|
59
48
|
"files": [
|
|
60
49
|
"dist"
|
|
61
|
-
]
|
|
62
|
-
|
|
50
|
+
],
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "tsgo --project tsconfig.build.json",
|
|
53
|
+
"postbuild": "rm -rf dist/templates && cp -r src/templates dist/templates",
|
|
54
|
+
"test": "vitest run",
|
|
55
|
+
"test:watch": "vitest",
|
|
56
|
+
"typecheck": "tsgo --noEmit",
|
|
57
|
+
"format": "prettier --write .",
|
|
58
|
+
"format:check": "prettier --check .",
|
|
59
|
+
"release": "changeset publish",
|
|
60
|
+
"run-sandcastle": "tsx .sandcastle/run.ts"
|
|
61
|
+
}
|
|
62
|
+
}
|
package/dist/Config.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { FileSystem } from "@effect/platform";
|
|
2
|
-
import { Effect, Schema } from "effect";
|
|
3
|
-
declare const HookDefinition: Schema.Struct<{
|
|
4
|
-
command: typeof Schema.String;
|
|
5
|
-
}>;
|
|
6
|
-
declare const SandcastleConfigSchema: Schema.Struct<{
|
|
7
|
-
hooks: Schema.optional<Schema.Struct<{
|
|
8
|
-
onSandboxReady: Schema.optional<Schema.Array$<Schema.Struct<{
|
|
9
|
-
command: typeof Schema.String;
|
|
10
|
-
}>>>;
|
|
11
|
-
}>>;
|
|
12
|
-
defaultMaxIterations: Schema.optional<typeof Schema.Number>;
|
|
13
|
-
model: Schema.optional<typeof Schema.String>;
|
|
14
|
-
agent: Schema.optional<typeof Schema.String>;
|
|
15
|
-
imageName: Schema.optional<typeof Schema.String>;
|
|
16
|
-
}>;
|
|
17
|
-
export type HookDefinition = typeof HookDefinition.Type;
|
|
18
|
-
export type SandcastleConfig = typeof SandcastleConfigSchema.Type;
|
|
19
|
-
export declare class ConfigError extends Error {
|
|
20
|
-
readonly _tag = "ConfigError";
|
|
21
|
-
constructor(message: string);
|
|
22
|
-
}
|
|
23
|
-
export declare const readConfig: (repoDir: string) => Effect.Effect<{
|
|
24
|
-
readonly hooks?: {
|
|
25
|
-
readonly onSandboxReady?: readonly {
|
|
26
|
-
readonly command: string;
|
|
27
|
-
}[] | undefined;
|
|
28
|
-
} | undefined;
|
|
29
|
-
readonly defaultMaxIterations?: number | undefined;
|
|
30
|
-
readonly model?: string | undefined;
|
|
31
|
-
readonly agent?: string | undefined;
|
|
32
|
-
readonly imageName?: string | undefined;
|
|
33
|
-
}, ConfigError, FileSystem.FileSystem>;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=Config.d.ts.map
|
package/dist/Config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Config.d.ts","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGxC,QAAA,MAAM,cAAc;;EAEuB,CAAC;AAE5C,QAAA,MAAM,sBAAsB;;;;;;;;;;EAUiB,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAC;AACxD,MAAM,MAAM,gBAAgB,GAAG,OAAO,sBAAsB,CAAC,IAAI,CAAC;AAElE,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAUD,eAAO,MAAM,UAAU;;;;;;;;;;sCAoCnB,CAAC"}
|
package/dist/Config.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { FileSystem } from "@effect/platform";
|
|
2
|
-
import { Effect, Schema } from "effect";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
const HookDefinition = Schema.Struct({
|
|
5
|
-
command: Schema.String,
|
|
6
|
-
}).annotations({ title: "HookDefinition" });
|
|
7
|
-
const SandcastleConfigSchema = Schema.Struct({
|
|
8
|
-
hooks: Schema.optional(Schema.Struct({
|
|
9
|
-
onSandboxReady: Schema.optional(Schema.Array(HookDefinition)),
|
|
10
|
-
})),
|
|
11
|
-
defaultMaxIterations: Schema.optional(Schema.Number),
|
|
12
|
-
model: Schema.optional(Schema.String),
|
|
13
|
-
agent: Schema.optional(Schema.String),
|
|
14
|
-
imageName: Schema.optional(Schema.String),
|
|
15
|
-
}).annotations({ title: "SandcastleConfig" });
|
|
16
|
-
export class ConfigError extends Error {
|
|
17
|
-
_tag = "ConfigError";
|
|
18
|
-
constructor(message) {
|
|
19
|
-
super(message);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
const RENAMED_KEYS = {
|
|
23
|
-
defaultIterations: "defaultMaxIterations",
|
|
24
|
-
};
|
|
25
|
-
const decodeConfig = Schema.decodeUnknownEither(SandcastleConfigSchema, {
|
|
26
|
-
onExcessProperty: "error",
|
|
27
|
-
});
|
|
28
|
-
export const readConfig = (repoDir) => Effect.gen(function* () {
|
|
29
|
-
const fs = yield* FileSystem.FileSystem;
|
|
30
|
-
const content = yield* fs
|
|
31
|
-
.readFileString(join(repoDir, ".sandcastle", "config.json"))
|
|
32
|
-
.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
33
|
-
if (content === null)
|
|
34
|
-
return {};
|
|
35
|
-
let raw;
|
|
36
|
-
try {
|
|
37
|
-
raw = JSON.parse(content);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return yield* Effect.fail(new ConfigError("Invalid JSON in config.json"));
|
|
41
|
-
}
|
|
42
|
-
// Check for renamed keys and produce clear errors
|
|
43
|
-
if (typeof raw === "object" && raw !== null) {
|
|
44
|
-
for (const [oldKey, newKey] of Object.entries(RENAMED_KEYS)) {
|
|
45
|
-
if (oldKey in raw) {
|
|
46
|
-
return yield* Effect.fail(new ConfigError(`"${oldKey}" has been renamed to "${newKey}" in config.json. Please update your config.`));
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const result = decodeConfig(raw);
|
|
51
|
-
if (result._tag === "Left") {
|
|
52
|
-
return yield* Effect.fail(new ConfigError(result.left.message));
|
|
53
|
-
}
|
|
54
|
-
return result.right;
|
|
55
|
-
});
|
|
56
|
-
//# sourceMappingURL=Config.js.map
|
package/dist/Config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"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"}
|
package/dist/DockerSandbox.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DockerSandbox.d.ts","sourceRoot":"","sources":["../src/DockerSandbox.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAKvC,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AA+K5D,eAAO,MAAM,aAAa;;CAKzB,CAAC"}
|
package/dist/DockerSandbox.js
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { FileSystem } from "@effect/platform";
|
|
2
|
-
import { NodeFileSystem } from "@effect/platform-node";
|
|
3
|
-
import { Effect, Layer } from "effect";
|
|
4
|
-
import { execFile, spawn } from "node:child_process";
|
|
5
|
-
import { dirname } from "node:path";
|
|
6
|
-
import { createInterface } from "node:readline";
|
|
7
|
-
import { CopyError, ExecError } from "./errors.js";
|
|
8
|
-
import { Sandbox } from "./Sandbox.js";
|
|
9
|
-
const makeDockerSandbox = (containerName) => Effect.gen(function* () {
|
|
10
|
-
const fs = yield* FileSystem.FileSystem;
|
|
11
|
-
return {
|
|
12
|
-
exec: (command, options) => Effect.async((resume) => {
|
|
13
|
-
const args = ["exec"];
|
|
14
|
-
if (options?.cwd) {
|
|
15
|
-
args.push("-w", options.cwd);
|
|
16
|
-
}
|
|
17
|
-
args.push(containerName, "sh", "-c", command);
|
|
18
|
-
execFile("docker", args, { maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {
|
|
19
|
-
if (error && error.code === undefined) {
|
|
20
|
-
resume(Effect.fail(new ExecError({
|
|
21
|
-
command,
|
|
22
|
-
message: `docker exec failed: ${error.message}`,
|
|
23
|
-
})));
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
resume(Effect.succeed({
|
|
27
|
-
stdout: stdout.toString(),
|
|
28
|
-
stderr: stderr.toString(),
|
|
29
|
-
exitCode: typeof error?.code === "number"
|
|
30
|
-
? error.code
|
|
31
|
-
: 0,
|
|
32
|
-
}));
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}),
|
|
36
|
-
execStreaming: (command, onStdoutLine, options) => Effect.async((resume) => {
|
|
37
|
-
const args = ["exec"];
|
|
38
|
-
if (options?.cwd) {
|
|
39
|
-
args.push("-w", options.cwd);
|
|
40
|
-
}
|
|
41
|
-
args.push(containerName, "sh", "-c", command);
|
|
42
|
-
const proc = spawn("docker", args, {
|
|
43
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
44
|
-
});
|
|
45
|
-
const stdoutChunks = [];
|
|
46
|
-
const stderrChunks = [];
|
|
47
|
-
const rl = createInterface({ input: proc.stdout });
|
|
48
|
-
rl.on("line", (line) => {
|
|
49
|
-
stdoutChunks.push(line);
|
|
50
|
-
onStdoutLine(line);
|
|
51
|
-
});
|
|
52
|
-
proc.stderr.on("data", (chunk) => {
|
|
53
|
-
stderrChunks.push(chunk.toString());
|
|
54
|
-
});
|
|
55
|
-
proc.on("error", (error) => {
|
|
56
|
-
resume(Effect.fail(new ExecError({
|
|
57
|
-
command,
|
|
58
|
-
message: `docker exec streaming failed: ${error.message}`,
|
|
59
|
-
})));
|
|
60
|
-
});
|
|
61
|
-
proc.on("close", (code) => {
|
|
62
|
-
resume(Effect.succeed({
|
|
63
|
-
stdout: stdoutChunks.join("\n"),
|
|
64
|
-
stderr: stderrChunks.join(""),
|
|
65
|
-
exitCode: code ?? 0,
|
|
66
|
-
}));
|
|
67
|
-
});
|
|
68
|
-
}),
|
|
69
|
-
copyIn: (hostPath, sandboxPath) => Effect.gen(function* () {
|
|
70
|
-
// Ensure parent directory exists in container
|
|
71
|
-
const parentDir = dirname(sandboxPath);
|
|
72
|
-
yield* Effect.async((resume) => {
|
|
73
|
-
execFile("docker", ["exec", containerName, "mkdir", "-p", parentDir], (error) => {
|
|
74
|
-
if (error) {
|
|
75
|
-
resume(Effect.fail(new CopyError({
|
|
76
|
-
message: `Failed to create dir ${parentDir}: ${error.message}`,
|
|
77
|
-
})));
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
resume(Effect.succeed(undefined));
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
// docker cp hostPath containerName:sandboxPath
|
|
85
|
-
yield* Effect.async((resume) => {
|
|
86
|
-
execFile("docker", ["cp", hostPath, `${containerName}:${sandboxPath}`], (error) => {
|
|
87
|
-
if (error) {
|
|
88
|
-
resume(Effect.fail(new CopyError({
|
|
89
|
-
message: `Failed to copy ${hostPath} -> ${containerName}:${sandboxPath}: ${error.message}`,
|
|
90
|
-
})));
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
resume(Effect.succeed(undefined));
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}),
|
|
98
|
-
copyOut: (sandboxPath, hostPath) => Effect.gen(function* () {
|
|
99
|
-
// Ensure parent directory exists on host
|
|
100
|
-
yield* fs.makeDirectory(dirname(hostPath), { recursive: true }).pipe(Effect.mapError((error) => new CopyError({
|
|
101
|
-
message: `Failed to create host dir ${dirname(hostPath)}: ${error}`,
|
|
102
|
-
})));
|
|
103
|
-
// docker cp containerName:sandboxPath hostPath
|
|
104
|
-
yield* Effect.async((resume) => {
|
|
105
|
-
execFile("docker", ["cp", `${containerName}:${sandboxPath}`, hostPath], (error) => {
|
|
106
|
-
if (error) {
|
|
107
|
-
resume(Effect.fail(new CopyError({
|
|
108
|
-
message: `Failed to copy ${containerName}:${sandboxPath} -> ${hostPath}: ${error.message}`,
|
|
109
|
-
})));
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
resume(Effect.succeed(undefined));
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
}),
|
|
117
|
-
};
|
|
118
|
-
});
|
|
119
|
-
export const DockerSandbox = {
|
|
120
|
-
layer: (containerName) => Layer.effect(Sandbox, makeDockerSandbox(containerName)).pipe(Layer.provide(NodeFileSystem.layer)),
|
|
121
|
-
};
|
|
122
|
-
//# sourceMappingURL=DockerSandbox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DockerSandbox.js","sourceRoot":"","sources":["../src/DockerSandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FilesystemSandbox.d.ts","sourceRoot":"","sources":["../src/FilesystemSandbox.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAKvC,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AA8H5D,eAAO,MAAM,iBAAiB;;CAK7B,CAAC"}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { FileSystem } from "@effect/platform";
|
|
2
|
-
import { NodeFileSystem } from "@effect/platform-node";
|
|
3
|
-
import { Effect, Layer } from "effect";
|
|
4
|
-
import { execFile, spawn } from "node:child_process";
|
|
5
|
-
import { dirname } from "node:path";
|
|
6
|
-
import { createInterface } from "node:readline";
|
|
7
|
-
import { CopyError, ExecError } from "./errors.js";
|
|
8
|
-
import { Sandbox } from "./Sandbox.js";
|
|
9
|
-
const makeFilesystemSandbox = (sandboxDir) => Effect.gen(function* () {
|
|
10
|
-
const fs = yield* FileSystem.FileSystem;
|
|
11
|
-
return {
|
|
12
|
-
exec: (command, options) => Effect.async((resume) => {
|
|
13
|
-
execFile("sh", ["-c", command], { cwd: options?.cwd ?? sandboxDir }, (error, stdout, stderr) => {
|
|
14
|
-
if (error && error.code === undefined) {
|
|
15
|
-
resume(Effect.fail(new ExecError({
|
|
16
|
-
command,
|
|
17
|
-
message: `Failed to exec: ${error.message}`,
|
|
18
|
-
})));
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
resume(Effect.succeed({
|
|
22
|
-
stdout: stdout.toString(),
|
|
23
|
-
stderr: stderr.toString(),
|
|
24
|
-
exitCode: typeof error?.code === "number"
|
|
25
|
-
? error.code
|
|
26
|
-
: 0,
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}),
|
|
31
|
-
execStreaming: (command, onStdoutLine, options) => Effect.async((resume) => {
|
|
32
|
-
const proc = spawn("sh", ["-c", command], {
|
|
33
|
-
cwd: options?.cwd ?? sandboxDir,
|
|
34
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
35
|
-
});
|
|
36
|
-
const stdoutChunks = [];
|
|
37
|
-
const stderrChunks = [];
|
|
38
|
-
const rl = createInterface({ input: proc.stdout });
|
|
39
|
-
rl.on("line", (line) => {
|
|
40
|
-
stdoutChunks.push(line);
|
|
41
|
-
onStdoutLine(line);
|
|
42
|
-
});
|
|
43
|
-
proc.stderr.on("data", (chunk) => {
|
|
44
|
-
stderrChunks.push(chunk.toString());
|
|
45
|
-
});
|
|
46
|
-
proc.on("error", (error) => {
|
|
47
|
-
resume(Effect.fail(new ExecError({
|
|
48
|
-
command,
|
|
49
|
-
message: `Failed to exec: ${error.message}`,
|
|
50
|
-
})));
|
|
51
|
-
});
|
|
52
|
-
proc.on("close", (code) => {
|
|
53
|
-
resume(Effect.succeed({
|
|
54
|
-
stdout: stdoutChunks.join("\n"),
|
|
55
|
-
stderr: stderrChunks.join(""),
|
|
56
|
-
exitCode: code ?? 0,
|
|
57
|
-
}));
|
|
58
|
-
});
|
|
59
|
-
}),
|
|
60
|
-
copyIn: (hostPath, sandboxPath) => Effect.gen(function* () {
|
|
61
|
-
yield* fs
|
|
62
|
-
.makeDirectory(dirname(sandboxPath), { recursive: true })
|
|
63
|
-
.pipe(Effect.mapError((error) => new CopyError({
|
|
64
|
-
message: `Failed to copy ${hostPath} -> ${sandboxPath}: ${error}`,
|
|
65
|
-
})));
|
|
66
|
-
yield* fs.copyFile(hostPath, sandboxPath).pipe(Effect.mapError((error) => new CopyError({
|
|
67
|
-
message: `Failed to copy ${hostPath} -> ${sandboxPath}: ${error}`,
|
|
68
|
-
})));
|
|
69
|
-
}),
|
|
70
|
-
copyOut: (sandboxPath, hostPath) => Effect.gen(function* () {
|
|
71
|
-
yield* fs.makeDirectory(dirname(hostPath), { recursive: true }).pipe(Effect.mapError((error) => new CopyError({
|
|
72
|
-
message: `Failed to copy ${sandboxPath} -> ${hostPath}: ${error}`,
|
|
73
|
-
})));
|
|
74
|
-
yield* fs.copyFile(sandboxPath, hostPath).pipe(Effect.mapError((error) => new CopyError({
|
|
75
|
-
message: `Failed to copy ${sandboxPath} -> ${hostPath}: ${error}`,
|
|
76
|
-
})));
|
|
77
|
-
}),
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
export const FilesystemSandbox = {
|
|
81
|
-
layer: (sandboxDir) => Layer.effect(Sandbox, makeFilesystemSandbox(sandboxDir)).pipe(Layer.provide(NodeFileSystem.layer)),
|
|
82
|
-
};
|
|
83
|
-
//# sourceMappingURL=FilesystemSandbox.js.map
|