@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.
@@ -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":"AACA,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkBnE,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;AAuBD,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,qBAAqB,EAC9B,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,CAqHf;AAyID,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,IAAI,CAAC,CA4Cf"}
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 { buildLaunchCommand } from "../lib/launchCommand.js";
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 { stageBuildSecrets, stagePromptFromTemplate, stageWorkspaceLaunchCommand, } from "../lib/stagedLaunch.js";
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
- if (arguments_.promptDir !== undefined) {
216
- try {
217
- rmSync(arguments_.promptDir, { recursive: true, force: true });
218
- }
219
- catch {
220
- // The launch command would have removed this; silent on retry races.
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
+ }
@@ -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); `sdx` is Docker
33
- * Sandboxes (`sbx` CLI) — works on Linux and macOS and is the only known
34
- * option that lets the agent use Docker safely without exposing the host
35
- * socket; `none` is an explicit unsandboxed escape hatch.
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` is never picked
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;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -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
- git: { ...DEFAULT_GIT, ...user.git },
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,
@@ -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
@@ -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,CAmB5F"}
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":"AAGA,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;AA2KD,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;CAClC;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CA0B7E"}
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"}