@ai-hero/sandcastle 0.5.12 → 0.6.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 +106 -79
- package/dist/AgentProvider.d.ts +56 -3
- package/dist/AgentProvider.d.ts.map +1 -1
- package/dist/AgentProvider.js +324 -9
- package/dist/AgentProvider.js.map +1 -1
- package/dist/DockerLifecycle.d.ts +6 -0
- package/dist/DockerLifecycle.d.ts.map +1 -1
- package/dist/DockerLifecycle.js +12 -0
- package/dist/DockerLifecycle.js.map +1 -1
- package/dist/InitService.d.ts.map +1 -1
- package/dist/InitService.js +115 -14
- package/dist/InitService.js.map +1 -1
- package/dist/Orchestrator.d.ts +4 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +15 -14
- package/dist/Orchestrator.js.map +1 -1
- package/dist/SandboxFactory.d.ts.map +1 -1
- package/dist/SandboxFactory.js +51 -64
- package/dist/SandboxFactory.js.map +1 -1
- package/dist/SandboxLifecycle.d.ts +3 -0
- package/dist/SandboxLifecycle.d.ts.map +1 -1
- package/dist/SandboxLifecycle.js +44 -18
- package/dist/SandboxLifecycle.js.map +1 -1
- package/dist/SessionStore.d.ts +71 -10
- package/dist/SessionStore.d.ts.map +1 -1
- package/dist/SessionStore.js +222 -17
- package/dist/SessionStore.js.map +1 -1
- package/dist/WorktreeManager.d.ts +27 -0
- package/dist/WorktreeManager.d.ts.map +1 -1
- package/dist/WorktreeManager.js +50 -8
- package/dist/WorktreeManager.js.map +1 -1
- package/dist/boundedTail.d.ts +48 -0
- package/dist/boundedTail.d.ts.map +1 -0
- package/dist/boundedTail.js +64 -0
- package/dist/boundedTail.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -3
- package/dist/cli.js.map +1 -1
- package/dist/createSandbox.d.ts.map +1 -1
- package/dist/createSandbox.js +116 -122
- package/dist/createSandbox.js.map +1 -1
- package/dist/createWorktree.d.ts.map +1 -1
- package/dist/createWorktree.js +10 -9
- package/dist/createWorktree.js.map +1 -1
- package/dist/errors.d.ts +3 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +55 -46
- package/dist/interactive.js.map +1 -1
- package/dist/resumePrecheck.d.ts +26 -0
- package/dist/resumePrecheck.d.ts.map +1 -0
- package/dist/resumePrecheck.js +40 -0
- package/dist/resumePrecheck.js.map +1 -0
- package/dist/run.d.ts +15 -5
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +23 -9
- package/dist/run.js.map +1 -1
- package/dist/sandboxes/daytona.d.ts +9 -0
- package/dist/sandboxes/daytona.d.ts.map +1 -1
- package/dist/sandboxes/daytona.js +9 -7
- package/dist/sandboxes/daytona.js.map +1 -1
- package/dist/sandboxes/docker.d.ts +45 -0
- package/dist/sandboxes/docker.d.ts.map +1 -1
- package/dist/sandboxes/docker.js +40 -28
- package/dist/sandboxes/docker.js.map +1 -1
- package/dist/sandboxes/no-sandbox.d.ts +9 -0
- package/dist/sandboxes/no-sandbox.d.ts.map +1 -1
- package/dist/sandboxes/no-sandbox.js +32 -17
- package/dist/sandboxes/no-sandbox.js.map +1 -1
- package/dist/sandboxes/podman.d.ts +47 -0
- package/dist/sandboxes/podman.d.ts.map +1 -1
- package/dist/sandboxes/podman.js +49 -28
- package/dist/sandboxes/podman.js.map +1 -1
- package/dist/sandboxes/test-bind-mount.d.ts.map +1 -1
- package/dist/sandboxes/test-bind-mount.js +7 -6
- package/dist/sandboxes/test-bind-mount.js.map +1 -1
- package/dist/sandboxes/test-isolated.d.ts.map +1 -1
- package/dist/sandboxes/test-isolated.js +7 -6
- package/dist/sandboxes/test-isolated.js.map +1 -1
- package/dist/sandboxes/vercel.d.ts +9 -0
- package/dist/sandboxes/vercel.d.ts.map +1 -1
- package/dist/sandboxes/vercel.js +9 -7
- package/dist/sandboxes/vercel.js.map +1 -1
- package/dist/shutdownRegistry.d.ts +30 -0
- package/dist/shutdownRegistry.d.ts.map +1 -0
- package/dist/shutdownRegistry.js +73 -0
- package/dist/shutdownRegistry.js.map +1 -0
- package/dist/syncOut.js +1 -1
- package/dist/syncOut.js.map +1 -1
- package/dist/templates/parallel-planner/main.mts +19 -17
- package/dist/templates/parallel-planner/plan-prompt.md +4 -2
- package/dist/templates/parallel-planner-with-review/main.mts +19 -17
- package/dist/templates/parallel-planner-with-review/plan-prompt.md +4 -2
- package/dist/templates/parallel-planner-with-review/review-prompt.md +2 -2
- package/dist/templates/sequential-reviewer/main.mts +13 -5
- package/dist/templates/sequential-reviewer/review-prompt.md +2 -2
- package/dist/templates/simple-loop/main.mts +1 -1
- package/dist/testSandbox.d.ts.map +1 -1
- package/dist/testSandbox.js +32 -19
- package/dist/testSandbox.js.map +1 -1
- package/package.json +3 -2
- package/dist/SessionPaths.d.ts +0 -26
- package/dist/SessionPaths.d.ts.map +0 -1
- package/dist/SessionPaths.js +0 -22
- package/dist/SessionPaths.js.map +0 -1
package/dist/SessionStore.js
CHANGED
|
@@ -1,15 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SessionStore — keyed collection of agent session JSONLs.
|
|
3
3
|
*
|
|
4
|
-
* Provides read/write access to
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Provides read/write access to agent session files, with host-backed
|
|
5
|
+
* (filesystem) and sandbox-backed (via bind-mount handle file-transfer
|
|
6
|
+
* primitives) implementations. Per ADR 0012, the per-provider `transfer`
|
|
7
|
+
* op (e.g. `transferClaudeSession`, `transferCodexSession`) copies a session
|
|
8
|
+
* between stores and applies any format-specific content rewriting — for
|
|
9
|
+
* JSONL agents, rewriting `cwd` fields from source cwd to target cwd via the
|
|
10
|
+
* shared `rewriteSessionCwd` primitive.
|
|
9
11
|
*/
|
|
10
|
-
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
12
|
+
import { access, mkdir, readdir, readFile, rm, writeFile, } from "node:fs/promises";
|
|
11
13
|
import { tmpdir } from "node:os";
|
|
12
|
-
import { join, posix } from "node:path";
|
|
14
|
+
import { dirname, join, posix, relative } from "node:path";
|
|
15
|
+
const pathExists = async (path) => {
|
|
16
|
+
try {
|
|
17
|
+
await access(path);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
13
24
|
// ---------------------------------------------------------------------------
|
|
14
25
|
// Path encoding
|
|
15
26
|
// ---------------------------------------------------------------------------
|
|
@@ -39,6 +50,7 @@ export const hostSessionStore = (cwd, projectsDir) => {
|
|
|
39
50
|
return {
|
|
40
51
|
cwd,
|
|
41
52
|
sessionFilePath: (id) => join(projectDir, `${id}.jsonl`),
|
|
53
|
+
exists: async (id) => pathExists(join(projectDir, `${id}.jsonl`)),
|
|
42
54
|
readSession: async (id) => {
|
|
43
55
|
return await readFile(join(projectDir, `${id}.jsonl`), "utf-8");
|
|
44
56
|
},
|
|
@@ -48,6 +60,35 @@ export const hostSessionStore = (cwd, projectsDir) => {
|
|
|
48
60
|
},
|
|
49
61
|
};
|
|
50
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* Locate a Claude Code session JSONL on the host by its unique id, scanning each
|
|
65
|
+
* `~/.claude/projects/<encoded-cwd>/` directory rather than reconstructing the
|
|
66
|
+
* cwd encoding. The session id is globally unique, so the first match wins. Used
|
|
67
|
+
* by the no-sandbox resume precheck, where the agent wrote the file in place
|
|
68
|
+
* under a cwd-derived directory Sandcastle cannot reliably reconstruct.
|
|
69
|
+
*
|
|
70
|
+
* @param id - The session id (file basename without `.jsonl`).
|
|
71
|
+
* @param projectsDir - Override for the projects directory (default: `~/.claude/projects`).
|
|
72
|
+
*/
|
|
73
|
+
export const findClaudeSessionOnHost = async (id, projectsDir) => {
|
|
74
|
+
const root = projectsDir ?? join(process.env.HOME ?? "~", ".claude", "projects");
|
|
75
|
+
let entries;
|
|
76
|
+
try {
|
|
77
|
+
entries = await readdir(root, { withFileTypes: true });
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return { path: undefined, searchedRoot: root };
|
|
81
|
+
}
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
if (!entry.isDirectory())
|
|
84
|
+
continue;
|
|
85
|
+
const candidate = join(root, entry.name, `${id}.jsonl`);
|
|
86
|
+
if (await pathExists(candidate)) {
|
|
87
|
+
return { path: candidate, searchedRoot: root };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return { path: undefined, searchedRoot: root };
|
|
91
|
+
};
|
|
51
92
|
// ---------------------------------------------------------------------------
|
|
52
93
|
// Sandbox-backed SessionStore
|
|
53
94
|
// ---------------------------------------------------------------------------
|
|
@@ -68,6 +109,10 @@ export const sandboxSessionStore = (cwd, handle, projectsDir) => {
|
|
|
68
109
|
return {
|
|
69
110
|
cwd,
|
|
70
111
|
sessionFilePath: (id) => posix.join(projectDir, `${id}.jsonl`),
|
|
112
|
+
exists: async (id) => {
|
|
113
|
+
const result = await handle.exec(`test -f ${JSON.stringify(posix.join(projectDir, `${id}.jsonl`))}`);
|
|
114
|
+
return result.exitCode === 0;
|
|
115
|
+
},
|
|
71
116
|
readSession: async (id) => {
|
|
72
117
|
const sandboxPath = posix.join(projectDir, `${id}.jsonl`);
|
|
73
118
|
const tmpPath = join(tmpdir(), `sandcastle-session-${id}-${Date.now()}.jsonl`);
|
|
@@ -95,31 +140,191 @@ export const sandboxSessionStore = (cwd, handle, projectsDir) => {
|
|
|
95
140
|
},
|
|
96
141
|
};
|
|
97
142
|
};
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
// transferSession
|
|
100
|
-
// ---------------------------------------------------------------------------
|
|
101
143
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
144
|
+
* claudeCode's `sessionStorage.transfer` (ADR 0012). Copies a Claude Code
|
|
145
|
+
* session between stores, rewriting `cwd` fields in the JSONL entries from the
|
|
146
|
+
* source store's cwd to the target store's cwd. The rewrite is specific to
|
|
147
|
+
* Claude Code's JSONL format, so it lives with the provider rather than in
|
|
148
|
+
* central code.
|
|
104
149
|
*/
|
|
105
|
-
export const
|
|
150
|
+
export const transferClaudeSession = async (from, to, id) => {
|
|
106
151
|
const content = await from.readSession(id);
|
|
107
152
|
if (content === "") {
|
|
108
153
|
await to.writeSession(id, "");
|
|
109
154
|
return;
|
|
110
155
|
}
|
|
111
|
-
const rewritten = content
|
|
156
|
+
const rewritten = rewriteSessionCwd(content, from.cwd, to.cwd);
|
|
157
|
+
await to.writeSession(id, rewritten);
|
|
158
|
+
};
|
|
159
|
+
const isCodexSessionFilename = (filename, id) => filename.startsWith("rollout-") && filename.endsWith(`-${id}.jsonl`);
|
|
160
|
+
const codexIdFromFilename = (filename) => {
|
|
161
|
+
const match = /([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})\.jsonl$/.exec(filename);
|
|
162
|
+
return match?.[1];
|
|
163
|
+
};
|
|
164
|
+
const findCodexSessionPath = async (rootDir, id) => {
|
|
165
|
+
const visit = async (dir) => {
|
|
166
|
+
let entries;
|
|
167
|
+
try {
|
|
168
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
for (const entry of entries) {
|
|
174
|
+
const child = join(dir, entry.name);
|
|
175
|
+
if (entry.isFile() && isCodexSessionFilename(entry.name, id)) {
|
|
176
|
+
return child;
|
|
177
|
+
}
|
|
178
|
+
if (entry.isDirectory()) {
|
|
179
|
+
const found = await visit(child);
|
|
180
|
+
if (found)
|
|
181
|
+
return found;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return undefined;
|
|
185
|
+
};
|
|
186
|
+
return visit(rootDir);
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Locate a Codex session rollout file on the host by its id, reusing the
|
|
190
|
+
* date-nested scan. Used by the no-sandbox resume precheck.
|
|
191
|
+
*
|
|
192
|
+
* @param id - The session id.
|
|
193
|
+
* @param sessionsDir - Override for the sessions directory (default: `~/.codex/sessions`).
|
|
194
|
+
*/
|
|
195
|
+
export const findCodexSessionOnHost = async (id, sessionsDir) => {
|
|
196
|
+
const root = sessionsDir ?? join(process.env.HOME ?? "~", ".codex", "sessions");
|
|
197
|
+
const path = await findCodexSessionPath(root, id);
|
|
198
|
+
return { path, searchedRoot: root };
|
|
199
|
+
};
|
|
200
|
+
export const codexHostSessionStore = (cwd, sessionsDir) => {
|
|
201
|
+
const rootDir = sessionsDir ?? join(process.env.HOME ?? "~", ".codex", "sessions");
|
|
202
|
+
const locatedPaths = new Map();
|
|
203
|
+
const locateSession = async (id) => {
|
|
204
|
+
const path = await findCodexSessionPath(rootDir, id);
|
|
205
|
+
if (!path) {
|
|
206
|
+
throw new Error(`session ${id} not found in ${rootDir}`);
|
|
207
|
+
}
|
|
208
|
+
locatedPaths.set(id, path);
|
|
209
|
+
return { path, relativePath: relative(rootDir, path) };
|
|
210
|
+
};
|
|
211
|
+
return {
|
|
212
|
+
cwd,
|
|
213
|
+
locateSession,
|
|
214
|
+
sessionFilePath: (id) => locatedPaths.get(id),
|
|
215
|
+
exists: async (id) => {
|
|
216
|
+
return (await findCodexSessionPath(rootDir, id)) !== undefined;
|
|
217
|
+
},
|
|
218
|
+
readSession: async (id) => {
|
|
219
|
+
const located = await locateSession(id);
|
|
220
|
+
return readFile(located.path, "utf-8");
|
|
221
|
+
},
|
|
222
|
+
writeSession: async (id, content) => {
|
|
223
|
+
const existing = await findCodexSessionPath(rootDir, id);
|
|
224
|
+
const target = existing ??
|
|
225
|
+
join(rootDir, "unknown-date", `rollout-${Date.now()}-${id}.jsonl`);
|
|
226
|
+
await mkdir(dirname(target), { recursive: true });
|
|
227
|
+
await writeFile(target, content);
|
|
228
|
+
locatedPaths.set(id, target);
|
|
229
|
+
},
|
|
230
|
+
writeSessionAt: async (relativePath, content) => {
|
|
231
|
+
const target = join(rootDir, relativePath);
|
|
232
|
+
await mkdir(dirname(target), { recursive: true });
|
|
233
|
+
await writeFile(target, content);
|
|
234
|
+
const id = codexIdFromFilename(posix.basename(relativePath));
|
|
235
|
+
if (id)
|
|
236
|
+
locatedPaths.set(id, target);
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
export const codexSandboxSessionStore = (cwd, handle, sessionsDir = posix.join("/home/agent", ".codex", "sessions")) => {
|
|
241
|
+
const locatedPaths = new Map();
|
|
242
|
+
const writeSessionAt = async (relativePath, content) => {
|
|
243
|
+
const sandboxPath = posix.join(sessionsDir, relativePath);
|
|
244
|
+
const tmpPath = join(tmpdir(), `sandcastle-codex-session-${Date.now()}.jsonl`);
|
|
245
|
+
await writeFile(tmpPath, content);
|
|
246
|
+
try {
|
|
247
|
+
await handle.exec(`mkdir -p ${JSON.stringify(posix.dirname(sandboxPath))}`);
|
|
248
|
+
await handle.copyFileIn(tmpPath, sandboxPath);
|
|
249
|
+
const id = codexIdFromFilename(posix.basename(relativePath));
|
|
250
|
+
if (id)
|
|
251
|
+
locatedPaths.set(id, sandboxPath);
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
await rm(tmpPath, { force: true }).catch(() => { });
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
const locateSession = async (id) => {
|
|
258
|
+
const result = await handle.exec(`find ${JSON.stringify(sessionsDir)} -type f -name ${JSON.stringify(`rollout-*-${id}.jsonl`)} -print -quit`);
|
|
259
|
+
const path = result.stdout.trim().split("\n")[0];
|
|
260
|
+
if (result.exitCode !== 0 || !path) {
|
|
261
|
+
throw new Error(`session ${id} not found in ${sessionsDir}`);
|
|
262
|
+
}
|
|
263
|
+
locatedPaths.set(id, path);
|
|
264
|
+
return { path, relativePath: posix.relative(sessionsDir, path) };
|
|
265
|
+
};
|
|
266
|
+
return {
|
|
267
|
+
cwd,
|
|
268
|
+
locateSession,
|
|
269
|
+
sessionFilePath: (id) => locatedPaths.get(id),
|
|
270
|
+
exists: async (id) => {
|
|
271
|
+
const result = await handle.exec(`find ${JSON.stringify(sessionsDir)} -type f -name ${JSON.stringify(`rollout-*-${id}.jsonl`)} -print -quit`);
|
|
272
|
+
return result.exitCode === 0 && result.stdout.trim().length > 0;
|
|
273
|
+
},
|
|
274
|
+
readSession: async (id) => {
|
|
275
|
+
const located = await locateSession(id);
|
|
276
|
+
const tmpPath = join(tmpdir(), `sandcastle-codex-session-${id}-${Date.now()}.jsonl`);
|
|
277
|
+
await handle.copyFileOut(located.path, tmpPath);
|
|
278
|
+
try {
|
|
279
|
+
return await readFile(tmpPath, "utf-8");
|
|
280
|
+
}
|
|
281
|
+
finally {
|
|
282
|
+
await rm(tmpPath, { force: true }).catch(() => { });
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
writeSession: async (id, content) => {
|
|
286
|
+
const existing = await locateSession(id).catch(() => undefined);
|
|
287
|
+
const relativePath = existing?.relativePath ??
|
|
288
|
+
posix.join("unknown-date", `rollout-${Date.now()}-${id}.jsonl`);
|
|
289
|
+
await writeSessionAt(relativePath, content);
|
|
290
|
+
},
|
|
291
|
+
writeSessionAt,
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
const rewriteSessionCwd = (content, fromCwd, toCwd) => {
|
|
295
|
+
if (content === "")
|
|
296
|
+
return "";
|
|
297
|
+
return content
|
|
112
298
|
.split("\n")
|
|
113
299
|
.map((line) => {
|
|
114
300
|
if (line === "")
|
|
115
301
|
return line;
|
|
116
302
|
const entry = JSON.parse(line);
|
|
117
|
-
if (typeof entry.cwd === "string" && entry.cwd ===
|
|
118
|
-
entry.cwd =
|
|
303
|
+
if (typeof entry.cwd === "string" && entry.cwd === fromCwd) {
|
|
304
|
+
entry.cwd = toCwd;
|
|
305
|
+
}
|
|
306
|
+
if (entry.type === "session_meta" &&
|
|
307
|
+
typeof entry.payload === "object" &&
|
|
308
|
+
entry.payload !== null &&
|
|
309
|
+
typeof entry.payload.cwd === "string" &&
|
|
310
|
+
entry.payload.cwd === fromCwd) {
|
|
311
|
+
entry.payload.cwd = toCwd;
|
|
119
312
|
}
|
|
120
313
|
return JSON.stringify(entry);
|
|
121
314
|
})
|
|
122
315
|
.join("\n");
|
|
123
|
-
|
|
316
|
+
};
|
|
317
|
+
/**
|
|
318
|
+
* codex's `sessionStorage.transfer` (ADR 0012). Copies a Codex session between
|
|
319
|
+
* locatable stores, rewriting the `cwd` in the `session_meta` line and
|
|
320
|
+
* preserving the source's relative date-path on the target so Codex's id-scan
|
|
321
|
+
* rediscovers the file.
|
|
322
|
+
*/
|
|
323
|
+
export const transferCodexSession = async (from, to, id) => {
|
|
324
|
+
const located = await from.locateSession(id);
|
|
325
|
+
const content = await from.readSession(id);
|
|
326
|
+
const rewritten = rewriteSessionCwd(content, from.cwd, to.cwd);
|
|
327
|
+
await to.writeSessionAt(located.relativePath, rewritten);
|
|
328
|
+
await to.locateSession(id).catch(() => undefined);
|
|
124
329
|
};
|
|
125
330
|
//# sourceMappingURL=SessionStore.js.map
|
package/dist/SessionStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionStore.js","sourceRoot":"","sources":["../src/SessionStore.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SessionStore.js","sourceRoot":"","sources":["../src/SessionStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,33 @@ export interface WorktreeInfo {
|
|
|
15
15
|
path: string;
|
|
16
16
|
branch: string;
|
|
17
17
|
}
|
|
18
|
+
/** A single entry parsed from `git worktree list --porcelain`. */
|
|
19
|
+
export interface WorktreeEntry {
|
|
20
|
+
path: string;
|
|
21
|
+
/** `null` for a detached HEAD (e.g. mid-rebase). */
|
|
22
|
+
branch: string | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Finds an existing worktree that collides with `branch` or `worktreePath`.
|
|
26
|
+
*
|
|
27
|
+
* Matches by branch first, then falls back to a path match — covering the
|
|
28
|
+
* mid-rebase detached-HEAD case where git reports a `null` branch. The path
|
|
29
|
+
* fallback normalizes separators so it works on Windows.
|
|
30
|
+
*/
|
|
31
|
+
export declare const findCollidingWorktree: (existing: readonly WorktreeEntry[], branch: string, worktreePath: string) => WorktreeEntry | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Whether `worktreePath` lives under `worktreesDir` (i.e. is a worktree managed
|
|
34
|
+
* by sandcastle rather than the main working tree or an external worktree).
|
|
35
|
+
* Separators are normalized so the check holds on Windows.
|
|
36
|
+
*/
|
|
37
|
+
export declare const isManagedWorktreePath: (worktreePath: string, worktreesDir: string) => boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Whether a directory entry under `.sandcastle/worktrees/` is orphaned — not
|
|
40
|
+
* present in the set of active worktree paths reported by git. Both sides are
|
|
41
|
+
* normalized so paths from `join` (backslashes on Windows) match git's
|
|
42
|
+
* forward-slash output.
|
|
43
|
+
*/
|
|
44
|
+
export declare const isOrphanedWorktreePath: (entryPath: string, activeWorktreePaths: Iterable<string>) => boolean;
|
|
18
45
|
/**
|
|
19
46
|
* Creates a git worktree at `.sandcastle/worktrees/<name>/`.
|
|
20
47
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeManager.d.ts","sourceRoot":"","sources":["../src/WorktreeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAe,MAAM,aAAa,CAAC;AA0B/E,mEAAmE;AACnE,eAAO,MAAM,YAAY,0BACsB,CAAC;
|
|
1
|
+
{"version":3,"file":"WorktreeManager.d.ts","sourceRoot":"","sources":["../src/WorktreeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAe,MAAM,aAAa,CAAC;AA0B/E,mEAAmE;AACnE,eAAO,MAAM,YAAY,0BACsB,CAAC;AA+BhD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,uCAMlC,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,gBAAgB,kEAK1B,CAAC;AAEJ,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAYD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,yGAM6C,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,yDAImC,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,uEASlC,CAAC;AAiCF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM;;;;0GAwIhB,CAAC;AAEJ;;;GAGG;AACH,eAAO,MAAM,qBAAqB,wEAK/B,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,MAAM,qEAQlB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,uGA6EpB,CAAC"}
|
package/dist/WorktreeManager.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, Option } from "effect";
|
|
2
2
|
import { FileSystem } from "@effect/platform";
|
|
3
3
|
import { execFile } from "node:child_process";
|
|
4
|
-
import { join } from "node:path";
|
|
4
|
+
import { join, normalize } from "node:path";
|
|
5
5
|
import { WorktreeError, WorktreeTimeoutError, withTimeout } from "./errors.js";
|
|
6
6
|
const WORKTREE_TIMEOUT_MS = 30_000;
|
|
7
7
|
/**
|
|
@@ -25,7 +25,11 @@ const formatTimestamp = (date) => {
|
|
|
25
25
|
/** Sanitize a name for use in branch names and directory names. */
|
|
26
26
|
export const sanitizeName = (name) => name.toLowerCase().replace(/[^a-z0-9]/g, "-");
|
|
27
27
|
const execGit = (args, cwd) => Effect.async((resume) => {
|
|
28
|
-
|
|
28
|
+
// Force the C locale so git emits English, machine-stable messages. Several
|
|
29
|
+
// callers match git's stderr (e.g. "invalid reference") to decide control
|
|
30
|
+
// flow; under a localized locale gettext translates those strings and the
|
|
31
|
+
// matches silently fail, breaking worktree creation (issue #595).
|
|
32
|
+
execFile("git", args, { cwd, env: { ...process.env, LC_ALL: "C" } }, (error, stdout, stderr) => {
|
|
29
33
|
if (error) {
|
|
30
34
|
resume(Effect.fail(new WorktreeError({
|
|
31
35
|
message: stderr?.trim() || error.message,
|
|
@@ -50,6 +54,44 @@ export const generateTempBranchName = (name) => {
|
|
|
50
54
|
};
|
|
51
55
|
/** Returns the name of the currently checked-out branch in the given repo directory. */
|
|
52
56
|
export const getCurrentBranch = (repoDir) => execGit(["rev-parse", "--abbrev-ref", "HEAD"], repoDir).pipe(Effect.map((output) => output.trim()));
|
|
57
|
+
/**
|
|
58
|
+
* Normalizes path separators to forward slashes.
|
|
59
|
+
*
|
|
60
|
+
* `git worktree list --porcelain` reports paths with forward slashes on every
|
|
61
|
+
* platform, but `node:path.join` produces backslashes on Windows. Comparing
|
|
62
|
+
* the two without normalizing fails on Windows, so all path comparisons in
|
|
63
|
+
* this module run both sides through this first.
|
|
64
|
+
*/
|
|
65
|
+
const normalizePath = (p) => p.replace(/\\/g, "/");
|
|
66
|
+
/**
|
|
67
|
+
* Finds an existing worktree that collides with `branch` or `worktreePath`.
|
|
68
|
+
*
|
|
69
|
+
* Matches by branch first, then falls back to a path match — covering the
|
|
70
|
+
* mid-rebase detached-HEAD case where git reports a `null` branch. The path
|
|
71
|
+
* fallback normalizes separators so it works on Windows.
|
|
72
|
+
*/
|
|
73
|
+
export const findCollidingWorktree = (existing, branch, worktreePath) => existing.find((wt) => wt.branch === branch) ??
|
|
74
|
+
existing.find((wt) => normalizePath(wt.path) === normalizePath(worktreePath));
|
|
75
|
+
/**
|
|
76
|
+
* Whether `worktreePath` lives under `worktreesDir` (i.e. is a worktree managed
|
|
77
|
+
* by sandcastle rather than the main working tree or an external worktree).
|
|
78
|
+
* Separators are normalized so the check holds on Windows.
|
|
79
|
+
*/
|
|
80
|
+
export const isManagedWorktreePath = (worktreePath, worktreesDir) => normalizePath(worktreePath).startsWith(normalizePath(worktreesDir));
|
|
81
|
+
/**
|
|
82
|
+
* Whether a directory entry under `.sandcastle/worktrees/` is orphaned — not
|
|
83
|
+
* present in the set of active worktree paths reported by git. Both sides are
|
|
84
|
+
* normalized so paths from `join` (backslashes on Windows) match git's
|
|
85
|
+
* forward-slash output.
|
|
86
|
+
*/
|
|
87
|
+
export const isOrphanedWorktreePath = (entryPath, activeWorktreePaths) => {
|
|
88
|
+
const normalizedEntry = normalizePath(entryPath);
|
|
89
|
+
for (const active of activeWorktreePaths) {
|
|
90
|
+
if (normalizePath(active) === normalizedEntry)
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
return true;
|
|
94
|
+
};
|
|
53
95
|
/** Parses `git worktree list --porcelain` output into structured entries. */
|
|
54
96
|
const listWorktrees = (repoDir) => execGit(["worktree", "list", "--porcelain"], repoDir).pipe(Effect.map((output) => {
|
|
55
97
|
const entries = [];
|
|
@@ -115,12 +157,10 @@ export const create = (repoDir, opts) => Effect.gen(function* () {
|
|
|
115
157
|
// Match by branch first; fall back to target path (covers mid-rebase
|
|
116
158
|
// detached-HEAD state where the branch field is null).
|
|
117
159
|
const existing = yield* listWorktrees(repoDir);
|
|
118
|
-
const collision = existing
|
|
119
|
-
existing.find((wt) => wt.path === worktreePath);
|
|
160
|
+
const collision = findCollidingWorktree(existing, branch, worktreePath);
|
|
120
161
|
if (collision) {
|
|
121
162
|
// Only reuse worktrees managed by sandcastle (under .sandcastle/worktrees/)
|
|
122
|
-
|
|
123
|
-
if (isManagedWorktree) {
|
|
163
|
+
if (isManagedWorktreePath(collision.path, worktreesDir)) {
|
|
124
164
|
const dirty = yield* hasUncommittedChanges(collision.path);
|
|
125
165
|
if (dirty) {
|
|
126
166
|
console.warn(`Reusing worktree at ${collision.path} (branch '${branch}') — worktree has uncommitted changes`);
|
|
@@ -128,7 +168,9 @@ export const create = (repoDir, opts) => Effect.gen(function* () {
|
|
|
128
168
|
else {
|
|
129
169
|
console.log(`Reusing existing worktree at ${collision.path} (branch '${branch}')`);
|
|
130
170
|
}
|
|
131
|
-
|
|
171
|
+
// git reports forward slashes even on Windows; return a
|
|
172
|
+
// platform-native path so downstream join/fs calls stay consistent.
|
|
173
|
+
return { path: normalize(collision.path), branch };
|
|
132
174
|
}
|
|
133
175
|
// Branch is checked out in the main working tree or external worktree
|
|
134
176
|
yield* Effect.fail(new WorktreeError({
|
|
@@ -226,7 +268,7 @@ export const pruneStale = (repoDir) => Effect.gen(function* () {
|
|
|
226
268
|
for (const entry of entries) {
|
|
227
269
|
const entryPath = join(realWorktreesDir, entry);
|
|
228
270
|
const isDir = yield* fs.stat(entryPath).pipe(Effect.map((s) => s.type === "Directory"), Effect.catchAll(() => Effect.succeed(false)));
|
|
229
|
-
if (isDir &&
|
|
271
|
+
if (isDir && isOrphanedWorktreePath(entryPath, activeWorktreePaths)) {
|
|
230
272
|
yield* fs.remove(entryPath, { recursive: true, force: true }).pipe(Effect.mapError((e) => new WorktreeError({
|
|
231
273
|
message: `Failed to remove ${entryPath}: ${e.message}`,
|
|
232
274
|
})));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreeManager.js","sourceRoot":"","sources":["../src/WorktreeManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"WorktreeManager.js","sourceRoot":"","sources":["../src/WorktreeManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, rolling tail of streamed output — a pure, provider-agnostic
|
|
3
|
+
* utility shared by every sandbox provider that streams `exec` output.
|
|
4
|
+
*
|
|
5
|
+
* When a provider streams output line-by-line, it accumulates the stream only
|
|
6
|
+
* to build the returned `ExecResult.stdout`/`stderr`. Consumers read just the
|
|
7
|
+
* tail of that value (e.g. the last lines of an error, or a fallback for the
|
|
8
|
+
* agent's final result), so retaining the whole stream is unnecessary — and,
|
|
9
|
+
* once the accumulated string passes V8's ~512MB max string length, fatal: a
|
|
10
|
+
* naive `chunks.join()` throws `RangeError: Invalid string length`, which on a
|
|
11
|
+
* long agent run crashes the whole orchestration.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Default maximum number of characters retained in a bounded output tail.
|
|
15
|
+
*
|
|
16
|
+
* 64KiB sits comfortably above any agent completion signal or structured-output
|
|
17
|
+
* payload while staying far below V8's max string length.
|
|
18
|
+
*/
|
|
19
|
+
export declare const MAX_TAIL_CHARS: number;
|
|
20
|
+
/**
|
|
21
|
+
* A fixed-size rolling tail of strings, bounded by total character length.
|
|
22
|
+
*
|
|
23
|
+
* `push` appends to the tail; once the joined length would exceed `maxChars`,
|
|
24
|
+
* the oldest items are dropped from the front. A single item longer than
|
|
25
|
+
* `maxChars` is truncated to its own tail, so a newline-free blob can't
|
|
26
|
+
* overflow on one push. `toString` joins the retained items, and its length is
|
|
27
|
+
* always at most `maxChars`.
|
|
28
|
+
*
|
|
29
|
+
* The running length counter is encapsulated so callers can't desync it.
|
|
30
|
+
*/
|
|
31
|
+
export declare class BoundedTail {
|
|
32
|
+
private readonly items;
|
|
33
|
+
private totalChars;
|
|
34
|
+
private readonly maxChars;
|
|
35
|
+
private readonly separator;
|
|
36
|
+
/**
|
|
37
|
+
* @param maxChars Maximum length of the joined tail. Defaults to {@link MAX_TAIL_CHARS}.
|
|
38
|
+
* @param separator String placed between items by {@link toString}. Must match
|
|
39
|
+
* how the caller would otherwise have joined the accumulated chunks (e.g.
|
|
40
|
+
* `"\n"` for line streams, `""` for raw chunk streams).
|
|
41
|
+
*/
|
|
42
|
+
constructor(maxChars?: number, separator?: string);
|
|
43
|
+
/** Append one item to the tail, evicting oldest items to stay within budget. */
|
|
44
|
+
push(item: string): void;
|
|
45
|
+
/** Join the retained tail into a single string (length ≤ `maxChars`). */
|
|
46
|
+
toString(): string;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=boundedTail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundedTail.d.ts","sourceRoot":"","sources":["../src/boundedTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAY,CAAC;AAExC;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC;;;;;OAKG;IACH,YAAY,QAAQ,GAAE,MAAuB,EAAE,SAAS,SAAK,EAG5D;IAED,gFAAgF;IAChF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYvB;IAED,yEAAyE;IACzE,QAAQ,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, rolling tail of streamed output — a pure, provider-agnostic
|
|
3
|
+
* utility shared by every sandbox provider that streams `exec` output.
|
|
4
|
+
*
|
|
5
|
+
* When a provider streams output line-by-line, it accumulates the stream only
|
|
6
|
+
* to build the returned `ExecResult.stdout`/`stderr`. Consumers read just the
|
|
7
|
+
* tail of that value (e.g. the last lines of an error, or a fallback for the
|
|
8
|
+
* agent's final result), so retaining the whole stream is unnecessary — and,
|
|
9
|
+
* once the accumulated string passes V8's ~512MB max string length, fatal: a
|
|
10
|
+
* naive `chunks.join()` throws `RangeError: Invalid string length`, which on a
|
|
11
|
+
* long agent run crashes the whole orchestration.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Default maximum number of characters retained in a bounded output tail.
|
|
15
|
+
*
|
|
16
|
+
* 64KiB sits comfortably above any agent completion signal or structured-output
|
|
17
|
+
* payload while staying far below V8's max string length.
|
|
18
|
+
*/
|
|
19
|
+
export const MAX_TAIL_CHARS = 64 * 1024;
|
|
20
|
+
/**
|
|
21
|
+
* A fixed-size rolling tail of strings, bounded by total character length.
|
|
22
|
+
*
|
|
23
|
+
* `push` appends to the tail; once the joined length would exceed `maxChars`,
|
|
24
|
+
* the oldest items are dropped from the front. A single item longer than
|
|
25
|
+
* `maxChars` is truncated to its own tail, so a newline-free blob can't
|
|
26
|
+
* overflow on one push. `toString` joins the retained items, and its length is
|
|
27
|
+
* always at most `maxChars`.
|
|
28
|
+
*
|
|
29
|
+
* The running length counter is encapsulated so callers can't desync it.
|
|
30
|
+
*/
|
|
31
|
+
export class BoundedTail {
|
|
32
|
+
items = [];
|
|
33
|
+
totalChars = 0;
|
|
34
|
+
maxChars;
|
|
35
|
+
separator;
|
|
36
|
+
/**
|
|
37
|
+
* @param maxChars Maximum length of the joined tail. Defaults to {@link MAX_TAIL_CHARS}.
|
|
38
|
+
* @param separator String placed between items by {@link toString}. Must match
|
|
39
|
+
* how the caller would otherwise have joined the accumulated chunks (e.g.
|
|
40
|
+
* `"\n"` for line streams, `""` for raw chunk streams).
|
|
41
|
+
*/
|
|
42
|
+
constructor(maxChars = MAX_TAIL_CHARS, separator = "") {
|
|
43
|
+
this.maxChars = maxChars;
|
|
44
|
+
this.separator = separator;
|
|
45
|
+
}
|
|
46
|
+
/** Append one item to the tail, evicting oldest items to stay within budget. */
|
|
47
|
+
push(item) {
|
|
48
|
+
const bounded = item.length > this.maxChars
|
|
49
|
+
? item.slice(item.length - this.maxChars)
|
|
50
|
+
: item;
|
|
51
|
+
this.totalChars +=
|
|
52
|
+
bounded.length + (this.items.length > 0 ? this.separator.length : 0);
|
|
53
|
+
this.items.push(bounded);
|
|
54
|
+
while (this.totalChars > this.maxChars && this.items.length > 1) {
|
|
55
|
+
const dropped = this.items.shift();
|
|
56
|
+
this.totalChars -= dropped.length + this.separator.length;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Join the retained tail into a single string (length ≤ `maxChars`). */
|
|
60
|
+
toString() {
|
|
61
|
+
return this.items.join(this.separator);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=boundedTail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boundedTail.js","sourceRoot":"","sources":["../src/boundedTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AAExC;;;;;;;;;;GAUG;AACH,MAAM,OAAO,WAAW;IACL,KAAK,GAAa,EAAE,CAAC;IAC9B,UAAU,GAAG,CAAC,CAAC;IACN,QAAQ,CAAS;IACjB,SAAS,CAAS;IAEnC;;;;;OAKG;IACH,YAAY,QAAQ,GAAW,cAAc,EAAE,SAAS,GAAG,EAAE;QAC3D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC,IAAY;QACf,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ;YACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,UAAU;YACb,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YACpC,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACF"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export declare const sandcastle: Command.Command<"sandcastle", Display | FileSys
|
|
|
9
9
|
readonly template: import("effect/Option").Option<string>;
|
|
10
10
|
readonly agent: import("effect/Option").Option<string>;
|
|
11
11
|
readonly model: import("effect/Option").Option<string>;
|
|
12
|
+
readonly sandbox: import("effect/Option").Option<string>;
|
|
12
13
|
} | {
|
|
13
14
|
readonly subcommand: import("effect/Option").Option<{
|
|
14
15
|
readonly imageName: import("effect/Option").Option<string>;
|