@lambdacurry/arbor 0.20.11 → 0.20.13

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 +207 -19
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1806,6 +1806,18 @@ var previewViewerGrantUses = sqliteTable("preview_viewer_grant_uses", {
1806
1806
  profileId: text("profile_id").notNull().references(() => profiles.id),
1807
1807
  consumedAt: ts("consumed_at").notNull()
1808
1808
  });
1809
+ var livePreviewViewerGrantUses = sqliteTable("live_preview_viewer_grant_uses", {
1810
+ jti: text("jti").primaryKey(),
1811
+ threadId: text("thread_id").notNull().references(() => threads.id),
1812
+ profileId: text("profile_id").notNull().references(() => profiles.id),
1813
+ consumedAt: ts("consumed_at").notNull()
1814
+ });
1815
+ var threadLivePreviewSessions = sqliteTable("thread_live_preview_sessions", {
1816
+ threadId: text("thread_id").notNull().references(() => threads.id),
1817
+ profileId: text("profile_id").notNull().references(() => profiles.id),
1818
+ computerSessionId: text("computer_session_id").notNull().references(() => computerSessions.id),
1819
+ updatedAt: ts("updated_at").notNull()
1820
+ }, (t) => ({ pk: primaryKey({ columns: [t.threadId, t.profileId] }) }));
1809
1821
  var threadInitiatives = sqliteTable("thread_initiatives", {
1810
1822
  threadId: text("thread_id").notNull().references(() => threads.id),
1811
1823
  initiativeId: text("initiative_id").notNull().references(() => initiatives.id)
@@ -16795,17 +16807,78 @@ var computerProfile = exports_external.looseObject({
16795
16807
  tools: exports_external.array(exports_external.string()),
16796
16808
  recommendedEditingPrimitive: exports_external.string()
16797
16809
  });
16810
+ var computerRunPublicationState = exports_external.enum(["not-required", "durable", "not-durable", "unknown"]);
16811
+ var computerRunGitState = exports_external.looseObject({
16812
+ head: exports_external.string().nullable(),
16813
+ branch: exports_external.string().nullable(),
16814
+ upstream: exports_external.string().nullable(),
16815
+ dirty: exports_external.boolean(),
16816
+ remote: exports_external.looseObject({ name: exports_external.string(), repository: exports_external.string().nullable() }).nullable()
16817
+ });
16818
+ var computerRunPublication = exports_external.looseObject({
16819
+ state: computerRunPublicationState,
16820
+ reasonCode: exports_external.string(),
16821
+ remoteRef: exports_external.string().optional()
16822
+ });
16823
+ var computerRunDurability = exports_external.looseObject({
16824
+ workspace: exports_external.enum(["shared", "isolated"]),
16825
+ parentMutation: exports_external.enum(["direct", "none"]),
16826
+ providerExecution: exports_external.enum(["parent", "disposable"]),
16827
+ finishDestroysExecution: exports_external.boolean(),
16828
+ baseSnapshotId: id.nullable(),
16829
+ gitPublication: exports_external.looseObject({
16830
+ state: computerRunPublicationState,
16831
+ reasonCode: exports_external.string()
16832
+ })
16833
+ });
16834
+ var computerRunFinishAssessment = exports_external.looseObject({
16835
+ state: exports_external.enum(["safe", "blocked", "unknown"]),
16836
+ requiresDiscard: exports_external.boolean(),
16837
+ repositories: exports_external.array(exports_external.looseObject({
16838
+ repository: exports_external.string(),
16839
+ path: exports_external.string(),
16840
+ startHead: exports_external.string().nullable(),
16841
+ currentHead: exports_external.string().nullable(),
16842
+ currentDirty: exports_external.boolean().nullable(),
16843
+ changedSinceStart: exports_external.boolean().nullable(),
16844
+ publication: computerRunPublication
16845
+ }))
16846
+ });
16847
+ var operatingGuidanceEntry = exports_external.looseObject({
16848
+ class: exports_external.literal("guidance"),
16849
+ scope: exports_external.enum(["space", "topic"]),
16850
+ sourceId: id,
16851
+ strength: exports_external.literal("recommended"),
16852
+ message: exports_external.string()
16853
+ });
16854
+ var computerAgentBrief = exports_external.looseObject({
16855
+ work: exports_external.looseObject({ threadId: id, title: exports_external.string(), objective: exports_external.string() }),
16856
+ guidance: exports_external.array(operatingGuidanceEntry),
16857
+ computer: exports_external.looseObject({
16858
+ computerId: id,
16859
+ backend: exports_external.enum(["worker-shell", "container"]),
16860
+ containerProfile: exports_external.string().nullable(),
16861
+ repositories: exports_external.array(exports_external.looseObject({ repository: exports_external.string(), path: exports_external.string() })),
16862
+ durableSnapshotId: id.nullable(),
16863
+ repositoryState: exports_external.looseObject({
16864
+ source: exports_external.enum(["durable-snapshot", "workspace"]),
16865
+ remoteFreshness: exports_external.literal("unchecked"),
16866
+ guidance: exports_external.string()
16867
+ })
16868
+ }),
16869
+ activeRuns: exports_external.array(exports_external.looseObject({
16870
+ runId: id,
16871
+ label: exports_external.string().nullable(),
16872
+ mode: exports_external.enum(["read", "write"]),
16873
+ execution: exports_external.enum(["shared", "isolated"]),
16874
+ status: exports_external.enum(["active", "finished", "failed", "cancelled"])
16875
+ }))
16876
+ });
16798
16877
  var computerRunGitStart = exports_external.looseObject({
16799
16878
  repositories: exports_external.array(exports_external.looseObject({
16800
16879
  repository: exports_external.string(),
16801
16880
  path: exports_external.string(),
16802
- git: exports_external.looseObject({
16803
- head: exports_external.string().nullable(),
16804
- branch: exports_external.string().nullable(),
16805
- upstream: exports_external.string().nullable(),
16806
- dirty: exports_external.boolean(),
16807
- remote: exports_external.looseObject({ name: exports_external.string(), repository: exports_external.string().nullable() }).nullable()
16808
- }).nullable()
16881
+ git: computerRunGitState.nullable()
16809
16882
  }))
16810
16883
  });
16811
16884
  var computerRun = exports_external.looseObject({
@@ -16820,6 +16893,7 @@ var computerRun = exports_external.looseObject({
16820
16893
  workspaceDir: exports_external.string(),
16821
16894
  baseSnapshotId: id.nullable(),
16822
16895
  gitStart: computerRunGitStart.nullable().optional(),
16896
+ durability: computerRunDurability,
16823
16897
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
16824
16898
  label: exports_external.string().nullable(),
16825
16899
  reason: exports_external.string().nullable(),
@@ -16842,6 +16916,8 @@ var computerRunReceipt = exports_external.looseObject({
16842
16916
  workspace: exports_external.looseObject({ dir: exports_external.string() }),
16843
16917
  baseSnapshotId: id.nullable(),
16844
16918
  gitStart: computerRunGitStart.nullable().optional(),
16919
+ durability: computerRunDurability,
16920
+ finishAssessment: computerRunFinishAssessment.nullable(),
16845
16921
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
16846
16922
  outcome: exports_external.enum(["finished", "failed", "cancelled"]).nullable(),
16847
16923
  reason: exports_external.string().nullable(),
@@ -17155,6 +17231,19 @@ var MCP_OUTPUT_SCHEMAS = {
17155
17231
  effectiveRecipe: redactedComputerRecipe,
17156
17232
  materializedRecipe: redactedComputerRecipe.nullable()
17157
17233
  }),
17234
+ livePreview: exports_external.looseObject({
17235
+ url: exports_external.string(),
17236
+ surface: exports_external.looseObject({
17237
+ command: exports_external.string(),
17238
+ cwd: exports_external.string(),
17239
+ port: exports_external.number().int(),
17240
+ healthPath: exports_external.string()
17241
+ }),
17242
+ configuredBy: exports_external.looseObject({
17243
+ scope: exports_external.enum(["topic", "thread"]),
17244
+ scopeId: id
17245
+ })
17246
+ }).nullable(),
17158
17247
  topicBase: jsonObject.nullable(),
17159
17248
  computer: jsonObject.nullable(),
17160
17249
  activeGenerationId: id.nullable(),
@@ -17450,6 +17539,7 @@ var MCP_OUTPUT_SCHEMAS = {
17450
17539
  repositories: exports_external.array(exports_external.looseObject({ repository: exports_external.string(), path: exports_external.string() })),
17451
17540
  defaultCwd: exports_external.string(),
17452
17541
  capabilities: computerCapabilityCard,
17542
+ agentBrief: computerAgentBrief,
17453
17543
  runtime: jsonObject,
17454
17544
  reconciliation: exports_external.looseObject({
17455
17545
  action: exports_external.literal("automatic_reprovision"),
@@ -17463,11 +17553,72 @@ var MCP_OUTPUT_SCHEMAS = {
17463
17553
  execution: exports_external.enum(["shared", "isolated"]),
17464
17554
  baseSnapshotId: id.nullable(),
17465
17555
  gitStart: computerRunGitStart.nullable().optional(),
17556
+ durability: computerRunDurability,
17557
+ guidance: exports_external.array(operatingGuidanceEntry),
17466
17558
  status: exports_external.string()
17467
17559
  }),
17468
17560
  computer_run_finish: exports_external.looseObject({
17469
17561
  status: exports_external.string(),
17470
- replayed: exports_external.boolean()
17562
+ replayed: exports_external.boolean(),
17563
+ durability: computerRunDurability,
17564
+ finishAssessment: computerRunFinishAssessment.nullable()
17565
+ }),
17566
+ computer_repo_work_status: exports_external.looseObject({
17567
+ runId: id,
17568
+ status: exports_external.enum(["blocked", "unknown", "reviewable", "in-progress"]),
17569
+ canFinishRun: exports_external.boolean(),
17570
+ durablyFinishable: exports_external.boolean(),
17571
+ finishAssessment: computerRunFinishAssessment,
17572
+ repositories: exports_external.array(exports_external.looseObject({
17573
+ repository: exports_external.string(),
17574
+ path: exports_external.string(),
17575
+ start: computerRunGitState.nullable(),
17576
+ current: computerRunGitState.nullable(),
17577
+ changedSinceRunStart: exports_external.boolean().nullable(),
17578
+ publication: computerRunPublication,
17579
+ pullRequest: exports_external.looseObject({
17580
+ state: exports_external.enum(["none", "head-mismatch", "open", "merged", "closed", "unknown"]),
17581
+ number: exports_external.number().int().positive().optional(),
17582
+ url: exports_external.string().optional(),
17583
+ headSha: exports_external.string().optional(),
17584
+ baseRef: exports_external.string().optional(),
17585
+ draft: exports_external.boolean().optional()
17586
+ }),
17587
+ ci: exports_external.looseObject({
17588
+ state: exports_external.enum(["none", "pending", "passed", "failed", "unknown"]),
17589
+ total: exports_external.number().int().min(0),
17590
+ pending: exports_external.number().int().min(0),
17591
+ passed: exports_external.number().int().min(0),
17592
+ failed: exports_external.number().int().min(0)
17593
+ }),
17594
+ review: exports_external.looseObject({
17595
+ state: exports_external.enum(["not-applicable", "none", "approved", "changes-requested", "unknown"]),
17596
+ approvals: exports_external.number().int().min(0),
17597
+ changesRequested: exports_external.number().int().min(0)
17598
+ }),
17599
+ githubProof: exports_external.looseObject({
17600
+ state: exports_external.enum(["known", "unknown"]),
17601
+ reasonCode: exports_external.string()
17602
+ }),
17603
+ state: exports_external.enum([
17604
+ "unchanged",
17605
+ "working",
17606
+ "committed-local",
17607
+ "publication-unknown",
17608
+ "pushed-durable",
17609
+ "github-unknown",
17610
+ "pr-head-mismatch",
17611
+ "pr-open",
17612
+ "ci-pending",
17613
+ "reviewable",
17614
+ "merged"
17615
+ ]),
17616
+ retrySafety: exports_external.looseObject({
17617
+ push: exports_external.enum(["not-needed", "safe", "unknown"]),
17618
+ prCreate: exports_external.enum(["not-needed", "safe", "manual", "unknown"])
17619
+ }),
17620
+ nextAction: exports_external.string()
17621
+ }))
17471
17622
  }),
17472
17623
  computer_run_receipt: exports_external.looseObject({
17473
17624
  receipt: computerRunReceipt
@@ -17506,7 +17657,15 @@ var MCP_OUTPUT_SCHEMAS = {
17506
17657
  stderr: exports_external.string().optional(),
17507
17658
  truncated: exports_external.boolean().optional(),
17508
17659
  nextCursor: exports_external.string().optional(),
17509
- exitCode: exports_external.number().int().nullable().optional()
17660
+ exitCode: exports_external.number().int().nullable().optional(),
17661
+ activity: exports_external.looseObject({
17662
+ state: exports_external.enum(["output", "compute", "quiet", "terminal", "unknown"]),
17663
+ observedAt: timestamp,
17664
+ outputAdvanced: exports_external.boolean(),
17665
+ cpuPercent: exports_external.number().min(0).nullable(),
17666
+ processCount: exports_external.number().int().min(0).nullable(),
17667
+ reasonCode: exports_external.string()
17668
+ }).optional()
17510
17669
  }),
17511
17670
  computer_process_terminate: exports_external.looseObject({
17512
17671
  status: exports_external.string(),
@@ -17519,6 +17678,7 @@ var MCP_OUTPUT_SCHEMAS = {
17519
17678
  backend: exports_external.enum(["worker-shell", "container"]),
17520
17679
  profile: computerProfile.nullable(),
17521
17680
  capabilities: computerCapabilityCard,
17681
+ agentBrief: computerAgentBrief,
17522
17682
  runtime: jsonObject
17523
17683
  }),
17524
17684
  computer_verify: exports_external.looseObject({
@@ -17673,6 +17833,8 @@ var OUTPUT_SHAPERS = {
17673
17833
  ["execution", run.execution],
17674
17834
  ["baseSnapshotId", run.baseSnapshotId],
17675
17835
  ["gitStart", run.gitStart],
17836
+ ["durability", run.durability],
17837
+ ["guidance", result.guidance],
17676
17838
  ["status", run.status]
17677
17839
  ]);
17678
17840
  },
@@ -17680,7 +17842,9 @@ var OUTPUT_SHAPERS = {
17680
17842
  const run = record2(result.run) ?? {};
17681
17843
  return defined([
17682
17844
  ["status", run.status],
17683
- ["replayed", result.replayed]
17845
+ ["replayed", result.replayed],
17846
+ ["durability", run.durability],
17847
+ ["finishAssessment", result.finishAssessment]
17684
17848
  ]);
17685
17849
  },
17686
17850
  computer_exec: (result, input) => defined([
@@ -17699,7 +17863,8 @@ var OUTPUT_SHAPERS = {
17699
17863
  ["nextCursor", result.nextCursor],
17700
17864
  ["endedAt", result.endedAt],
17701
17865
  ["durationMs", result.durationMs],
17702
- ["exitCode", result.exitCode]
17866
+ ["exitCode", result.exitCode],
17867
+ ["activity", result.activity]
17703
17868
  ]),
17704
17869
  computer_process_terminate: (result) => defined([
17705
17870
  ["status", result.status],
@@ -17841,6 +18006,7 @@ var MCP_TOOL_ANNOTATIONS = {
17841
18006
  computer_open: additive,
17842
18007
  computer_reprovision: destructiveIdempotent,
17843
18008
  computer_run_start: additive,
18009
+ computer_repo_work_status: readOnly,
17844
18010
  computer_run_finish: idempotent,
17845
18011
  computer_run_receipt: readOnly,
17846
18012
  computer_runs: readOnly,
@@ -17915,6 +18081,14 @@ var PAGINATION_INPUT = {
17915
18081
  limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
17916
18082
  cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)")
17917
18083
  };
18084
+ var LIVE_PREVIEW_CONFIG_INPUT = {
18085
+ livePreview: exports_external.object({
18086
+ command: exports_external.string().min(1).max(4000).describe("explicit project preview command"),
18087
+ cwd: exports_external.string().startsWith("/workspace/").describe("workspace directory containing the project"),
18088
+ port: exports_external.number().int().min(1).max(65535).describe("local HTTP/WebSocket port"),
18089
+ healthPath: exports_external.string().startsWith("/").describe("HTTP health path checked before proxying")
18090
+ }).nullable().optional().describe("one inherited Thread Live Preview startup surface; null disables an inherited surface. This is runtime policy and does not change Computer recipe identity")
18091
+ };
17918
18092
  var ACTION_DEFINITIONS = [
17919
18093
  {
17920
18094
  name: "server_info",
@@ -18186,7 +18360,8 @@ var ACTION_DEFINITIONS = [
18186
18360
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
18187
18361
  containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
18188
18362
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
18189
- repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
18363
+ repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits"),
18364
+ ...LIVE_PREVIEW_CONFIG_INPUT
18190
18365
  },
18191
18366
  surfaces: ["mcp", "cli"],
18192
18367
  toolset: "structure",
@@ -18201,7 +18376,8 @@ var ACTION_DEFINITIONS = [
18201
18376
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
18202
18377
  containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.3.3, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
18203
18378
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
18204
- repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits")
18379
+ repositories: exports_external.array(exports_external.string()).max(MAX_COMPUTER_REPOSITORIES).nullable().optional().describe("connected GitHub repositories to materialize into a fresh reusable base and allow for later Git calls; [] clears and null inherits"),
18380
+ ...LIVE_PREVIEW_CONFIG_INPUT
18205
18381
  },
18206
18382
  surfaces: ["mcp", "cli"],
18207
18383
  toolset: "structure",
@@ -18221,7 +18397,7 @@ var ACTION_DEFINITIONS = [
18221
18397
  {
18222
18398
  name: "computer_open",
18223
18399
  title: "Open a Thread computer",
18224
- description: "Open or resume this Thread's project environment for filesystem or command work. A safe living-profile revision drift is reconciled automatically by replacing the generation, restoring supported state, and returning reconciliation metadata; structural recipe changes still fail explicitly with computer_reprovision as the suggested action. Every configured repository is re-authorized through its explicit GitHub connection; a fresh reusable base clones it with a request-scoped contents:read credential before strict setup runs, while a restore receives no credential. Returns computerSessionId — pass it unchanged to later Computer tools and cited work — plus the selected profile contract (including GitHub CLI (gh) on bun-typescript-v1), a resolved capabilities card, workspaceRoot, each materialized repositories[].path, and defaultCwd. Omitted computer_exec.cwd uses defaultCwd: the single checkout when exactly one repository is configured, workspaceRoot otherwise.",
18400
+ description: "Open or resume this Thread's project environment for filesystem or command work. A safe living-profile revision drift is reconciled automatically by replacing the generation, restoring supported state, and returning reconciliation metadata; structural recipe changes still fail explicitly with computer_reprovision as the suggested action. Every configured repository is re-authorized through its explicit GitHub connection; a fresh reusable base clones it with a request-scoped contents:read credential before strict setup runs, while a restore receives no credential. Returns computerSessionId — pass it unchanged to later Computer tools and cited work — plus a compact Agent Brief with Thread objective, scoped Space/Topic guidance and provenance, durable parent snapshot, repositories, explicit unchecked remote-freshness guidance, and active Runs; the selected profile contract; a resolved capabilities card; workspaceRoot; each materialized repositories[].path; and defaultCwd. Omitted computer_exec.cwd uses defaultCwd: the single checkout when exactly one repository is configured, workspaceRoot otherwise.",
18225
18401
  inputSchema: {
18226
18402
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
18227
18403
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -18247,7 +18423,7 @@ var ACTION_DEFINITIONS = [
18247
18423
  {
18248
18424
  name: "computer_run_start",
18249
18425
  title: "Start a run",
18250
- description: "Start one unit of work inside an opened Thread computer. Write Runs default to isolated execution restored from the Computer's current base snapshot, so independent work does not collide. For intentional live collaboration, pass execution='shared' and the Run works directly in the Thread Computer alongside other shared Runs. Read Runs always share. All placements present the same /workspace layout; pass runId to Run-aware Computer operations and Arbor routes them correctly. Finish every Run with computer_run_finish, which destroys its isolated environment. This creates no second Thread or durable Computer.",
18426
+ description: "Start one unit of work inside an opened Thread computer. Write Runs default to isolated execution restored from the Computer's current base snapshot, so independent work does not collide. For intentional live collaboration, pass execution='shared' and the Run works directly in the Thread Computer alongside other shared Runs. Read Runs always share. All placements present the same /workspace layout; pass runId to Run-aware Computer operations and Arbor routes them correctly. An isolated WRITE Run does not mutate the parent Computer, its provider environment is disposable, and finish destroys that environment. The start result states those durability facts and returns the inherited scoped guidance; follow any durability-first project guidance before broad validation. Git publication remains unknown until Arbor can prove a clean changed HEAD exists on the configured remote; a local commit, isolated filesystem, or Preview is not that proof. This creates no second Thread or durable Computer.",
18251
18427
  inputSchema: {
18252
18428
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18253
18429
  mode: exports_external.enum(["read", "write"]).describe("write for mutable work; read for shared inspection"),
@@ -18258,14 +18434,26 @@ var ACTION_DEFINITIONS = [
18258
18434
  toolset: "loop",
18259
18435
  run: forward("computer_runtime.run_start")
18260
18436
  },
18437
+ {
18438
+ name: "computer_repo_work_status",
18439
+ title: "Inspect repository finish state",
18440
+ description: "READ ONLY: resolve repository-finish state for an active isolated WRITE Run from authoritative Git remote proof plus GitHub PR, CI, and review reads; the bounded inspection uses three batched provider exec phases and at most four GitHub REST calls per eligible repository. It reports durable state, explicit push/PR retrySafety, known PR-head mismatches versus unavailable GitHub proof, the next action, and Run finishability; it never commits, pushes, creates a PR, merges, or deploys.",
18441
+ inputSchema: {
18442
+ runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
18443
+ },
18444
+ surfaces: ["computer-mcp", "computer-cli"],
18445
+ toolset: "loop",
18446
+ run: forward("computer_runtime.repo_work_status")
18447
+ },
18261
18448
  {
18262
18449
  name: "computer_run_finish",
18263
18450
  title: "Finish a run",
18264
- description: "Close a Run with its terminal outcome and the one line that explains it. Finishing an isolated write Run destroys its execution environment, so push or otherwise publish anything that must outlive the Run before finishing it. Repeating the same outcome is a safe no-op, and it keeps the reason the first caller settled a different one conflicts. Say what happened in reason: it is what computer_run_receipt shows a reader who was not here.",
18451
+ description: "Close a Run with its terminal outcome and the one line that explains it. Before destroying an isolated WRITE environment, Arbor inspects bounded Git state: newly dirty work or a live remote check proving the new HEAD is absent blocks ordinary finish. Publication uncertainty remains explicitly unknown. Pass discard=true only when intentionally destroying work Arbor proved non-durable. Repeating the same outcome is a safe no-op, and the terminal receipt preserves the durability assessment.",
18265
18452
  inputSchema: {
18266
18453
  runId: exports_external.string().describe("the runId returned by computer_run_start, run_…"),
18267
18454
  outcome: exports_external.enum(["finished", "failed", "cancelled"]).optional().describe("terminal outcome; defaults to finished"),
18268
- 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")
18455
+ 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"),
18456
+ discard: exports_external.boolean().optional().describe("explicitly allow teardown when Arbor proved current Run work is not durable")
18269
18457
  },
18270
18458
  surfaces: ["computer-mcp", "computer-cli"],
18271
18459
  toolset: "loop",
@@ -18274,7 +18462,7 @@ var ACTION_DEFINITIONS = [
18274
18462
  {
18275
18463
  name: "computer_run_receipt",
18276
18464
  title: "Read a run receipt",
18277
- description: "READ ONLY: read one run's compact receipt — its purpose, actor, computer session, base snapshot and starting Git projection, execution placement, meaningful activity, and terminal outcome. Background work may appear as distilled labels/outcomes, but Arbor keeps no raw command transcript or process output. The receipt stays readable after the Run is terminal.",
18465
+ description: "READ ONLY: read one run's compact receipt — its purpose, actor, computer session, base snapshot and starting Git projection, explicit isolation/durability contract, pre-teardown durability assessment when available (including publication that remains unknown unless proven), meaningful activity, and terminal outcome. Background work may appear as distilled labels/outcomes, but Arbor keeps no raw command transcript or process output. The receipt stays readable after the Run is terminal.",
18278
18466
  inputSchema: {
18279
18467
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
18280
18468
  },
@@ -18317,7 +18505,7 @@ var ACTION_DEFINITIONS = [
18317
18505
  {
18318
18506
  name: "computer_process_read",
18319
18507
  title: "Read a background process",
18320
- description: "READ ONLY: Tail one process returned by computer_exec(background=true). With no cursor, returns only the latest small output window; pass nextCursor on the next read to receive only newer output. Defaults to 4 KB total and allows an explicit larger read up to 64 KB. Once terminal, also returns the final exit result.",
18508
+ description: "READ ONLY: Tail one process returned by computer_exec(background=true). With no cursor, returns only the latest small output window; pass nextCursor on the next read to receive only newer output. Defaults to 4 KB total and allows an explicit larger read up to 64 KB. Returns a compact activity receipt that distinguishes fresh output, active CPU work, quiet running, terminal state, and unavailable telemetry without exposing raw process tables. Once terminal, also returns the final exit result.",
18321
18509
  inputSchema: {
18322
18510
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18323
18511
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.20.11",
3
+ "version": "0.20.13",
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",