@lambdacurry/arbor 0.20.14 → 0.20.16

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 +172 -44
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -16831,6 +16831,15 @@ var computerRunDurability = exports_external.looseObject({
16831
16831
  reasonCode: exports_external.string()
16832
16832
  })
16833
16833
  });
16834
+ var computerRunDurabilitySummary = exports_external.object({
16835
+ workspace: exports_external.enum(["shared", "isolated"]),
16836
+ parentMutation: exports_external.enum(["direct", "none"]),
16837
+ finishDestroysExecution: exports_external.boolean(),
16838
+ gitPublication: exports_external.object({
16839
+ state: computerRunPublicationState,
16840
+ reasonCode: exports_external.string()
16841
+ })
16842
+ });
16834
16843
  var computerRunFinishAssessment = exports_external.looseObject({
16835
16844
  state: exports_external.enum(["safe", "blocked", "unknown"]),
16836
16845
  requiresDiscard: exports_external.boolean(),
@@ -16966,6 +16975,43 @@ var computerCapabilityCard = exports_external.looseObject({
16966
16975
  runtimeActive: exports_external.boolean()
16967
16976
  })
16968
16977
  });
16978
+ var computerOpenProfile = exports_external.object({
16979
+ id: exports_external.string(),
16980
+ version: exports_external.number(),
16981
+ tools: exports_external.array(exports_external.string()),
16982
+ recommendedEditingPrimitive: exports_external.string()
16983
+ });
16984
+ var computerOpenCapabilities = exports_external.object({
16985
+ capabilities: exports_external.array(exports_external.object({
16986
+ id: exports_external.string(),
16987
+ state: exports_external.enum(["ready", "available"])
16988
+ }))
16989
+ });
16990
+ var computerOpenGuidanceEntry = exports_external.object({
16991
+ class: exports_external.literal("guidance"),
16992
+ scope: exports_external.enum(["space", "topic"]),
16993
+ sourceId: id,
16994
+ strength: exports_external.literal("recommended"),
16995
+ message: exports_external.string()
16996
+ });
16997
+ var computerOpenAgentBrief = exports_external.object({
16998
+ work: exports_external.object({ threadId: id, title: exports_external.string(), objective: exports_external.string() }),
16999
+ guidance: exports_external.array(computerOpenGuidanceEntry),
17000
+ computer: exports_external.object({
17001
+ repositoryState: exports_external.object({
17002
+ source: exports_external.enum(["durable-snapshot", "workspace"]),
17003
+ remoteFreshness: exports_external.literal("unchecked"),
17004
+ guidance: exports_external.string()
17005
+ })
17006
+ }),
17007
+ activeRuns: exports_external.array(exports_external.object({
17008
+ runId: id,
17009
+ label: exports_external.string().nullable(),
17010
+ mode: exports_external.enum(["read", "write"]),
17011
+ execution: exports_external.enum(["shared", "isolated"]),
17012
+ status: exports_external.enum(["active", "finished", "failed", "cancelled"])
17013
+ }))
17014
+ });
16969
17015
  var codeSymbol = exports_external.looseObject({
16970
17016
  namePath: exports_external.string(),
16971
17017
  kind: exports_external.string(),
@@ -17548,33 +17594,25 @@ var MCP_OUTPUT_SCHEMAS = {
17548
17594
  guidance: exports_external.array(exports_external.string()).optional(),
17549
17595
  contributionLanes: exports_external.array(exports_external.string()).optional()
17550
17596
  }),
17551
- computer_open: exports_external.looseObject({
17552
- computerId: id,
17597
+ computer_open: exports_external.object({
17553
17598
  computerSessionId: id,
17554
- backend: exports_external.enum(["worker-shell", "container"]),
17555
- profile: computerProfile.nullable(),
17556
- startingSnapshot: snapshot.nullable(),
17557
- materialized: checkpoint.nullable(),
17599
+ profile: computerOpenProfile.nullable(),
17558
17600
  workspaceRoot: exports_external.string(),
17559
- repositories: exports_external.array(exports_external.looseObject({ repository: exports_external.string(), path: exports_external.string() })),
17601
+ repositories: exports_external.array(exports_external.object({ repository: exports_external.string(), path: exports_external.string() })),
17560
17602
  defaultCwd: exports_external.string(),
17561
- capabilities: computerCapabilityCard,
17562
- agentBrief: computerAgentBrief,
17563
- runtime: jsonObject,
17564
- reconciliation: exports_external.looseObject({
17603
+ capabilities: computerOpenCapabilities,
17604
+ agentBrief: computerOpenAgentBrief,
17605
+ reconciliation: exports_external.object({
17565
17606
  action: exports_external.literal("automatic_reprovision"),
17566
17607
  reason: exports_external.literal("container_profile_revision"),
17567
17608
  fromContainerProfileRevision: exports_external.number().int().nullable(),
17568
17609
  toContainerProfileRevision: exports_external.number().int().nullable()
17569
17610
  }).optional()
17570
17611
  }),
17571
- computer_run_start: exports_external.looseObject({
17612
+ computer_run_start: exports_external.object({
17572
17613
  runId: id,
17573
17614
  execution: exports_external.enum(["shared", "isolated"]),
17574
- baseSnapshotId: id.nullable(),
17575
- gitStart: computerRunGitStart.nullable().optional(),
17576
- durability: computerRunDurability,
17577
- guidance: exports_external.array(operatingGuidanceEntry),
17615
+ durability: computerRunDurabilitySummary,
17578
17616
  status: exports_external.string()
17579
17617
  }),
17580
17618
  computer_run_finish: exports_external.looseObject({
@@ -17816,6 +17854,17 @@ function record2(value) {
17816
17854
  function defined(entries) {
17817
17855
  return Object.fromEntries(entries.filter(([, value]) => value !== undefined));
17818
17856
  }
17857
+ function selected(value, fields) {
17858
+ const source = record2(value);
17859
+ if (!source)
17860
+ return;
17861
+ return defined(fields.map((field) => [field, source[field]]));
17862
+ }
17863
+ function selectedArray(value, fields) {
17864
+ if (!Array.isArray(value))
17865
+ return;
17866
+ return value.map((entry) => selected(entry, fields) ?? {});
17867
+ }
17819
17868
  var OUTPUT_SHAPERS = {
17820
17869
  contribute: (result) => defined([
17821
17870
  ["contributionId", result.contributionId],
@@ -17852,15 +17901,94 @@ var OUTPUT_SHAPERS = {
17852
17901
  ["withdrawn", result.withdrawn]
17853
17902
  ]),
17854
17903
  dismiss: (result) => defined([["status", result.status]]),
17904
+ computer_open: (result) => {
17905
+ const profile3 = record2(result.profile);
17906
+ const capabilityCard = record2(result.capabilities);
17907
+ const capabilityEntries = Array.isArray(capabilityCard?.capabilities) ? capabilityCard.capabilities.map((value) => {
17908
+ const capability = record2(value) ?? {};
17909
+ return defined([
17910
+ ["id", capability.id],
17911
+ ["state", capability.state]
17912
+ ]);
17913
+ }) : undefined;
17914
+ const agentBrief = record2(result.agentBrief);
17915
+ const work = record2(agentBrief?.work);
17916
+ const computer2 = record2(agentBrief?.computer);
17917
+ const repositories = selectedArray(result.repositories, ["repository", "path"]);
17918
+ const guidance = selectedArray(agentBrief?.guidance, [
17919
+ "class",
17920
+ "scope",
17921
+ "sourceId",
17922
+ "strength",
17923
+ "message"
17924
+ ]);
17925
+ const repositoryState = selected(computer2?.repositoryState, [
17926
+ "source",
17927
+ "remoteFreshness",
17928
+ "guidance"
17929
+ ]);
17930
+ const activeRuns = selectedArray(agentBrief?.activeRuns, [
17931
+ "runId",
17932
+ "label",
17933
+ "mode",
17934
+ "execution",
17935
+ "status"
17936
+ ]);
17937
+ const reconciliation = selected(result.reconciliation, [
17938
+ "action",
17939
+ "reason",
17940
+ "fromContainerProfileRevision",
17941
+ "toContainerProfileRevision"
17942
+ ]);
17943
+ return defined([
17944
+ ["computerSessionId", result.computerSessionId],
17945
+ [
17946
+ "profile",
17947
+ result.profile === null ? null : profile3 ? defined([
17948
+ ["id", profile3.id],
17949
+ ["version", profile3.version],
17950
+ ["tools", profile3.tools],
17951
+ ["recommendedEditingPrimitive", profile3.recommendedEditingPrimitive]
17952
+ ]) : undefined
17953
+ ],
17954
+ ["workspaceRoot", result.workspaceRoot],
17955
+ ["repositories", repositories],
17956
+ ["defaultCwd", result.defaultCwd],
17957
+ ["capabilities", capabilityEntries ? { capabilities: capabilityEntries } : undefined],
17958
+ [
17959
+ "agentBrief",
17960
+ agentBrief ? defined([
17961
+ [
17962
+ "work",
17963
+ work ? defined([
17964
+ ["threadId", work.threadId],
17965
+ ["title", work.title],
17966
+ ["objective", work.objective]
17967
+ ]) : undefined
17968
+ ],
17969
+ ["guidance", guidance],
17970
+ ["computer", computer2 ? defined([["repositoryState", repositoryState]]) : undefined],
17971
+ ["activeRuns", activeRuns]
17972
+ ]) : undefined
17973
+ ],
17974
+ ["reconciliation", reconciliation]
17975
+ ]);
17976
+ },
17855
17977
  computer_run_start: (result) => {
17856
17978
  const run = record2(result.run) ?? {};
17979
+ const durability = record2(run.durability) ?? {};
17857
17980
  return defined([
17858
17981
  ["runId", run.runId],
17859
17982
  ["execution", run.execution],
17860
- ["baseSnapshotId", run.baseSnapshotId],
17861
- ["gitStart", run.gitStart],
17862
- ["durability", run.durability],
17863
- ["guidance", result.guidance],
17983
+ [
17984
+ "durability",
17985
+ defined([
17986
+ ["workspace", durability.workspace],
17987
+ ["parentMutation", durability.parentMutation],
17988
+ ["finishDestroysExecution", durability.finishDestroysExecution],
17989
+ ["gitPublication", selected(durability.gitPublication, ["state", "reasonCode"])]
17990
+ ])
17991
+ ],
17864
17992
  ["status", run.status]
17865
17993
  ]);
17866
17994
  },
@@ -18424,7 +18552,7 @@ var ACTION_DEFINITIONS = [
18424
18552
  {
18425
18553
  name: "computer_open",
18426
18554
  title: "Open a Thread computer",
18427
- 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.",
18555
+ 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.",
18428
18556
  inputSchema: {
18429
18557
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
18430
18558
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -18437,7 +18565,7 @@ var ACTION_DEFINITIONS = [
18437
18565
  {
18438
18566
  name: "computer_reprovision",
18439
18567
  title: "Replace a Thread computer",
18440
- 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.",
18568
+ 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.",
18441
18569
  inputSchema: {
18442
18570
  threadId: exports_external.string().describe("the Thread whose active Computer generation is replaced, thr_…"),
18443
18571
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this ONE replacement request; reuse it unchanged for retries"),
@@ -18450,7 +18578,7 @@ var ACTION_DEFINITIONS = [
18450
18578
  {
18451
18579
  name: "computer_run_start",
18452
18580
  title: "Start a run",
18453
- 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.",
18581
+ description: "Start one bounded unit of work inside an opened Thread Computer when you need a read or write Run. Returns runId, placement/status, and compact durability facts; detailed base Git/snapshot state remains inspectable from the Run receipt, and write Runs default to isolated unless execution='shared' is chosen.",
18454
18582
  inputSchema: {
18455
18583
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18456
18584
  mode: exports_external.enum(["read", "write"]).describe("write for mutable work; read for shared inspection"),
@@ -18464,7 +18592,7 @@ var ACTION_DEFINITIONS = [
18464
18592
  {
18465
18593
  name: "computer_repo_work_status",
18466
18594
  title: "Inspect repository finish state",
18467
- 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.",
18595
+ 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.",
18468
18596
  inputSchema: {
18469
18597
  runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
18470
18598
  },
@@ -18475,7 +18603,7 @@ var ACTION_DEFINITIONS = [
18475
18603
  {
18476
18604
  name: "computer_run_finish",
18477
18605
  title: "Finish a run",
18478
- 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.",
18606
+ 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.",
18479
18607
  inputSchema: {
18480
18608
  runId: exports_external.string().describe("the runId returned by computer_run_start, run_…"),
18481
18609
  outcome: exports_external.enum(["finished", "failed", "cancelled"]).optional().describe("terminal outcome; defaults to finished"),
@@ -18489,7 +18617,7 @@ var ACTION_DEFINITIONS = [
18489
18617
  {
18490
18618
  name: "computer_run_receipt",
18491
18619
  title: "Read a run receipt",
18492
- 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), durable operation receipts with stable state/reason/retry-safety, meaningful activity, and terminal outcome. Foreground and background work may appear as distilled process identities/labels/outcomes, but Arbor keeps no raw command transcript or process output. The receipt stays readable after the Run is terminal.",
18620
+ 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.",
18493
18621
  inputSchema: {
18494
18622
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
18495
18623
  },
@@ -18500,7 +18628,7 @@ var ACTION_DEFINITIONS = [
18500
18628
  {
18501
18629
  name: "computer_runs",
18502
18630
  title: "List runs",
18503
- 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.",
18631
+ 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.",
18504
18632
  inputSchema: {
18505
18633
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18506
18634
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]).optional().describe("filter to one lifecycle status"),
@@ -18513,12 +18641,12 @@ var ACTION_DEFINITIONS = [
18513
18641
  {
18514
18642
  name: "computer_exec",
18515
18643
  title: "Run a command",
18516
- 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 explicit asynchronous work, background=true returns a processId immediately. On an isolated container Run, foreground exec also establishes a durable operation/process identity before Arbor waits; a missed foreground response can be recovered from computer_run_receipt.operations and computer_process_read without repeating the mutation. 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. Provider-owned processes stay in the environment where they were started.",
18644
+ 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.",
18517
18645
  inputSchema: {
18518
18646
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18519
18647
  command: exports_external.string().min(1).describe("the shell command to run"),
18520
18648
  runId: exports_external.string().optional().describe("route this command according to this Run execution placement, run_… (from computer_run_start)"),
18521
- cwd: exports_external.string().optional().describe("working directory under /workspace, or under the run"),
18649
+ cwd: exports_external.string().optional().describe("working directory under /workspace, or under the run; omit to use defaultCwd"),
18522
18650
  timeout: exports_external.number().int().min(1000).max(1800000).optional().describe("timeout in milliseconds, from 1,000 through 1,800,000"),
18523
18651
  background: exports_external.boolean().optional().describe("start a container process and return its pid"),
18524
18652
  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"),
@@ -18532,7 +18660,7 @@ var ACTION_DEFINITIONS = [
18532
18660
  {
18533
18661
  name: "computer_process_read",
18534
18662
  title: "Read a background process",
18535
- description: "READ ONLY: Read one provider-owned process from computer_exec, including a recoverable foreground operation discovered through computer_run_receipt.operations. 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 the existing compact activity receipt that distinguishes fresh output, active CPU work, quiet running, terminal state, and unavailable telemetry without exposing raw process tables. For a known foreground recovery handle whose provider state cannot be observed, returns structured recovery state/reason/retry-safety instead of guessing. Once terminal, also returns the final exit result.",
18663
+ 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.",
18536
18664
  inputSchema: {
18537
18665
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18538
18666
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
@@ -18547,7 +18675,7 @@ var ACTION_DEFINITIONS = [
18547
18675
  {
18548
18676
  name: "computer_process_terminate",
18549
18677
  title: "Terminate a background process",
18550
- 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.",
18678
+ 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.",
18551
18679
  inputSchema: {
18552
18680
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18553
18681
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
@@ -18560,7 +18688,7 @@ var ACTION_DEFINITIONS = [
18560
18688
  {
18561
18689
  name: "computer_status",
18562
18690
  title: "Inspect a computer",
18563
- 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.",
18691
+ 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.",
18564
18692
  inputSchema: {
18565
18693
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18566
18694
  },
@@ -18571,7 +18699,7 @@ var ACTION_DEFINITIONS = [
18571
18699
  {
18572
18700
  name: "computer_verify",
18573
18701
  title: "Capture public visual evidence",
18574
- 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.",
18702
+ 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.",
18575
18703
  inputSchema: {
18576
18704
  threadId: exports_external.string().describe("the Arbor Thread that will own the evidence, thr_…"),
18577
18705
  targetUrl: exports_external.url().refine((value) => value.startsWith("https://"), "targetUrl must use HTTPS").describe("one public HTTPS URL to capture")
@@ -18583,7 +18711,7 @@ var ACTION_DEFINITIONS = [
18583
18711
  {
18584
18712
  name: "code_symbols",
18585
18713
  title: "Outline a file's symbols",
18586
- 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.",
18714
+ 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.",
18587
18715
  inputSchema: {
18588
18716
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18589
18717
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18596,7 +18724,7 @@ var ACTION_DEFINITIONS = [
18596
18724
  {
18597
18725
  name: "code_find_symbol",
18598
18726
  title: "Find a symbol by name path",
18599
- 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.",
18727
+ 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.",
18600
18728
  inputSchema: {
18601
18729
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18602
18730
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18612,7 +18740,7 @@ var ACTION_DEFINITIONS = [
18612
18740
  {
18613
18741
  name: "code_references",
18614
18742
  title: "Find what references a symbol",
18615
- 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.',
18743
+ 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.",
18616
18744
  inputSchema: {
18617
18745
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18618
18746
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18626,7 +18754,7 @@ var ACTION_DEFINITIONS = [
18626
18754
  {
18627
18755
  name: "code_implementations",
18628
18756
  title: "Find implementations of a symbol",
18629
- 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.",
18757
+ 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.",
18630
18758
  inputSchema: {
18631
18759
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18632
18760
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18640,7 +18768,7 @@ var ACTION_DEFINITIONS = [
18640
18768
  {
18641
18769
  name: "code_diagnostics",
18642
18770
  title: "Read language-server diagnostics for a file",
18643
- 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.",
18771
+ 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.",
18644
18772
  inputSchema: {
18645
18773
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18646
18774
  runId: exports_external.string().optional().describe("route this semantic read according to this Run execution placement, run_…"),
@@ -18653,7 +18781,7 @@ var ACTION_DEFINITIONS = [
18653
18781
  {
18654
18782
  name: "computer_export",
18655
18783
  title: "Export a Thread file",
18656
- 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.",
18784
+ 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.",
18657
18785
  inputSchema: {
18658
18786
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18659
18787
  runId: exports_external.string().optional().describe("route this export according to this Run execution placement, run_…"),
@@ -18668,7 +18796,7 @@ var ACTION_DEFINITIONS = [
18668
18796
  {
18669
18797
  name: "computer_write",
18670
18798
  title: "Write a project file",
18671
- 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.",
18799
+ 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.",
18672
18800
  inputSchema: {
18673
18801
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18674
18802
  path: exports_external.string().describe("absolute path under /workspace, or a path inside the run"),
@@ -18683,7 +18811,7 @@ var ACTION_DEFINITIONS = [
18683
18811
  {
18684
18812
  name: "computer_checkpoint",
18685
18813
  title: "Checkpoint completed work",
18686
- 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.",
18814
+ 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.",
18687
18815
  inputSchema: {
18688
18816
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18689
18817
  },
@@ -18694,7 +18822,7 @@ var ACTION_DEFINITIONS = [
18694
18822
  {
18695
18823
  name: "computer_publish_preview",
18696
18824
  title: "Publish an immutable static Preview",
18697
- 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.",
18825
+ 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.",
18698
18826
  inputSchema: {
18699
18827
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required for parent publication, optional when runId is supplied"),
18700
18828
  runId: exports_external.string().optional().describe("active isolated write Run whose static workspace bytes should be published as review output"),
@@ -18709,7 +18837,7 @@ var ACTION_DEFINITIONS = [
18709
18837
  {
18710
18838
  name: "computer_publish_app_bundle",
18711
18839
  title: "Publish an immutable AppBundle",
18712
- 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.",
18840
+ 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.",
18713
18841
  inputSchema: {
18714
18842
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
18715
18843
  artifactVersionId: exports_external.string().describe("the source ArtifactVersion, artv_…"),
@@ -18731,7 +18859,7 @@ var ACTION_DEFINITIONS = [
18731
18859
  {
18732
18860
  name: "computer_stop",
18733
18861
  title: "Checkpoint and stop",
18734
- 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.",
18862
+ 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.",
18735
18863
  inputSchema: {
18736
18864
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
18737
18865
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.20.14",
3
+ "version": "0.20.16",
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",