@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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -87
  3. package/dist/AgentProvider.d.ts.map +1 -1
  4. package/dist/CopyToSandbox.d.ts +1 -1
  5. package/dist/CopyToSandbox.d.ts.map +1 -1
  6. package/dist/Display.d.ts +7 -1
  7. package/dist/Display.d.ts.map +1 -1
  8. package/dist/Display.js +7 -0
  9. package/dist/Display.js.map +1 -1
  10. package/dist/DockerLifecycle.d.ts +6 -6
  11. package/dist/DockerLifecycle.d.ts.map +1 -1
  12. package/dist/EnvResolver.d.ts.map +1 -1
  13. package/dist/ErrorHandler.d.ts.map +1 -1
  14. package/dist/InitService.d.ts.map +1 -1
  15. package/dist/InitService.js +3 -3
  16. package/dist/InitService.js.map +1 -1
  17. package/dist/Orchestrator.d.ts +16 -3
  18. package/dist/Orchestrator.d.ts.map +1 -1
  19. package/dist/Orchestrator.js +76 -18
  20. package/dist/Orchestrator.js.map +1 -1
  21. package/dist/PromptArgumentSubstitution.d.ts +5 -0
  22. package/dist/PromptArgumentSubstitution.d.ts.map +1 -1
  23. package/dist/PromptArgumentSubstitution.js.map +1 -1
  24. package/dist/PromptPreprocessor.d.ts.map +1 -1
  25. package/dist/PromptResolver.d.ts.map +1 -1
  26. package/dist/RecoveryMessage.d.ts.map +1 -1
  27. package/dist/SandboxFactory.d.ts +3 -3
  28. package/dist/SandboxFactory.d.ts.map +1 -1
  29. package/dist/SandboxLifecycle.d.ts +1 -1
  30. package/dist/SandboxLifecycle.d.ts.map +1 -1
  31. package/dist/SandboxLifecycle.js +7 -7
  32. package/dist/SandboxLifecycle.js.map +1 -1
  33. package/dist/WorktreeManager.d.ts +6 -6
  34. package/dist/WorktreeManager.d.ts.map +1 -1
  35. package/dist/cli.d.ts +1 -3
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +4 -15
  38. package/dist/cli.js.map +1 -1
  39. package/dist/run.d.ts +31 -5
  40. package/dist/run.d.ts.map +1 -1
  41. package/dist/run.js +27 -11
  42. package/dist/run.js.map +1 -1
  43. package/dist/templates/parallel-planner/implement-prompt.md +1 -1
  44. package/dist/templates/parallel-planner/main.ts +3 -3
  45. package/dist/templates/parallel-planner/merge-prompt.md +1 -1
  46. package/dist/templates/sequential-reviewer/implement-prompt.md +1 -1
  47. package/dist/templates/sequential-reviewer/main.ts +3 -3
  48. package/dist/templates/simple-loop/main.ts +3 -3
  49. package/dist/templates/simple-loop/prompt.md +1 -1
  50. package/dist/terminalCleanup.d.ts +2 -2
  51. package/dist/terminalCleanup.d.ts.map +1 -1
  52. package/dist/testSandbox.d.ts +1 -1
  53. package/dist/testSandbox.d.ts.map +1 -1
  54. package/package.json +15 -15
  55. package/dist/Config.d.ts +0 -35
  56. package/dist/Config.d.ts.map +0 -1
  57. package/dist/Config.js +0 -56
  58. package/dist/Config.js.map +0 -1
  59. package/dist/DockerSandbox.d.ts +0 -6
  60. package/dist/DockerSandbox.d.ts.map +0 -1
  61. package/dist/DockerSandbox.js +0 -122
  62. package/dist/DockerSandbox.js.map +0 -1
  63. package/dist/FilesystemSandbox.d.ts +0 -6
  64. package/dist/FilesystemSandbox.d.ts.map +0 -1
  65. package/dist/FilesystemSandbox.js +0 -83
  66. package/dist/FilesystemSandbox.js.map +0 -1
  67. package/dist/Sandbox.d.ts +0 -23
  68. package/dist/Sandbox.d.ts.map +0 -1
  69. package/dist/Sandbox.js +0 -5
  70. package/dist/Sandbox.js.map +0 -1
  71. package/dist/SyncService.d.ts +0 -20
  72. package/dist/SyncService.d.ts.map +0 -1
  73. package/dist/SyncService.js +0 -504
  74. package/dist/SyncService.js.map +0 -1
  75. package/dist/TokenResolver.d.ts +0 -6
  76. package/dist/TokenResolver.d.ts.map +0 -1
  77. package/dist/TokenResolver.js +0 -43
  78. 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,4BACA,CAAC;AAEvC,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,8CASnC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6BAI5B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,uEAS5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;CAclC,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9D,CAAC;IACF,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,gGAAgG;IAChG,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,wFAAwF;IACxF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,GAAG,6CA0If,CAAC"}
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, agent, } = options;
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
- // Resolve agent provider: explicit option > default
77
- const agentName = agent ?? "claude-code";
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
- Agent: agentName,
123
- Image: resolvedImageName,
124
- "Max iterations": String(maxIterations),
125
- };
126
- rows["Branch"] = resolvedBranch;
127
- if (resolvedModel)
128
- rows["Model"] = resolvedModel;
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 `npm run typecheck` and `npm run test` to ensure the tests pass.
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
- // npm install ensures the sandbox always has fresh dependencies.
30
+ // pnpm install ensures the sandbox always has fresh dependencies.
31
31
  const hooks = {
32
- onSandboxReady: [{ command: "npm install" }],
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 npm install from scratch; the hook above handles
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 `npm run typecheck` and `npx vitest run` to verify everything works
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 `npm run typecheck` and `npm run test` to ensure the tests pass.
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
- // npm install ensures the sandbox always has fresh dependencies.
30
+ // pnpm install ensures the sandbox always has fresh dependencies.
31
31
  const hooks = {
32
- onSandboxReady: [{ command: "npm install" }],
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 npm install from scratch; the hook above handles
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 npm install from scratch on every iteration.
26
- // The onSandboxReady hook still runs npm install as a safety net to handle
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: "npm install" }],
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 `npm run typecheck` and `npm run test` before committing. Fix any failures before proceeding.
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 | undefined;
21
- setRawMode?: ((raw: boolean) => void) | undefined;
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;;;;;gBAcpC,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,oBAAoB,YAEhC,CAAC"}
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"}
@@ -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, never, never>;
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,4DA8GjC,CAAC"}
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.1",
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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"Config.js","sourceRoot":"","sources":["../src/Config.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { Layer } from "effect";
2
- import { Sandbox } from "./Sandbox.js";
3
- export declare const DockerSandbox: {
4
- layer: (containerName: string) => Layer.Layer<Sandbox, never, never>;
5
- };
6
- //# sourceMappingURL=DockerSandbox.d.ts.map
@@ -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"}
@@ -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,6 +0,0 @@
1
- import { Layer } from "effect";
2
- import { Sandbox } from "./Sandbox.js";
3
- export declare const FilesystemSandbox: {
4
- layer: (sandboxDir: string) => Layer.Layer<Sandbox, never, never>;
5
- };
6
- //# sourceMappingURL=FilesystemSandbox.d.ts.map
@@ -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