@madarco/agentbox 0.11.2 → 0.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/CHANGELOG.md +75 -0
- package/dist/{_cloud-attach-XWCVLO5V.js → _cloud-attach-XKO4SHR3.js} +3 -3
- package/dist/{chunk-ZGVMN54V.js → chunk-2LF5YILI.js} +21 -3
- package/dist/chunk-2LF5YILI.js.map +1 -0
- package/dist/{chunk-MXXXKJYS.js → chunk-DHJ7OMIP.js} +234 -83
- package/dist/chunk-DHJ7OMIP.js.map +1 -0
- package/dist/{chunk-GYJ62GFL.js → chunk-HFV6THYG.js} +6 -6
- package/dist/{chunk-ZJXTIH6C.js → chunk-IZXPJPPV.js} +1347 -852
- package/dist/chunk-IZXPJPPV.js.map +1 -0
- package/dist/{dist-RAZP76VX.js → dist-24PY2ZMO.js} +3 -3
- package/dist/{dist-PTJ6CEQY.js → dist-47LVLYUV.js} +4 -4
- package/dist/{dist-ASLPRUQR.js → dist-RZZSSUNB.js} +28 -2
- package/dist/{dist-WMQDMTWS.js → dist-SWUOU34W.js} +8 -5
- package/dist/dist-SWUOU34W.js.map +1 -0
- package/dist/index.js +1351 -731
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
- package/runtime/docker/packages/ctl/dist/bin.cjs +335 -4
- package/runtime/docker/packages/sandbox-docker/scripts/gh-shim +86 -5
- package/runtime/hetzner/ctl.cjs +335 -4
- package/runtime/hetzner/gh-shim +86 -5
- package/runtime/relay/bin.cjs +285 -2
- package/runtime/vercel/ctl.cjs +335 -4
- package/runtime/vercel/gh-shim +86 -5
- package/share/host-skills/agentbox/SKILL.md +16 -5
- package/share/host-skills/agentbox-info/SKILL.md +29 -7
- package/dist/chunk-MXXXKJYS.js.map +0 -1
- package/dist/chunk-ZGVMN54V.js.map +0 -1
- package/dist/chunk-ZJXTIH6C.js.map +0 -1
- package/dist/dist-WMQDMTWS.js.map +0 -1
- /package/dist/{_cloud-attach-XWCVLO5V.js.map → _cloud-attach-XKO4SHR3.js.map} +0 -0
- /package/dist/{chunk-GYJ62GFL.js.map → chunk-HFV6THYG.js.map} +0 -0
- /package/dist/{dist-RAZP76VX.js.map → dist-24PY2ZMO.js.map} +0 -0
- /package/dist/{dist-PTJ6CEQY.js.map → dist-47LVLYUV.js.map} +0 -0
- /package/dist/{dist-ASLPRUQR.js.map → dist-RZZSSUNB.js.map} +0 -0
package/runtime/relay/bin.cjs
CHANGED
|
@@ -18036,6 +18036,8 @@ var GH_PR_OPS = [
|
|
|
18036
18036
|
"create",
|
|
18037
18037
|
"view",
|
|
18038
18038
|
"list",
|
|
18039
|
+
"diff",
|
|
18040
|
+
"checks",
|
|
18039
18041
|
"comment",
|
|
18040
18042
|
"review",
|
|
18041
18043
|
"merge",
|
|
@@ -18046,7 +18048,84 @@ var GH_PR_OPS = [
|
|
|
18046
18048
|
function isGhPrOp(value) {
|
|
18047
18049
|
return GH_PR_OPS.includes(value);
|
|
18048
18050
|
}
|
|
18049
|
-
var GH_PR_READ_ONLY_OPS = /* @__PURE__ */ new Set([
|
|
18051
|
+
var GH_PR_READ_ONLY_OPS = /* @__PURE__ */ new Set([
|
|
18052
|
+
"view",
|
|
18053
|
+
"list",
|
|
18054
|
+
"diff",
|
|
18055
|
+
"checks"
|
|
18056
|
+
]);
|
|
18057
|
+
var GH_RUN_OPS = ["list", "view", "rerun"];
|
|
18058
|
+
function isGhRunOp(value) {
|
|
18059
|
+
return GH_RUN_OPS.includes(value);
|
|
18060
|
+
}
|
|
18061
|
+
var GH_RUN_READ_ONLY_OPS = /* @__PURE__ */ new Set(["list", "view"]);
|
|
18062
|
+
var PR_REVIEW_COMMENT = /^repos\/[^/]+\/[^/]+\/pulls\/\d+\/comments(\?.*)?$/;
|
|
18063
|
+
var PR_REVIEW_COMMENT_REPLY = /^repos\/[^/]+\/[^/]+\/pulls\/\d+\/comments\/\d+\/replies(\?.*)?$/;
|
|
18064
|
+
var GH_API_WRITE_ALLOWED_ENDPOINTS = [
|
|
18065
|
+
PR_REVIEW_COMMENT,
|
|
18066
|
+
PR_REVIEW_COMMENT_REPLY
|
|
18067
|
+
];
|
|
18068
|
+
var GH_API_ALLOWED_ENDPOINTS = [...GH_API_WRITE_ALLOWED_ENDPOINTS];
|
|
18069
|
+
function isAllowedGhApiEndpoint(endpoint) {
|
|
18070
|
+
return GH_API_ALLOWED_ENDPOINTS.some((re) => re.test(normalizeGhApiEndpoint(endpoint)));
|
|
18071
|
+
}
|
|
18072
|
+
function isWriteAllowedGhApiEndpoint(endpoint) {
|
|
18073
|
+
return GH_API_WRITE_ALLOWED_ENDPOINTS.some((re) => re.test(normalizeGhApiEndpoint(endpoint)));
|
|
18074
|
+
}
|
|
18075
|
+
function normalizeGhApiEndpoint(endpoint) {
|
|
18076
|
+
return endpoint.replace(/^\/+/, "");
|
|
18077
|
+
}
|
|
18078
|
+
var GH_API_ENDPOINT_REFUSAL = {
|
|
18079
|
+
exitCode: 65,
|
|
18080
|
+
stdout: "",
|
|
18081
|
+
stderr: "gh api: endpoint not allowlisted. Proxied: GET on repos/:owner/:repo/pulls/:number/comments (and /:id/replies); POST to those endpoints to add a review comment.\n"
|
|
18082
|
+
};
|
|
18083
|
+
function refuseGhApiCall(endpoint, args) {
|
|
18084
|
+
const refuse = (reason) => ({
|
|
18085
|
+
exitCode: 65,
|
|
18086
|
+
stdout: "",
|
|
18087
|
+
stderr: `gh api: ${reason}
|
|
18088
|
+
`
|
|
18089
|
+
});
|
|
18090
|
+
let explicitMethod = null;
|
|
18091
|
+
let hasFieldFlag = false;
|
|
18092
|
+
for (let i2 = 0; i2 < args.length; i2++) {
|
|
18093
|
+
const arg = args[i2] ?? "";
|
|
18094
|
+
if (arg === "-X" || arg === "--method") {
|
|
18095
|
+
explicitMethod = args[i2 + 1] ?? "";
|
|
18096
|
+
i2++;
|
|
18097
|
+
continue;
|
|
18098
|
+
}
|
|
18099
|
+
if (arg.startsWith("--method=")) {
|
|
18100
|
+
explicitMethod = arg.slice("--method=".length);
|
|
18101
|
+
continue;
|
|
18102
|
+
}
|
|
18103
|
+
if (arg.startsWith("-X") && arg.length > 2) {
|
|
18104
|
+
explicitMethod = arg.slice(2).replace(/^=/, "");
|
|
18105
|
+
continue;
|
|
18106
|
+
}
|
|
18107
|
+
if (arg === "--input" || arg.startsWith("--input=")) {
|
|
18108
|
+
return refuse("'--input' (stdin/file body) isn't supported through the relay; use -f/-F fields");
|
|
18109
|
+
}
|
|
18110
|
+
if (arg === "-f" || arg === "-F" || arg === "--field" || arg === "--raw-field") {
|
|
18111
|
+
hasFieldFlag = true;
|
|
18112
|
+
i2++;
|
|
18113
|
+
continue;
|
|
18114
|
+
}
|
|
18115
|
+
if (arg.startsWith("-f") || arg.startsWith("-F") || arg.startsWith("--field=") || arg.startsWith("--raw-field=")) {
|
|
18116
|
+
hasFieldFlag = true;
|
|
18117
|
+
}
|
|
18118
|
+
}
|
|
18119
|
+
const method = (explicitMethod ?? (hasFieldFlag ? "POST" : "GET")).toUpperCase();
|
|
18120
|
+
if (method === "GET") return null;
|
|
18121
|
+
if (method === "POST") {
|
|
18122
|
+
if (isWriteAllowedGhApiEndpoint(endpoint)) return null;
|
|
18123
|
+
return refuse(
|
|
18124
|
+
`POST is only proxied to PR review-comment endpoints (repos/:o/:r/pulls/:n/comments[/:id/replies]), not '${endpoint}'`
|
|
18125
|
+
);
|
|
18126
|
+
}
|
|
18127
|
+
return refuse(`method '${method}' is not proxied \u2014 only GET, and POST to comment endpoints, are allowed`);
|
|
18128
|
+
}
|
|
18050
18129
|
function injectPrCreateHead(op, branch, args) {
|
|
18051
18130
|
if (op !== "create") return args;
|
|
18052
18131
|
if (!branch || branch === "HEAD") return args;
|
|
@@ -18462,6 +18541,12 @@ async function executeCloudAction(action, deps) {
|
|
|
18462
18541
|
if (action.method.startsWith("gh.pr.")) {
|
|
18463
18542
|
return runGhPrRpc(action, deps);
|
|
18464
18543
|
}
|
|
18544
|
+
if (action.method.startsWith("gh.run.")) {
|
|
18545
|
+
return runGhRunRpc(action, deps);
|
|
18546
|
+
}
|
|
18547
|
+
if (action.method === "gh.api") {
|
|
18548
|
+
return runGhApiRpc(action, deps);
|
|
18549
|
+
}
|
|
18465
18550
|
if (action.method === "git.clone" || action.method === "gh.repo.clone") {
|
|
18466
18551
|
return {
|
|
18467
18552
|
exitCode: 64,
|
|
@@ -18570,6 +18655,66 @@ async function runGhPrRpc(action, deps) {
|
|
|
18570
18655
|
if (prCreateNeedsHead(op, finalArgs)) return PR_CREATE_NO_HEAD_REFUSAL;
|
|
18571
18656
|
return runHostGh(["pr", op, ...finalArgs], lookup.workspacePath);
|
|
18572
18657
|
}
|
|
18658
|
+
async function cloudWriteConfirm(deps, command, cwd, args) {
|
|
18659
|
+
if (!deps.prompts || !deps.subscribers) return null;
|
|
18660
|
+
const ctx = {
|
|
18661
|
+
kind: "confirm",
|
|
18662
|
+
message: `Allow ${command} from cloud box ${deps.boxName ?? deps.boxId}?`,
|
|
18663
|
+
detail: args.join(" ").slice(0, 200),
|
|
18664
|
+
defaultAnswer: "n",
|
|
18665
|
+
context: { command, cwd, argv: args }
|
|
18666
|
+
};
|
|
18667
|
+
const hasSubscriber = deps.subscribers.forBox(deps.boxId).length > 0;
|
|
18668
|
+
if (!hasSubscriber && process.env["AGENTBOX_PROMPT"] !== "off") {
|
|
18669
|
+
const noSubMode = (process.env["AGENTBOX_GH_NO_SUB"] ?? "deny").toLowerCase();
|
|
18670
|
+
if (noSubMode === "deny") {
|
|
18671
|
+
return {
|
|
18672
|
+
exitCode: 10,
|
|
18673
|
+
stdout: "",
|
|
18674
|
+
stderr: "denied automatically \u2014 no attached wrapper to confirm. Attach `agentbox claude` (or similar) and retry, or set AGENTBOX_GH_NO_SUB=allow.\n"
|
|
18675
|
+
};
|
|
18676
|
+
}
|
|
18677
|
+
if (noSubMode === "allow") {
|
|
18678
|
+
deps.log?.(`${command} auto-approved (no subscribers, AGENTBOX_GH_NO_SUB=allow)`);
|
|
18679
|
+
return null;
|
|
18680
|
+
}
|
|
18681
|
+
const verdict2 = await askPrompt(deps.prompts, deps.subscribers, deps.boxId, ctx, {
|
|
18682
|
+
ttlMs: 5 * 60 * 1e3
|
|
18683
|
+
});
|
|
18684
|
+
return verdict2.answer === "y" ? null : { exitCode: 10, stdout: "", stderr: "denied by user\n" };
|
|
18685
|
+
}
|
|
18686
|
+
const verdict = await askPrompt(deps.prompts, deps.subscribers, deps.boxId, ctx);
|
|
18687
|
+
return verdict.answer === "y" ? null : { exitCode: 10, stdout: "", stderr: "denied by user\n" };
|
|
18688
|
+
}
|
|
18689
|
+
async function runGhRunRpc(action, deps) {
|
|
18690
|
+
const op = action.method.slice("gh.run.".length);
|
|
18691
|
+
if (!isGhRunOp(op)) {
|
|
18692
|
+
return { exitCode: 64, stdout: "", stderr: `unknown gh.run.* op: ${op}
|
|
18693
|
+
` };
|
|
18694
|
+
}
|
|
18695
|
+
const params = action.params ?? {};
|
|
18696
|
+
const args = Array.isArray(params.args) ? params.args.filter((a2) => typeof a2 === "string") : [];
|
|
18697
|
+
const ghReady = await assertGhReady();
|
|
18698
|
+
if (ghReady) return ghReady;
|
|
18699
|
+
const lookup = await lookupCloudBox(deps.boxId);
|
|
18700
|
+
if (!GH_RUN_READ_ONLY_OPS.has(op)) {
|
|
18701
|
+
const denied = await cloudWriteConfirm(deps, `gh run ${op}`, params.path, args);
|
|
18702
|
+
if (denied) return denied;
|
|
18703
|
+
}
|
|
18704
|
+
return runHostGh(["run", op, ...args], lookup.workspacePath);
|
|
18705
|
+
}
|
|
18706
|
+
async function runGhApiRpc(action, deps) {
|
|
18707
|
+
const params = action.params ?? {};
|
|
18708
|
+
const endpoint = typeof params.endpoint === "string" ? params.endpoint : "";
|
|
18709
|
+
if (!isAllowedGhApiEndpoint(endpoint)) return GH_API_ENDPOINT_REFUSAL;
|
|
18710
|
+
const args = Array.isArray(params.args) ? params.args.filter((a2) => typeof a2 === "string") : [];
|
|
18711
|
+
const callRefusal = refuseGhApiCall(endpoint, args);
|
|
18712
|
+
if (callRefusal) return callRefusal;
|
|
18713
|
+
const ghReady = await assertGhReady();
|
|
18714
|
+
if (ghReady) return ghReady;
|
|
18715
|
+
const lookup = await lookupCloudBox(deps.boxId);
|
|
18716
|
+
return runHostGh(["api", endpoint, ...args], lookup.workspacePath);
|
|
18717
|
+
}
|
|
18573
18718
|
async function runBrowserOpenMirror(action, deps) {
|
|
18574
18719
|
const params = action.params ?? {};
|
|
18575
18720
|
const url = typeof params.url === "string" ? params.url.trim() : "";
|
|
@@ -19506,6 +19651,29 @@ function createRelayServer(opts) {
|
|
|
19506
19651
|
send(res, status, result);
|
|
19507
19652
|
return;
|
|
19508
19653
|
}
|
|
19654
|
+
if (body.method.startsWith("gh.run.")) {
|
|
19655
|
+
const op = body.method.slice("gh.run.".length);
|
|
19656
|
+
if (!isGhRunOp(op)) {
|
|
19657
|
+
send(res, 400, { error: `unknown gh.run.* op: ${op}` });
|
|
19658
|
+
return;
|
|
19659
|
+
}
|
|
19660
|
+
const result = await handleGhRunRpc(
|
|
19661
|
+
op,
|
|
19662
|
+
reg,
|
|
19663
|
+
body.params,
|
|
19664
|
+
prompts,
|
|
19665
|
+
subscribers
|
|
19666
|
+
);
|
|
19667
|
+
const status = result.exitCode === 0 ? 200 : 500;
|
|
19668
|
+
send(res, status, result);
|
|
19669
|
+
return;
|
|
19670
|
+
}
|
|
19671
|
+
if (body.method === "gh.api") {
|
|
19672
|
+
const result = await handleGhApiRpc(reg, body.params);
|
|
19673
|
+
const status = result.exitCode === 0 ? 200 : 500;
|
|
19674
|
+
send(res, status, result);
|
|
19675
|
+
return;
|
|
19676
|
+
}
|
|
19509
19677
|
if (body.method === "git.clone" || body.method === "gh.repo.clone") {
|
|
19510
19678
|
send(res, 501, {
|
|
19511
19679
|
exitCode: 64,
|
|
@@ -19983,6 +20151,53 @@ async function handleGhPrRpc(op, reg, params, prompts, subscribers, hostInitiate
|
|
|
19983
20151
|
if (prCreateNeedsHead(op, finalArgs)) return PR_CREATE_NO_HEAD_REFUSAL;
|
|
19984
20152
|
return runHostGh(["pr", op, ...finalArgs], worktree.hostMainRepo);
|
|
19985
20153
|
}
|
|
20154
|
+
async function handleGhRunRpc(op, reg, params, prompts, subscribers) {
|
|
20155
|
+
const containerPath = params?.path ?? "/workspace";
|
|
20156
|
+
const worktree = resolveWorktree(reg, containerPath);
|
|
20157
|
+
if (!worktree) {
|
|
20158
|
+
return {
|
|
20159
|
+
exitCode: 64,
|
|
20160
|
+
stdout: "",
|
|
20161
|
+
stderr: `no worktree registered for box ${reg.boxId} matching ${containerPath}`
|
|
20162
|
+
};
|
|
20163
|
+
}
|
|
20164
|
+
const ghReady = await assertGhReady();
|
|
20165
|
+
if (ghReady) return ghReady;
|
|
20166
|
+
const args = Array.isArray(params?.args) ? params.args.filter((a2) => typeof a2 === "string") : [];
|
|
20167
|
+
if (!GH_RUN_READ_ONLY_OPS.has(op)) {
|
|
20168
|
+
const detail = args.join(" ").slice(0, 200);
|
|
20169
|
+
const verdict = await askPrompt(prompts, subscribers, reg.boxId, {
|
|
20170
|
+
kind: "confirm",
|
|
20171
|
+
message: `Allow gh run ${op} from box ${reg.name}?`,
|
|
20172
|
+
detail,
|
|
20173
|
+
defaultAnswer: "n",
|
|
20174
|
+
context: { command: `gh run ${op}`, cwd: containerPath, argv: args }
|
|
20175
|
+
});
|
|
20176
|
+
if (verdict.answer !== "y") {
|
|
20177
|
+
return { exitCode: 10, stdout: "", stderr: "denied by user\n" };
|
|
20178
|
+
}
|
|
20179
|
+
}
|
|
20180
|
+
return runHostGh(["run", op, ...args], worktree.hostMainRepo);
|
|
20181
|
+
}
|
|
20182
|
+
async function handleGhApiRpc(reg, params) {
|
|
20183
|
+
const containerPath = params?.path ?? "/workspace";
|
|
20184
|
+
const worktree = resolveWorktree(reg, containerPath);
|
|
20185
|
+
if (!worktree) {
|
|
20186
|
+
return {
|
|
20187
|
+
exitCode: 64,
|
|
20188
|
+
stdout: "",
|
|
20189
|
+
stderr: `no worktree registered for box ${reg.boxId} matching ${containerPath}`
|
|
20190
|
+
};
|
|
20191
|
+
}
|
|
20192
|
+
const endpoint = typeof params?.endpoint === "string" ? params.endpoint : "";
|
|
20193
|
+
if (!isAllowedGhApiEndpoint(endpoint)) return GH_API_ENDPOINT_REFUSAL;
|
|
20194
|
+
const args = Array.isArray(params?.args) ? params.args.filter((a2) => typeof a2 === "string") : [];
|
|
20195
|
+
const callRefusal = refuseGhApiCall(endpoint, args);
|
|
20196
|
+
if (callRefusal) return callRefusal;
|
|
20197
|
+
const ghReady = await assertGhReady();
|
|
20198
|
+
if (ghReady) return ghReady;
|
|
20199
|
+
return runHostGh(["api", endpoint, ...args], worktree.hostMainRepo);
|
|
20200
|
+
}
|
|
19986
20201
|
async function handleCpRpc(reg, method, params) {
|
|
19987
20202
|
const entry = process.env.AGENTBOX_CLI_ENTRY;
|
|
19988
20203
|
if (!entry) {
|
|
@@ -20110,13 +20325,23 @@ var BUILT_IN_DEFAULTS = {
|
|
|
20110
20325
|
defaultCheckpointDaytona: "",
|
|
20111
20326
|
defaultCheckpointHetzner: "",
|
|
20112
20327
|
defaultCheckpointVercel: "",
|
|
20328
|
+
size: "",
|
|
20329
|
+
sizeDocker: "",
|
|
20330
|
+
sizeDaytona: "",
|
|
20331
|
+
sizeHetzner: "",
|
|
20332
|
+
sizeVercel: "",
|
|
20113
20333
|
withPlaywright: false,
|
|
20114
20334
|
withEnv: false,
|
|
20335
|
+
resyncOnStart: true,
|
|
20115
20336
|
vnc: true,
|
|
20116
20337
|
isolateClaudeConfig: false,
|
|
20117
20338
|
isolateCodexConfig: false,
|
|
20118
20339
|
isolateOpencodeConfig: false,
|
|
20119
20340
|
image: "agentbox/box:dev",
|
|
20341
|
+
imageDocker: "",
|
|
20342
|
+
imageDaytona: "",
|
|
20343
|
+
imageHetzner: "",
|
|
20344
|
+
imageVercel: "",
|
|
20120
20345
|
// Mirrors BOX_IMAGE_REGISTRY in @agentbox/sandbox-docker. Empty disables the
|
|
20121
20346
|
// registry pull (always build the docker base image locally).
|
|
20122
20347
|
imageRegistry: "ghcr.io/madarco/agentbox/box",
|
|
@@ -20234,6 +20459,35 @@ var KEY_REGISTRY = [
|
|
|
20234
20459
|
description: "Per-provider override of `box.defaultCheckpoint` for vercel. Wins over the global when set; set via `agentbox checkpoint set-default --provider vercel`.",
|
|
20235
20460
|
advanced: true
|
|
20236
20461
|
},
|
|
20462
|
+
{
|
|
20463
|
+
key: "box.size",
|
|
20464
|
+
type: "string",
|
|
20465
|
+
description: "Default VM size for cloud providers. Provider-interpreted: hetzner = server type (e.g. `cx33`); daytona = `cpu-memory-disk` GB (e.g. `4-8-20`). Used as fallback when no per-provider override is set. Docker/Vercel ignore it."
|
|
20466
|
+
},
|
|
20467
|
+
{
|
|
20468
|
+
key: "box.sizeDocker",
|
|
20469
|
+
type: "string",
|
|
20470
|
+
description: "Per-provider override of `box.size` for docker. Reserved \u2014 docker sizing is controlled via `box.memory` / `box.cpus` / `box.disk`.",
|
|
20471
|
+
advanced: true
|
|
20472
|
+
},
|
|
20473
|
+
{
|
|
20474
|
+
key: "box.sizeDaytona",
|
|
20475
|
+
type: "string",
|
|
20476
|
+
description: "Per-provider override of `box.size` for daytona. `cpu-memory-disk` GB spec (e.g. `4-8-20`). Only honored on the image/Dockerfile create path; Daytona rejects custom resources on snapshot-resume.",
|
|
20477
|
+
advanced: true
|
|
20478
|
+
},
|
|
20479
|
+
{
|
|
20480
|
+
key: "box.sizeHetzner",
|
|
20481
|
+
type: "string",
|
|
20482
|
+
description: "Per-provider override of `box.size` for hetzner. Server type string (e.g. `cx23`, `cx33`, `cx43`).",
|
|
20483
|
+
advanced: true
|
|
20484
|
+
},
|
|
20485
|
+
{
|
|
20486
|
+
key: "box.sizeVercel",
|
|
20487
|
+
type: "string",
|
|
20488
|
+
description: "Per-provider override of `box.size` for vercel. Reserved \u2014 vercel sizing is controlled via `box.vercelVcpus`.",
|
|
20489
|
+
advanced: true
|
|
20490
|
+
},
|
|
20237
20491
|
{
|
|
20238
20492
|
key: "checkpoint.maxLayers",
|
|
20239
20493
|
type: "int",
|
|
@@ -20250,6 +20504,11 @@ var KEY_REGISTRY = [
|
|
|
20250
20504
|
type: "bool",
|
|
20251
20505
|
description: "Copy host env/config files (.env*, secrets.toml, agentbox.yaml, ...) into /workspace at box create time (gitignore-bypassing)."
|
|
20252
20506
|
},
|
|
20507
|
+
{
|
|
20508
|
+
key: "box.resyncOnStart",
|
|
20509
|
+
type: "bool",
|
|
20510
|
+
description: "Merge the host's current branch into the box and overlay the host's uncommitted/untracked changes when starting an agent session (keeps the box's version on conflict and warns the agent)."
|
|
20511
|
+
},
|
|
20253
20512
|
{
|
|
20254
20513
|
key: "box.vnc",
|
|
20255
20514
|
type: "bool",
|
|
@@ -20273,7 +20532,31 @@ var KEY_REGISTRY = [
|
|
|
20273
20532
|
{
|
|
20274
20533
|
key: "box.image",
|
|
20275
20534
|
type: "string",
|
|
20276
|
-
description: "
|
|
20535
|
+
description: "Generic box image ref (fallback). Used as fallback when no per-provider override is set; the default `agentbox/box:dev` is treated as a sentinel by cloud backends (boot from their prepared base snapshot instead).",
|
|
20536
|
+
advanced: true
|
|
20537
|
+
},
|
|
20538
|
+
{
|
|
20539
|
+
key: "box.imageDocker",
|
|
20540
|
+
type: "string",
|
|
20541
|
+
description: "Per-provider override of `box.image` for docker (local docker image ref, e.g. `agentbox/box:dev`). Wins over the generic when set.",
|
|
20542
|
+
advanced: true
|
|
20543
|
+
},
|
|
20544
|
+
{
|
|
20545
|
+
key: "box.imageDaytona",
|
|
20546
|
+
type: "string",
|
|
20547
|
+
description: "Per-provider override of `box.image` for daytona (named snapshot, e.g. `agentbox-base-<fingerprint>`). Written by `agentbox prepare --provider daytona`.",
|
|
20548
|
+
advanced: true
|
|
20549
|
+
},
|
|
20550
|
+
{
|
|
20551
|
+
key: "box.imageHetzner",
|
|
20552
|
+
type: "string",
|
|
20553
|
+
description: "Per-provider override of `box.image` for hetzner (image description, e.g. `agentbox-base-<fingerprint>`). Written by `agentbox prepare --provider hetzner`.",
|
|
20554
|
+
advanced: true
|
|
20555
|
+
},
|
|
20556
|
+
{
|
|
20557
|
+
key: "box.imageVercel",
|
|
20558
|
+
type: "string",
|
|
20559
|
+
description: "Per-provider override of `box.image` for vercel (snapshot id, e.g. `snap_\u2026`). Written by `agentbox prepare --provider vercel`.",
|
|
20277
20560
|
advanced: true
|
|
20278
20561
|
},
|
|
20279
20562
|
{
|