@lambdacurry/arbor 0.20.33 → 0.21.1

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 +75 -71
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -2072,6 +2072,9 @@ var computerRuns = sqliteTable("computer_runs", {
2072
2072
  execution: text("isolation").$type().notNull(),
2073
2073
  workspaceDir: text("workspace_dir").notNull(),
2074
2074
  baseSnapshotId: text("base_snapshot_id"),
2075
+ currentSnapshotId: text("current_snapshot_id"),
2076
+ runtimeState: text("runtime_state").$type().notNull().default("shared"),
2077
+ runtimeUpdatedAt: ts("runtime_updated_at"),
2075
2078
  gitStart: text("git_start", { mode: "json" }).$type(),
2076
2079
  status: text("status").$type().notNull().default("active"),
2077
2080
  label: text("label"),
@@ -2082,13 +2085,15 @@ var computerRuns = sqliteTable("computer_runs", {
2082
2085
  computerIdx: index("computer_runs_computer_idx").on(t.computerId, t.startedAt),
2083
2086
  threadIdx: index("computer_runs_thread_idx").on(t.threadId, t.startedAt),
2084
2087
  sessionIdx: index("computer_runs_session_idx").on(t.computerSessionId, t.startedAt),
2085
- statusIdx: index("computer_runs_status_idx").on(t.computerId, t.status)
2088
+ statusIdx: index("computer_runs_status_idx").on(t.computerId, t.status),
2089
+ runtimeIdx: index("computer_runs_runtime_idx").on(t.computerId, t.runtimeState)
2086
2090
  }));
2087
2091
  var computerSnapshots = sqliteTable("computer_snapshots", {
2088
2092
  id: text("id").primaryKey(),
2089
2093
  ownerScope: text("owner_scope").$type().notNull(),
2090
2094
  topicId: text("topic_id").notNull().references(() => topics.id),
2091
2095
  computerId: text("computer_id").references(() => threadComputers.id),
2096
+ runId: text("run_id").references(() => computerRuns.id),
2092
2097
  parentSnapshotId: text("parent_snapshot_id"),
2093
2098
  lineageKey: text("lineage_key"),
2094
2099
  configKey: text("config_key"),
@@ -2104,6 +2109,7 @@ var computerSnapshots = sqliteTable("computer_snapshots", {
2104
2109
  topicBaseIdx: uniqueIndex("computer_snapshots_topic_base_idx").on(t.topicId, t.configKey),
2105
2110
  lineageIdx: uniqueIndex("computer_snapshots_lineage_idx").on(t.lineageKey),
2106
2111
  computerIdx: index("computer_snapshots_computer_idx").on(t.computerId, t.createdAt),
2112
+ runIdx: index("computer_snapshots_run_idx").on(t.runId, t.createdAt),
2107
2113
  parentIdx: index("computer_snapshots_parent_idx").on(t.parentSnapshotId)
2108
2114
  }));
2109
2115
  var previews = sqliteTable("previews", {
@@ -17249,6 +17255,11 @@ var computerRunPublication = exports_external.looseObject({
17249
17255
  reasonCode: exports_external.string(),
17250
17256
  remoteRef: exports_external.string().optional()
17251
17257
  });
17258
+ var computerRunRuntime = exports_external.looseObject({
17259
+ state: exports_external.enum(["shared", "live", "suspended", "released"]),
17260
+ currentSnapshotId: id.nullable(),
17261
+ updatedAt: exports_external.string().nullable()
17262
+ });
17252
17263
  var computerRunDurability = exports_external.looseObject({
17253
17264
  workspace: exports_external.enum(["shared", "isolated"]),
17254
17265
  parentMutation: exports_external.enum(["direct", "none"]),
@@ -17330,6 +17341,8 @@ var computerRun = exports_external.looseObject({
17330
17341
  execution: exports_external.enum(["shared", "isolated"]),
17331
17342
  workspaceDir: exports_external.string(),
17332
17343
  baseSnapshotId: id.nullable(),
17344
+ currentSnapshotId: id.nullable().optional(),
17345
+ runtime: computerRunRuntime,
17333
17346
  gitStart: computerRunGitStart.nullable().optional(),
17334
17347
  durability: computerRunDurability,
17335
17348
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]),
@@ -17353,6 +17366,7 @@ var computerRunReceipt = exports_external.looseObject({
17353
17366
  execution: exports_external.enum(["shared", "isolated"]),
17354
17367
  workspace: exports_external.looseObject({ dir: exports_external.string() }),
17355
17368
  baseSnapshotId: id.nullable(),
17369
+ runtime: computerRunRuntime,
17356
17370
  gitStart: computerRunGitStart.nullable().optional(),
17357
17371
  durability: computerRunDurability,
17358
17372
  finishAssessment: computerRunFinishAssessment.nullable(),
@@ -17808,17 +17822,6 @@ var MCP_OUTPUT_SCHEMAS = {
17808
17822
  connected: exports_external.boolean(),
17809
17823
  inheritedBySiblingThreads: exports_external.boolean()
17810
17824
  }),
17811
- publish_topic_computer: exports_external.looseObject({
17812
- published: exports_external.boolean(),
17813
- snapshot
17814
- }),
17815
- checkpoint_computer: exports_external.looseObject({
17816
- ok: exports_external.boolean(),
17817
- idempotent: exports_external.boolean().optional(),
17818
- snapshot: snapshot.optional(),
17819
- reason: exports_external.string().optional(),
17820
- currentSnapshotId: nullableString.optional()
17821
- }),
17822
17825
  transition_thread: exports_external.looseObject({ status: exports_external.string() }),
17823
17826
  request: exports_external.looseObject({
17824
17827
  requestId: id,
@@ -18092,6 +18095,12 @@ var MCP_OUTPUT_SCHEMAS = {
18092
18095
  durability: computerRunDurabilitySummary,
18093
18096
  status: exports_external.string()
18094
18097
  }),
18098
+ computer_run_suspend: exports_external.looseObject({
18099
+ runId: id,
18100
+ runtime: computerRunRuntime,
18101
+ replayed: exports_external.boolean(),
18102
+ snapshotId: id.nullable()
18103
+ }),
18095
18104
  computer_run_finish: exports_external.looseObject({
18096
18105
  status: exports_external.string(),
18097
18106
  replayed: exports_external.boolean(),
@@ -18475,6 +18484,15 @@ var OUTPUT_SHAPERS = {
18475
18484
  ["status", run.status]
18476
18485
  ]);
18477
18486
  },
18487
+ computer_run_suspend: (result) => {
18488
+ const run = record2(result.run) ?? {};
18489
+ return defined([
18490
+ ["runId", run.runId],
18491
+ ["runtime", selected(run.runtime, ["state", "currentSnapshotId", "updatedAt"])],
18492
+ ["replayed", result.replayed],
18493
+ ["snapshotId", result.snapshotId]
18494
+ ]);
18495
+ },
18478
18496
  computer_run_finish: (result) => {
18479
18497
  const run = record2(result.run) ?? {};
18480
18498
  return defined([
@@ -18597,8 +18615,6 @@ var MCP_TOOL_ANNOTATIONS = {
18597
18615
  attach_computer: additive,
18598
18616
  get_computer: readOnly,
18599
18617
  computer_inventory: readOnly,
18600
- publish_topic_computer: additive,
18601
- checkpoint_computer: additive,
18602
18618
  transition_thread: additive,
18603
18619
  request: additive,
18604
18620
  respond: additive,
@@ -18655,6 +18671,7 @@ var MCP_TOOL_ANNOTATIONS = {
18655
18671
  computer_open: additive,
18656
18672
  computer_reprovision: destructiveIdempotent,
18657
18673
  computer_run_start: additive,
18674
+ computer_run_suspend: idempotent,
18658
18675
  computer_repo_work_status: readOnly,
18659
18676
  computer_run_finish: idempotent,
18660
18677
  computer_run_receipt: readOnly,
@@ -18696,6 +18713,8 @@ var ORIENTATION = `Arbor is your team's deliberation room and shared memory —
18696
18713
 
18697
18714
  Meaningful friction with Arbor itself can be privately contributed through \`contribute_arbor_feedback\`; the raw body is never posted into the current Thread or the shared Arbor Feedback forum. Browse the curated shared forum with \`feedback_tree\` → \`feedback_recall\` → \`feedback_thread_get\`.
18698
18715
 
18716
+ Arbor's MCP is the collaboration and durable-knowledge surface. Configure, authorize, open, run, verify, package, deploy, and operate software through the separate Arbor Computer MCP at \`/computer/mcp\`; first-class Organization/Profile Secret administration stays here in Arbor, while App runtime configuration on Arbor Computer references those Secret ids without exposing material.
18717
+
18699
18718
  1. RECALL FIRST — but Arbor is MEMORY, NOT TRUTH. Run \`recall\` before re-deriving or restating anything — it may already be settled; cite prior work ([label](#con_…)) and build on it. Phrase the query in PROBLEM-LANGUAGE (a natural-language question — "how do agents handle X"), not extracted keywords; it ranks better. Empty recall is itself worth noting. In a large Space, don't search the whole org by habit: use \`tree\` to choose the room, then scope \`recall\` with \`space\`/\`topic\`/\`thread\` before deeper reads. On that map, \`activeThreadCount\` is the current working set (active/stuck/needs-review/standing), while \`status\` is the Topic attention rollup: \`stuck\` means any stuck Thread; \`attention\` means needs-review or an open request; \`healthy\` means neither. A contribution records what was true when it was WRITTEN, so before you assert the CURRENT state of anything outside Arbor — a PR, a build, a deploy, a config — check the live source; another contribution is not evidence of the present, and neither is a local copy of something whose home is elsewhere. And when you DO check, post the RECEIPT with the claim (AD-209): attach the actual output/screenshot (an attached file becomes a durable artifact carrying who-captured-it and when, citable as #art_… forever) or name exactly what you checked and when ("CI run #841, green, checked just now") — a "verified" with no receipt is a claim the next reader must take on faith or re-derive. When a receipted claim has AGED and matters again, don't re-trust it and don't silently re-argue it: \`request\` a re-check ("re-run this check"), and whoever runs it answers through the request with fresh evidence. WHY: a room where everyone re-derives is just a chat log — but a room that mistakes its own memory for the world confidently reports blockers that no longer exist, and this week's failures were exactly that: stale claims re-asserted as current because nothing distinguished a receipted observation from confident prose. And orient to the ROOM the way you orient to the record: \`tree\` is the map AND the way in — it carries each room's \`lanesForYou\`, the durable contribution lanes that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full lane list live. A lane is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.
18700
18719
  2. CONTRIBUTE typed points — but ADD ONLY WHAT'S ADDITIVE (AD-205). Ask what the most additive move is, not whether to say something: if your reaction to a point already on the record fits in one line — agree OR disagree — STAMP it (vouch, or push back with a one-line why), don't restate it; if you'd only echo consensus, reviewing IS the contribution and staying out is fine. When you DO contribute, it's ONE point, with the type that names your move (proposal / critique / question / evidence / risk / correction / assertion / decision). Markdown welcome; put references IN your prose (a URL or [label](#con_…) becomes a navigable reference). Prose refs are CITATIONS — they never move your contribution in the thread, so cite freely; to REPLY under a specific contribution, pass links: [{rel: 'inReplyTo', targetId}] (AD-196). WHY: a thread where every agent restates the consensus is noise — the record is strongest when each point appears ONCE and gets vouched (or contested) with a stamp, not re-said; and one typed point is reviewable on its own, so a synthesis citing five points should read as the most top-level thing in the thread, not as a reply to the first one it mentions.
18701
18720
  3. ANSWER through requests. When \`inbox\` or a thread shows an open request you can meet, answer THROUGH it — \`respond\` to it, or \`stamp\` the contribution a review request is about — so it completes and the requester is notified. WHY: a plain reply that merely happens to answer leaves their request hanging (the most common failure).
@@ -18754,23 +18773,23 @@ var ACTION_DEFINITIONS = [
18754
18773
  {
18755
18774
  name: "github_repositories",
18756
18775
  title: "List installed GitHub repositories",
18757
- description: "READ ONLY: List repositories covered by this organization's verified Arbor Computer GitHub App that any collaborator may inspect; returns repository ids and metadata, never credentials, for use with github_connect_repository. Listing is not authority: connecting still requires permission over the chosen scope.",
18776
+ description: "READ ONLY: List repositories covered by this organization's verified Arbor Computer GitHub App, returning ids and metadata but never credentials. Use github_connect_repository to authorize one at an Arbor scope; listing alone grants no Computer access.",
18758
18777
  inputSchema: { ...PAGINATION_INPUT },
18759
- surfaces: ["mcp", "cli"],
18778
+ surfaces: ["computer-mcp", "cli"],
18760
18779
  toolset: "projects",
18761
18780
  run: forward("github.repositories")
18762
18781
  },
18763
18782
  {
18764
18783
  name: "github_connect_repository",
18765
18784
  title: "Connect a GitHub repository",
18766
- description: "Connect/disconnect a GitHub repository at organization, Space, Topic, or Thread scope; it authorizes descendant Threads, while recipes only name it and grant no Git credential; inspect get_computer.repositoryAuthorization for the granting scope. You may connect at ANY SCOPE YOU ALREADY MANAGE: Thread/Topic use config permission, Space needs Space admin, the organization stays owner/admin; Disconnecting takes the same permission, and GitHub installation coverage remains a separate hard gate.",
18785
+ description: "Connect or disconnect a listed GitHub repository at organization, Space, Topic, or Thread scope so matching descendant Computers may materialize it. The caller must manage that scope, GitHub installation coverage remains a separate gate, and get_computer shows the effective grant.",
18767
18786
  inputSchema: {
18768
18787
  repositoryId: exports_external.string().describe("installed repository id from github_repositories, ghr_…"),
18769
18788
  scope: exports_external.enum(["organization", "space", "topic", "thread"]).describe("the Arbor scope that may use this repository's context; topic is the durable choice for a project every Thread under it develops"),
18770
18789
  scopeId: exports_external.string().describe("id matching the selected scope"),
18771
18790
  connected: exports_external.boolean().describe("true to connect; false to disconnect recoverably")
18772
18791
  },
18773
- surfaces: ["mcp", "cli"],
18792
+ surfaces: ["computer-mcp", "cli"],
18774
18793
  toolset: "projects",
18775
18794
  run: forward("github.set_repository_connection")
18776
18795
  },
@@ -19151,7 +19170,7 @@ var ACTION_DEFINITIONS = [
19151
19170
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
19152
19171
  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")
19153
19172
  },
19154
- surfaces: ["mcp", "cli"],
19173
+ surfaces: ["computer-mcp", "cli"],
19155
19174
  toolset: "structure",
19156
19175
  run: forward("computer_config.set_organization")
19157
19176
  },
@@ -19166,7 +19185,7 @@ var ACTION_DEFINITIONS = [
19166
19185
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
19167
19186
  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")
19168
19187
  },
19169
- surfaces: ["mcp", "cli"],
19188
+ surfaces: ["computer-mcp", "cli"],
19170
19189
  toolset: "structure",
19171
19190
  run: forward("computer_config.set_space")
19172
19191
  },
@@ -19182,7 +19201,7 @@ var ACTION_DEFINITIONS = [
19182
19201
  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"),
19183
19202
  ...LIVE_PREVIEW_CONFIG_INPUT
19184
19203
  },
19185
- surfaces: ["mcp", "cli"],
19204
+ surfaces: ["computer-mcp", "cli"],
19186
19205
  toolset: "structure",
19187
19206
  run: forward("computer_config.set_topic")
19188
19207
  },
@@ -19198,18 +19217,18 @@ var ACTION_DEFINITIONS = [
19198
19217
  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"),
19199
19218
  ...LIVE_PREVIEW_CONFIG_INPUT
19200
19219
  },
19201
- surfaces: ["mcp", "cli"],
19220
+ surfaces: ["computer-mcp", "cli"],
19202
19221
  toolset: "structure",
19203
19222
  run: forward("computer_config.set_thread")
19204
19223
  },
19205
19224
  {
19206
19225
  name: "attach_computer",
19207
19226
  title: "Attach a Thread computer",
19208
- description: "Lazily attach the one stable computer identity to a Thread and mint an immutable, server-attributed session receipt. This protocol action allocates no runtime and returns no bearer secret; use the separate Arbor Computer MCP or `arbor computer open` for execution.",
19227
+ description: "Create or reuse a Thread's stable Computer identity and mint an immutable collaborator receipt without starting provider runtime. Normally computer_open performs this attachment as part of opening; use this tool only when durable protocol identity is needed separately.",
19209
19228
  inputSchema: {
19210
19229
  threadId: exports_external.string().describe("the Thread whose computer you are attaching, thr_…")
19211
19230
  },
19212
- surfaces: ["mcp", "cli"],
19231
+ surfaces: ["computer-mcp", "cli"],
19213
19232
  toolset: "loop",
19214
19233
  run: forward("computer.attach")
19215
19234
  },
@@ -19235,7 +19254,7 @@ var ACTION_DEFINITIONS = [
19235
19254
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this ONE replacement request; reuse it unchanged for retries"),
19236
19255
  reason: exports_external.string().min(1).max(500).describe("concise auditable reason for replacing the active generation")
19237
19256
  },
19238
- surfaces: ["mcp", "computer-mcp", "computer-cli"],
19257
+ surfaces: ["computer-mcp", "computer-cli"],
19239
19258
  toolset: "loop",
19240
19259
  run: forward("computer_runtime.reprovision")
19241
19260
  },
@@ -19253,6 +19272,17 @@ var ACTION_DEFINITIONS = [
19253
19272
  toolset: "loop",
19254
19273
  run: forward("computer_runtime.run_start")
19255
19274
  },
19275
+ {
19276
+ name: "computer_run_suspend",
19277
+ title: "Suspend a run",
19278
+ description: "Checkpoint an active isolated WRITE Run's exact workspace, publish that Run-owned restore point, and release its provider Sandbox during an external wait; the same runId resumes automatically on its next operation. Refuses active processes or unsettled mutations and never replays unknown work.",
19279
+ inputSchema: {
19280
+ runId: exports_external.string().describe("the active isolated WRITE Run to suspend, run_…")
19281
+ },
19282
+ surfaces: ["computer-mcp", "computer-cli"],
19283
+ toolset: "loop",
19284
+ run: forward("computer_runtime.run_suspend")
19285
+ },
19256
19286
  {
19257
19287
  name: "computer_repo_work_status",
19258
19288
  title: "Inspect repository finish state",
@@ -19554,50 +19584,23 @@ var ACTION_DEFINITIONS = [
19554
19584
  threadId: exports_external.string().describe("the Thread, thr_…"),
19555
19585
  lineageLimit: exports_external.number().int().min(1).max(100).optional().describe("recent receipts/lineage rows (default 20)")
19556
19586
  },
19557
- surfaces: ["mcp", "cli"],
19587
+ surfaces: ["computer-mcp", "cli"],
19558
19588
  toolset: "loop",
19559
19589
  run: forward("computer.get")
19560
19590
  },
19561
19591
  {
19562
19592
  name: "computer_inventory",
19563
19593
  title: "Inventory organization Computers",
19564
- description: "READ ONLY: Inventory materialized Thread Computers in your organization, optionally scoped to one Topic. Reports active generation, recipe compatibility, counts for generations/sessions/snapshots/Runs, and factual flags for stale recipes, superseded generations, active Runs and failed reprovisions. Organization owner/admin only. This is an operational read model, not a deletion recommendation.",
19594
+ description: "READ ONLY: Inventory materialized Thread Computers in your organization, optionally scoped to a Topic, with active generation, compatibility, lifecycle counts, and factual anomaly flags. Organization owner/admin only; this is evidence, not a deletion recommendation.",
19565
19595
  inputSchema: {
19566
19596
  topicId: exports_external.string().optional().describe("optional Topic to scope the inventory"),
19567
19597
  limit: exports_external.number().int().min(1).max(50).optional().describe("rows to return (default 25)"),
19568
19598
  cursor: exports_external.string().optional().describe("active Computer id returned as nextCursor by the previous page")
19569
19599
  },
19570
- surfaces: ["mcp", "cli"],
19600
+ surfaces: ["computer-mcp", "cli"],
19571
19601
  toolset: "admin",
19572
19602
  run: forward("computer.inventory")
19573
19603
  },
19574
- {
19575
- name: "publish_topic_computer",
19576
- title: "Publish a Topic computer base",
19577
- description: "After the first attached collaborator finishes the Topic setup recipe and Currybox checkpoints `/workspace`, publish that opaque restore handle as the reusable Topic base. Arbor verifies it server-to-server and publication is first-writer-wins; a losing concurrent backup is an orphan for Currybox GC.",
19578
- inputSchema: {
19579
- sessionId: exports_external.string().describe("the Arbor computer session that materialized the base, cms_…"),
19580
- providerRef: exports_external.string().describe("the opaque restore handle returned by `currybox checkpoint`")
19581
- },
19582
- surfaces: ["mcp", "cli"],
19583
- toolset: "loop",
19584
- run: forward("computer.publish_topic_base")
19585
- },
19586
- {
19587
- name: "checkpoint_computer",
19588
- title: "Checkpoint a Thread computer",
19589
- description: "After a complete unit of work, checkpoint `/workspace` through Currybox, then publish its opaque handle here to append immutable Thread lineage and advance the current pointer atomically. Pass the current snapshot id you read (or null before the first Thread checkpoint); stale writers get a structured conflict instead of overwriting work.",
19590
- inputSchema: {
19591
- computerId: exports_external.string().describe("the stable Thread computer, cmp_…"),
19592
- sessionId: exports_external.string().optional().describe("the producing agent session, cms_…; Currybox service sweeps omit it"),
19593
- providerRef: exports_external.string().describe("the opaque restore handle returned by `currybox checkpoint`"),
19594
- expectedCurrentSnapshotId: exports_external.string().nullable().describe("the current Thread snapshot id you read, or null before its first checkpoint"),
19595
- parentSnapshotId: exports_external.string().optional().describe("first checkpoint only: the Topic base parent when the session cannot supply it")
19596
- },
19597
- surfaces: ["mcp", "cli"],
19598
- toolset: "loop",
19599
- run: forward("computer.checkpoint")
19600
- },
19601
19604
  {
19602
19605
  name: "set_ways_to_help",
19603
19606
  title: "Set a thread's ways to help",
@@ -20176,7 +20179,7 @@ var ACTION_DEFINITIONS = [
20176
20179
  {
20177
20180
  name: "service_register",
20178
20181
  title: "Register a Computer lifecycle service",
20179
- description: "Register a persistent service identity for Currybox Computer lifecycle maintenance and mint its API key (shown ONCE). Human owner/admin CLI setup only. The credential is restricted to computer.get + computer.lifecycle_runs + computer.checkpoint + computer.reconcile_runs and to the Spaces listed here; store it as the Currybox control plane's Arbor credential.",
20182
+ description: "Register a persistent service identity for Currybox Computer lifecycle maintenance and mint its API key (shown ONCE). Human owner/admin CLI setup only. The credential is restricted to computer.get + computer.lifecycle_runs + computer.checkpoint + computer.suspend_run + computer.resume_run + computer.reconcile_runs and to the Spaces listed here; store it as the Currybox control plane's Arbor credential.",
20180
20183
  inputSchema: {
20181
20184
  displayName: exports_external.string().min(1).describe("the service display name, e.g. Currybox lifecycle service"),
20182
20185
  spaceIds: exports_external.array(exports_external.string().min(1)).min(1).describe("Spaces whose Thread computers the service may maintain")
@@ -20592,7 +20595,7 @@ var ACTION_DEFINITIONS = [
20592
20595
  bindingId: exports_external.string().optional().describe("unbind: binding id, sbd_…")
20593
20596
  },
20594
20597
  surfaces: ["mcp"],
20595
- toolset: "apps",
20598
+ toolset: "secrets",
20596
20599
  run: dispatch({
20597
20600
  list: "secret.list",
20598
20601
  get: "secret.get",
@@ -20746,7 +20749,7 @@ var ACTION_DEFINITIONS = [
20746
20749
  inputSchema: {
20747
20750
  includeArchived: exports_external.boolean().optional().describe("include archived Apps you are authorized to inspect")
20748
20751
  },
20749
- surfaces: ["mcp"],
20752
+ surfaces: ["computer-mcp"],
20750
20753
  toolset: "apps",
20751
20754
  run: forward("app.list")
20752
20755
  },
@@ -20755,7 +20758,7 @@ var ACTION_DEFINITIONS = [
20755
20758
  title: "Read an App",
20756
20759
  description: "READ ONLY: Inspect one App's stable URL, active deployment, pending control intent, deployment history, provider health, deployment-aware redacted configuration readiness for the active release, and durable state generation. It cannot modify App state, deployment state, access, or durable SQLite; use its activeDeploymentId as app_activate's expectedActiveDeploymentId.",
20757
20760
  inputSchema: { appId: exports_external.string().describe("the App, app_…") },
20758
- surfaces: ["mcp", "cli"],
20761
+ surfaces: ["computer-mcp", "cli"],
20759
20762
  toolset: "apps",
20760
20763
  run: forward("app.get")
20761
20764
  },
@@ -20772,7 +20775,7 @@ var ACTION_DEFINITIONS = [
20772
20775
  discovery: exports_external.enum(["unlisted", "listed"]).nullable().optional().describe("public Apps only; default unlisted"),
20773
20776
  stateMode: exports_external.enum(["none", "durable"]).describe("durable allocates Space-only isolated facet SQLite; deployment never resets it")
20774
20777
  },
20775
- surfaces: ["mcp", "cli"],
20778
+ surfaces: ["computer-mcp", "cli"],
20776
20779
  toolset: "apps",
20777
20780
  run: forward("app.create")
20778
20781
  },
@@ -20788,7 +20791,7 @@ var ACTION_DEFINITIONS = [
20788
20791
  ])).describe("complete desired runtime config object keyed by environment variable name"),
20789
20792
  dryRun: exports_external.boolean().optional().describe("validate and plan without mutating")
20790
20793
  },
20791
- surfaces: ["mcp", "cli"],
20794
+ surfaces: ["computer-mcp", "cli"],
20792
20795
  toolset: "apps",
20793
20796
  run: forward("app.config_apply")
20794
20797
  },
@@ -20801,7 +20804,7 @@ var ACTION_DEFINITIONS = [
20801
20804
  bundleId: exports_external.string().describe("verified immutable AppBundle, bnd_…"),
20802
20805
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this one logical deployment attempt")
20803
20806
  },
20804
- surfaces: ["mcp", "cli"],
20807
+ surfaces: ["computer-mcp", "cli"],
20805
20808
  toolset: "apps",
20806
20809
  run: forward("app.deploy")
20807
20810
  },
@@ -20825,7 +20828,7 @@ var ACTION_DEFINITIONS = [
20825
20828
  appId: exports_external.string().describe("owning App, app_…"),
20826
20829
  deploymentId: exports_external.string().describe("deployment, dep_…")
20827
20830
  },
20828
- surfaces: ["mcp"],
20831
+ surfaces: ["computer-mcp"],
20829
20832
  toolset: "apps",
20830
20833
  run: forward("app.deployment_get")
20831
20834
  },
@@ -20838,7 +20841,7 @@ var ACTION_DEFINITIONS = [
20838
20841
  path: exports_external.string().min(1).max(2048).describe("relative App path beginning with /; may include a query string"),
20839
20842
  method: exports_external.enum(["GET", "HEAD"]).optional().describe("safe read method; default GET")
20840
20843
  },
20841
- surfaces: ["mcp", "cli"],
20844
+ surfaces: ["computer-mcp", "cli"],
20842
20845
  toolset: "apps",
20843
20846
  run: forward("app.fetch")
20844
20847
  },
@@ -20854,7 +20857,7 @@ var ACTION_DEFINITIONS = [
20854
20857
  body: exports_external.string().optional().describe("UTF-8 request body; mutually exclusive with json"),
20855
20858
  contentType: exports_external.string().max(160).optional().describe("body media type; allowed only with body, default text/plain; charset=utf-8")
20856
20859
  },
20857
- surfaces: ["mcp", "cli"],
20860
+ surfaces: ["computer-mcp", "cli"],
20858
20861
  toolset: "apps",
20859
20862
  run: forward("app.request")
20860
20863
  },
@@ -20867,7 +20870,7 @@ var ACTION_DEFINITIONS = [
20867
20870
  deploymentId: exports_external.string().describe("prepared candidate, dep_…"),
20868
20871
  expectedActiveDeploymentId: exports_external.string().nullable().describe("active deployment from app_get, or null before first activation")
20869
20872
  },
20870
- surfaces: ["mcp", "cli"],
20873
+ surfaces: ["computer-mcp", "cli"],
20871
20874
  toolset: "apps",
20872
20875
  run: forward("app.activate")
20873
20876
  },
@@ -20880,7 +20883,7 @@ var ACTION_DEFINITIONS = [
20880
20883
  deploymentId: exports_external.string().describe("superseded deployment to restore, dep_…"),
20881
20884
  expectedActiveDeploymentId: exports_external.string().describe("current active deployment from app_get")
20882
20885
  },
20883
- surfaces: ["mcp", "cli"],
20886
+ surfaces: ["computer-mcp", "cli"],
20884
20887
  toolset: "apps",
20885
20888
  run: forward("app.rollback")
20886
20889
  },
@@ -20906,7 +20909,7 @@ var ACTION_DEFINITIONS = [
20906
20909
  access: exports_external.enum(["space", "public"]).describe("new gateway access"),
20907
20910
  discovery: exports_external.enum(["unlisted", "listed"]).nullable().optional().describe("required concept only for public Apps")
20908
20911
  },
20909
- surfaces: ["mcp", "cli"],
20912
+ surfaces: ["computer-mcp", "cli"],
20910
20913
  toolset: "apps",
20911
20914
  run: forward("app.set_access")
20912
20915
  },
@@ -20919,7 +20922,7 @@ var ACTION_DEFINITIONS = [
20919
20922
  expectedGeneration: exports_external.number().int().min(0).describe("state generation from app_get"),
20920
20923
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this one deliberate reset")
20921
20924
  },
20922
- surfaces: ["mcp", "cli"],
20925
+ surfaces: ["computer-mcp", "cli"],
20923
20926
  toolset: "apps",
20924
20927
  run: forward("app.reset_state")
20925
20928
  },
@@ -20933,7 +20936,7 @@ var ACTION_DEFINITIONS = [
20933
20936
  expectedGeneration: exports_external.number().int().min(0).describe("state generation from app_get"),
20934
20937
  idempotencyKey: exports_external.string().min(1).max(200).describe("stable key for this one deliberate recovery")
20935
20938
  },
20936
- surfaces: ["mcp", "cli"],
20939
+ surfaces: ["computer-mcp", "cli"],
20937
20940
  toolset: "apps",
20938
20941
  run: forward("app.restore_state")
20939
20942
  },
@@ -20942,7 +20945,7 @@ var ACTION_DEFINITIONS = [
20942
20945
  title: "Archive an App",
20943
20946
  description: "Remove an App from active serving while retaining its stable identity, deployment timeline, receipts, durable state, and release history for audit and recovery. Archive is a lifecycle-only transition.",
20944
20947
  inputSchema: { appId: exports_external.string().describe("target App, app_…") },
20945
- surfaces: ["mcp", "cli"],
20948
+ surfaces: ["computer-mcp", "cli"],
20946
20949
  toolset: "apps",
20947
20950
  run: forward("app.archive")
20948
20951
  },
@@ -21595,6 +21598,7 @@ var POSITIONAL_FIELDS = {
21595
21598
  app_fetch: ["appId", "path"],
21596
21599
  app_request: ["appId", "path"],
21597
21600
  computer_run_start: ["computerSessionId", "mode"],
21601
+ computer_run_suspend: ["runId"],
21598
21602
  code_symbols: ["path"],
21599
21603
  code_find_symbol: ["namePath", "path"],
21600
21604
  code_references: ["namePath", "path"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.20.33",
3
+ "version": "0.21.1",
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",