@lambdacurry/arbor 0.17.5 → 0.18.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/arbor.js +148 -154
- package/package.json +1 -1
package/dist/arbor.js
CHANGED
|
@@ -1671,6 +1671,29 @@ var computerSessions = sqliteTable("computer_sessions", {
|
|
|
1671
1671
|
computerIdx: index("computer_sessions_computer_idx").on(t.computerId, t.attachedAt),
|
|
1672
1672
|
threadIdx: index("computer_sessions_thread_idx").on(t.threadId, t.attachedAt)
|
|
1673
1673
|
}));
|
|
1674
|
+
var computerRuns = sqliteTable("computer_runs", {
|
|
1675
|
+
id: text("id").primaryKey(),
|
|
1676
|
+
computerId: text("computer_id").notNull().references(() => threadComputers.id),
|
|
1677
|
+
threadId: text("thread_id").notNull().references(() => threads.id),
|
|
1678
|
+
computerSessionId: text("computer_session_id").notNull().references(() => computerSessions.id),
|
|
1679
|
+
profileId: text("profile_id").notNull().references(() => profiles.id),
|
|
1680
|
+
executionContextId: text("execution_context_id").notNull().references(() => executionContexts.id),
|
|
1681
|
+
mode: text("mode").$type().notNull(),
|
|
1682
|
+
isolation: text("isolation").$type().notNull(),
|
|
1683
|
+
workspaceDir: text("workspace_dir").notNull(),
|
|
1684
|
+
workspaceRef: text("workspace_ref"),
|
|
1685
|
+
baseSnapshotId: text("base_snapshot_id"),
|
|
1686
|
+
status: text("status").$type().notNull().default("active"),
|
|
1687
|
+
label: text("label"),
|
|
1688
|
+
reason: text("reason"),
|
|
1689
|
+
startedAt: ts("started_at").notNull(),
|
|
1690
|
+
endedAt: ts("ended_at")
|
|
1691
|
+
}, (t) => ({
|
|
1692
|
+
computerIdx: index("computer_runs_computer_idx").on(t.computerId, t.startedAt),
|
|
1693
|
+
threadIdx: index("computer_runs_thread_idx").on(t.threadId, t.startedAt),
|
|
1694
|
+
sessionIdx: index("computer_runs_session_idx").on(t.computerSessionId, t.startedAt),
|
|
1695
|
+
statusIdx: index("computer_runs_status_idx").on(t.computerId, t.status)
|
|
1696
|
+
}));
|
|
1674
1697
|
var computerSnapshots = sqliteTable("computer_snapshots", {
|
|
1675
1698
|
id: text("id").primaryKey(),
|
|
1676
1699
|
ownerScope: text("owner_scope").$type().notNull(),
|
|
@@ -2174,6 +2197,11 @@ var watches = sqliteTable("watches", {
|
|
|
2174
2197
|
watchUq: uniqueIndex("watches_watcher_target_uniq").on(t.watcherProfileId, t.targetType, t.targetId),
|
|
2175
2198
|
watchTargetIdx: index("watches_target_idx").on(t.targetType, t.targetId)
|
|
2176
2199
|
}));
|
|
2200
|
+
// ../core/src/ops/computer-run.ts
|
|
2201
|
+
var COMPUTER_WORKSPACE_ROOT = "/workspace";
|
|
2202
|
+
var COMPUTER_RUN_WORKSPACE_ROOT = `${COMPUTER_WORKSPACE_ROOT}/.arbor-runs`;
|
|
2203
|
+
var TERMINAL = new Set(["finished", "failed", "cancelled"]);
|
|
2204
|
+
|
|
2177
2205
|
// ../core/src/ops/computer.ts
|
|
2178
2206
|
var MAX_COMPUTER_REPOSITORIES = 10;
|
|
2179
2207
|
|
|
@@ -16737,6 +16765,43 @@ var computerProfile = exports_external.looseObject({
|
|
|
16737
16765
|
tools: exports_external.array(exports_external.string()),
|
|
16738
16766
|
recommendedEditingPrimitive: exports_external.string()
|
|
16739
16767
|
});
|
|
16768
|
+
var computerRun = exports_external.looseObject({
|
|
16769
|
+
runId: id,
|
|
16770
|
+
computerId: id,
|
|
16771
|
+
threadId: id,
|
|
16772
|
+
computerSessionId: id,
|
|
16773
|
+
profileId: id,
|
|
16774
|
+
executionContextId: id,
|
|
16775
|
+
mode: exports_external.enum(["read", "write"]),
|
|
16776
|
+
isolation: exports_external.enum(["shared", "isolated"]),
|
|
16777
|
+
workspaceDir: exports_external.string(),
|
|
16778
|
+
workspaceRef: exports_external.string().nullable(),
|
|
16779
|
+
baseSnapshotId: id.nullable(),
|
|
16780
|
+
status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
|
|
16781
|
+
label: exports_external.string().nullable(),
|
|
16782
|
+
reason: exports_external.string().nullable(),
|
|
16783
|
+
startedAt: exports_external.string(),
|
|
16784
|
+
endedAt: exports_external.string().nullable()
|
|
16785
|
+
});
|
|
16786
|
+
var computerRunReceipt = exports_external.looseObject({
|
|
16787
|
+
runId: id,
|
|
16788
|
+
threadId: id,
|
|
16789
|
+
computerId: id,
|
|
16790
|
+
computerSessionId: id,
|
|
16791
|
+
actor: exports_external.looseObject({ profileId: id, executionContextId: id }),
|
|
16792
|
+
label: exports_external.string().nullable(),
|
|
16793
|
+
mode: exports_external.enum(["read", "write"]),
|
|
16794
|
+
isolation: exports_external.enum(["shared", "isolated"]),
|
|
16795
|
+
workspace: exports_external.looseObject({ dir: exports_external.string(), ref: exports_external.string().nullable() }),
|
|
16796
|
+
baseSnapshotId: id.nullable(),
|
|
16797
|
+
status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
|
|
16798
|
+
outcome: exports_external.enum(["finished", "failed", "cancelled"]).nullable(),
|
|
16799
|
+
reason: exports_external.string().nullable(),
|
|
16800
|
+
startedAt: exports_external.string(),
|
|
16801
|
+
endedAt: exports_external.string().nullable(),
|
|
16802
|
+
durationMs: exports_external.number().nullable(),
|
|
16803
|
+
lifecycle: exports_external.array(exports_external.looseObject({ type: exports_external.string(), at: exports_external.string() }))
|
|
16804
|
+
});
|
|
16740
16805
|
var computerCapabilityCard = exports_external.looseObject({
|
|
16741
16806
|
capabilities: exports_external.array(exports_external.looseObject({
|
|
16742
16807
|
id: exports_external.string(),
|
|
@@ -17354,6 +17419,28 @@ var MCP_OUTPUT_SCHEMAS = {
|
|
|
17354
17419
|
toContainerProfileRevision: exports_external.number().int().nullable()
|
|
17355
17420
|
}).optional()
|
|
17356
17421
|
}),
|
|
17422
|
+
computer_run_start: exports_external.looseObject({
|
|
17423
|
+
run: computerRun,
|
|
17424
|
+
workspace: exports_external.looseObject({
|
|
17425
|
+
workspaceRoot: exports_external.string(),
|
|
17426
|
+
repositories: exports_external.array(exports_external.looseObject({ repository: exports_external.string(), path: exports_external.string() })),
|
|
17427
|
+
defaultCwd: exports_external.string(),
|
|
17428
|
+
ref: exports_external.string().nullable().optional(),
|
|
17429
|
+
root: exports_external.string().optional()
|
|
17430
|
+
})
|
|
17431
|
+
}),
|
|
17432
|
+
computer_run_finish: exports_external.looseObject({
|
|
17433
|
+
run: computerRun,
|
|
17434
|
+
replayed: exports_external.boolean()
|
|
17435
|
+
}),
|
|
17436
|
+
computer_run_receipt: exports_external.looseObject({
|
|
17437
|
+
receipt: computerRunReceipt
|
|
17438
|
+
}),
|
|
17439
|
+
computer_runs: exports_external.looseObject({
|
|
17440
|
+
computerId: id,
|
|
17441
|
+
threadId: id,
|
|
17442
|
+
runs: exports_external.array(computerRun)
|
|
17443
|
+
}),
|
|
17357
17444
|
computer_reprovision: exports_external.looseObject({
|
|
17358
17445
|
reprovisionId: id,
|
|
17359
17446
|
threadId: id,
|
|
@@ -17422,11 +17509,6 @@ var MCP_OUTPUT_SCHEMAS = {
|
|
|
17422
17509
|
sha256: exports_external.string()
|
|
17423
17510
|
})
|
|
17424
17511
|
}),
|
|
17425
|
-
computer_read: exports_external.looseObject({
|
|
17426
|
-
content: exports_external.string(),
|
|
17427
|
-
size: exports_external.number().optional(),
|
|
17428
|
-
encoding: exports_external.string().optional()
|
|
17429
|
-
}),
|
|
17430
17512
|
computer_export: exports_external.looseObject({
|
|
17431
17513
|
computerSessionId: id,
|
|
17432
17514
|
replayed: exports_external.boolean(),
|
|
@@ -17438,56 +17520,6 @@ var MCP_OUTPUT_SCHEMAS = {
|
|
|
17438
17520
|
path: exports_external.string().optional(),
|
|
17439
17521
|
size: exports_external.number().optional()
|
|
17440
17522
|
}),
|
|
17441
|
-
computer_clone: exports_external.looseObject({
|
|
17442
|
-
ok: exports_external.literal(true),
|
|
17443
|
-
operation: exports_external.literal("clone"),
|
|
17444
|
-
repository: exports_external.string(),
|
|
17445
|
-
dir: exports_external.string(),
|
|
17446
|
-
credential: exports_external.literal("caller"),
|
|
17447
|
-
branch: exports_external.string().optional(),
|
|
17448
|
-
head: exports_external.string().optional(),
|
|
17449
|
-
refs: exports_external.array(exports_external.string()).optional()
|
|
17450
|
-
}),
|
|
17451
|
-
computer_fetch: exports_external.looseObject({
|
|
17452
|
-
ok: exports_external.literal(true),
|
|
17453
|
-
operation: exports_external.literal("fetch"),
|
|
17454
|
-
repository: exports_external.string(),
|
|
17455
|
-
dir: exports_external.string(),
|
|
17456
|
-
credential: exports_external.enum(["caller", "arbor-managed"]),
|
|
17457
|
-
branch: exports_external.string().optional(),
|
|
17458
|
-
head: exports_external.string().optional(),
|
|
17459
|
-
fetchHead: exports_external.string().optional(),
|
|
17460
|
-
refs: exports_external.array(exports_external.string()).optional()
|
|
17461
|
-
}),
|
|
17462
|
-
computer_pull: exports_external.looseObject({
|
|
17463
|
-
ok: exports_external.literal(true),
|
|
17464
|
-
operation: exports_external.literal("pull"),
|
|
17465
|
-
repository: exports_external.string(),
|
|
17466
|
-
dir: exports_external.string(),
|
|
17467
|
-
credential: exports_external.enum(["caller", "arbor-managed"]),
|
|
17468
|
-
branch: exports_external.string().optional(),
|
|
17469
|
-
head: exports_external.string().optional(),
|
|
17470
|
-
before: exports_external.string().optional(),
|
|
17471
|
-
after: exports_external.string().optional(),
|
|
17472
|
-
fetchHead: exports_external.string().optional(),
|
|
17473
|
-
refs: exports_external.array(exports_external.string()).optional(),
|
|
17474
|
-
remoteTracking: exports_external.union([
|
|
17475
|
-
exports_external.looseObject({ updated: exports_external.literal(true), ref: exports_external.string(), head: exports_external.string() }),
|
|
17476
|
-
exports_external.looseObject({ updated: exports_external.literal(false), reason: exports_external.literal("untracked_workspace") })
|
|
17477
|
-
])
|
|
17478
|
-
}),
|
|
17479
|
-
computer_push: exports_external.looseObject({
|
|
17480
|
-
ok: exports_external.literal(true),
|
|
17481
|
-
operation: exports_external.literal("push"),
|
|
17482
|
-
repository: exports_external.string(),
|
|
17483
|
-
dir: exports_external.string(),
|
|
17484
|
-
credential: exports_external.enum(["caller", "github-user"]),
|
|
17485
|
-
branch: exports_external.string().optional(),
|
|
17486
|
-
head: exports_external.string().optional(),
|
|
17487
|
-
before: exports_external.string().optional(),
|
|
17488
|
-
after: exports_external.string().optional(),
|
|
17489
|
-
refs: exports_external.array(exports_external.string()).optional()
|
|
17490
|
-
}),
|
|
17491
17523
|
computer_checkpoint: checkpoint,
|
|
17492
17524
|
computer_publish_preview: exports_external.looseObject({
|
|
17493
17525
|
previewId: id,
|
|
@@ -17602,12 +17634,6 @@ var destructiveOpenWorld = {
|
|
|
17602
17634
|
idempotentHint: false,
|
|
17603
17635
|
openWorldHint: true
|
|
17604
17636
|
};
|
|
17605
|
-
var idempotentOpenWorld = {
|
|
17606
|
-
readOnlyHint: false,
|
|
17607
|
-
destructiveHint: false,
|
|
17608
|
-
idempotentHint: true,
|
|
17609
|
-
openWorldHint: true
|
|
17610
|
-
};
|
|
17611
17637
|
var MCP_TOOL_ANNOTATIONS = {
|
|
17612
17638
|
server_info: readOnly,
|
|
17613
17639
|
recall: readOnly,
|
|
@@ -17681,6 +17707,10 @@ var MCP_TOOL_ANNOTATIONS = {
|
|
|
17681
17707
|
github_connect_repository: idempotent,
|
|
17682
17708
|
computer_open: additive,
|
|
17683
17709
|
computer_reprovision: destructiveIdempotent,
|
|
17710
|
+
computer_run_start: additive,
|
|
17711
|
+
computer_run_finish: idempotent,
|
|
17712
|
+
computer_run_receipt: readOnly,
|
|
17713
|
+
computer_runs: readOnly,
|
|
17684
17714
|
computer_exec: destructiveOpenWorld,
|
|
17685
17715
|
computer_process_read: readOnly,
|
|
17686
17716
|
computer_process_terminate: destructiveOpenWorld,
|
|
@@ -17691,13 +17721,8 @@ var MCP_TOOL_ANNOTATIONS = {
|
|
|
17691
17721
|
code_implementations: readOnly,
|
|
17692
17722
|
code_diagnostics: readOnly,
|
|
17693
17723
|
computer_verify: openWorld,
|
|
17694
|
-
computer_read: readOnly,
|
|
17695
17724
|
computer_export: idempotent,
|
|
17696
17725
|
computer_write: destructive,
|
|
17697
|
-
computer_clone: idempotentOpenWorld,
|
|
17698
|
-
computer_fetch: idempotentOpenWorld,
|
|
17699
|
-
computer_pull: destructiveOpenWorld,
|
|
17700
|
-
computer_push: destructiveOpenWorld,
|
|
17701
17726
|
computer_checkpoint: additive,
|
|
17702
17727
|
computer_publish_preview: idempotent,
|
|
17703
17728
|
computer_publish_app_bundle: idempotent,
|
|
@@ -18086,14 +18111,65 @@ var ACTION_DEFINITIONS = [
|
|
|
18086
18111
|
toolset: "loop",
|
|
18087
18112
|
run: forward("computer_runtime.reprovision")
|
|
18088
18113
|
},
|
|
18114
|
+
{
|
|
18115
|
+
name: "computer_run_start",
|
|
18116
|
+
title: "Start a run",
|
|
18117
|
+
description: "Start one unit of work inside an opened Thread computer and receive the workspace it may use. A write run is given its OWN mutable checkout — a working tree per materialized repository, forked from the computer's current shared state — so a second task started on the SAME computer does not land in its edits. Pass the returned runId to computer_exec and computer_write: exec starts in that checkout and write's path is confined to it, so an Arbor-routed path cannot address the shared workspace or another run's checkout. This routes collaborating tasks apart rather than sandboxing them — the raw command text is not sandboxed, so an absolute path inside a command string still reaches the shared workspace or another run's checkout in the shared container, while relative paths keep a command's writes in your own checkout. It is isolation against collision, not against untrusted code. A read run stays on the shared /workspace. Finish every run with computer_run_finish. This creates no Thread and no second computer.",
|
|
18118
|
+
inputSchema: {
|
|
18119
|
+
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18120
|
+
mode: exports_external.enum(["read", "write"]).describe("write for an isolated mutable checkout; read to share /workspace"),
|
|
18121
|
+
label: exports_external.string().max(120).optional().describe("short factual label for this unit of work")
|
|
18122
|
+
},
|
|
18123
|
+
surfaces: ["computer-mcp", "computer-cli"],
|
|
18124
|
+
toolset: "loop",
|
|
18125
|
+
run: forward("computer_runtime.run_start")
|
|
18126
|
+
},
|
|
18127
|
+
{
|
|
18128
|
+
name: "computer_run_finish",
|
|
18129
|
+
title: "Finish a run",
|
|
18130
|
+
description: "Close a run with its terminal outcome and the one line that explains it. Checkpoint anything worth keeping first (computer_checkpoint or computer_stop); finishing a run releases the unit of work, it does not save or discard the files in its checkout. Repeating the same outcome is a safe no-op, and it keeps the reason the first caller settled — a different outcome is a conflict. Say what happened in reason: it is what computer_run_receipt shows a reader who was not here.",
|
|
18131
|
+
inputSchema: {
|
|
18132
|
+
runId: exports_external.string().describe("the runId returned by computer_run_start, run_…"),
|
|
18133
|
+
outcome: exports_external.enum(["finished", "failed", "cancelled"]).optional().describe("terminal outcome; defaults to finished"),
|
|
18134
|
+
reason: exports_external.string().max(500).optional().describe("one factual line on how this unit of work ended, e.g. what shipped or what broke")
|
|
18135
|
+
},
|
|
18136
|
+
surfaces: ["computer-mcp", "computer-cli"],
|
|
18137
|
+
toolset: "loop",
|
|
18138
|
+
run: forward("computer_runtime.run_finish")
|
|
18139
|
+
},
|
|
18140
|
+
{
|
|
18141
|
+
name: "computer_run_receipt",
|
|
18142
|
+
title: "Read a run receipt",
|
|
18143
|
+
description: "READ ONLY: read one run's compact receipt — its purpose, actor, computer session, the base snapshot it forked from, its workspace and effective isolation, how it ended and why, how long it took, and its lifecycle events. This is the normal way to inspect a run you or someone else started, and it stays readable after the run is terminal. Arbor keeps no process state and no command output, so the receipt says what the protocol recorded, not what scrolled past in the shell.",
|
|
18144
|
+
inputSchema: {
|
|
18145
|
+
runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
|
|
18146
|
+
},
|
|
18147
|
+
surfaces: ["computer-mcp", "computer-cli"],
|
|
18148
|
+
toolset: "loop",
|
|
18149
|
+
run: forward("computer_runtime.run_receipt")
|
|
18150
|
+
},
|
|
18151
|
+
{
|
|
18152
|
+
name: "computer_runs",
|
|
18153
|
+
title: "List runs",
|
|
18154
|
+
description: "READ ONLY: list the active and recent runs of this Thread computer with each run's mode, effective isolation, and workspace identity. Use it to see what other work is in flight on the same computer before starting or finishing your own.",
|
|
18155
|
+
inputSchema: {
|
|
18156
|
+
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18157
|
+
status: exports_external.enum(["active", "finished", "failed", "cancelled"]).optional().describe("filter to one lifecycle status"),
|
|
18158
|
+
limit: exports_external.number().int().min(1).max(100).optional().describe("rows to return (default 20)")
|
|
18159
|
+
},
|
|
18160
|
+
surfaces: ["computer-mcp", "computer-cli"],
|
|
18161
|
+
toolset: "loop",
|
|
18162
|
+
run: forward("computer_runtime.run_list")
|
|
18163
|
+
},
|
|
18089
18164
|
{
|
|
18090
18165
|
name: "computer_exec",
|
|
18091
18166
|
title: "Run a command",
|
|
18092
|
-
description: "Run one bounded logical operation in an opened Thread computer. Omitting cwd runs from the Computer's defaultCwd — the one materialized checkout when the recipe has exactly one repository, otherwise the workspace root — and the receipt echoes the cwd it ran in; pass cwd explicitly to override it. Strict Bash semantics are ON by default: an early command failure or failed pipeline makes the execution nonzero, while explicit handling such as `cmd || fallback` still works. Set strict=false only for an intentional best-effort script. For a connected human, Arbor supplies ambient GitHub authorization for normal gh/HTTPS Git commands and GitHub-linked author/committer identity ephemerally for every exec without writing credentials into the workspace; command-local Git environment overrides may still replace the identity. Use background only for the container backend; it returns a processId for computer_process_read / computer_process_terminate. worker-shell deliberately serializes mutations and rejects long-lived processes.",
|
|
18167
|
+
description: "Run one bounded logical operation in an opened Thread computer. Omitting cwd runs from the Computer's defaultCwd — the one materialized checkout when the recipe has exactly one repository, otherwise the workspace root — and the receipt echoes the cwd it ran in; pass cwd explicitly to override it. Pass runId to work inside that run's own checkout: the command starts there and relative paths keep its writes there, while the raw command text is not sandboxed — an absolute path still reaches the shared workspace or another run's checkout in the shared container. Strict Bash semantics are ON by default: an early command failure or failed pipeline makes the execution nonzero, while explicit handling such as `cmd || fallback` still works. Set strict=false only for an intentional best-effort script. For a connected human, Arbor supplies ambient GitHub authorization for normal gh/HTTPS Git commands and GitHub-linked author/committer identity ephemerally for every exec without writing credentials into the workspace; command-local Git environment overrides may still replace the identity. Use background only for the container backend; it returns a processId for computer_process_read / computer_process_terminate. worker-shell deliberately serializes mutations and rejects long-lived processes.",
|
|
18093
18168
|
inputSchema: {
|
|
18094
18169
|
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18095
18170
|
command: exports_external.string().min(1).describe("the shell command to run"),
|
|
18096
|
-
|
|
18171
|
+
runId: exports_external.string().optional().describe("run this inside the checkout of this run, run_… (from computer_run_start)"),
|
|
18172
|
+
cwd: exports_external.string().optional().describe("working directory under /workspace, or under the run"),
|
|
18097
18173
|
timeout: exports_external.number().int().min(1000).max(1800000).optional().describe("timeout in milliseconds, from 1,000 through 1,800,000"),
|
|
18098
18174
|
background: exports_external.boolean().optional().describe("start a container process and return its pid"),
|
|
18099
18175
|
strict: exports_external.boolean().optional().describe("fail on the first unhandled command or pipeline failure; defaults to true, set false only for intentional best-effort execution")
|
|
@@ -18215,18 +18291,6 @@ var ACTION_DEFINITIONS = [
|
|
|
18215
18291
|
toolset: "loop",
|
|
18216
18292
|
run: forward("computer_code.diagnostics")
|
|
18217
18293
|
},
|
|
18218
|
-
{
|
|
18219
|
-
name: "computer_read",
|
|
18220
|
-
title: "Read a project file",
|
|
18221
|
-
description: "Read one file from the opened computer when command output is the wrong shape. Paths must stay under /workspace.",
|
|
18222
|
-
inputSchema: {
|
|
18223
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18224
|
-
path: exports_external.string().describe("absolute path under /workspace")
|
|
18225
|
-
},
|
|
18226
|
-
surfaces: ["computer-mcp", "computer-cli"],
|
|
18227
|
-
toolset: "loop",
|
|
18228
|
-
run: forward("computer_runtime.read")
|
|
18229
|
-
},
|
|
18230
18294
|
{
|
|
18231
18295
|
name: "computer_export",
|
|
18232
18296
|
title: "Export a Thread file",
|
|
@@ -18244,10 +18308,11 @@ var ACTION_DEFINITIONS = [
|
|
|
18244
18308
|
{
|
|
18245
18309
|
name: "computer_write",
|
|
18246
18310
|
title: "Write a project file",
|
|
18247
|
-
description: "Write one file under /workspace. Content is UTF-8 by default; pass encoding=base64 only for binary bytes. Prefer normal editing tools for code changes; reach for this when the MCP/CLI computer surface is the only filesystem path.",
|
|
18311
|
+
description: "Write one file under /workspace. Content is UTF-8 by default; pass encoding=base64 only for binary bytes. Pass runId to write inside that run's own checkout, where the path may be relative and, being an Arbor-routed path, cannot reach the shared workspace or another run's files. Prefer normal editing tools for code changes; reach for this when the MCP/CLI computer surface is the only filesystem path.",
|
|
18248
18312
|
inputSchema: {
|
|
18249
18313
|
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18250
|
-
path: exports_external.string().describe("absolute path under /workspace"),
|
|
18314
|
+
path: exports_external.string().describe("absolute path under /workspace, or a path inside the run"),
|
|
18315
|
+
runId: exports_external.string().optional().describe("write into the checkout of this run, run_… (from computer_run_start)"),
|
|
18251
18316
|
content: exports_external.string().describe("complete UTF-8 content, or base64 bytes when encoding=base64"),
|
|
18252
18317
|
encoding: exports_external.enum(["utf8", "base64"]).optional().describe("content encoding; defaults to utf8, use base64 for binary files")
|
|
18253
18318
|
},
|
|
@@ -18255,77 +18320,6 @@ var ACTION_DEFINITIONS = [
|
|
|
18255
18320
|
toolset: "loop",
|
|
18256
18321
|
run: forward("computer_runtime.write")
|
|
18257
18322
|
},
|
|
18258
|
-
{
|
|
18259
|
-
name: "computer_clone",
|
|
18260
|
-
title: "Clone an allowed repository",
|
|
18261
|
-
description: "Clone a repository named by the resolved computer recipe, supplying the working collaborator's GitHub token just in time. The token is spent only on this call and is neither returned nor persisted in the workspace.",
|
|
18262
|
-
inputSchema: {
|
|
18263
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18264
|
-
repository: exports_external.string().describe("allowed owner/repository slug"),
|
|
18265
|
-
githubToken: exports_external.string().min(1).describe("short-lived GitHub token supplied by the caller"),
|
|
18266
|
-
githubUsername: exports_external.string().optional().describe("GitHub username; defaults to x-access-token")
|
|
18267
|
-
},
|
|
18268
|
-
surfaces: ["computer-mcp", "computer-cli"],
|
|
18269
|
-
toolset: "loop",
|
|
18270
|
-
run: forward("computer_runtime.clone")
|
|
18271
|
-
},
|
|
18272
|
-
{
|
|
18273
|
-
name: "computer_sync",
|
|
18274
|
-
title: "Sync an allowed repository",
|
|
18275
|
-
description: "Fetch, fast-forward pull, or push the checked-out branch of a cloned recipe repository. OMIT githubToken to refresh a repository named in this computer's effective recipe with Arbor's own managed credential — Arbor rechecks the repository connection and mints a request-scoped one-repository read credential server-side, so a restored computer can reach current history with no token of yours. Managed refresh covers fetch and pull; push writes to GitHub, so omit githubToken there to push as the signed-in human's GitHub identity connected in Account Settings, or supply your just-in-time collaborator token as an override. The lightweight Computer fixes the allowlisted GitHub URL, never force-pushes or deletes refs, and neither stores nor returns either credential.",
|
|
18276
|
-
inputSchema: {
|
|
18277
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18278
|
-
repository: exports_external.string().describe("allowed owner/repository slug already cloned by computer_clone"),
|
|
18279
|
-
operation: exports_external.enum(["fetch", "pull", "push"]).describe("network operation to perform"),
|
|
18280
|
-
githubToken: exports_external.string().min(1).optional().describe("short-lived collaborator GitHub token; omit for fetch/pull to use Arbor's managed read credential, or for push to use the signed-in human's connected GitHub identity"),
|
|
18281
|
-
githubUsername: exports_external.string().optional().describe("GitHub username for a supplied githubToken; defaults to x-access-token")
|
|
18282
|
-
},
|
|
18283
|
-
surfaces: ["computer-cli"],
|
|
18284
|
-
toolset: "loop",
|
|
18285
|
-
run: forward("computer_runtime.sync")
|
|
18286
|
-
},
|
|
18287
|
-
{
|
|
18288
|
-
name: "computer_fetch",
|
|
18289
|
-
title: "Fetch an allowed repository",
|
|
18290
|
-
description: `Fetch remote refs for a cloned recipe repository without changing its checked-out branch or any remote ref. OMIT githubToken and Arbor refreshes it for you: it rechecks that the repository is in this computer's effective recipe and still connected, mints a request-scoped one-repository read credential server-side, spends it on this fetch alone, and returns credential: "arbor-managed" — this is the way a RESTORED computer, which deliberately holds no credential, catches up with the remote. Supply githubToken instead to fetch as the collaborator. Neither credential is stored or returned.`,
|
|
18291
|
-
inputSchema: {
|
|
18292
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18293
|
-
repository: exports_external.string().describe("allowed owner/repository slug already cloned"),
|
|
18294
|
-
githubToken: exports_external.string().min(1).optional().describe("short-lived collaborator GitHub token; omit to use Arbor's managed recipe credential"),
|
|
18295
|
-
githubUsername: exports_external.string().optional().describe("GitHub username for a supplied githubToken; defaults to x-access-token")
|
|
18296
|
-
},
|
|
18297
|
-
surfaces: ["computer-mcp"],
|
|
18298
|
-
toolset: "loop",
|
|
18299
|
-
run: (ex, input) => ex.call("computer_runtime.sync", { ...input, operation: "fetch" })
|
|
18300
|
-
},
|
|
18301
|
-
{
|
|
18302
|
-
name: "computer_pull",
|
|
18303
|
-
title: "Fast-forward an allowed repository",
|
|
18304
|
-
description: "Fetch and fast-forward the checked-out branch of a cloned recipe repository; divergent history, a dirty working tree, and anything needing a merge are rejected rather than forced. A returned pull also PROVES the branch's remote-tracking ref reached the fetched tip and reports it as remoteTracking, so ordinary `git status` and `git log origin/<branch>` stay true instead of showing a level checkout as ahead; if that cannot be proven the call fails as retryable with the landed fast-forward attached, rather than reporting a truthful pull it did not verify. remoteTracking.updated is false only when the checked-out branch does not track this repository at all. OMIT githubToken and Arbor pulls with its own managed recipe credential after rechecking the repository connection — the way a restored computer reaches current history. Supply githubToken instead to pull as the collaborator. Neither credential is stored or returned.",
|
|
18305
|
-
inputSchema: {
|
|
18306
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18307
|
-
repository: exports_external.string().describe("allowed owner/repository slug already cloned"),
|
|
18308
|
-
githubToken: exports_external.string().min(1).optional().describe("short-lived collaborator GitHub token; omit to use Arbor's managed recipe credential"),
|
|
18309
|
-
githubUsername: exports_external.string().optional().describe("GitHub username for a supplied githubToken; defaults to x-access-token")
|
|
18310
|
-
},
|
|
18311
|
-
surfaces: ["computer-mcp"],
|
|
18312
|
-
toolset: "loop",
|
|
18313
|
-
run: (ex, input) => ex.call("computer_runtime.sync", { ...input, operation: "pull" })
|
|
18314
|
-
},
|
|
18315
|
-
{
|
|
18316
|
-
name: "computer_push",
|
|
18317
|
-
title: "Push an allowed repository",
|
|
18318
|
-
description: "Push the checked-out branch to its fixed allowlisted GitHub repository without force-pushing or deleting refs. OMIT githubToken to use the signed-in human's GitHub connection from Account Settings; Arbor refreshes that GitHub App user credential server-side and never returns or persists it in the Computer. Supply githubToken only for an explicit caller credential override.",
|
|
18319
|
-
inputSchema: {
|
|
18320
|
-
computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
|
|
18321
|
-
repository: exports_external.string().describe("allowed owner/repository slug already cloned"),
|
|
18322
|
-
githubToken: exports_external.string().min(1).optional().describe("optional short-lived GitHub token override; omit to use your connected GitHub identity"),
|
|
18323
|
-
githubUsername: exports_external.string().optional().describe("GitHub username for a supplied githubToken; omit for your connected GitHub identity")
|
|
18324
|
-
},
|
|
18325
|
-
surfaces: ["computer-mcp"],
|
|
18326
|
-
toolset: "loop",
|
|
18327
|
-
run: (ex, input) => ex.call("computer_runtime.sync", { ...input, operation: "push" })
|
|
18328
|
-
},
|
|
18329
18323
|
{
|
|
18330
18324
|
name: "computer_checkpoint",
|
|
18331
18325
|
title: "Checkpoint completed work",
|
|
@@ -18387,7 +18381,7 @@ var ACTION_DEFINITIONS = [
|
|
|
18387
18381
|
{
|
|
18388
18382
|
name: "get_computer",
|
|
18389
18383
|
title: "Read a Thread computer",
|
|
18390
|
-
description: "Read a Thread's redacted effective recipe, active materialized generation, compatibility state, historical generation lineage, current Topic/Thread snapshot refs, recent attachment receipts, and replacement outcomes. Recipe metadata includes provider/backend/profile/repositories/config revision and whether setup is configured, never setup content or credentials. This is durable Arbor protocol state, not live process/presence status.",
|
|
18384
|
+
description: "Read a Thread's redacted effective recipe, active materialized generation, compatibility state, historical generation lineage, current Topic/Thread snapshot refs, recent attachment receipts, active and recent runs with each run's mode/isolation/workspace, and replacement outcomes. Recipe metadata includes provider/backend/profile/repositories/config revision and whether setup is configured, never setup content or credentials. This is durable Arbor protocol state, not live process/presence status.",
|
|
18391
18385
|
inputSchema: {
|
|
18392
18386
|
threadId: exports_external.string().describe("the Thread, thr_…"),
|
|
18393
18387
|
lineageLimit: exports_external.number().int().min(1).max(100).optional().describe("recent receipts/lineage rows (default 20)")
|
package/package.json
CHANGED