@clipboard-health/groundcrew 4.10.5 → 4.12.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/dist/commands/doctor.js +25 -0
- package/dist/commands/setupWorkspace.d.ts.map +1 -1
- package/dist/commands/setupWorkspace.js +62 -10
- package/dist/lib/clearanceHosts.d.ts +31 -0
- package/dist/lib/clearanceHosts.d.ts.map +1 -0
- package/dist/lib/clearanceHosts.js +105 -0
- package/dist/lib/config.d.ts +16 -7
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +20 -1
- package/dist/lib/host.d.ts +14 -0
- package/dist/lib/host.d.ts.map +1 -1
- package/dist/lib/host.js +8 -1
- package/dist/lib/launchCommand.d.ts +41 -0
- package/dist/lib/launchCommand.d.ts.map +1 -1
- package/dist/lib/launchCommand.js +205 -31
- package/dist/lib/localRunner.d.ts +5 -4
- package/dist/lib/localRunner.d.ts.map +1 -1
- package/dist/lib/localRunner.js +23 -4
- package/dist/lib/srtPolicy.d.ts +51 -0
- package/dist/lib/srtPolicy.d.ts.map +1 -0
- package/dist/lib/srtPolicy.js +251 -0
- package/dist/lib/stagedLaunch.d.ts +22 -0
- package/dist/lib/stagedLaunch.d.ts.map +1 -1
- package/dist/lib/stagedLaunch.js +18 -0
- package/dist/lib/worktrees.d.ts +2 -2
- package/dist/lib/worktrees.d.ts.map +1 -1
- package/dist/lib/worktrees.js +9 -5
- package/docs/configuration.md +2 -1
- package/docs/runners.md +47 -5
- package/package.json +2 -1
package/dist/commands/doctor.js
CHANGED
|
@@ -247,6 +247,22 @@ function localCapabilityCheck(host, resolved) {
|
|
|
247
247
|
: "sdx runner requires `sbx` (Docker Sandboxes) on PATH (install from https://docs.docker.com/ai/sandboxes/)",
|
|
248
248
|
};
|
|
249
249
|
}
|
|
250
|
+
if (resolved === "srt") {
|
|
251
|
+
const missingLinuxDeps = host.isLinux
|
|
252
|
+
? [
|
|
253
|
+
host.hasBubblewrap ? undefined : "bubblewrap",
|
|
254
|
+
host.hasSocat ? undefined : "socat",
|
|
255
|
+
host.hasRipgrep ? undefined : "ripgrep (rg)",
|
|
256
|
+
].filter((name) => name !== undefined)
|
|
257
|
+
: [];
|
|
258
|
+
const ok = host.isSrtSupported && missingLinuxDeps.length === 0;
|
|
259
|
+
return {
|
|
260
|
+
name: "local runner (srt)",
|
|
261
|
+
ok,
|
|
262
|
+
required: false,
|
|
263
|
+
hint: srtRunnerHint(ok, host.isSrtSupported, missingLinuxDeps),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
250
266
|
// resolved === "none"
|
|
251
267
|
return {
|
|
252
268
|
name: "local runner (none)",
|
|
@@ -255,6 +271,15 @@ function localCapabilityCheck(host, resolved) {
|
|
|
255
271
|
hint: "WARNING: local.runner='none' — agent runs unsandboxed on the host. Only use this when you understand the implications.",
|
|
256
272
|
};
|
|
257
273
|
}
|
|
274
|
+
function srtRunnerHint(ok, isSrtSupported, missingLinuxDeps) {
|
|
275
|
+
if (ok) {
|
|
276
|
+
return "ready (beta: @anthropic-ai/sandbox-runtime is a research preview)";
|
|
277
|
+
}
|
|
278
|
+
if (!isSrtSupported) {
|
|
279
|
+
return "srt runner requires macOS or Linux/WSL";
|
|
280
|
+
}
|
|
281
|
+
return `srt runner on Linux requires ${missingLinuxDeps.join(", ")} on PATH (Debian/Ubuntu: \`apt install bubblewrap socat ripgrep\`; on Ubuntu 24.04+ also \`sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0\`)`;
|
|
282
|
+
}
|
|
258
283
|
function reportLocalCapability(arguments_) {
|
|
259
284
|
writeOutput();
|
|
260
285
|
writeOutput("Local runner");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/setupWorkspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setupWorkspace.d.ts","sourceRoot":"","sources":["../../src/commands/setupWorkspace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAsBzF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAyDD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,EAC9B,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,CAuIf;AA8ID,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { rmSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
2
3
|
import { loadConfig } from "../lib/config.js";
|
|
3
4
|
import { openAgentWorkspace, prepareAgentLaunch } from "../lib/agentLaunch.js";
|
|
4
5
|
import { createBoard } from "../lib/board.js";
|
|
5
6
|
import { buildSources, sourcesFromConfig } from "../lib/buildSources.js";
|
|
6
|
-
import {
|
|
7
|
+
import { collectAllowedDomains } from "../lib/clearanceHosts.js";
|
|
8
|
+
import { buildLaunchCommand, inferAgentCommandName } from "../lib/launchCommand.js";
|
|
7
9
|
import { resolvePrepareWorktreeCommand } from "../lib/repositoryHooks.js";
|
|
8
10
|
import { recordRunState } from "../lib/runState.js";
|
|
9
|
-
import {
|
|
11
|
+
import { buildSrtSettings } from "../lib/srtPolicy.js";
|
|
12
|
+
import { stageBuildSecrets, stagePromptFromTemplate, stageSrtSettings, stageWorkspaceLaunchCommand, } from "../lib/stagedLaunch.js";
|
|
10
13
|
import { naturalIdFromCanonical } from "../lib/ticketSource.js";
|
|
11
|
-
import { debug, errorMessage, log, okMark } from "../lib/util.js";
|
|
14
|
+
import { debug, errorMessage, log, okMark, readEnvironmentVariable } from "../lib/util.js";
|
|
12
15
|
import { workspaces } from "../lib/workspaces.js";
|
|
13
16
|
import { isWorktreeAlreadyExistsError, worktrees } from "../lib/worktrees.js";
|
|
14
17
|
function stagePrompt(input) {
|
|
@@ -25,6 +28,33 @@ function stagePrompt(input) {
|
|
|
25
28
|
},
|
|
26
29
|
});
|
|
27
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate the srt policies for this launch and stage them to temp settings
|
|
33
|
+
* files. The agent identity comes from the model `cmd`; the git common dir is
|
|
34
|
+
* the parent clone's `.git` (the worktree lives beside it); the egress
|
|
35
|
+
* allowlist is translated from the existing clearance env so srt and safehouse
|
|
36
|
+
* share one source of truth. Only called when `local.runner` resolves to `srt`.
|
|
37
|
+
*
|
|
38
|
+
* Two policies: the `prepare` policy is profile-neutral (empty agent → no
|
|
39
|
+
* `~/.claude`/`~/.codex` grants) so the repo-controlled prepareWorktree hook
|
|
40
|
+
* can't touch the agent's credentials; the `agent` policy carries the agent's
|
|
41
|
+
* credential profile.
|
|
42
|
+
*/
|
|
43
|
+
function buildAndStageSrtSettings(input) {
|
|
44
|
+
const repoDir = path.resolve(input.config.workspace.projectDir, input.repository);
|
|
45
|
+
const base = {
|
|
46
|
+
worktreeDir: input.worktreeDir,
|
|
47
|
+
gitCommonDir: path.join(repoDir, ".git"),
|
|
48
|
+
allowedDomains: collectAllowedDomains({
|
|
49
|
+
hosts: readEnvironmentVariable("CLEARANCE_ALLOW_HOSTS"),
|
|
50
|
+
files: readEnvironmentVariable("CLEARANCE_ALLOW_HOSTS_FILES"),
|
|
51
|
+
}),
|
|
52
|
+
};
|
|
53
|
+
return stageSrtSettings(input.ticket, {
|
|
54
|
+
prepare: buildSrtSettings({ ...base, agent: "" }),
|
|
55
|
+
agent: buildSrtSettings({ ...base, agent: inferAgentCommandName(input.definition.cmd) }),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
28
58
|
export async function setupWorkspace(config, options, runOptions = {}) {
|
|
29
59
|
const { ticket, repository, model } = options;
|
|
30
60
|
const { signal } = runOptions;
|
|
@@ -62,6 +92,7 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
62
92
|
// Without rollback the next tick hits "Worktree already exists" and
|
|
63
93
|
// the ticket strands forever.
|
|
64
94
|
let promptDir;
|
|
95
|
+
let srtSettingsDir;
|
|
65
96
|
try {
|
|
66
97
|
await assertLaunchReady(readinessPromise);
|
|
67
98
|
const ticketDetails = options.details;
|
|
@@ -79,6 +110,20 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
79
110
|
defaultHooks: config.defaults.hooks,
|
|
80
111
|
});
|
|
81
112
|
const secretsFile = prepareWorktreeCommand === undefined ? undefined : stageBuildSecrets(promptDir);
|
|
113
|
+
let srtPrepareSettingsFile;
|
|
114
|
+
let srtAgentSettingsFile;
|
|
115
|
+
if (runner === "srt") {
|
|
116
|
+
const staged = buildAndStageSrtSettings({
|
|
117
|
+
config,
|
|
118
|
+
repository,
|
|
119
|
+
ticket,
|
|
120
|
+
worktreeDir: launchDir,
|
|
121
|
+
definition,
|
|
122
|
+
});
|
|
123
|
+
srtPrepareSettingsFile = staged.prepareFile;
|
|
124
|
+
srtAgentSettingsFile = staged.agentFile;
|
|
125
|
+
srtSettingsDir = staged.directory;
|
|
126
|
+
}
|
|
82
127
|
const launchCommand = buildLaunchCommand({
|
|
83
128
|
definition,
|
|
84
129
|
promptFile: stagedPrompt.file,
|
|
@@ -87,6 +132,9 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
87
132
|
prepareWorktreeCommand,
|
|
88
133
|
runner,
|
|
89
134
|
sandboxName,
|
|
135
|
+
srtPrepareSettingsFile,
|
|
136
|
+
srtAgentSettingsFile,
|
|
137
|
+
srtSettingsDir,
|
|
90
138
|
});
|
|
91
139
|
const launchCmd = stageWorkspaceLaunchCommand(promptDir, launchCommand);
|
|
92
140
|
debug("Opening workspace...");
|
|
@@ -119,7 +167,7 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
119
167
|
}
|
|
120
168
|
}
|
|
121
169
|
catch (error) {
|
|
122
|
-
await rollbackWorktree({ config, entry: created, promptDir });
|
|
170
|
+
await rollbackWorktree({ config, entry: created, promptDir, srtSettingsDir });
|
|
123
171
|
recordRunStateBestEffort({
|
|
124
172
|
config,
|
|
125
173
|
ticket,
|
|
@@ -212,12 +260,16 @@ async function rollbackWorktree(arguments_) {
|
|
|
212
260
|
log(`Worktree teardown failed during rollback: ${errorMessage(error)}`);
|
|
213
261
|
}
|
|
214
262
|
finally {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
263
|
+
// Both temp dirs are normally removed by the launch command; clean them
|
|
264
|
+
// here for the pre-launch failure path. Silent on retry races.
|
|
265
|
+
for (const dir of [arguments_.promptDir, arguments_.srtSettingsDir]) {
|
|
266
|
+
if (dir !== undefined) {
|
|
267
|
+
try {
|
|
268
|
+
rmSync(dir, { recursive: true, force: true });
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// already gone
|
|
272
|
+
}
|
|
221
273
|
}
|
|
222
274
|
}
|
|
223
275
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate the existing clearance egress allowlist into srt
|
|
3
|
+
* `network.allowedDomains`. groundcrew keeps one source of truth for which
|
|
4
|
+
* hosts an agent may reach: the `CLEARANCE_ALLOW_HOSTS` env var and the
|
|
5
|
+
* newline-delimited files named by `CLEARANCE_ALLOW_HOSTS_FILES` (the shipped
|
|
6
|
+
* `clearance-allow-hosts` starter plus any personal files).
|
|
7
|
+
*
|
|
8
|
+
* clearance and srt share host-matching semantics — a bare `example.com` is an
|
|
9
|
+
* exact match and `*.example.com` matches subdomains — so the translation is
|
|
10
|
+
* almost an identity. The only real work is parsing (comments, blanks,
|
|
11
|
+
* comma/whitespace/newline separators), de-duplication, and dropping entries
|
|
12
|
+
* srt's domain schema would reject (`*.com`, `*`, leading/trailing dots, bare
|
|
13
|
+
* tokens without a dot like `localhost`) so the generated settings file always
|
|
14
|
+
* validates.
|
|
15
|
+
*/
|
|
16
|
+
export interface CollectAllowedDomainsInput {
|
|
17
|
+
/** Raw `CLEARANCE_ALLOW_HOSTS` value (comma/whitespace separated). */
|
|
18
|
+
hosts?: string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Raw `CLEARANCE_ALLOW_HOSTS_FILES` value: a list of file paths joined by
|
|
21
|
+
* the platform path delimiter (`:` on POSIX), each a newline-delimited host
|
|
22
|
+
* list. Missing or unreadable files are skipped with a debug line.
|
|
23
|
+
*/
|
|
24
|
+
files?: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse and validate clearance allow-host sources into a de-duplicated list of
|
|
28
|
+
* srt domain patterns, preserving first-seen order.
|
|
29
|
+
*/
|
|
30
|
+
export declare function collectAllowedDomains(input: CollectAllowedDomainsInput): string[];
|
|
31
|
+
//# sourceMappingURL=clearanceHosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearanceHosts.d.ts","sourceRoot":"","sources":["../../src/lib/clearanceHosts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,MAAM,WAAW,0BAA0B;IACzC,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,MAAM,EAAE,CA8BjF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate the existing clearance egress allowlist into srt
|
|
3
|
+
* `network.allowedDomains`. groundcrew keeps one source of truth for which
|
|
4
|
+
* hosts an agent may reach: the `CLEARANCE_ALLOW_HOSTS` env var and the
|
|
5
|
+
* newline-delimited files named by `CLEARANCE_ALLOW_HOSTS_FILES` (the shipped
|
|
6
|
+
* `clearance-allow-hosts` starter plus any personal files).
|
|
7
|
+
*
|
|
8
|
+
* clearance and srt share host-matching semantics — a bare `example.com` is an
|
|
9
|
+
* exact match and `*.example.com` matches subdomains — so the translation is
|
|
10
|
+
* almost an identity. The only real work is parsing (comments, blanks,
|
|
11
|
+
* comma/whitespace/newline separators), de-duplication, and dropping entries
|
|
12
|
+
* srt's domain schema would reject (`*.com`, `*`, leading/trailing dots, bare
|
|
13
|
+
* tokens without a dot like `localhost`) so the generated settings file always
|
|
14
|
+
* validates.
|
|
15
|
+
*/
|
|
16
|
+
import { readFileSync } from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { debug } from "./util.js";
|
|
19
|
+
/**
|
|
20
|
+
* Parse and validate clearance allow-host sources into a de-duplicated list of
|
|
21
|
+
* srt domain patterns, preserving first-seen order.
|
|
22
|
+
*/
|
|
23
|
+
export function collectAllowedDomains(input) {
|
|
24
|
+
const texts = [];
|
|
25
|
+
for (const file of splitPathList(input.files)) {
|
|
26
|
+
try {
|
|
27
|
+
texts.push(readFileSync(file, "utf8"));
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
debug(`Skipping unreadable CLEARANCE_ALLOW_HOSTS_FILES entry ${file}: ${String(error)}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (input.hosts !== undefined) {
|
|
34
|
+
texts.push(input.hosts);
|
|
35
|
+
}
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const domains = [];
|
|
38
|
+
for (const text of texts) {
|
|
39
|
+
for (const raw of tokenize(text)) {
|
|
40
|
+
const domain = normalizeDomain(raw);
|
|
41
|
+
if (domain === undefined) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const key = domain.toLowerCase();
|
|
45
|
+
if (seen.has(key)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
seen.add(key);
|
|
49
|
+
domains.push(domain);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return domains;
|
|
53
|
+
}
|
|
54
|
+
function splitPathList(value) {
|
|
55
|
+
if (value === undefined || value.length === 0) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
return value
|
|
59
|
+
.split(path.delimiter)
|
|
60
|
+
.map((entry) => entry.trim())
|
|
61
|
+
.filter((entry) => entry.length > 0);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Split a host source into candidate tokens. Handles env-style
|
|
65
|
+
* comma/whitespace separators and file-style newline lists with `#` comments
|
|
66
|
+
* (full-line or trailing — hostnames never contain `#`).
|
|
67
|
+
*/
|
|
68
|
+
function tokenize(text) {
|
|
69
|
+
return text
|
|
70
|
+
.split(/\r?\n/)
|
|
71
|
+
.flatMap((line) => line.replace(/#.*$/, "").split(/[\s,]+/))
|
|
72
|
+
.map((token) => token.trim())
|
|
73
|
+
.filter((token) => token.length > 0);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Normalize a raw host token into a valid srt domain pattern, or `undefined`
|
|
77
|
+
* if srt would reject it. Mirrors srt's `DomainPatternSchema`: a wildcard must
|
|
78
|
+
* be `*.<domain-with-a-dot>`; a bare host must contain a dot and no `*`. A
|
|
79
|
+
* leading-dot suffix form (`.example.com`) is rewritten to `*.example.com`.
|
|
80
|
+
*/
|
|
81
|
+
function normalizeDomain(token) {
|
|
82
|
+
const candidate = token.startsWith(".") ? `*${token}` : token;
|
|
83
|
+
if (candidate.startsWith("*.")) {
|
|
84
|
+
const base = candidate.slice(2);
|
|
85
|
+
return isPlainDomain(base) ? candidate : undefined;
|
|
86
|
+
}
|
|
87
|
+
return isPlainDomain(candidate) ? candidate : undefined;
|
|
88
|
+
}
|
|
89
|
+
function isPlainDomain(value) {
|
|
90
|
+
return (value.length > 0 &&
|
|
91
|
+
!value.includes("*") &&
|
|
92
|
+
// Mirror srt's DomainPatternSchema, which rejects scheme/path/port tokens.
|
|
93
|
+
// This matters for safety, not just correctness: a token srt rejects (e.g.
|
|
94
|
+
// `https://api.github.com`, `api.github.com:443`, `github.com/path`) fails
|
|
95
|
+
// the whole settings file's schema validation, and srt's `loadConfig` then
|
|
96
|
+
// returns null → the CLI silently falls back to a config with no read mask.
|
|
97
|
+
// Dropping such tokens here keeps the generated settings valid (fail closed
|
|
98
|
+
// for that host, never fail open for the launch).
|
|
99
|
+
!value.includes("://") &&
|
|
100
|
+
!value.includes("/") &&
|
|
101
|
+
!value.includes(":") &&
|
|
102
|
+
value.includes(".") &&
|
|
103
|
+
!value.startsWith(".") &&
|
|
104
|
+
!value.endsWith("."));
|
|
105
|
+
}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -29,16 +29,18 @@ export type WorkspaceKindSetting = "auto" | "cmux" | "tmux";
|
|
|
29
29
|
export declare const WORKSPACE_KIND_SETTINGS: readonly WorkspaceKindSetting[];
|
|
30
30
|
/**
|
|
31
31
|
* Concrete local isolation backend selected for a launch. `safehouse` is
|
|
32
|
-
* macOS-only (clearance HTTP-egress + sandbox profile); `
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* macOS-only (clearance HTTP-egress + sandbox profile); `srt` is Anthropic's
|
|
33
|
+
* sandbox-runtime (macOS `sandbox-exec` + Linux `bubblewrap`, with a built-in
|
|
34
|
+
* network allowlist) — a fast, non-Docker option on both macOS and Linux/WSL;
|
|
35
|
+
* `sdx` is Docker Sandboxes (`sbx` CLI) — works on Linux and macOS and is the
|
|
36
|
+
* only known option that lets the agent use Docker safely without exposing the
|
|
37
|
+
* host socket; `none` is an explicit unsandboxed escape hatch.
|
|
36
38
|
*/
|
|
37
|
-
export type LocalRunner = "safehouse" | "sdx" | "none";
|
|
39
|
+
export type LocalRunner = "safehouse" | "srt" | "sdx" | "none";
|
|
38
40
|
/**
|
|
39
41
|
* User-facing local runner setting. `auto` resolves at launch time:
|
|
40
|
-
* macOS picks `safehouse`, Linux picks `sdx`. `none`
|
|
41
|
-
* implicitly.
|
|
42
|
+
* macOS picks `safehouse`, Linux picks `sdx`. `srt` and `none` are never
|
|
43
|
+
* picked implicitly — both are opt-in via an explicit `local.runner`.
|
|
42
44
|
*/
|
|
43
45
|
export type LocalRunnerSetting = LocalRunner | "auto";
|
|
44
46
|
export declare const LOCAL_RUNNER_SETTINGS: readonly LocalRunnerSetting[];
|
|
@@ -140,6 +142,12 @@ export interface Config {
|
|
|
140
142
|
git?: {
|
|
141
143
|
remote?: string;
|
|
142
144
|
defaultBranch?: string;
|
|
145
|
+
/**
|
|
146
|
+
* Overrides the prefix groundcrew puts in front of the ticket id when it
|
|
147
|
+
* names a worktree branch (`<branchPrefix>-<ticket>`). Defaults to the OS
|
|
148
|
+
* account username when unset. Must be a git-ref-safe, slash-free slug.
|
|
149
|
+
*/
|
|
150
|
+
branchPrefix?: string;
|
|
143
151
|
};
|
|
144
152
|
workspace: {
|
|
145
153
|
projectDir: string;
|
|
@@ -204,6 +212,7 @@ export interface ResolvedConfig {
|
|
|
204
212
|
git: {
|
|
205
213
|
remote: string;
|
|
206
214
|
defaultBranch: string;
|
|
215
|
+
branchPrefix?: string;
|
|
207
216
|
};
|
|
208
217
|
workspace: {
|
|
209
218
|
projectDir: string;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAMrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAEpE,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE5D,eAAO,MAAM,uBAAuB,EAAE,SAAS,oBAAoB,EAIzD,CAAC;AAEX
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -23,6 +23,7 @@ export const WORKSPACE_KIND_SETTINGS = [
|
|
|
23
23
|
export const LOCAL_RUNNER_SETTINGS = [
|
|
24
24
|
"auto",
|
|
25
25
|
"safehouse",
|
|
26
|
+
"srt",
|
|
26
27
|
"sdx",
|
|
27
28
|
"none",
|
|
28
29
|
];
|
|
@@ -148,6 +149,17 @@ function normalizeOptionalString(value, configKey) {
|
|
|
148
149
|
}
|
|
149
150
|
return value.trim();
|
|
150
151
|
}
|
|
152
|
+
// Git-ref-safe, slash-free slug: must start alphanumeric/underscore (git rejects
|
|
153
|
+
// a leading '.', and `git worktree add -b` would read a leading '-' as a flag)
|
|
154
|
+
// and contain no `..` (git rejects it).
|
|
155
|
+
const BRANCH_PREFIX_RE = /^(?!.*\.\.)\w[\w.-]*$/;
|
|
156
|
+
function normalizeBranchPrefix(value) {
|
|
157
|
+
const normalized = normalizeOptionalString(value, "git.branchPrefix");
|
|
158
|
+
if (normalized !== undefined && !BRANCH_PREFIX_RE.test(normalized)) {
|
|
159
|
+
fail(`git.branchPrefix must be a slash-free slug of letters, digits, '.', '_', or '-' (got ${JSON.stringify(value)})`);
|
|
160
|
+
}
|
|
161
|
+
return normalized;
|
|
162
|
+
}
|
|
151
163
|
function normalizeHookCommands(value, configKey) {
|
|
152
164
|
if (value === undefined) {
|
|
153
165
|
return {};
|
|
@@ -435,9 +447,16 @@ function applyDefaults(user) {
|
|
|
435
447
|
fail("local must be an object");
|
|
436
448
|
}
|
|
437
449
|
const sources = normalizeSources(user.sources);
|
|
450
|
+
const branchPrefix = normalizeBranchPrefix(user.git?.branchPrefix);
|
|
438
451
|
return {
|
|
439
452
|
sources,
|
|
440
|
-
|
|
453
|
+
// Only carry the key when set so `git.branchPrefix` stays truly optional
|
|
454
|
+
// under exactOptionalPropertyTypes.
|
|
455
|
+
git: {
|
|
456
|
+
...DEFAULT_GIT,
|
|
457
|
+
...user.git,
|
|
458
|
+
...(branchPrefix === undefined ? {} : { branchPrefix }),
|
|
459
|
+
},
|
|
441
460
|
workspace: {
|
|
442
461
|
projectDir: expandHome(user.workspace.projectDir),
|
|
443
462
|
knownRepositories: user.workspace.knownRepositories,
|
package/dist/lib/host.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export interface HostCapabilities {
|
|
|
12
12
|
hasCmux: boolean;
|
|
13
13
|
/** True when the `tmux` binary is on PATH. */
|
|
14
14
|
hasTmux: boolean;
|
|
15
|
+
/** True when the `bubblewrap` binary is on PATH (Linux srt dependency). */
|
|
16
|
+
hasBubblewrap: boolean;
|
|
17
|
+
/** True when the `socat` binary is on PATH (Linux srt dependency). */
|
|
18
|
+
hasSocat: boolean;
|
|
19
|
+
/** True when the `rg` (ripgrep) binary is on PATH (Linux srt dependency). */
|
|
20
|
+
hasRipgrep: boolean;
|
|
15
21
|
/** True when the host platform is macOS. Safehouse is macOS-only. */
|
|
16
22
|
isMacOS: boolean;
|
|
17
23
|
/** True when the host platform is Linux. */
|
|
@@ -22,6 +28,14 @@ export interface HostCapabilities {
|
|
|
22
28
|
* or WSL before creating a worktree.
|
|
23
29
|
*/
|
|
24
30
|
isSafehouseSupported: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* True when srt (Anthropic sandbox-runtime) is supportable on this
|
|
33
|
+
* platform. srt uses `sandbox-exec` on macOS and `bubblewrap` on Linux,
|
|
34
|
+
* so this tracks "macOS || Linux"; WSL inherits the Linux path. The srt
|
|
35
|
+
* binary itself ships as a groundcrew dependency, so there is no PATH
|
|
36
|
+
* probe — but the Linux backend additionally needs bubblewrap/socat/rg.
|
|
37
|
+
*/
|
|
38
|
+
isSrtSupported: boolean;
|
|
25
39
|
/**
|
|
26
40
|
* True when sdx (Docker Sandboxes) is supportable on this platform —
|
|
27
41
|
* sbx is published for both macOS and Linux, so this stays in sync with
|
package/dist/lib/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/lib/host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc1F;AAED,wBAAsB,sBAAsB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/lib/host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,gEAAgE;IAChE,MAAM,EAAE,OAAO,CAAC;IAChB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,2EAA2E;IAC3E,aAAa,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,QAAQ,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;;;OAMG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc1F;AAED,wBAAsB,sBAAsB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0B5F"}
|
package/dist/lib/host.js
CHANGED
|
@@ -28,20 +28,27 @@ export async function which(cmd, signal) {
|
|
|
28
28
|
export async function detectHostCapabilities(signal) {
|
|
29
29
|
const isMacOS = process.platform === "darwin";
|
|
30
30
|
const isLinux = process.platform === "linux";
|
|
31
|
-
const [safehouse, sbx, cmux, tmux] = await Promise.all([
|
|
31
|
+
const [safehouse, sbx, cmux, tmux, bubblewrap, socat, ripgrep] = await Promise.all([
|
|
32
32
|
which("safehouse", signal),
|
|
33
33
|
which("sbx", signal),
|
|
34
34
|
which("cmux", signal),
|
|
35
35
|
which("tmux", signal),
|
|
36
|
+
which("bwrap", signal),
|
|
37
|
+
which("socat", signal),
|
|
38
|
+
which("rg", signal),
|
|
36
39
|
]);
|
|
37
40
|
return {
|
|
38
41
|
hasSafehouse: safehouse !== undefined,
|
|
39
42
|
hasSbx: sbx !== undefined,
|
|
40
43
|
hasCmux: cmux !== undefined,
|
|
41
44
|
hasTmux: tmux !== undefined,
|
|
45
|
+
hasBubblewrap: bubblewrap !== undefined,
|
|
46
|
+
hasSocat: socat !== undefined,
|
|
47
|
+
hasRipgrep: ripgrep !== undefined,
|
|
42
48
|
isMacOS,
|
|
43
49
|
isLinux,
|
|
44
50
|
isSafehouseSupported: isMacOS,
|
|
51
|
+
isSrtSupported: isMacOS || isLinux,
|
|
45
52
|
isSdxSupported: isMacOS || isLinux,
|
|
46
53
|
};
|
|
47
54
|
}
|
|
@@ -11,6 +11,31 @@ export { shellSingleQuote } from "./shell.ts";
|
|
|
11
11
|
* exercise the catch branch.
|
|
12
12
|
*/
|
|
13
13
|
export declare function resolveSafehouseClearancePath(baseUrl?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the `srt` CLI shipped by `@anthropic-ai/sandbox-runtime` (a pinned
|
|
16
|
+
* groundcrew dependency) via Node's module resolution, reading the package's
|
|
17
|
+
* `bin` field so the path survives version bumps that move the entry point.
|
|
18
|
+
* The resolved `dist/cli.js` carries a `#!/usr/bin/env node` shebang and npm
|
|
19
|
+
* marks it executable, so it is exec'd directly like the safehouse wrapper.
|
|
20
|
+
*
|
|
21
|
+
* @param baseUrl - **Test-only seam.** Production callers must omit this so the
|
|
22
|
+
* helper resolves from this module's URL. Tests pass an invalid value to
|
|
23
|
+
* exercise the catch branch.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveSrtBinPath(baseUrl?: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Extract the `srt` entry from a package manifest's `bin` field, which npm
|
|
28
|
+
* allows as either a bare string (single-bin packages) or a name→path map.
|
|
29
|
+
*/
|
|
30
|
+
export declare function srtBinEntry(manifest: {
|
|
31
|
+
bin?: string | Record<string, string>;
|
|
32
|
+
}): string;
|
|
33
|
+
/**
|
|
34
|
+
* Infer the agent's command basename from a model `cmd` (skipping a leading
|
|
35
|
+
* `env`/`KEY=val` prefix). Safehouse uses it to pick the matching `.sb`
|
|
36
|
+
* profile; srt uses it to pick the agent's credential profile in `srtPolicy`.
|
|
37
|
+
*/
|
|
38
|
+
export declare function inferAgentCommandName(agentCmd: string): string;
|
|
14
39
|
interface LaunchCommandArguments {
|
|
15
40
|
definition: ModelDefinition;
|
|
16
41
|
promptFile: string;
|
|
@@ -42,6 +67,22 @@ interface LaunchCommandArguments {
|
|
|
42
67
|
* on one host and sdx on another without config edits.
|
|
43
68
|
*/
|
|
44
69
|
sandboxName?: string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Absolute path to the profile-neutral srt settings JSON for the
|
|
72
|
+
* prepareWorktree wrap (no agent credential grants). Required when
|
|
73
|
+
* `runner === "srt"`. Staged in `srtSettingsDir`.
|
|
74
|
+
*/
|
|
75
|
+
srtPrepareSettingsFile?: string | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* Absolute path to the full agent srt settings JSON for the agent wrap.
|
|
78
|
+
* Required when `runner === "srt"`. Staged in `srtSettingsDir`.
|
|
79
|
+
*/
|
|
80
|
+
srtAgentSettingsFile?: string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* Absolute temp dir holding the srt settings files. Required when
|
|
83
|
+
* `runner === "srt"`; torn down by the launch command after srt exits.
|
|
84
|
+
*/
|
|
85
|
+
srtSettingsDir?: string | undefined;
|
|
45
86
|
}
|
|
46
87
|
/**
|
|
47
88
|
* Build the shell command that runs inside the workspace. The prompt is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAcvF;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,MAAwB,GAAG,MAAM,CAgB3E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,MAAM,CAMvF;AAqMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA8B9D;AAED,UAAU,sBAAsB;IAC9B,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;;OAIG;IACH,MAAM,EAAE,WAAW,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CA6B7E"}
|