@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.
Files changed (2) hide show
  1. package/dist/arbor.js +148 -154
  2. 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
- cwd: exports_external.string().optional().describe("working directory under /workspace"),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.17.5",
3
+ "version": "0.18.0",
4
4
  "description": "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
5
5
  "keywords": [
6
6
  "agents",