@lambdacurry/arbor 0.22.14 → 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 +128 -32
  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.14",
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(),
@@ -8382,13 +8423,13 @@ var MCP_OUTPUT_SCHEMAS = {
8382
8423
  reacted: boolean2(),
8383
8424
  reactions: array(reactionCount)
8384
8425
  }),
8385
- create_topic: looseObject({ topicId: id }),
8426
+ create_topic: looseObject({ topicId: id, url: string2().optional() }),
8386
8427
  topic_update: looseObject({
8387
8428
  id,
8388
8429
  title: string2().optional(),
8389
8430
  purpose: nullableString.optional()
8390
8431
  }),
8391
- create_thread: looseObject({ threadId: id }),
8432
+ create_thread: looseObject({ threadId: id, url: string2().optional() }),
8392
8433
  thread_update: looseObject({
8393
8434
  id,
8394
8435
  title: string2().optional(),
@@ -8684,6 +8725,7 @@ var MCP_OUTPUT_SCHEMAS = {
8684
8725
  artifact_get: object({
8685
8726
  id,
8686
8727
  title: string2(),
8728
+ url: string2().optional(),
8687
8729
  kind: string2(),
8688
8730
  version: number2().int().nonnegative(),
8689
8731
  lineCount: number2().int().nonnegative(),
@@ -8695,6 +8737,16 @@ var MCP_OUTPUT_SCHEMAS = {
8695
8737
  nextLine: number2().int().min(1).nullable().optional(),
8696
8738
  totalLines: number2().int().nonnegative().optional()
8697
8739
  }),
8740
+ tldraw_create: looseObject({
8741
+ artifactId: id,
8742
+ artifactVersionId: id,
8743
+ version: number2().int().min(1),
8744
+ sourceAttachmentId: id,
8745
+ sourceSha256: string2(),
8746
+ documentClock: number2().int().min(0),
8747
+ replayed: boolean2(),
8748
+ url: string2().optional()
8749
+ }),
8698
8750
  tldraw_import: looseObject({
8699
8751
  artifactId: id,
8700
8752
  artifactVersionId: id,
@@ -8717,7 +8769,8 @@ var MCP_OUTPUT_SCHEMAS = {
8717
8769
  source: jsonObject,
8718
8770
  current: jsonObject,
8719
8771
  versionRefs: array(jsonObject),
8720
- script: jsonObject
8772
+ script: jsonObject,
8773
+ url: string2().optional()
8721
8774
  }),
8722
8775
  tldraw_workbench: looseObject({
8723
8776
  artifactId: id,
@@ -8730,10 +8783,36 @@ var MCP_OUTPUT_SCHEMAS = {
8730
8783
  }),
8731
8784
  manifest: jsonObject
8732
8785
  }),
8733
- tldraw_status: looseObject({
8786
+ tldraw_status: object({
8734
8787
  artifactId: id,
8735
- room: jsonObject,
8736
- 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
+ })
8737
8816
  }),
8738
8817
  tldraw_checkpoint: looseObject({
8739
8818
  artifactId: id,
@@ -9154,7 +9233,7 @@ var MCP_OUTPUT_SCHEMAS = {
9154
9233
  recovery: object({
9155
9234
  state: literal("execution-unavailable"),
9156
9235
  reasonCode: _enum(["execution_session_unavailable", "provider_timeout"]),
9157
- nextAction: literal("computer_open")
9236
+ nextAction: literal("computer_run_start")
9158
9237
  }).optional(),
9159
9238
  agentBrief: computerAgentBrief,
9160
9239
  runtime: jsonObject
@@ -9302,8 +9381,14 @@ var OUTPUT_SHAPERS = {
9302
9381
  ["reacted", result.reacted],
9303
9382
  ["reactions", result.reactions]
9304
9383
  ]),
9305
- create_topic: (result) => defined([["topicId", result.id]]),
9306
- create_thread: (result) => defined([["threadId", result.id]]),
9384
+ create_topic: (result) => defined([
9385
+ ["topicId", result.id],
9386
+ ["url", result.url]
9387
+ ]),
9388
+ create_thread: (result) => defined([
9389
+ ["threadId", result.id],
9390
+ ["url", result.url]
9391
+ ]),
9307
9392
  space_create: (result) => defined([
9308
9393
  ["spaceId", result.id],
9309
9394
  ["visibility", result.visibility]
@@ -9582,7 +9667,6 @@ var MCP_TOOL_ANNOTATIONS = {
9582
9667
  set_space_computer: destructiveIdempotent,
9583
9668
  set_topic_computer: destructiveIdempotent,
9584
9669
  set_thread_computer: destructiveIdempotent,
9585
- attach_computer: additive,
9586
9670
  get_computer: readOnly,
9587
9671
  computer_inventory: readOnly,
9588
9672
  transition_thread: additive,
@@ -9618,6 +9702,7 @@ var MCP_TOOL_ANNOTATIONS = {
9618
9702
  curation: additive,
9619
9703
  artifact: additive,
9620
9704
  artifact_get: readOnly,
9705
+ tldraw_create: idempotent,
9621
9706
  tldraw_import: idempotent,
9622
9707
  tldraw_get: readOnly,
9623
9708
  tldraw_workbench: destructive,
@@ -9652,9 +9737,8 @@ var MCP_TOOL_ANNOTATIONS = {
9652
9737
  github_repositories: readOnly,
9653
9738
  github_refresh_installation: openWorld,
9654
9739
  github_connect_repository: idempotent,
9655
- computer_open: additive,
9656
9740
  computer_reprovision: destructiveIdempotent,
9657
- computer_run_start: additive,
9741
+ computer_run_start: idempotent,
9658
9742
  computer_run_suspend: idempotent,
9659
9743
  computer_repo_work_status: readOnly,
9660
9744
  computer_run_finish: idempotent,
@@ -9672,10 +9756,8 @@ var MCP_TOOL_ANNOTATIONS = {
9672
9756
  computer_verify: openWorld,
9673
9757
  computer_export: idempotent,
9674
9758
  computer_write: destructive,
9675
- computer_checkpoint: additive,
9676
9759
  computer_publish_preview: idempotent,
9677
- computer_publish_app_bundle: idempotent,
9678
- computer_stop: additive
9760
+ computer_publish_app_bundle: idempotent
9679
9761
  };
9680
9762
  function mcpAnnotationsFor(name) {
9681
9763
  const annotations = MCP_TOOL_ANNOTATIONS[name];
@@ -9848,10 +9930,10 @@ Arbor Computer is the complete software execution platform attached to Arbor's d
9848
9930
 
9849
9931
  ${ARBOR_FEEDBACK_GUIDANCE}
9850
9932
 
9851
- 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.
9852
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.
9853
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.
9854
- 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.
9855
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.
9856
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.
9857
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.
@@ -10551,7 +10633,7 @@ var ACTION_DEFINITIONS = [
10551
10633
  inputSchema: {
10552
10634
  threadId: string2().describe("the Thread whose computer you are attaching, thr_…")
10553
10635
  },
10554
- surfaces: ["computer-mcp", "cli"],
10636
+ surfaces: ["cli"],
10555
10637
  toolset: "loop",
10556
10638
  run: forward("computer.attach")
10557
10639
  },
@@ -10565,7 +10647,7 @@ var ACTION_DEFINITIONS = [
10565
10647
  vcpus: number2().int().min(1).max(4).optional().describe("optional container vCPU request"),
10566
10648
  label: string2().optional().describe("short runtime label for operator diagnostics")
10567
10649
  },
10568
- surfaces: ["computer-mcp", "computer-cli"],
10650
+ surfaces: ["computer-cli"],
10569
10651
  toolset: "loop",
10570
10652
  run: forward("computer_runtime.open")
10571
10653
  },
@@ -10585,10 +10667,10 @@ var ACTION_DEFINITIONS = [
10585
10667
  {
10586
10668
  name: "computer_run_start",
10587
10669
  title: "Start a run",
10588
- 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}.`,
10589
10671
  inputSchema: {
10590
- threadId: string2().optional().describe("the Thread whose Computer this Run works in, thr_…; the front door — no computer_open first"),
10591
- 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_…"),
10592
10674
  mode: _enum(["read", "write"]).describe("write for mutable work; read for shared inspection"),
10593
10675
  execution: _enum(["shared", "isolated"]).optional().describe("write Run placement; defaults to isolated. Use shared only for intentional live collaboration on the Thread Computer"),
10594
10676
  label: string2().max(120).optional().describe("short factual label for this unit of work"),
@@ -10842,7 +10924,7 @@ var ACTION_DEFINITIONS = [
10842
10924
  runId: string2().optional().describe("an active shared write Run whose parent lineage to checkpoint, run_…"),
10843
10925
  computerSessionId: string2().optional().describe("legacy alternative to runId: a computerSessionId on that Computer, cms_…")
10844
10926
  },
10845
- surfaces: ["computer-mcp", "computer-cli"],
10927
+ surfaces: ["computer-cli"],
10846
10928
  toolset: "loop",
10847
10929
  run: forward("computer_runtime.checkpoint")
10848
10930
  },
@@ -10908,7 +10990,7 @@ var ACTION_DEFINITIONS = [
10908
10990
  runId: string2().optional().describe("an active shared write Run whose parent to checkpoint and stop, run_…"),
10909
10991
  computerSessionId: string2().optional().describe("legacy alternative to runId: a computerSessionId on that Computer, cms_…")
10910
10992
  },
10911
- surfaces: ["computer-mcp", "computer-cli"],
10993
+ surfaces: ["computer-cli"],
10912
10994
  toolset: "loop",
10913
10995
  run: forward("computer_runtime.stop")
10914
10996
  },
@@ -10955,7 +11037,7 @@ var ACTION_DEFINITIONS = [
10955
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.",
10956
11038
  inputSchema: {
10957
11039
  threadId: string2().describe("the thread to move, thr_…"),
10958
- 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"),
10959
11041
  reason: string2().optional().describe("optional one-line why, recorded on the event")
10960
11042
  },
10961
11043
  surfaces: ["mcp", "cli"],
@@ -10965,7 +11047,7 @@ var ACTION_DEFINITIONS = [
10965
11047
  {
10966
11048
  name: "create_artifact",
10967
11049
  title: "Create an artifact",
10968
- 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.",
10969
11051
  inputSchema: {
10970
11052
  type: string2().describe("semantic type, e.g. decision|summary|plan|markdown|table|research-brief"),
10971
11053
  kind: _enum(["doc", "table", "diagram", "html", "file"]).optional().describe("structural kind (default file). doc/table/diagram/html are editable, versioned text"),
@@ -11244,7 +11326,7 @@ var ACTION_DEFINITIONS = [
11244
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.",
11245
11327
  inputSchema: {
11246
11328
  emoji: string2().optional().describe("exactly one emoji that represents you, e.g. \uD83D\uDD2D"),
11247
- 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"),
11248
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."),
11249
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.")
11250
11332
  },
@@ -11926,10 +12008,24 @@ var ACTION_DEFINITIONS = [
11926
12008
  toolset: "artifacts",
11927
12009
  run: forward("artifact.transition")
11928
12010
  },
12011
+ {
12012
+ name: "tldraw_create",
12013
+ title: "Create a blank tldraw board",
12014
+ description: "Create a durable blank native tldraw Artifact on a Thread, entering the same source/version/room/checkpoint lifecycle as an imported board. Retries with the same idempotencyKey return the original Artifact; observe before editing.",
12015
+ inputSchema: {
12016
+ title: string2().min(1).max(200).describe("the board title"),
12017
+ summary: string2().min(1).max(500).describe("one-line description of the board"),
12018
+ sourceThreadId: string2().describe("Thread that owns the board, thr_…"),
12019
+ idempotencyKey: string2().min(1).max(200).describe("stable key for this create request")
12020
+ },
12021
+ surfaces: ["mcp", "cli"],
12022
+ toolset: "artifacts",
12023
+ run: forward("tldraw.create")
12024
+ },
11929
12025
  {
11930
12026
  name: "tldraw_import",
11931
12027
  title: "Import a tldraw board",
11932
- description: "Create a durable tldraw Artifact from one uploaded .tldr source after Arbor validates the stored bytes and source thread. Retries with the same idempotencyKey return the original Artifact version.",
12028
+ description: "Import an external .tldr into a durable tldraw Artifact after Arbor validates the stored bytes and source Thread. For a new blank board use tldraw_create; retries with the same idempotencyKey return the original Artifact version, then observe before editing.",
11933
12029
  inputSchema: {
11934
12030
  sourceAttachmentId: string2().describe("uploaded .tldr Attachment, att_…"),
11935
12031
  title: string2().min(1).max(200).describe("the board title"),
@@ -11969,7 +12065,7 @@ var ACTION_DEFINITIONS = [
11969
12065
  {
11970
12066
  name: "tldraw_status",
11971
12067
  title: "Check tldraw board status",
11972
- 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.",
11973
12069
  inputSchema: { artifactId: string2().describe("the tldraw Artifact, art_…") },
11974
12070
  surfaces: ["mcp", "cli"],
11975
12071
  toolset: "artifacts",
@@ -12027,7 +12123,7 @@ var ACTION_DEFINITIONS = [
12027
12123
  {
12028
12124
  name: "tldraw_observe",
12029
12125
  title: "Observe a tldraw board",
12030
- 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}.`,
12031
12127
  inputSchema: {
12032
12128
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12033
12129
  pageId: string2().min(1).max(200).optional().describe("optional page to observe"),
@@ -12041,7 +12137,7 @@ var ACTION_DEFINITIONS = [
12041
12137
  {
12042
12138
  name: "tldraw_exec",
12043
12139
  title: "Run a one-shot tldraw program",
12044
- 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}.`,
12045
12141
  inputSchema: {
12046
12142
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12047
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.14",
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",