@lambdacurry/arbor 0.22.5 → 0.22.7

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 +356 -5
  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.5",
5
+ version: "0.22.7",
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",
@@ -6914,6 +6914,9 @@ var artifactVersions = sqliteTable("artifact_versions", {
6914
6914
  artifactId: text("artifact_id").notNull().references(() => artifacts.id),
6915
6915
  version: integer2("version").notNull(),
6916
6916
  source: text("source").notNull(),
6917
+ sourceAttachmentId: text("source_attachment_id").references(() => attachments.id),
6918
+ sourceSha256: text("source_sha256"),
6919
+ tldrawDocumentClock: integer2("tldraw_document_clock"),
6917
6920
  editorProfileId: text("editor_profile_id").notNull().references(() => profiles.id),
6918
6921
  executionContextId: text("execution_context_id").references(() => executionContexts.id),
6919
6922
  note: text("note"),
@@ -6921,6 +6924,95 @@ var artifactVersions = sqliteTable("artifact_versions", {
6921
6924
  }, (t) => ({
6922
6925
  artifactVersionUq: uniqueIndex("artifact_versions_artifact_version_uq").on(t.artifactId, t.version)
6923
6926
  }));
6927
+ var artifactTldrawBoards = sqliteTable("artifact_tldraw_boards", {
6928
+ artifactId: text("artifact_id").primaryKey().references(() => artifacts.id, { onDelete: "cascade" }),
6929
+ roomGeneration: integer2("room_generation").notNull().default(1),
6930
+ documentClock: integer2("document_clock").notNull().default(0),
6931
+ documentDigest: text("document_digest").notNull(),
6932
+ currentVersion: integer2("current_version").notNull().default(0),
6933
+ createIdempotencyKey: text("create_idempotency_key").notNull(),
6934
+ createActorProfileId: text("create_actor_profile_id").notNull().references(() => profiles.id),
6935
+ createThreadId: text("create_thread_id").notNull().references(() => threads.id),
6936
+ createFingerprint: text("create_fingerprint").notNull(),
6937
+ checkpointedAt: ts("checkpointed_at"),
6938
+ updatedAt: ts("updated_at").notNull()
6939
+ }, (t) => ({
6940
+ createKeyUq: uniqueIndex("artifact_tldraw_boards_create_key_uq").on(t.createActorProfileId, t.createThreadId, t.createIdempotencyKey)
6941
+ }));
6942
+ var artifactTldrawCheckpoints = sqliteTable("artifact_tldraw_checkpoints", {
6943
+ id: text("id").primaryKey(),
6944
+ artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
6945
+ actorProfileId: text("actor_profile_id").notNull().references(() => profiles.id),
6946
+ idempotencyKey: text("idempotency_key").notNull(),
6947
+ requestFingerprint: text("request_fingerprint").notNull(),
6948
+ resultArtifactVersionId: text("result_artifact_version_id").notNull().references(() => artifactVersions.id),
6949
+ resultVersion: integer2("result_version").notNull(),
6950
+ createdAt: ts("created_at").notNull()
6951
+ }, (t) => ({
6952
+ requestUq: uniqueIndex("artifact_tldraw_checkpoints_request_uq").on(t.artifactId, t.actorProfileId, t.idempotencyKey)
6953
+ }));
6954
+ var artifactTldrawScriptVersions = sqliteTable("artifact_tldraw_script_versions", {
6955
+ id: text("id").primaryKey(),
6956
+ artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
6957
+ version: integer2("version").notNull(),
6958
+ attachmentId: text("attachment_id").notNull().references(() => attachments.id),
6959
+ digest: text("digest").notNull(),
6960
+ byteLength: integer2("byte_length").notNull(),
6961
+ createdByProfileId: text("created_by_profile_id").notNull().references(() => profiles.id),
6962
+ createdAt: ts("created_at").notNull()
6963
+ }, (t) => ({
6964
+ artifactVersionUq: uniqueIndex("artifact_tldraw_script_versions_artifact_version_uq").on(t.artifactId, t.version),
6965
+ artifactDigestUq: uniqueIndex("artifact_tldraw_script_versions_artifact_digest_uq").on(t.artifactId, t.digest)
6966
+ }));
6967
+ var artifactTldrawDocumentScripts = sqliteTable("artifact_tldraw_document_scripts", {
6968
+ artifactId: text("artifact_id").primaryKey().references(() => artifacts.id, { onDelete: "cascade" }),
6969
+ revision: integer2("revision").notNull().default(0),
6970
+ currentVersion: integer2("current_version"),
6971
+ currentAttachmentId: text("current_attachment_id").references(() => attachments.id),
6972
+ currentDigest: text("current_digest"),
6973
+ currentByteLength: integer2("current_byte_length"),
6974
+ approvedVersion: integer2("approved_version"),
6975
+ approvedDigest: text("approved_digest"),
6976
+ approvedByProfileId: text("approved_by_profile_id").references(() => profiles.id),
6977
+ approvedAt: ts("approved_at"),
6978
+ enabled: integer2("enabled", { mode: "boolean" }).notNull().default(false),
6979
+ updatedAt: ts("updated_at").notNull()
6980
+ });
6981
+ var artifactTldrawExecs = sqliteTable("artifact_tldraw_execs", {
6982
+ id: text("id").primaryKey(),
6983
+ artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
6984
+ requestId: text("request_id").notNull(),
6985
+ sourceDigest: text("source_digest").notNull(),
6986
+ requestFingerprint: text("request_fingerprint").notNull(),
6987
+ expectedDocumentClock: integer2("expected_document_clock"),
6988
+ settleMs: integer2("settle_ms"),
6989
+ startDocumentClock: integer2("start_document_clock").notNull(),
6990
+ startDocumentDigest: text("start_document_digest").notNull(),
6991
+ endDocumentClock: integer2("end_document_clock"),
6992
+ endDocumentDigest: text("end_document_digest"),
6993
+ outcome: text("outcome").notNull(),
6994
+ resultDigest: text("result_digest"),
6995
+ error: text("error"),
6996
+ completionFingerprint: text("completion_fingerprint"),
6997
+ actorProfileId: text("actor_profile_id").notNull().references(() => profiles.id),
6998
+ createdAt: ts("created_at").notNull(),
6999
+ completedAt: ts("completed_at")
7000
+ }, (t) => ({
7001
+ requestUq: uniqueIndex("artifact_tldraw_execs_request_uq").on(t.artifactId, t.actorProfileId, t.requestId),
7002
+ requestLength: check("artifact_tldraw_execs_request_length", sql`length(${t.requestId}) BETWEEN 1 AND 200`),
7003
+ digestLength: check("artifact_tldraw_execs_digest_length", sql`length(${t.sourceDigest}) BETWEEN 1 AND 200`),
7004
+ settleNonnegative: check("artifact_tldraw_execs_settle_nonnegative", sql`${t.settleMs} IS NULL OR ${t.settleMs} >= 0`),
7005
+ resultLength: check("artifact_tldraw_execs_result_length", sql`${t.resultDigest} IS NULL OR length(${t.resultDigest}) <= 200`),
7006
+ errorLength: check("artifact_tldraw_execs_error_length", sql`${t.error} IS NULL OR length(${t.error}) <= 2000`)
7007
+ }));
7008
+ var artifactTldrawViewerGrantUses = sqliteTable("artifact_tldraw_viewer_grant_uses", {
7009
+ id: text("id").primaryKey(),
7010
+ artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
7011
+ grantId: text("grant_id").notNull(),
7012
+ profileId: text("profile_id").notNull().references(() => profiles.id),
7013
+ createdAt: ts("created_at").notNull(),
7014
+ usedAt: ts("used_at")
7015
+ }, (t) => ({ grantUq: uniqueIndex("artifact_tldraw_viewer_grant_uses_grant_uq").on(t.grantId) }));
6924
7016
  var secrets = sqliteTable("secrets", {
6925
7017
  id: text("id").primaryKey(),
6926
7018
  orgId: text("org_id").notNull().references(() => orgs.id),
@@ -8601,6 +8693,116 @@ var MCP_OUTPUT_SCHEMAS = {
8601
8693
  nextLine: number2().int().min(1).nullable().optional(),
8602
8694
  totalLines: number2().int().nonnegative().optional()
8603
8695
  }),
8696
+ tldraw_import: looseObject({
8697
+ artifactId: id,
8698
+ artifactVersionId: id,
8699
+ version: number2().int().min(1),
8700
+ sourceAttachmentId: id,
8701
+ sourceSha256: string2(),
8702
+ documentClock: number2().int().min(0),
8703
+ replayed: boolean2(),
8704
+ url: string2().optional()
8705
+ }),
8706
+ tldraw_get: looseObject({
8707
+ artifactId: id,
8708
+ title: string2(),
8709
+ summary: string2(),
8710
+ sourceThreadId: id,
8711
+ version: number2().int().min(1),
8712
+ selectedVersion: number2().int().min(1),
8713
+ historical: boolean2(),
8714
+ canEdit: boolean2(),
8715
+ source: jsonObject,
8716
+ current: jsonObject,
8717
+ versionRefs: array(jsonObject),
8718
+ script: jsonObject
8719
+ }),
8720
+ tldraw_workbench: looseObject({
8721
+ artifactId: id,
8722
+ runId: id,
8723
+ TLDRAW_LOCAL_ROOT: string2(),
8724
+ paths: looseObject({
8725
+ board: string2(),
8726
+ script: string2().nullable(),
8727
+ manifest: string2()
8728
+ }),
8729
+ manifest: jsonObject
8730
+ }),
8731
+ tldraw_status: looseObject({
8732
+ artifactId: id,
8733
+ room: jsonObject,
8734
+ script: jsonObject
8735
+ }),
8736
+ tldraw_checkpoint: looseObject({
8737
+ artifactId: id,
8738
+ ok: boolean2(),
8739
+ changed: boolean2().optional(),
8740
+ version: number2().int().min(1).optional(),
8741
+ replayed: boolean2().optional()
8742
+ }),
8743
+ tldraw_publish: looseObject({
8744
+ artifactId: id,
8745
+ artifactVersionId: id.optional(),
8746
+ version: number2().int().min(1).optional(),
8747
+ sourceAttachmentId: id.optional(),
8748
+ documentClock: number2().int().min(0).optional(),
8749
+ replayed: boolean2().optional()
8750
+ }),
8751
+ tldraw_script: looseObject({
8752
+ artifactId: id,
8753
+ revision: number2().int().min(0),
8754
+ status: _enum(["absent", "approval-required", "enabled", "disabled"]),
8755
+ source: jsonObject.nullable(),
8756
+ approval: jsonObject.nullable()
8757
+ }),
8758
+ tldraw_observe: looseObject({
8759
+ artifactId: id,
8760
+ documentClock: number2().int().min(0),
8761
+ documentDigest: string2(),
8762
+ scene: looseObject({
8763
+ shapes: array(jsonObject),
8764
+ bindings: array(jsonObject),
8765
+ lint: array(jsonObject),
8766
+ truncation: looseObject({
8767
+ shapesOmitted: number2().int().nonnegative(),
8768
+ bindingsOmitted: number2().int().nonnegative(),
8769
+ bindingRecordsUninspected: number2().int().nonnegative(),
8770
+ findingsOmitted: number2().int().nonnegative(),
8771
+ textShapesTruncated: number2().int().nonnegative(),
8772
+ pageNameCharactersOmitted: number2().int().nonnegative(),
8773
+ serializedBytes: number2().int().nonnegative(),
8774
+ serializedByteLimit: number2().int().positive()
8775
+ })
8776
+ }),
8777
+ image: looseObject({
8778
+ attachmentId: id.optional(),
8779
+ downloadUrl: string2().optional(),
8780
+ mimeType: literal("image/png"),
8781
+ width: number2().int().positive(),
8782
+ height: number2().int().positive(),
8783
+ size: number2().int().nonnegative().optional(),
8784
+ sha256: string2().optional(),
8785
+ data: string2().optional()
8786
+ })
8787
+ }),
8788
+ tldraw_exec: looseObject({
8789
+ executionId: id,
8790
+ artifactId: id,
8791
+ state: _enum(["succeeded", "failed", "unknown", "running"]),
8792
+ start: jsonObject,
8793
+ end: jsonObject.optional(),
8794
+ result: unknown().optional(),
8795
+ error: string2().optional()
8796
+ }),
8797
+ tldraw_exec_get: looseObject({
8798
+ executionId: id,
8799
+ artifactId: id,
8800
+ state: _enum(["succeeded", "failed", "unknown", "running"]),
8801
+ start: jsonObject,
8802
+ end: jsonObject.optional(),
8803
+ result: unknown().optional(),
8804
+ error: string2().optional()
8805
+ }),
8604
8806
  artifact_transition: looseObject({
8605
8807
  artifactId: id,
8606
8808
  status: string2(),
@@ -9407,6 +9609,16 @@ var MCP_TOOL_ANNOTATIONS = {
9407
9609
  curation: additive,
9408
9610
  artifact: additive,
9409
9611
  artifact_get: readOnly,
9612
+ tldraw_import: idempotent,
9613
+ tldraw_get: readOnly,
9614
+ tldraw_workbench: destructive,
9615
+ tldraw_status: readOnly,
9616
+ tldraw_checkpoint: idempotent,
9617
+ tldraw_publish: idempotent,
9618
+ tldraw_script: destructive,
9619
+ tldraw_observe: additive,
9620
+ tldraw_exec: destructiveOpenWorld,
9621
+ tldraw_exec_get: readOnly,
9410
9622
  artifact_transition: additive,
9411
9623
  artifact_delete: destructive,
9412
9624
  secrets: destructive,
@@ -10186,7 +10398,7 @@ var ACTION_DEFINITIONS = [
10186
10398
  description: "DESTRUCTIVE REPLACE: Replace the organization's entire sparse Computer-default layer; omitted fields are cleared from this layer and fall back to provider defaults, while lower scopes may override. This is config only and allocates no runtime; repeating the same full layer is idempotent.",
10187
10399
  inputSchema: {
10188
10400
  backend: _enum(["worker-shell", "container"]).nullable().optional().describe("default execution tier, or null to use worker-shell"),
10189
- containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.1, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear"),
10401
+ containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.2, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear"),
10190
10402
  setupScript: string2().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
10191
10403
  repositories: array(string2()).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")
10192
10404
  },
@@ -10201,7 +10413,7 @@ var ACTION_DEFINITIONS = [
10201
10413
  inputSchema: {
10202
10414
  spaceId: string2().describe("the Space, spc_…"),
10203
10415
  backend: _enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
10204
- containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.1, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10416
+ containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.2, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10205
10417
  setupScript: string2().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize, or null to clear"),
10206
10418
  repositories: array(string2()).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")
10207
10419
  },
@@ -10216,7 +10428,7 @@ var ACTION_DEFINITIONS = [
10216
10428
  inputSchema: {
10217
10429
  topicId: string2().describe("the Topic, top_…"),
10218
10430
  backend: _enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
10219
- containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.1, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10431
+ containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.2, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10220
10432
  setupScript: string2().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
10221
10433
  repositories: array(string2()).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"),
10222
10434
  ...LIVE_PREVIEW_CONFIG_INPUT
@@ -10232,7 +10444,7 @@ var ACTION_DEFINITIONS = [
10232
10444
  inputSchema: {
10233
10445
  threadId: string2().describe("the Thread, thr_…"),
10234
10446
  backend: _enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
10235
- containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.1, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10447
+ containerProfile: string2().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.4.2, bunx, Node 26.5.1, pnpm 10.33.0, Python 3.13.15 (python/python3), jq, and ripgrep (rg), or null to clear inherited profile"),
10236
10448
  setupScript: string2().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
10237
10449
  repositories: array(string2()).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"),
10238
10450
  ...LIVE_PREVIEW_CONFIG_INPUT
@@ -11623,6 +11835,145 @@ var ACTION_DEFINITIONS = [
11623
11835
  toolset: "artifacts",
11624
11836
  run: forward("artifact.transition")
11625
11837
  },
11838
+ {
11839
+ name: "tldraw_import",
11840
+ title: "Import a tldraw board",
11841
+ 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.",
11842
+ inputSchema: {
11843
+ sourceAttachmentId: string2().describe("uploaded .tldr Attachment, att_…"),
11844
+ title: string2().min(1).max(200).describe("the board title"),
11845
+ summary: string2().min(1).max(500).describe("one-line description of the board"),
11846
+ sourceThreadId: string2().describe("Thread that owns the source Attachment, thr_…"),
11847
+ idempotencyKey: string2().min(1).max(200).describe("stable key for this import request")
11848
+ },
11849
+ surfaces: ["mcp", "cli"],
11850
+ toolset: "artifacts",
11851
+ run: forward("tldraw.import")
11852
+ },
11853
+ {
11854
+ name: "tldraw_get",
11855
+ title: "Read a tldraw board",
11856
+ description: "Read the current or one historical tldraw board version, its immutable source references, version list, edit access, and document-script state. Historical versions are read-only.",
11857
+ inputSchema: {
11858
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11859
+ version: number2().int().min(1).optional().describe("optional historical version number")
11860
+ },
11861
+ surfaces: ["mcp", "cli"],
11862
+ toolset: "artifacts",
11863
+ run: forward("tldraw.get")
11864
+ },
11865
+ {
11866
+ name: "tldraw_workbench",
11867
+ title: "Materialize a tldraw workbench",
11868
+ description: "Materialize the current live tldraw board and separate document script in an active same-Thread WRITE Run, writing a manifest that pins the exact ArtifactVersion, live clock/digest, and script source tuple without approving or enabling scripts. Each call creates a fresh workbench directory; idempotencyKey makes only the live checkpoint retry-safe.",
11869
+ inputSchema: {
11870
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11871
+ runId: string2().describe("active same-Thread WRITE Run, run_…"),
11872
+ idempotencyKey: string2().min(1).max(120).describe("stable key for this workbench materialization")
11873
+ },
11874
+ surfaces: ["computer-mcp", "computer-cli"],
11875
+ toolset: "loop",
11876
+ run: forward("tldraw.workbench")
11877
+ },
11878
+ {
11879
+ name: "tldraw_status",
11880
+ title: "Check tldraw board status",
11881
+ 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.",
11882
+ inputSchema: { artifactId: string2().describe("the tldraw Artifact, art_…") },
11883
+ surfaces: ["mcp", "cli"],
11884
+ toolset: "artifacts",
11885
+ run: forward("tldraw.status")
11886
+ },
11887
+ {
11888
+ name: "tldraw_checkpoint",
11889
+ title: "Checkpoint a tldraw board",
11890
+ description: "Persist a current tldraw room snapshot as the next immutable Artifact version with compare-and-swap clocks. Repeating the same idempotencyKey returns the existing checkpoint receipt.",
11891
+ inputSchema: {
11892
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11893
+ idempotencyKey: string2().min(1).max(200).describe("stable key for this checkpoint"),
11894
+ reason: _enum(["manual", "autosave", "exec"]).optional().describe("why the room is being checkpointed")
11895
+ },
11896
+ surfaces: ["mcp", "cli"],
11897
+ toolset: "artifacts",
11898
+ run: forward("tldraw.checkpoint")
11899
+ },
11900
+ {
11901
+ name: "tldraw_publish",
11902
+ title: "Publish a tldraw board version",
11903
+ description: "Publish one validated .tldr source into the current board using both the room document clock and Artifact version as compare-and-swap guards. Retries are safe with the same idempotencyKey.",
11904
+ inputSchema: {
11905
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11906
+ sourceAttachmentId: string2().describe("validated .tldr Attachment, att_…"),
11907
+ expectedDocumentClock: number2().int().min(0).describe("room clock observed before publish"),
11908
+ expectedArtifactVersion: number2().int().min(1).describe("Artifact version observed before publish"),
11909
+ idempotencyKey: string2().min(1).max(200).describe("stable key for this publish")
11910
+ },
11911
+ surfaces: ["mcp", "cli"],
11912
+ toolset: "artifacts",
11913
+ run: forward("tldraw.publish")
11914
+ },
11915
+ {
11916
+ name: "tldraw_script",
11917
+ title: "Manage a tldraw document script",
11918
+ description: "Set, approve, disable, or reload the separate document script for a tldraw board. Approval names the exact displayed source version and digest; scripts never run from historical views.",
11919
+ inputSchema: {
11920
+ verb: _enum(["set", "approve", "disable", "reload"]).describe("the script change"),
11921
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11922
+ attachmentId: string2().optional().describe("set: uploaded script Attachment, att_…"),
11923
+ expectedRevision: number2().int().min(0).optional().describe("set: script revision observed before the write"),
11924
+ version: number2().int().min(1).optional().describe("approve: exact displayed source version"),
11925
+ digest: string2().regex(/^[a-f0-9]{64}$/).optional().describe("approve: exact displayed source digest")
11926
+ },
11927
+ surfaces: ["mcp", "cli"],
11928
+ toolset: "artifacts",
11929
+ run: dispatch({
11930
+ set: "tldraw.script",
11931
+ approve: "tldraw.script",
11932
+ disable: "tldraw.script",
11933
+ reload: "tldraw.script"
11934
+ }, (verb, input) => ({ ...input, verb }))
11935
+ },
11936
+ {
11937
+ name: "tldraw_observe",
11938
+ title: "Observe a tldraw board",
11939
+ description: "Capture a fresh bounded tldraw scene, lint result, document clock and digest, plus a PNG attachment for visual review.",
11940
+ inputSchema: {
11941
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11942
+ pageId: string2().min(1).max(200).optional().describe("optional page to observe"),
11943
+ viewportWidth: number2().int().min(320).max(1920).optional(),
11944
+ viewportHeight: number2().int().min(240).max(1080).optional()
11945
+ },
11946
+ surfaces: ["mcp", "cli"],
11947
+ toolset: "artifacts",
11948
+ run: forward("tldraw.observe")
11949
+ },
11950
+ {
11951
+ name: "tldraw_exec",
11952
+ title: "Run a one-shot tldraw program",
11953
+ description: "Run bounded one-shot code against the current live tldraw board without changing its persistent document script, and return a durable execution receipt. An unknown result is reported for recovery and is never replayed automatically.",
11954
+ inputSchema: {
11955
+ artifactId: string2().describe("the tldraw Artifact, art_…"),
11956
+ code: string2().min(1).max(1e5).describe("the script source to execute"),
11957
+ idempotencyKey: string2().min(1).max(200).describe("stable key for this execution"),
11958
+ expectedDocumentClock: number2().int().min(0).optional().describe("optional current room clock guard"),
11959
+ boundedSettleMs: number2().int().min(400).max(3000).optional().describe("maximum settle time")
11960
+ },
11961
+ surfaces: ["mcp", "cli"],
11962
+ toolset: "artifacts",
11963
+ run: forward("tldraw.exec")
11964
+ },
11965
+ {
11966
+ name: "tldraw_exec_get",
11967
+ title: "Read a tldraw execution receipt",
11968
+ description: "Read one tldraw execution receipt by execution id. The receipt reports success, failure, running, or unknown without starting another execution.",
11969
+ inputSchema: {
11970
+ executionId: string2().describe("the execution receipt, tex_…"),
11971
+ artifactId: string2().optional().describe("optional board id for a scoped lookup")
11972
+ },
11973
+ surfaces: ["mcp", "cli"],
11974
+ toolset: "artifacts",
11975
+ run: forward("tldraw.exec_get")
11976
+ },
11626
11977
  {
11627
11978
  name: "artifact_delete",
11628
11979
  title: "Permanently delete an Artifact",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.22.5",
3
+ "version": "0.22.7",
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",