@lambdacurry/arbor 0.22.15 → 0.22.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 +89 -26
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // package.json
3
3
  var package_default = {
4
4
  name: "@lambdacurry/arbor",
5
- version: "0.22.15",
5
+ version: "0.22.16",
6
6
  description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
7
7
  keywords: [
8
8
  "agents",
@@ -4911,6 +4911,16 @@ function json(params) {
4911
4911
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
4912
4912
  config(en_default());
4913
4913
  // ../core/src/objects/types.ts
4914
+ var IDENTITY_COLORS = [
4915
+ "indigo",
4916
+ "teal",
4917
+ "terracotta",
4918
+ "plum",
4919
+ "steel",
4920
+ "olive",
4921
+ "rose",
4922
+ "cyan"
4923
+ ];
4914
4924
  var CONTRIBUTION_TYPES = [
4915
4925
  "comment",
4916
4926
  "question",
@@ -8300,6 +8310,37 @@ var paged = (key, item) => looseObject({
8300
8310
  total: number2().optional(),
8301
8311
  nextCursor: string2().optional()
8302
8312
  });
8313
+ var tldrawDocumentVersionRef = object({
8314
+ artifactId: id,
8315
+ artifactVersionId: id,
8316
+ version: number2().int().min(1),
8317
+ sourceAttachmentId: id,
8318
+ sourceSha256: string2(),
8319
+ documentClock: number2().int().min(0),
8320
+ byteLength: number2().int().min(0)
8321
+ });
8322
+ var tldrawScriptAttempt = object({
8323
+ revision: number2().int().min(0),
8324
+ version: number2().int().min(1),
8325
+ digest: string2(),
8326
+ at: timestamp
8327
+ });
8328
+ var tldrawDesiredScript = object({
8329
+ revision: number2().int().min(0),
8330
+ version: number2().int().min(1),
8331
+ digest: string2(),
8332
+ approved: boolean2()
8333
+ }).nullable();
8334
+ var tldrawSessionScriptStatus = object({
8335
+ sessionId: string2(),
8336
+ profileId: id,
8337
+ displayName: string2(),
8338
+ connectedAt: timestamp,
8339
+ desired: tldrawDesiredScript,
8340
+ attempted: tldrawScriptAttempt.nullable(),
8341
+ lastSuccessful: tldrawScriptAttempt.nullable(),
8342
+ error: tldrawScriptAttempt.extend({ code: string2(), message: string2() }).nullable()
8343
+ });
8303
8344
  var MCP_OUTPUT_SCHEMAS = {
8304
8345
  server_info: looseObject({
8305
8346
  serverVersion: string2(),
@@ -8742,10 +8783,36 @@ var MCP_OUTPUT_SCHEMAS = {
8742
8783
  }),
8743
8784
  manifest: jsonObject
8744
8785
  }),
8745
- tldraw_status: looseObject({
8786
+ tldraw_status: object({
8746
8787
  artifactId: id,
8747
- room: jsonObject,
8748
- script: jsonObject
8788
+ room: object({
8789
+ roomGeneration: number2().int().min(1),
8790
+ instanceId: string2(),
8791
+ instanceStartedAt: timestamp,
8792
+ documentClock: number2().int().min(0),
8793
+ documentSha256: string2(),
8794
+ recordCount: number2().int().min(0),
8795
+ databaseSizeBytes: number2().int().min(0),
8796
+ connectedSessions: number2().int().min(0),
8797
+ resumedSessions: number2().int().min(0),
8798
+ dirtySince: timestamp.nullable(),
8799
+ lastMutationProfileId: id.nullable(),
8800
+ lastCheckpoint: tldrawDocumentVersionRef.nullable(),
8801
+ lastCheckpointError: object({ code: string2(), message: string2(), at: timestamp }).nullable(),
8802
+ autosave: object({
8803
+ createdVersions: number2().int().min(0),
8804
+ uploadedBytes: number2().int().min(0),
8805
+ retryCount: number2().int().min(0)
8806
+ })
8807
+ }),
8808
+ script: object({
8809
+ artifactId: id,
8810
+ revision: number2().int().min(0),
8811
+ status: _enum(["absent", "approval-required", "enabled", "disabled"]),
8812
+ source: jsonObject.nullable(),
8813
+ approval: jsonObject.nullable(),
8814
+ sessions: array(tldrawSessionScriptStatus)
8815
+ })
8749
8816
  }),
8750
8817
  tldraw_checkpoint: looseObject({
8751
8818
  artifactId: id,
@@ -9166,7 +9233,7 @@ var MCP_OUTPUT_SCHEMAS = {
9166
9233
  recovery: object({
9167
9234
  state: literal("execution-unavailable"),
9168
9235
  reasonCode: _enum(["execution_session_unavailable", "provider_timeout"]),
9169
- nextAction: literal("computer_open")
9236
+ nextAction: literal("computer_run_start")
9170
9237
  }).optional(),
9171
9238
  agentBrief: computerAgentBrief,
9172
9239
  runtime: jsonObject
@@ -9600,7 +9667,6 @@ var MCP_TOOL_ANNOTATIONS = {
9600
9667
  set_space_computer: destructiveIdempotent,
9601
9668
  set_topic_computer: destructiveIdempotent,
9602
9669
  set_thread_computer: destructiveIdempotent,
9603
- attach_computer: additive,
9604
9670
  get_computer: readOnly,
9605
9671
  computer_inventory: readOnly,
9606
9672
  transition_thread: additive,
@@ -9671,9 +9737,8 @@ var MCP_TOOL_ANNOTATIONS = {
9671
9737
  github_repositories: readOnly,
9672
9738
  github_refresh_installation: openWorld,
9673
9739
  github_connect_repository: idempotent,
9674
- computer_open: additive,
9675
9740
  computer_reprovision: destructiveIdempotent,
9676
- computer_run_start: additive,
9741
+ computer_run_start: idempotent,
9677
9742
  computer_run_suspend: idempotent,
9678
9743
  computer_repo_work_status: readOnly,
9679
9744
  computer_run_finish: idempotent,
@@ -9691,10 +9756,8 @@ var MCP_TOOL_ANNOTATIONS = {
9691
9756
  computer_verify: openWorld,
9692
9757
  computer_export: idempotent,
9693
9758
  computer_write: destructive,
9694
- computer_checkpoint: additive,
9695
9759
  computer_publish_preview: idempotent,
9696
- computer_publish_app_bundle: idempotent,
9697
- computer_stop: additive
9760
+ computer_publish_app_bundle: idempotent
9698
9761
  };
9699
9762
  function mcpAnnotationsFor(name) {
9700
9763
  const annotations = MCP_TOOL_ANNOTATIONS[name];
@@ -9867,10 +9930,10 @@ Arbor Computer is the complete software execution platform attached to Arbor's d
9867
9930
 
9868
9931
  ${ARBOR_FEEDBACK_GUIDANCE}
9869
9932
 
9870
- 1. ORIENT, CONFIGURE, AND AUTHORIZE. Start with provider-free get_computer(threadId) to inspect the effective inherited recipe, repository authorization, compatibility, recoverySafety, and durable lineage without contacting execution. Use set_organization_computer, set_space_computer, set_topic_computer, or set_thread_computer only when the corresponding complete sparse layer must be replaced; use github_repositories then github_connect_repository to authorize repositories at the narrowest scope that should inherit them. If github_repositories looks stale, github_refresh_installation reconciles the cached inventory from GitHub. computer_run_start(threadId, mode) is the front door: it attaches durable identity itself and starts an isolated write Run from the Thread's base snapshot without booting the parent; computer_open and attach_computer are deprecated aliases (AD-306). Each returned repository entry includes verified root instruction pointers when that repo has an AGENTS.md: read surfaced repository instructions before substantial edits or verification, then check for a nearer nested AGENTS.md once the target path is known. Repo-local instructions/scripts/config beat guessed formatter, test, lint, or build commands.
9933
+ 1. ORIENT, CONFIGURE, AND AUTHORIZE. Start with provider-free get_computer(threadId) to inspect the effective inherited recipe, repository authorization, compatibility, recoverySafety, and durable lineage without contacting execution. Use set_organization_computer, set_space_computer, set_topic_computer, or set_thread_computer only when the corresponding complete sparse layer must be replaced; use github_repositories then github_connect_repository to authorize repositories at the narrowest scope that should inherit them. If github_repositories looks stale, github_refresh_installation reconciles the cached inventory from GitHub. computer_run_start(threadId, mode) is the front door: it attaches durable identity itself and starts an isolated write Run from the Thread's base snapshot without booting the parent. Each returned repository entry includes verified root instruction pointers when that repo has an AGENTS.md: read surfaced repository instructions before substantial edits or verification, then check for a nearer nested AGENTS.md once the target path is known. Repo-local instructions/scripts/config beat guessed formatter, test, lint, or build commands.
9871
9934
  2. READ THE CAPABILITIES CARD, NOT THE BACKEND. runId is the one address: every runtime tool takes it, and the computerSessionId a Run carries is legacy input. computer_status(runId) describes the live PARENT Thread Computer behind a shared Run; it does not establish isolated Run activity, so use computer_run_receipt(runId) and computer_process_read for Run-owned work. Command-line utilities, including Git and package managers, run through computer_exec; check unfamiliar binaries with command -v.
9872
9935
  3. ONE RUN PER TASK. A write Run defaults to an isolated execution environment with its own filesystem, processes, ports, and /tmp while preserving /workspace paths; a read Run shares the parent. Pass runId to Run-aware tools. If a response is lost, recover the durable operation/process identity from computer_run_receipt and read it before retrying. computer_process_read and computer_process_terminate settle a provider-absent current-generation process from exact evidence; computer_run_suspend performs that bounded settlement internally and never replays unknown work. A still-active process returns a retryable busy state; an unknown current-generation mutation fail-closes. An isolated local commit or Preview is not Git publication; push coherent work and prove it with computer_repo_work_status before computer_run_finish destroys the final placement. discard=true with outcome failed or cancelled is the explicit choice to abandon unknown or proven non-durable work without replaying it.
9873
- 4. CHECKPOINT COMPLETE UNITS THROUGH THE RUN. computer_run_suspend(runId) checkpoints an intermediate complete unit — an isolated Run publishes its exact workspace and releases its Sandbox, a shared Run advances the parent lineage — and computer_run_finish(runId) makes the final one; finishing the last active shared Run also stops the parent. computer_checkpoint and computer_stop are deprecated aliases. An isolated Run Preview is durable review output, not adoption or a checkpoint. The internal provider-handle publication operations are not agent tools.
9936
+ 4. CHECKPOINT COMPLETE UNITS THROUGH THE RUN. computer_run_suspend(runId) checkpoints an intermediate complete unit — an isolated Run publishes its exact workspace and releases its Sandbox, a shared Run advances the parent lineage — and computer_run_finish(runId) makes the final one; finishing the last active shared Run also stops the parent. An isolated Run Preview is durable review output, not adoption or a checkpoint. The internal provider-handle publication operations are not agent tools.
9874
9937
  5. GIT AND GITHUB ARE ORDINARY COMMANDS AFTER AUTHORIZATION. Clone, fetch, pull, push, and gh run through computer_exec using a connected human's just-in-time ambient GitHub identity. Credentials never enter argv, workspace files, Git config, checkpoints, Events, logs, or receipts. A restored Computer deliberately keeps the checkout age of its snapshot, so fetch/pull before trusting remote state.
9875
9938
  6. VERIFY, PREVIEW, AND EXPORT. computer_verify captures a public URL directly without opening a project runtime. computer_publish_preview preserves immutable static output from either the parent or an active isolated write Run. computer_export moves bounded files into durable Thread Attachments; for a computer:// file Artifact asleep face, export the exact locator path .tldr and a same-Thread PNG, then use artifact set_snapshot. computer_export itself does not call set_snapshot; place returned Markdown exactly where the media belongs and cite the matching attachment ids.
9876
9939
  7. PACKAGE, DEPLOY, ACTIVATE, AND OPERATE APPS HERE. computer_publish_app_bundle creates the immutable executable bundle from verified parent bytes through a shared write Run: push isolated work, computer_run_start with execution shared, pull, then publish. For short-lived public Artifact experiments use preview_app_create/get/retire; for published Space Apps use app_create, app_config_apply, app_deploy, app_deployment_get, app_activate, app_get, app_fetch/app_request, app_rollback, app_set_access, app_reset_state/app_restore_state, and app_archive as one workflow-closed release surface. First-class Organization/Profile Secrets remain on Arbor's collaboration MCP because they are broader identity-owned resources; App configuration here references existing Secret ids and never accepts or returns secret material.
@@ -10570,7 +10633,7 @@ var ACTION_DEFINITIONS = [
10570
10633
  inputSchema: {
10571
10634
  threadId: string2().describe("the Thread whose computer you are attaching, thr_…")
10572
10635
  },
10573
- surfaces: ["computer-mcp", "cli"],
10636
+ surfaces: ["cli"],
10574
10637
  toolset: "loop",
10575
10638
  run: forward("computer.attach")
10576
10639
  },
@@ -10584,7 +10647,7 @@ var ACTION_DEFINITIONS = [
10584
10647
  vcpus: number2().int().min(1).max(4).optional().describe("optional container vCPU request"),
10585
10648
  label: string2().optional().describe("short runtime label for operator diagnostics")
10586
10649
  },
10587
- surfaces: ["computer-mcp", "computer-cli"],
10650
+ surfaces: ["computer-cli"],
10588
10651
  toolset: "loop",
10589
10652
  run: forward("computer_runtime.open")
10590
10653
  },
@@ -10604,10 +10667,10 @@ var ACTION_DEFINITIONS = [
10604
10667
  {
10605
10668
  name: "computer_run_start",
10606
10669
  title: "Start a run",
10607
- description: `Start one bounded unit of work by threadId, no computer_open first: write defaults to an isolated Run from the Thread snapshot without booting the parent; shared/read Runs use the live parent; idempotencyKey recovers zero-or-one Run after response loss, and failures return runId for computer_run_receipt. First use: read the Computer guide at ${AGENT_GUIDE_URLS.computer}.`,
10670
+ description: `Start one bounded unit of work by threadId: write defaults to an isolated Run from the Thread snapshot without booting the parent; shared/read Runs use the live parent; idempotencyKey recovers zero-or-one Run after response loss, and failures return runId for computer_run_receipt. First use: read the Computer guide at ${AGENT_GUIDE_URLS.computer}.`,
10608
10671
  inputSchema: {
10609
- threadId: string2().optional().describe("the Thread whose Computer this Run works in, thr_…; the front door — no computer_open first"),
10610
- computerSessionId: string2().optional().describe("alternative to threadId: an existing computerSessionId from computer_open, cms_… (parent already open)"),
10672
+ threadId: string2().optional().describe("the Thread whose Computer this Run works in, thr_…; the canonical Run-first front door"),
10673
+ computerSessionId: string2().optional().describe("legacy compatibility alternative to threadId: an existing parent computerSessionId, cms_…"),
10611
10674
  mode: _enum(["read", "write"]).describe("write for mutable work; read for shared inspection"),
10612
10675
  execution: _enum(["shared", "isolated"]).optional().describe("write Run placement; defaults to isolated. Use shared only for intentional live collaboration on the Thread Computer"),
10613
10676
  label: string2().max(120).optional().describe("short factual label for this unit of work"),
@@ -10861,7 +10924,7 @@ var ACTION_DEFINITIONS = [
10861
10924
  runId: string2().optional().describe("an active shared write Run whose parent lineage to checkpoint, run_…"),
10862
10925
  computerSessionId: string2().optional().describe("legacy alternative to runId: a computerSessionId on that Computer, cms_…")
10863
10926
  },
10864
- surfaces: ["computer-mcp", "computer-cli"],
10927
+ surfaces: ["computer-cli"],
10865
10928
  toolset: "loop",
10866
10929
  run: forward("computer_runtime.checkpoint")
10867
10930
  },
@@ -10927,7 +10990,7 @@ var ACTION_DEFINITIONS = [
10927
10990
  runId: string2().optional().describe("an active shared write Run whose parent to checkpoint and stop, run_…"),
10928
10991
  computerSessionId: string2().optional().describe("legacy alternative to runId: a computerSessionId on that Computer, cms_…")
10929
10992
  },
10930
- surfaces: ["computer-mcp", "computer-cli"],
10993
+ surfaces: ["computer-cli"],
10931
10994
  toolset: "loop",
10932
10995
  run: forward("computer_runtime.stop")
10933
10996
  },
@@ -10974,7 +11037,7 @@ var ACTION_DEFINITIONS = [
10974
11037
  description: "Move a Thread among active, needs-review, stuck, standing, resolved, or archived with an optional reason; illegal lifecycle jumps are rejected. Resolve finite Decide/Deliver/Investigate/Manage work once its outcome is in, archive retired work (refile misfiled work with `thread_update` instead), use standing only for intentionally open-ended concerns, and curate standout outputs separately.",
10975
11038
  inputSchema: {
10976
11039
  threadId: string2().describe("the thread to move, thr_…"),
10977
- to: string2().describe("target status: active|needs-review|stuck|standing|resolved|archived"),
11040
+ to: _enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).describe("target Thread lifecycle status"),
10978
11041
  reason: string2().optional().describe("optional one-line why, recorded on the event")
10979
11042
  },
10980
11043
  surfaces: ["mcp", "cli"],
@@ -10984,7 +11047,7 @@ var ACTION_DEFINITIONS = [
10984
11047
  {
10985
11048
  name: "create_artifact",
10986
11049
  title: "Create an artifact",
10987
- description: "Promote durable output — a decision, summary, plan, or research brief — into a first-class artifact you own. Give it a concise summary of what the Artifact is or accomplishes; this is the skim and retrieval description, not a repeat of its title. Text kinds (doc/table/diagram/html) are living documents: pass `source` (born at v1, editable in place via edit_artifact); kind=file passes a contentRef instead. The artifact is AUTOMATICALLY listed on its source thread (no link post needed). When it came from an attached Thread computer, pass that attach_computer receipt as computerSessionId so the artifact cites the reproducible session. Reach for this when a thread has produced something worth retaining and citing beyond the conversation — especially a table or doc the team will UPDATE, which beats pasting it into a prose contribution.",
11050
+ description: "Promote durable output — a decision, summary, plan, or research brief — into a first-class artifact you own. Give it a concise summary of what the Artifact is or accomplishes; this is the skim and retrieval description, not a repeat of its title. Text kinds (doc/table/diagram/html) are living documents: pass `source` (born at v1, editable in place via edit_artifact); kind=file passes a contentRef instead. The artifact is AUTOMATICALLY listed on its source thread (no link post needed). When it came from a Thread Computer, pass its producing computerSessionId when available so the artifact cites the reproducible session. Reach for this when a thread has produced something worth retaining and citing beyond the conversation — especially a table or doc the team will UPDATE, which beats pasting it into a prose contribution.",
10988
11051
  inputSchema: {
10989
11052
  type: string2().describe("semantic type, e.g. decision|summary|plan|markdown|table|research-brief"),
10990
11053
  kind: _enum(["doc", "table", "diagram", "html", "file"]).optional().describe("structural kind (default file). doc/table/diagram/html are editable, versioned text"),
@@ -11263,7 +11326,7 @@ var ACTION_DEFINITIONS = [
11263
11326
  description: "Set your own identity charter, emoji, color, and capabilities so teammates can understand and route work to you; change them anytime. Write the charter ROLE-FIRST (what you are/do, not your name); display name remains human-managed and capabilities are free-form skill tags.",
11264
11327
  inputSchema: {
11265
11328
  emoji: string2().optional().describe("exactly one emoji that represents you, e.g. \uD83D\uDD2D"),
11266
- color: string2().optional().describe("an identity color key from the curated palette"),
11329
+ color: _enum(IDENTITY_COLORS).optional().describe("an identity color key from the curated palette"),
11267
11330
  description: string2().optional().describe("your charter (≤500 chars): ROLE-FIRST — what you are + do, NOT 'I'm {Name}' (it renders after 'You are {Name}'). Read back in your orientation. Empty clears it."),
11268
11331
  capabilities: array(string2()).optional().describe("free-form skill tags (≤20, each ≤60 chars) for what you can do — e.g. ['market-research','data-viz']; how teammates route work to you. An empty array clears them.")
11269
11332
  },
@@ -12002,7 +12065,7 @@ var ACTION_DEFINITIONS = [
12002
12065
  {
12003
12066
  name: "tldraw_status",
12004
12067
  title: "Check tldraw board status",
12005
- description: "Read the current room status and separately reported script sessions for a tldraw board. Session reports remain per-session observations and are never collapsed into global success.",
12068
+ description: "Read compact operational room health and separately reported script sessions for a tldraw board; board geometry/document content stays on tldraw_observe and tldraw_get. Session reports remain per-session observations and are never collapsed into global success.",
12006
12069
  inputSchema: { artifactId: string2().describe("the tldraw Artifact, art_…") },
12007
12070
  surfaces: ["mcp", "cli"],
12008
12071
  toolset: "artifacts",
@@ -12060,7 +12123,7 @@ var ACTION_DEFINITIONS = [
12060
12123
  {
12061
12124
  name: "tldraw_observe",
12062
12125
  title: "Observe a tldraw board",
12063
- description: `Capture a fresh bounded tldraw scene, lint result, document clock and digest, plus a PNG attachment for visual review; observe before editing. First use: read the tldraw guide at ${AGENT_GUIDE_URLS.tldraw}.`,
12126
+ description: `Capture a fresh bounded tldraw scene, lint result, document clock and digest, plus a PNG attachment for visual review; observe before editing and after context compaction to reacquire authoritative shape IDs/geometry. First use: read the tldraw guide at ${AGENT_GUIDE_URLS.tldraw}.`,
12064
12127
  inputSchema: {
12065
12128
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12066
12129
  pageId: string2().min(1).max(200).optional().describe("optional page to observe"),
@@ -12074,7 +12137,7 @@ var ACTION_DEFINITIONS = [
12074
12137
  {
12075
12138
  name: "tldraw_exec",
12076
12139
  title: "Run a one-shot tldraw program",
12077
- description: `Modify the current live tldraw board with preferred declarative operations or bounded JavaScript, then return a durable execution receipt; observe first, and never replay an unknown result automatically. First use: read the tldraw guide at ${AGENT_GUIDE_URLS.tldraw}.`,
12140
+ description: `Modify the current live tldraw board with preferred declarative operations or bounded JavaScript, then return a durable execution receipt; use IDs from a fresh observe, reacquire this current schema after compaction, and never replay an unknown result. First use: read the tldraw guide at ${AGENT_GUIDE_URLS.tldraw}.`,
12078
12141
  inputSchema: {
12079
12142
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12080
12143
  code: string2().min(1).max(1e5).optional().describe("advanced script source; mutually exclusive with operations"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.22.15",
3
+ "version": "0.22.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",