@lambdacurry/arbor 0.20.13 → 0.20.15

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 +53 -26
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -16921,6 +16921,25 @@ var computerRunReceipt = exports_external.looseObject({
16921
16921
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
16922
16922
  outcome: exports_external.enum(["finished", "failed", "cancelled"]).nullable(),
16923
16923
  reason: exports_external.string().nullable(),
16924
+ reasonCode: exports_external.string().nullable(),
16925
+ operations: exports_external.array(exports_external.looseObject({
16926
+ operationId: exports_external.string(),
16927
+ kind: exports_external.literal("exec"),
16928
+ execution: exports_external.enum(["foreground", "background"]),
16929
+ state: exports_external.enum([
16930
+ "starting",
16931
+ "running",
16932
+ "completed",
16933
+ "failed",
16934
+ "cancelled",
16935
+ "provider-lost",
16936
+ "unknown"
16937
+ ]),
16938
+ mutationRetrySafety: exports_external.enum(["not-needed", "unsafe", "unknown"]),
16939
+ reasonCode: exports_external.string(),
16940
+ startedAt: exports_external.string(),
16941
+ endedAt: exports_external.string().nullable()
16942
+ })),
16924
16943
  startedAt: exports_external.string(),
16925
16944
  endedAt: exports_external.string().nullable(),
16926
16945
  durationMs: exports_external.number().nullable(),
@@ -16929,7 +16948,8 @@ var computerRunReceipt = exports_external.looseObject({
16929
16948
  at: exports_external.string(),
16930
16949
  label: exports_external.string().optional(),
16931
16950
  detail: exports_external.string().optional(),
16932
- targetId: exports_external.string().optional()
16951
+ targetId: exports_external.string().optional(),
16952
+ reasonCode: exports_external.string().optional()
16933
16953
  })),
16934
16954
  lifecycle: exports_external.array(exports_external.looseObject({ type: exports_external.string(), at: exports_external.string() }))
16935
16955
  });
@@ -17665,6 +17685,12 @@ var MCP_OUTPUT_SCHEMAS = {
17665
17685
  cpuPercent: exports_external.number().min(0).nullable(),
17666
17686
  processCount: exports_external.number().int().min(0).nullable(),
17667
17687
  reasonCode: exports_external.string()
17688
+ }).optional(),
17689
+ recovery: exports_external.looseObject({
17690
+ state: exports_external.enum(["provider-timeout", "provider-lost", "unknown"]),
17691
+ reasonCode: exports_external.string(),
17692
+ mutationRetrySafety: exports_external.enum(["unsafe", "unknown"]),
17693
+ nextAction: exports_external.enum(["computer_process_read", "computer_run_receipt"])
17668
17694
  }).optional()
17669
17695
  }),
17670
17696
  computer_process_terminate: exports_external.looseObject({
@@ -17864,7 +17890,8 @@ var OUTPUT_SHAPERS = {
17864
17890
  ["endedAt", result.endedAt],
17865
17891
  ["durationMs", result.durationMs],
17866
17892
  ["exitCode", result.exitCode],
17867
- ["activity", result.activity]
17893
+ ["activity", result.activity],
17894
+ ["recovery", result.recovery]
17868
17895
  ]),
17869
17896
  computer_process_terminate: (result) => defined([
17870
17897
  ["status", result.status],
@@ -18397,7 +18424,7 @@ var ACTION_DEFINITIONS = [
18397
18424
  {
18398
18425
  name: "computer_open",
18399
18426
  title: "Open a Thread computer",
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.",
18427
+ description: "Open or resume a Thread's project environment when you need filesystem, command, Run, checkpoint, Preview, or publication work. Returns the session handle, workspace/repositories/default cwd, Agent Brief, profile/capabilities, active Runs, and any reconciliation notice.",
18401
18428
  inputSchema: {
18402
18429
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
18403
18430
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -18410,7 +18437,7 @@ var ACTION_DEFINITIONS = [
18410
18437
  {
18411
18438
  name: "computer_reprovision",
18412
18439
  title: "Replace a Thread computer",
18413
- description: "DESTRUCTIVE RECOVERY: explicitly replace an incompatible active Computer generation from the Thread's effective recipe. This one recovery action is also available on the normal Arbor MCP so a structurally stale Computer can be replaced before Computer MCP attachment is possible. The old generation remains authoritative unless the successor restores supported state and passes health. Same-provider worker-shell→container migration is supported; container→worker-shell and cross-provider migration fail explicitly. Reuse one idempotencyKey only for the same replacement request.",
18440
+ description: "DESTRUCTIVE RECOVERY: Replace an incompatible active Computer generation from the Thread's effective recipe when Arbor reports structural recipe incompatibility. Preserves the old generation unless the successor restores supported state and passes health.",
18414
18441
  inputSchema: {
18415
18442
  threadId: exports_external.string().describe("the Thread whose active Computer generation is replaced, thr_…"),
18416
18443
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this ONE replacement request; reuse it unchanged for retries"),
@@ -18423,7 +18450,7 @@ var ACTION_DEFINITIONS = [
18423
18450
  {
18424
18451
  name: "computer_run_start",
18425
18452
  title: "Start a run",
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.",
18453
+ description: "Start one bounded unit of work inside an opened Thread Computer when you need a read or write Run. Returns runId plus placement, base Git/snapshot state, durability facts, and inherited guidance; write Runs default to isolated unless execution='shared' is chosen.",
18427
18454
  inputSchema: {
18428
18455
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18429
18456
  mode: exports_external.enum(["read", "write"]).describe("write for mutable work; read for shared inspection"),
@@ -18437,7 +18464,7 @@ var ACTION_DEFINITIONS = [
18437
18464
  {
18438
18465
  name: "computer_repo_work_status",
18439
18466
  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.",
18467
+ description: "READ ONLY: Inspect an active isolated WRITE Run before a push/PR retry or finish when Git publication, PR, CI, or review state matters. Returns authoritative durability/finishability, retry safety, mismatches, and the next repository action without mutating GitHub.",
18441
18468
  inputSchema: {
18442
18469
  runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
18443
18470
  },
@@ -18448,7 +18475,7 @@ var ACTION_DEFINITIONS = [
18448
18475
  {
18449
18476
  name: "computer_run_finish",
18450
18477
  title: "Finish a run",
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.",
18478
+ description: "Finish a Run with an explicit terminal outcome after its work is complete or intentionally abandoned. Ordinary finish succeeds unless Arbor proves isolated WRITE work non-durable; use discard=true only to intentionally destroy that proven non-durable work; publication can remain unknown, repeating the same outcome is a safe no-op, and the receipt preserves the durability assessment.",
18452
18479
  inputSchema: {
18453
18480
  runId: exports_external.string().describe("the runId returned by computer_run_start, run_…"),
18454
18481
  outcome: exports_external.enum(["finished", "failed", "cancelled"]).optional().describe("terminal outcome; defaults to finished"),
@@ -18462,7 +18489,7 @@ var ACTION_DEFINITIONS = [
18462
18489
  {
18463
18490
  name: "computer_run_receipt",
18464
18491
  title: "Read a run receipt",
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.",
18492
+ description: "READ ONLY: Inspect one Run's durable receipt during or after execution when you need purpose, placement, durability, recoverable operation state, activity, or terminal outcome. Returns compact Run history and assessments, including durable operation receipts, not raw command transcripts or process output.",
18466
18493
  inputSchema: {
18467
18494
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
18468
18495
  },
@@ -18473,7 +18500,7 @@ var ACTION_DEFINITIONS = [
18473
18500
  {
18474
18501
  name: "computer_runs",
18475
18502
  title: "List runs",
18476
- description: "READ ONLY: list the active and recent runs of this Thread computer with each run's mode, execution placement, and workspace identity. Use it to see what other work is in flight on the same computer before starting or finishing your own.",
18503
+ description: "READ ONLY: List active or recent Runs for this Thread Computer when deciding whether to resume existing work or start another unit. Returns each Run's mode, execution placement, workspace identity, and lifecycle status.",
18477
18504
  inputSchema: {
18478
18505
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18479
18506
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]).optional().describe("filter to one lifecycle status"),
@@ -18486,12 +18513,12 @@ var ACTION_DEFINITIONS = [
18486
18513
  {
18487
18514
  name: "computer_exec",
18488
18515
  title: "Run a command",
18489
- description: "Run one bounded logical operation in an opened Thread computer. Omitting cwd uses the environment's defaultCwd; pass cwd explicitly to override it. Pass runId to route the command according to that Run's execution placement; without runId the command executes in the parent Computer. Strict Bash semantics are ON by default. For tests, builds, installs, or any command likely to run long, prefer background=true so the call returns a processId immediately; follow it with computer_process_read using the returned cursor for small incremental tails. For a labeled run-scoped verification check, pass activityKind=verification so the terminal exit becomes a distilled verification outcome. For a connected human, Arbor supplies ambient GitHub authorization and Git identity ephemerally without writing credentials into the workspace. Background processes stay in the environment where they were started.",
18516
+ description: "Run one bounded shell operation in the parent Computer or a Run; connected humans receive ambient GitHub authorization and Git identity without workspace credentials. Background work returns a processId, and a missed isolated-Run foreground response can be recovered from computer_run_receipt.operations with computer_process_read instead of repeating the mutation.",
18490
18517
  inputSchema: {
18491
18518
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18492
18519
  command: exports_external.string().min(1).describe("the shell command to run"),
18493
18520
  runId: exports_external.string().optional().describe("route this command according to this Run execution placement, run_… (from computer_run_start)"),
18494
- cwd: exports_external.string().optional().describe("working directory under /workspace, or under the run"),
18521
+ cwd: exports_external.string().optional().describe("working directory under /workspace, or under the run; omit to use defaultCwd"),
18495
18522
  timeout: exports_external.number().int().min(1000).max(1800000).optional().describe("timeout in milliseconds, from 1,000 through 1,800,000"),
18496
18523
  background: exports_external.boolean().optional().describe("start a container process and return its pid"),
18497
18524
  activityLabel: exports_external.string().min(1).max(COMPUTER_RUN_ACTIVITY_LABEL_MAX).optional().describe("short human-readable label for run-scoped background work; Arbor records this label instead of the raw command or output"),
@@ -18505,7 +18532,7 @@ var ACTION_DEFINITIONS = [
18505
18532
  {
18506
18533
  name: "computer_process_read",
18507
18534
  title: "Read a background process",
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.",
18535
+ description: "READ ONLY: Read a provider-owned process from computer_exec, including a foreground operation recovered from a Run receipt, and use nextCursor for incremental output. Returns compact activity or recovery state plus the final exit result when observable.",
18509
18536
  inputSchema: {
18510
18537
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18511
18538
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
@@ -18520,7 +18547,7 @@ var ACTION_DEFINITIONS = [
18520
18547
  {
18521
18548
  name: "computer_process_terminate",
18522
18549
  title: "Terminate a background process",
18523
- description: "Terminate one process returned by computer_exec(background=true), including its provider-owned process tree. Returns the observed terminal state so ChatGPT can stop long verification explicitly without shell PIDs or ps/kill workarounds.",
18550
+ description: "Terminate a background process started by computer_exec when it should no longer run. Stops the provider-owned process tree and returns the observed terminal state without requiring shell PIDs or ps/kill.",
18524
18551
  inputSchema: {
18525
18552
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18526
18553
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
@@ -18533,7 +18560,7 @@ var ACTION_DEFINITIONS = [
18533
18560
  {
18534
18561
  name: "computer_status",
18535
18562
  title: "Inspect a computer",
18536
- description: "READ ONLY: Read what this computer can do right now — the same resolved capabilities card computer_open returns, each entry ready or available — plus live Currybox process/runtime status and the declared container profile contract. Reach for it when you are unsure whether a capability background processes, semantic code intelligence, Preview publication — is usable on this session. This cannot modify files, processes, checkpoints, or Thread state; use get_computer on the Arbor surface for durable config and snapshot lineage.",
18563
+ description: "READ ONLY: Inspect live Computer capabilities, runtime/process state, and the declared profile when computer_open did not answer a current operational question. Use get_computer instead for durable recipe, generation, and snapshot lineage.",
18537
18564
  inputSchema: {
18538
18565
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18539
18566
  },
@@ -18544,7 +18571,7 @@ var ACTION_DEFINITIONS = [
18544
18571
  {
18545
18572
  name: "computer_verify",
18546
18573
  title: "Capture public visual evidence",
18547
- description: "Capture the 1280×720 rendering of one public HTTPS URL without starting the Thread's project runtime. Returns computerSessionId, attachmentIds, capture metadata, a gated downloadUrl, and ready-to-place attachments[].markdown; Computer MCP also emits the PNG as an inspectable image block. Put that Markdown exactly where the image belongs in your contribution or response body, and pass the matching attachmentIds so the bytes stay durably attached. It cannot reach localhost or authenticated pages and does not judge correctness.",
18574
+ description: "Capture a 1280×720 screenshot of one public HTTPS URL as Thread evidence without opening the project runtime. Returns capture metadata plus ready-to-place attachments[].markdown; put that Markdown exactly where the image belongs and bind the matching attachmentIds, while localhost and authenticated pages remain unavailable and the capture does not judge correctness.",
18548
18575
  inputSchema: {
18549
18576
  threadId: exports_external.string().describe("the Arbor Thread that will own the evidence, thr_…"),
18550
18577
  targetUrl: exports_external.url().refine((value) => value.startsWith("https://"), "targetUrl must use HTTPS").describe("one public HTTPS URL to capture")
@@ -18556,7 +18583,7 @@ var ACTION_DEFINITIONS = [
18556
18583
  {
18557
18584
  name: "code_symbols",
18558
18585
  title: "Outline a file's symbols",
18559
- description: "Outline the symbols a file or directory defines, resolved by the project's language server. Reach for this before reading a large unfamiliar file unlike a grep through `computer_exec`, it returns the real declarations with their kinds rather than every textual match. Needs the semantic-code capability shown on the computer_status card.",
18586
+ description: "READ ONLY: Outline real declarations in a file or directory when you need structure without reading or searching the whole source. Uses the language server to return symbols and kinds, distinguishing declarations from textual matches.",
18560
18587
  inputSchema: {
18561
18588
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18562
18589
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18569,7 +18596,7 @@ var ACTION_DEFINITIONS = [
18569
18596
  {
18570
18597
  name: "code_find_symbol",
18571
18598
  title: "Find a symbol by name path",
18572
- description: "Locate a declaration by its name path (`ClassName/methodName`) and optionally return its body. Use it instead of a `computer_exec` grep when you want THE definition rather than every line mentioning the name; the language server distinguishes the declaration from its call sites and its string occurrences. Needs the semantic-code capability shown on the computer_status card.",
18599
+ description: "READ ONLY: Locate a declaration by name path when you need the definition rather than text matches. Uses the language server and can include the symbol body and bounded child depth.",
18573
18600
  inputSchema: {
18574
18601
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18575
18602
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18585,7 +18612,7 @@ var ACTION_DEFINITIONS = [
18585
18612
  {
18586
18613
  name: "code_references",
18587
18614
  title: "Find what references a symbol",
18588
- description: 'List the places that actually reference a symbol, each with a short snippet. This is the operation `computer_exec` cannot do: a text search finds the same identifier in comments, unrelated modules, and shadowed scopes, while the language server resolves real references — so it answers "is this safe to change". Needs the semantic-code capability shown on the computer_status card.',
18615
+ description: "READ ONLY: Find semantic references to a declaration when you need to know what actually depends on it before a change. Uses the language server to return resolved references with snippets, excluding unrelated textual matches.",
18589
18616
  inputSchema: {
18590
18617
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18591
18618
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18599,7 +18626,7 @@ var ACTION_DEFINITIONS = [
18599
18626
  {
18600
18627
  name: "code_implementations",
18601
18628
  title: "Find implementations of a symbol",
18602
- description: "List the concrete implementations or subtypes of an interface, abstract type, or method. A `computer_exec` search cannot follow a type relationship — only the language server knows which declarations satisfy this one. Needs the semantic-code capability shown on the computer_status card.",
18629
+ description: "READ ONLY: Find concrete implementations or subtypes of an interface, abstract type, or method. Uses the language server to resolve type relationships that text search cannot follow.",
18603
18630
  inputSchema: {
18604
18631
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18605
18632
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18613,7 +18640,7 @@ var ACTION_DEFINITIONS = [
18613
18640
  {
18614
18641
  name: "code_diagnostics",
18615
18642
  title: "Read language-server diagnostics for a file",
18616
- description: "Return the language server's live errors and warnings for one file, mapped to symbols. Reach for it on a file you just edited: it answers in seconds without the whole-project build a `computer_exec` typecheck runs, though a green result here is not a substitute for that build. Needs the semantic-code capability shown on the computer_status card.",
18643
+ description: "READ ONLY: Check live language-server errors and warnings for one file, especially after an edit. Returns diagnostics mapped to symbols for fast local feedback; it does not replace a whole-project build or typecheck.",
18617
18644
  inputSchema: {
18618
18645
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18619
18646
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18626,7 +18653,7 @@ var ACTION_DEFINITIONS = [
18626
18653
  {
18627
18654
  name: "computer_export",
18628
18655
  title: "Export a Thread file",
18629
- description: "Move one bounded image, MP4/WebM video, or supported file from an opened Computer or Run into a durable Thread Attachment. Pass runId to export the exact files visible to that Run execution placement. Describe what it shows so the returned attachments[].markdown has meaningful image alt text or a video/file label; put that Markdown where the media belongs and bind those ids when contributing or responding. Supply one stable idempotencyKey per logical export: safe retries return the original Attachment, while reusing the key for another path or description conflicts.",
18656
+ description: "Export one bounded file from the parent Computer or a Run into a durable Thread Attachment when the file itself is evidence. Returns attachment ids and ready-to-place attachments[].markdown; put that Markdown exactly where the media belongs and bind the matching ids, while idempotencyKey controls safe retry identity.",
18630
18657
  inputSchema: {
18631
18658
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18632
18659
  runId: exports_external.string().optional().describe("route this export according to this Run execution placement, run_…"),
@@ -18641,7 +18668,7 @@ var ACTION_DEFINITIONS = [
18641
18668
  {
18642
18669
  name: "computer_write",
18643
18670
  title: "Write a project file",
18644
- description: "Write one file under /workspace. Content is UTF-8 by default; pass encoding=base64 only for binary bytes. Pass runId to route the write according to that Run: isolated Runs target their Sandbox, shared Runs target the live parent Computer. Without runId the write targets the parent Computer. Prefer normal editing tools for code changes; reach for this when the MCP/CLI computer surface is the only filesystem path.",
18671
+ description: "Write or replace one file in the parent Computer or a Run when the Computer surface is your filesystem editing path. Routes by runId when supplied and supports UTF-8 or explicit base64 bytes.",
18645
18672
  inputSchema: {
18646
18673
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18647
18674
  path: exports_external.string().describe("absolute path under /workspace, or a path inside the run"),
@@ -18656,7 +18683,7 @@ var ACTION_DEFINITIONS = [
18656
18683
  {
18657
18684
  name: "computer_checkpoint",
18658
18685
  title: "Checkpoint completed work",
18659
- description: "Save the live parent Thread Computer into durable Thread lineage. This is intentionally not Run-scoped: isolated Run publication/integration is a separate contract. If your work is in an isolated Run, do not call this expecting it to save that fork; publish the work through its repository workflow first. A running background process may still be writing the workspace, so checkpointing refuses until it is finished or explicitly terminated; use computer_status to inspect active processes. For the final unit, call computer_stop instead; it performs the final checkpoint before teardown. No checkpoint is needed for computer_verify alone because remote visual capture starts no project runtime.",
18686
+ description: "Checkpoint a completed unit from the live parent Thread Computer into durable Thread lineage when more parent work will follow. It is not Run-scoped; isolated Run work must be made durable through its repository workflow, and running background processes can block the checkpoint.",
18660
18687
  inputSchema: {
18661
18688
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18662
18689
  },
@@ -18667,7 +18694,7 @@ var ACTION_DEFINITIONS = [
18667
18694
  {
18668
18695
  name: "computer_publish_preview",
18669
18696
  title: "Publish an immutable static Preview",
18670
- description: "Publish one checked HTML file or bounded static build directory as a private immutable Preview. Parent publication uses computerSessionId, checkpoints the source into Thread lineage, then publishes it. Isolated Run publication uses runId, freezes that Run's exact static bytes without checkpointing, adopting the Run, or advancing parent lineage, and remains durable after the Run is destroyed. The returned arborthreads.dev URL survives teardown; put it on its own line to show the interactive Preview card. A directory must contain index.html, use relative local asset URLs, and cannot include dotfiles, source maps, secrets, symlinks, or server code. Supply one stable idempotencyKey per logical publication: safe retries return the original immutable URL, while reusing the key for another path/title or Run fork conflicts.",
18697
+ description: "Publish one checked HTML file or bounded static directory as a private immutable Preview for review. Parent publication checkpoints first; isolated Run publication freezes that Run's bytes without adopting it, and the returned arborthreads.dev URL survives teardown.",
18671
18698
  inputSchema: {
18672
18699
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required for parent publication, optional when runId is supplied"),
18673
18700
  runId: exports_external.string().optional().describe("active isolated write Run whose static workspace bytes should be published as review output"),
@@ -18682,7 +18709,7 @@ var ACTION_DEFINITIONS = [
18682
18709
  {
18683
18710
  name: "computer_publish_app_bundle",
18684
18711
  title: "Publish an immutable AppBundle",
18685
- description: "From the live parent Thread Computer, after a Bun container build is green, verify that entryPath bytes exactly match the referenced ArtifactVersion, then capture source hashes plus Git/workspace provenance, then freeze the Worker module and optional static assets into a content-addressed AppBundle. A mismatch is rejected; dirty or untracked source is allowed but returned as an explicit warning. Use the returned bundleId with app_deploy; retries require the same idempotencyKey. AppBundle publication remains intentionally parent-only; an isolated Run Preview is review output and does not adopt the Run.",
18712
+ description: "Publish a content-addressed AppBundle from the live parent Computer after a green build when an ArtifactVersion is ready for app deployment. Verifies entry bytes against the ArtifactVersion, captures source/Git provenance and static assets, and returns bundleId; isolated Runs are not accepted.",
18686
18713
  inputSchema: {
18687
18714
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18688
18715
  artifactVersionId: exports_external.string().describe("the source ArtifactVersion, artv_…"),
@@ -18704,7 +18731,7 @@ var ACTION_DEFINITIONS = [
18704
18731
  {
18705
18732
  name: "computer_stop",
18706
18733
  title: "Checkpoint and stop",
18707
- description: "Finish an opened computer after a unit of work. Currybox checkpoints and Arbor publishes before teardown; any durability failure refuses the stop instead of silently discarding state. A running background process also refuses the checkpoint; use computer_status to inspect it and computer_process_terminate when it should be stopped.",
18734
+ description: "Checkpoint and stop an opened parent Computer after the final unit of work. Teardown is refused if checkpoint durability fails or a background process is still running, so state is not silently discarded.",
18708
18735
  inputSchema: {
18709
18736
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18710
18737
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.20.13",
3
+ "version": "0.20.15",
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",