@clipboard-health/groundcrew 4.50.14 → 4.51.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/crew.config.example.ts +9 -0
- package/dist/commands/openWorkspace.js +1 -1
- package/dist/commands/resumeWorkspace.js +1 -1
- package/dist/commands/setupWorkspace.js +1 -1
- package/dist/lib/agentLaunch.d.ts +2 -2
- package/dist/lib/agentLaunch.d.ts.map +1 -1
- package/dist/lib/agentLaunch.js +2 -2
- package/dist/lib/config.d.ts +13 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +30 -11
- package/dist/lib/launchCommand.d.ts +5 -8
- package/dist/lib/launchCommand.d.ts.map +1 -1
- package/dist/lib/launchCommand.js +6 -2
- package/package.json +1 -1
package/crew.config.example.ts
CHANGED
|
@@ -186,6 +186,15 @@ export default {
|
|
|
186
186
|
// // sdx/none runners.
|
|
187
187
|
// local: { safehouse: { enable: ["agent-browser"] } },
|
|
188
188
|
//
|
|
189
|
+
// // Custom sandbox-exec rules for the agent wrap, forwarded as repeated
|
|
190
|
+
// // `safehouse --append-profile=<path>` flags. For read-only toolchain
|
|
191
|
+
// // directories, prefer `local.readOnlyDirs`; use profiles for other policy
|
|
192
|
+
// // rules. `~` is expanded; missing profiles fail the launch. Ignored by
|
|
193
|
+
// // sdx/none and withheld from repo-controlled prepareWorktree hooks.
|
|
194
|
+
// // Grant only the required access: a supervisor's control socket can let
|
|
195
|
+
// // sandboxed code launch commands outside the sandbox.
|
|
196
|
+
// local: { safehouse: { appendProfile: ["~/.config/groundcrew/mytool.sb"] } },
|
|
197
|
+
//
|
|
189
198
|
// // Groundcrew does not create or authenticate sdx sandboxes. For an sdx
|
|
190
199
|
// // agent, create the matching sandbox yourself before first launch:
|
|
191
200
|
// // sbx create --name groundcrew-claude claude ~/dev/groundcrew
|
|
@@ -190,7 +190,7 @@ export async function openWorkspace(config, options) {
|
|
|
190
190
|
sandboxName,
|
|
191
191
|
workspaceKind,
|
|
192
192
|
readOnlyDirs: config.local.readOnlyDirs,
|
|
193
|
-
|
|
193
|
+
safehouse: config.local.safehouse,
|
|
194
194
|
omitPromptArgument,
|
|
195
195
|
});
|
|
196
196
|
cleanupAgentLaunch = launch.cleanup;
|
|
@@ -224,7 +224,7 @@ export async function resumeWorkspace(config, options) {
|
|
|
224
224
|
markDoneSupported: context.completionMarkDoneSupported,
|
|
225
225
|
}),
|
|
226
226
|
taskSourceWritePaths,
|
|
227
|
-
|
|
227
|
+
safehouse: config.local.safehouse,
|
|
228
228
|
});
|
|
229
229
|
cleanupAgentLaunch = launch.cleanup;
|
|
230
230
|
const launchCmd = stageWorkspaceLaunchCommand(stagedPrompt.directory, launch.command);
|
|
@@ -130,7 +130,7 @@ export async function setupWorkspace(config, options, runOptions = {}) {
|
|
|
130
130
|
markDoneSupported: completionMarkDoneSupported,
|
|
131
131
|
}),
|
|
132
132
|
taskSourceWritePaths,
|
|
133
|
-
|
|
133
|
+
safehouse: config.local.safehouse,
|
|
134
134
|
});
|
|
135
135
|
cleanupAgentLaunch = launch.cleanup;
|
|
136
136
|
const launchCmd = stageWorkspaceLaunchCommand(promptDir, launch.command);
|
|
@@ -5,7 +5,7 @@ export interface ComposedAgentLaunch {
|
|
|
5
5
|
command: string;
|
|
6
6
|
cleanup: () => void;
|
|
7
7
|
}
|
|
8
|
-
/** Build the workspace launch command shared by
|
|
8
|
+
/** Build the workspace launch command shared by setup, resume, and open. */
|
|
9
9
|
export declare function composeAgentLaunch(input: {
|
|
10
10
|
runner: LocalRunner;
|
|
11
11
|
networkEgress: NetworkEgressSetting;
|
|
@@ -22,7 +22,7 @@ export declare function composeAgentLaunch(input: {
|
|
|
22
22
|
workerEnvironment?: WorkerEnvironment | undefined;
|
|
23
23
|
omitPromptArgument?: boolean | undefined;
|
|
24
24
|
taskSourceWritePaths?: readonly string[] | undefined;
|
|
25
|
-
|
|
25
|
+
safehouse: ResolvedConfig["local"]["safehouse"];
|
|
26
26
|
readOnlyDirs?: readonly string[] | undefined;
|
|
27
27
|
/**
|
|
28
28
|
* Test-only seam: overrides `os.homedir()` when staging a relocated agent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentLaunch.d.ts","sourceRoot":"","sources":["../../src/lib/agentLaunch.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAW5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,
|
|
1
|
+
{"version":3,"file":"agentLaunch.d.ts","sourceRoot":"","sources":["../../src/lib/agentLaunch.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAW5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,oBAAoB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,iCAAiC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvD,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAClD,kBAAkB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACzC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrD,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC;IAChD,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,mBAAmB,CA+CtB;AAqHD,UAAU,mBAAmB;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,iFAAiF;IACjF,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsD/B;AAwBD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAchB"}
|
package/dist/lib/agentLaunch.js
CHANGED
|
@@ -15,7 +15,7 @@ import { assertLocalRunnerRequirements, resolveLocalRunner } from "./localRunner
|
|
|
15
15
|
import { sandboxNameFor } from "./sandboxName.js";
|
|
16
16
|
import { debug, readEnvironmentVariable, sleep, writeError } from "./util.js";
|
|
17
17
|
import { resolveWorkspaceKind, workspaces } from "./workspaces.js";
|
|
18
|
-
/** Build the workspace launch command shared by
|
|
18
|
+
/** Build the workspace launch command shared by setup, resume, and open. */
|
|
19
19
|
export function composeAgentLaunch(input) {
|
|
20
20
|
const homeDir = input.homeDir ?? os.homedir();
|
|
21
21
|
const safehouseAgentIntegration = input.runner === "safehouse"
|
|
@@ -48,7 +48,7 @@ export function composeAgentLaunch(input) {
|
|
|
48
48
|
omitPromptArgument: input.omitPromptArgument,
|
|
49
49
|
safehouseAddDirs: input.runner === "safehouse" ? resolveSafehouseAddDirs(input.worktreeDir) : undefined,
|
|
50
50
|
safehouseAgentAddDirs: input.runner === "safehouse" ? (input.taskSourceWritePaths ?? []) : undefined,
|
|
51
|
-
|
|
51
|
+
safehouse: input.safehouse,
|
|
52
52
|
// Safehouse rejects nonexistent --add-dirs-ro paths, so drop absent ones.
|
|
53
53
|
safehouseAgentAddDirsReadOnly: input.runner === "safehouse" ? (input.readOnlyDirs ?? []).filter(existsSync) : undefined,
|
|
54
54
|
safehouseAgentIntegration,
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -333,6 +333,17 @@ export interface Config {
|
|
|
333
333
|
* launch. Defaults to none.
|
|
334
334
|
*/
|
|
335
335
|
enable?: string[];
|
|
336
|
+
/**
|
|
337
|
+
* Custom sandbox-exec rules, forwarded as repeated --append-profile
|
|
338
|
+
* flags on the agent wrap only. Later matching rules can override the
|
|
339
|
+
* generated policy. Prefer local.readOnlyDirs for read-only toolchain
|
|
340
|
+
* access. Paths are trimmed, ~-expanded, and de-duplicated; Safehouse
|
|
341
|
+
* rejects missing profiles at launch. Defaults to none.
|
|
342
|
+
*
|
|
343
|
+
* Grant only the required access. A supervisor's control socket can
|
|
344
|
+
* let sandboxed code launch commands outside the sandbox.
|
|
345
|
+
*/
|
|
346
|
+
appendProfile?: string[];
|
|
336
347
|
};
|
|
337
348
|
/**
|
|
338
349
|
* Host directories re-opened read-only inside the safehouse sandbox, for
|
|
@@ -414,11 +425,12 @@ export interface ResolvedConfig {
|
|
|
414
425
|
*/
|
|
415
426
|
networkEgress: NetworkEgressSetting;
|
|
416
427
|
/**
|
|
417
|
-
* Resolved Safehouse tuning. Always present;
|
|
428
|
+
* Resolved Safehouse tuning. Always present; both lists default to `[]`.
|
|
418
429
|
* Only the safehouse runner consumes it.
|
|
419
430
|
*/
|
|
420
431
|
safehouse: {
|
|
421
432
|
enable: readonly string[];
|
|
433
|
+
appendProfile: readonly string[];
|
|
422
434
|
};
|
|
423
435
|
/** Resolved, `~`-expanded read-only sandbox dirs. Defaults to tfenv's config root. */
|
|
424
436
|
readOnlyDirs: 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":"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
|
|
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
|
@@ -60,9 +60,7 @@ function normalizeLocal(userLocal) {
|
|
|
60
60
|
return {
|
|
61
61
|
runner: normalizeLocalRunner(userLocal?.runner, "local.runner") ?? "auto",
|
|
62
62
|
networkEgress: normalizeNetworkEgress(userLocal?.networkEgress, "local.networkEgress") ?? "allowlisted",
|
|
63
|
-
safehouse:
|
|
64
|
-
enable: normalizeSafehouseEnable(userLocal?.safehouse, "local.safehouse"),
|
|
65
|
-
},
|
|
63
|
+
safehouse: normalizeSafehouse(userLocal?.safehouse, "local.safehouse"),
|
|
66
64
|
readOnlyDirs: normalizeReadOnlyDirs(userLocal?.readOnlyDirs),
|
|
67
65
|
};
|
|
68
66
|
}
|
|
@@ -368,29 +366,50 @@ function normalizeNetworkEgress(value, configKey) {
|
|
|
368
366
|
return value;
|
|
369
367
|
}
|
|
370
368
|
const SAFEHOUSE_FEATURE_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
|
|
371
|
-
function
|
|
369
|
+
function normalizeSafehouse(value, configKey) {
|
|
372
370
|
if (value === undefined) {
|
|
373
|
-
return [];
|
|
371
|
+
return { enable: [], appendProfile: [] };
|
|
374
372
|
}
|
|
375
373
|
if (!isPlainObject(value)) {
|
|
376
374
|
fail(`${configKey} must be an object`);
|
|
377
375
|
}
|
|
378
|
-
|
|
379
|
-
|
|
376
|
+
return {
|
|
377
|
+
enable: normalizeSafehouseEnable(value["enable"], `${configKey}.enable`),
|
|
378
|
+
appendProfile: normalizeSafehouseAppendProfile(value["appendProfile"], `${configKey}.appendProfile`),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
function normalizeSafehouseEnable(value, configKey) {
|
|
382
|
+
if (value === undefined) {
|
|
380
383
|
return [];
|
|
381
384
|
}
|
|
382
|
-
if (!Array.isArray(
|
|
383
|
-
fail(`${configKey}
|
|
385
|
+
if (!Array.isArray(value)) {
|
|
386
|
+
fail(`${configKey} must be an array of safehouse feature names (got ${JSON.stringify(value)})`);
|
|
384
387
|
}
|
|
385
388
|
const features = [];
|
|
386
|
-
for (const [index, entry] of
|
|
389
|
+
for (const [index, entry] of value.entries()) {
|
|
387
390
|
if (typeof entry !== "string" || !SAFEHOUSE_FEATURE_PATTERN.test(entry)) {
|
|
388
|
-
fail(`${configKey}
|
|
391
|
+
fail(`${configKey}[${index}] must be a safehouse feature slug matching ${SAFEHOUSE_FEATURE_PATTERN.source} (got ${JSON.stringify(entry)})`);
|
|
389
392
|
}
|
|
390
393
|
features.push(entry);
|
|
391
394
|
}
|
|
392
395
|
return [...new Set(features)];
|
|
393
396
|
}
|
|
397
|
+
function normalizeSafehouseAppendProfile(value, configKey) {
|
|
398
|
+
if (value === undefined) {
|
|
399
|
+
return [];
|
|
400
|
+
}
|
|
401
|
+
if (!Array.isArray(value)) {
|
|
402
|
+
fail(`${configKey} must be an array of profile paths (got ${JSON.stringify(value)})`);
|
|
403
|
+
}
|
|
404
|
+
const profiles = [];
|
|
405
|
+
for (const [index, entry] of value.entries()) {
|
|
406
|
+
if (typeof entry !== "string" || entry.trim().length === 0) {
|
|
407
|
+
fail(`${configKey}[${index}] must be a non-empty path (got ${JSON.stringify(entry)})`);
|
|
408
|
+
}
|
|
409
|
+
profiles.push(expandHome(entry.trim()));
|
|
410
|
+
}
|
|
411
|
+
return [...new Set(profiles)];
|
|
412
|
+
}
|
|
394
413
|
function normalizeResumeArgs(value, configKey) {
|
|
395
414
|
requireString(value, configKey);
|
|
396
415
|
const trimmed = value.trim();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type LocalRunner, type AgentDefinition, type NetworkEgressSetting } from "./config.ts";
|
|
1
|
+
import { type LocalRunner, type AgentDefinition, type NetworkEgressSetting, type ResolvedConfig } from "./config.ts";
|
|
2
2
|
export { shellSingleQuote } from "./shell.ts";
|
|
3
3
|
/**
|
|
4
4
|
* Return a copy of `definition` whose `cmd` has the agent's `resumeArgs`
|
|
@@ -139,14 +139,11 @@ interface LaunchCommandArguments {
|
|
|
139
139
|
*/
|
|
140
140
|
safehouseAgentAddDirs?: readonly string[] | undefined;
|
|
141
141
|
/**
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
* agent's deny-by-default policy. Withheld from the repo-controlled
|
|
146
|
-
* prepareWorktree wrap, which never needs them. Empty/undefined → no
|
|
147
|
-
* `--enable` flag.
|
|
142
|
+
* Resolved operator tuning, consumed only by the Safehouse agent wrap.
|
|
143
|
+
* Feature names emit --enable; profile paths emit repeated --append-profile
|
|
144
|
+
* flags. Neither applies to the repo-controlled prepareWorktree wrap.
|
|
148
145
|
*/
|
|
149
|
-
|
|
146
|
+
safehouse: ResolvedConfig["local"]["safehouse"];
|
|
150
147
|
/**
|
|
151
148
|
* Extra read-only paths granted only to the Safehouse agent wrap via
|
|
152
149
|
* `--add-dirs-ro` (host toolchains the Safehouse profile masks but doesn't
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,oBAAoB,
|
|
1
|
+
{"version":3,"file":"launchCommand.d.ts","sourceRoot":"","sources":["../../src/lib/launchCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -428,7 +428,8 @@ function buildSafehouseLaunchCommand(arguments_) {
|
|
|
428
428
|
]));
|
|
429
429
|
// Optional sandbox integrations (e.g. `agent-browser`) layered onto the agent
|
|
430
430
|
// profile only — the repo-controlled prepareWorktree hook never needs them.
|
|
431
|
-
const safehouseEnableFlag = safehouseEnableFeaturesFlag(arguments_.
|
|
431
|
+
const safehouseEnableFlag = safehouseEnableFeaturesFlag(arguments_.safehouse.enable);
|
|
432
|
+
const safehouseAppendProfileFlag = safehouseAppendProfilesFlag(arguments_.safehouse.appendProfile);
|
|
432
433
|
const safehouseWrapper = safehouseWrapperCommand(arguments_.networkEgress);
|
|
433
434
|
// Extra paths an integration staged for the agent wrap (e.g. codex's
|
|
434
435
|
// relocated CODEX_HOME) and wants removed alongside the shim dir. Rendered
|
|
@@ -474,7 +475,7 @@ function buildSafehouseLaunchCommand(arguments_) {
|
|
|
474
475
|
// Running the real launch chain as `sh -c` would make it see `sh`, so use
|
|
475
476
|
// an agent-named symlink to /bin/sh. This preserves per-agent profile
|
|
476
477
|
// selection without enabling every agent profile.
|
|
477
|
-
`{ ${safehouseWrapper} ${safehouseAgentAddDirsFlag}${safehouseAgentAddDirsReadOnlyFlag}${safehouseEnableFlag}${agentEnvPassFlag}"$_safehouse_shim" -c ${shellSingleQuote(agentCommand)} sh${promptPositional(arguments_.omitPromptArgument)}; _safehouse_status=$?; rm -rf "$_safehouse_shim_dir";${successPathCleanupSegment(writeBackCmd, teardownCleanupCmd)} trap - EXIT; exit "$_safehouse_status"; }`);
|
|
478
|
+
`{ ${safehouseWrapper} ${safehouseAgentAddDirsFlag}${safehouseAgentAddDirsReadOnlyFlag}${safehouseEnableFlag}${safehouseAppendProfileFlag}${agentEnvPassFlag}"$_safehouse_shim" -c ${shellSingleQuote(agentCommand)} sh${promptPositional(arguments_.omitPromptArgument)}; _safehouse_status=$?; rm -rf "$_safehouse_shim_dir";${successPathCleanupSegment(writeBackCmd, teardownCleanupCmd)} trap - EXIT; exit "$_safehouse_status"; }`);
|
|
478
479
|
return lines.join(" && ");
|
|
479
480
|
}
|
|
480
481
|
/**
|
|
@@ -545,6 +546,9 @@ function safehousePathListFlag(flagName, paths) {
|
|
|
545
546
|
function safehouseEnableFeaturesFlag(features) {
|
|
546
547
|
return features.length === 0 ? "" : `--enable=${shellSingleQuote(features.join(","))} `;
|
|
547
548
|
}
|
|
549
|
+
function safehouseAppendProfilesFlag(profiles) {
|
|
550
|
+
return profiles.map((profile) => `--append-profile=${shellSingleQuote(profile)} `).join("");
|
|
551
|
+
}
|
|
548
552
|
function uniqueStrings(values) {
|
|
549
553
|
return [...new Set(values)];
|
|
550
554
|
}
|
package/package.json
CHANGED