@lambdacurry/arbor 0.22.39 → 0.22.41

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 +191 -35
  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.39",
5
+ version: "0.22.41",
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",
@@ -4921,6 +4921,16 @@ var IDENTITY_COLORS = [
4921
4921
  "rose",
4922
4922
  "cyan"
4923
4923
  ];
4924
+ var LIFECYCLE_TYPES = [
4925
+ "backlog",
4926
+ "active",
4927
+ "needs-review",
4928
+ "stuck",
4929
+ "standing",
4930
+ "resolved",
4931
+ "canceled",
4932
+ "archived"
4933
+ ];
4924
4934
  var CONTRIBUTION_TYPES = [
4925
4935
  "comment",
4926
4936
  "question",
@@ -6464,13 +6474,15 @@ var threads = sqliteTable("threads", {
6464
6474
  title: text("title").notNull(),
6465
6475
  objective: text("objective").notNull(),
6466
6476
  status: text("status").$type().notNull().default("active"),
6477
+ lifecycleType: text("lifecycle_type").$type().notNull().default("active"),
6467
6478
  waysToHelp: text("ways_to_help", { mode: "json" }).$type().notNull().default([]),
6468
6479
  openQuestions: text("open_questions", { mode: "json" }).$type().notNull().default([]),
6469
6480
  expectedOutput: text("expected_output").notNull().default(""),
6470
6481
  createdAt: ts("created_at").notNull()
6471
6482
  }, (t) => ({
6472
6483
  topicIdx: index("threads_topic_idx").on(t.topicId),
6473
- spaceIdx: index("threads_space_idx").on(t.spaceId)
6484
+ spaceIdx: index("threads_space_idx").on(t.spaceId),
6485
+ lifecycleTypeIdx: index("threads_lifecycle_type_idx").on(t.lifecycleType)
6474
6486
  }));
6475
6487
  var computerConfigs = sqliteTable("computer_configs", {
6476
6488
  id: text("id").primaryKey(),
@@ -6685,6 +6697,7 @@ var computerRuns = sqliteTable("computer_runs", {
6685
6697
  runtimeState: text("runtime_state").$type().notNull().default("shared"),
6686
6698
  runtimeUpdatedAt: ts("runtime_updated_at"),
6687
6699
  gitStart: text("git_start", { mode: "json" }).$type(),
6700
+ f1Authority: text("f1_authority", { mode: "json" }).$type(),
6688
6701
  finishRequest: text("finish_request", { mode: "json" }).$type(),
6689
6702
  status: text("status").$type().notNull().default("active"),
6690
6703
  label: text("label"),
@@ -6698,6 +6711,60 @@ var computerRuns = sqliteTable("computer_runs", {
6698
6711
  statusIdx: index("computer_runs_status_idx").on(t.computerId, t.status),
6699
6712
  runtimeIdx: index("computer_runs_runtime_idx").on(t.computerId, t.runtimeState)
6700
6713
  }));
6714
+ var packageCacheObjects = sqliteTable("package_cache_objects", {
6715
+ key: text("key").primaryKey(),
6716
+ orgId: text("org_id").notNull().references(() => orgs.id),
6717
+ project: text("project").notNull(),
6718
+ ecosystem: text("ecosystem").notNull(),
6719
+ originId: text("origin_id").notNull(),
6720
+ integrityAlgorithm: text("integrity_algorithm").notNull(),
6721
+ digest: text("digest").notNull(),
6722
+ sri: text("sri").notNull(),
6723
+ byteLength: integer2("byte_length").notNull(),
6724
+ status: text("status").$type().notNull(),
6725
+ uploadId: text("upload_id").notNull(),
6726
+ producerRunId: text("producer_run_id").notNull().references(() => computerRuns.id),
6727
+ producerTrust: text("producer_trust").$type().notNull(),
6728
+ createdAt: ts("created_at").notNull(),
6729
+ readyAt: ts("ready_at"),
6730
+ expiresAt: ts("expires_at").notNull()
6731
+ }, (t) => ({
6732
+ uploadUq: uniqueIndex("package_cache_objects_upload_uniq").on(t.uploadId),
6733
+ projectStatusExpiryIdx: index("package_cache_objects_project_status_expiry_idx").on(t.orgId, t.project, t.status, t.expiresAt)
6734
+ }));
6735
+ var packageCacheProjectUsage = sqliteTable("package_cache_project_usage", {
6736
+ id: text("id").primaryKey(),
6737
+ orgId: text("org_id").notNull().references(() => orgs.id),
6738
+ project: text("project").notNull(),
6739
+ maxStoredBytes: integer2("max_stored_bytes").notNull(),
6740
+ maxObjects: integer2("max_objects").notNull(),
6741
+ maxWriteBytesPerDay: integer2("max_write_bytes_per_day").notNull(),
6742
+ writePeriod: text("write_period").notNull(),
6743
+ writeBytesToday: integer2("write_bytes_today").notNull().default(0),
6744
+ storedBytes: integer2("stored_bytes").notNull().default(0),
6745
+ objectCount: integer2("object_count").notNull().default(0),
6746
+ reservedBytes: integer2("reserved_bytes").notNull().default(0),
6747
+ reservedObjects: integer2("reserved_objects").notNull().default(0),
6748
+ writeBytes: integer2("write_bytes").notNull().default(0),
6749
+ readBytes: integer2("read_bytes").notNull().default(0),
6750
+ hits: integer2("hits").notNull().default(0),
6751
+ misses: integer2("misses").notNull().default(0),
6752
+ rejections: integer2("rejections").notNull().default(0),
6753
+ classAOps: integer2("class_a_ops").notNull().default(0),
6754
+ classBOps: integer2("class_b_ops").notNull().default(0),
6755
+ publicationsNew: integer2("publications_new").notNull().default(0),
6756
+ publicationsDuplicate: integer2("publications_duplicate").notNull().default(0),
6757
+ publicationsConverged: integer2("publications_converged").notNull().default(0),
6758
+ publicationsRejected: integer2("publications_rejected").notNull().default(0),
6759
+ fallbacks: integer2("fallbacks").notNull().default(0),
6760
+ updatedAt: ts("updated_at").notNull()
6761
+ }, (t) => ({
6762
+ projectUq: uniqueIndex("package_cache_project_usage_project_uniq").on(t.orgId, t.project),
6763
+ nonnegative: check("package_cache_project_usage_nonnegative", sql`${t.storedBytes} >= 0 AND ${t.objectCount} >= 0 AND ${t.reservedBytes} >= 0 AND ${t.reservedObjects} >= 0`),
6764
+ byteBudget: check("package_cache_project_usage_byte_budget", sql`${t.storedBytes} + ${t.reservedBytes} <= ${t.maxStoredBytes}`),
6765
+ objectBudget: check("package_cache_project_usage_object_budget", sql`${t.objectCount} + ${t.reservedObjects} <= ${t.maxObjects}`),
6766
+ dailyWriteBudget: check("package_cache_project_usage_daily_write_budget", sql`${t.writeBytesToday} + ${t.reservedBytes} <= ${t.maxWriteBytesPerDay}`)
6767
+ }));
6701
6768
  var computerSnapshots = sqliteTable("computer_snapshots", {
6702
6769
  id: text("id").primaryKey(),
6703
6770
  ownerScope: text("owner_scope").$type().notNull(),
@@ -7063,6 +7130,22 @@ var artifactTldrawBoards = sqliteTable("artifact_tldraw_boards", {
7063
7130
  }, (t) => ({
7064
7131
  createKeyUq: uniqueIndex("artifact_tldraw_boards_create_key_uq").on(t.createActorProfileId, t.createThreadId, t.createIdempotencyKey)
7065
7132
  }));
7133
+ var artifactTldrawLatestPreviews = sqliteTable("artifact_tldraw_latest_previews", {
7134
+ artifactId: text("artifact_id").primaryKey().references(() => artifacts.id, { onDelete: "cascade" }),
7135
+ attachmentId: text("attachment_id").notNull().references(() => attachments.id),
7136
+ documentDigest: text("document_digest").notNull(),
7137
+ documentClock: integer2("document_clock").notNull(),
7138
+ roomGeneration: integer2("room_generation").notNull(),
7139
+ width: integer2("width").notNull(),
7140
+ height: integer2("height").notNull(),
7141
+ generatedAt: ts("generated_at").notNull(),
7142
+ revision: integer2("revision").notNull().default(1),
7143
+ storageSlot: integer2("storage_slot").notNull(),
7144
+ retiredAttachmentId: text("retired_attachment_id"),
7145
+ retiredStorageSlot: integer2("retired_storage_slot")
7146
+ }, (t) => ({
7147
+ attachmentIdx: uniqueIndex("artifact_tldraw_latest_previews_attachment_uniq").on(t.attachmentId)
7148
+ }));
7066
7149
  var artifactTldrawCheckpoints = sqliteTable("artifact_tldraw_checkpoints", {
7067
7150
  id: text("id").primaryKey(),
7068
7151
  artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
@@ -7588,6 +7671,36 @@ var threadAssignments = sqliteTable("thread_assignments", {
7588
7671
  assigneeUq: uniqueIndex("thread_assignments_thread_profile_uniq").on(t.threadId, t.profileId),
7589
7672
  profileIdx: index("thread_assignments_profile_idx").on(t.profileId, t.createdAt)
7590
7673
  }));
7674
+ // ../core/src/db/tldraw-preview-candidate-schema.ts
7675
+ var ts2 = (name) => text(name);
7676
+ var artifactTldrawPreviewCandidates = sqliteTable("artifact_tldraw_preview_candidates", {
7677
+ artifactId: text("artifact_id").primaryKey().references(() => artifacts.id, { onDelete: "cascade" }),
7678
+ generationToken: text("generation_token").notNull(),
7679
+ slot: integer2("slot").notNull(),
7680
+ attachmentId: text("attachment_id").notNull(),
7681
+ r2Key: text("r2_key").notNull(),
7682
+ targetDocumentDigest: text("target_document_digest").notNull(),
7683
+ leaseExpiresAt: ts2("lease_expires_at").notNull(),
7684
+ createdAt: ts2("created_at").notNull()
7685
+ }, (t) => ({
7686
+ generationIdx: uniqueIndex("artifact_tldraw_preview_candidates_generation_uniq").on(t.generationToken),
7687
+ attachmentIdx: uniqueIndex("artifact_tldraw_preview_candidates_attachment_uniq").on(t.attachmentId),
7688
+ r2KeyIdx: uniqueIndex("artifact_tldraw_preview_candidates_r2_key_uniq").on(t.r2Key)
7689
+ }));
7690
+ // ../core/src/lifecycle/thread.ts
7691
+ var STATUS_OPENNESS = {
7692
+ backlog: { working: false, currentWork: false, closed: false },
7693
+ active: { working: true, currentWork: true, closed: false },
7694
+ "needs-review": { working: true, currentWork: true, closed: false },
7695
+ stuck: { working: true, currentWork: true, closed: false },
7696
+ standing: { working: true, currentWork: false, closed: false },
7697
+ resolved: { working: false, currentWork: false, closed: true },
7698
+ canceled: { working: false, currentWork: false, closed: true },
7699
+ archived: { working: false, currentWork: false, closed: true }
7700
+ };
7701
+ var typesWhere = (sense) => Object.keys(STATUS_OPENNESS).filter((s) => STATUS_OPENNESS[s][sense]);
7702
+ var WORKING_THREAD_STATUSES = typesWhere("working");
7703
+ var CURRENT_WORK_THREAD_STATUSES = typesWhere("currentWork");
7591
7704
  // ../core/src/ops/secret.ts
7592
7705
  var SECRET_PERMISSIONS = [
7593
7706
  "create",
@@ -7609,6 +7722,15 @@ var ORG_ADMIN_CONTAINMENT_PERMISSIONS = new Set([
7609
7722
 
7610
7723
  // ../core/src/ops/computer-run.ts
7611
7724
  var COMPUTER_RUN_START_CHECKPOINT_RESERVATION_STALE_MS = 12 * 60 * 1000;
7725
+ var COMPUTER_RUN_F1_FINAL_FAILURE_CODES = new Set([
7726
+ "run.provision.lifecycle_capacity_blocked",
7727
+ "run.provision.capacity_blocked",
7728
+ "run.provision.attempts_exhausted",
7729
+ "run.provision.preflight_failed",
7730
+ "run.provision.reconciliation_failed",
7731
+ "run.provision.owner_unavailable",
7732
+ "run.provision.provider_unavailable"
7733
+ ]);
7612
7734
  var TERMINAL = new Set(["finished", "failed", "cancelled"]);
7613
7735
  var RUN_LIFECYCLE_TYPES = new Set(["run.started", "run.finished", "run.failed", "run.cancelled"]);
7614
7736
  var COMPUTER_RUN_ACTIVITY_LABEL_MAX = 120;
@@ -7661,6 +7783,9 @@ var assigneeColumns = {
7661
7783
  color: profiles.color,
7662
7784
  emoji: profiles.emoji
7663
7785
  };
7786
+ // ../core/src/ops/package-cache.ts
7787
+ var PACKAGE_CACHE_PENDING_TTL_MS = 15 * 60 * 1000;
7788
+ var PACKAGE_CACHE_FINAL_TTL_MS = 30 * 24 * 60 * 60 * 1000;
7664
7789
  // ../core/src/ops/computer-output.ts
7665
7790
  var COMPUTER_OUTPUT_DEFAULT_STALE_MS = 24 * 60 * 60 * 1000;
7666
7791
  // ../core/src/ops/computer-recovery.ts
@@ -7820,6 +7945,20 @@ var recallHit = looseObject({
7820
7945
  url: nullableString,
7821
7946
  createdAt: timestamp
7822
7947
  });
7948
+ var tldrawLatestPreview = object({
7949
+ status: _enum(["current", "stale", "missing"]),
7950
+ representedDocumentDigest: string2().optional(),
7951
+ representedDocumentClock: number2().int().min(0).optional(),
7952
+ generatedAt: timestamp.optional(),
7953
+ image: object({
7954
+ attachmentId: id,
7955
+ downloadUrl: string2(),
7956
+ mimeType: literal("image/png"),
7957
+ width: number2().int().positive(),
7958
+ height: number2().int().positive(),
7959
+ size: number2().int().positive()
7960
+ }).strict().optional()
7961
+ });
7823
7962
  var artifactLivePreviewThread = looseObject({
7824
7963
  id,
7825
7964
  title: string2()
@@ -8990,6 +9129,7 @@ var MCP_OUTPUT_SCHEMAS = {
8990
9129
  retryCount: number2().int().min(0)
8991
9130
  })
8992
9131
  }),
9132
+ preview: tldrawLatestPreview,
8993
9133
  script: object({
8994
9134
  artifactId: id,
8995
9135
  revision: number2().int().min(0),
@@ -9040,15 +9180,7 @@ var MCP_OUTPUT_SCHEMAS = {
9040
9180
  serializedByteLimit: number2().int().positive()
9041
9181
  })
9042
9182
  }),
9043
- image: object({
9044
- attachmentId: id,
9045
- downloadUrl: string2(),
9046
- mimeType: literal("image/png"),
9047
- width: number2().int().positive(),
9048
- height: number2().int().positive(),
9049
- size: number2().int().positive(),
9050
- sha256: string2()
9051
- }).strict()
9183
+ preview: tldrawLatestPreview
9052
9184
  }),
9053
9185
  tldraw_exec: looseObject({
9054
9186
  executionId: id,
@@ -9314,7 +9446,16 @@ var MCP_OUTPUT_SCHEMAS = {
9314
9446
  })
9315
9447
  }),
9316
9448
  computer_run_receipt: looseObject({
9317
- receipt: computerRunReceipt2
9449
+ receipt: union([
9450
+ computerRunReceipt2,
9451
+ object({
9452
+ runStartId: id,
9453
+ runId: id,
9454
+ runCreated: literal(false),
9455
+ status: literal("provisioning"),
9456
+ phase: literal("run.admission")
9457
+ })
9458
+ ])
9318
9459
  }),
9319
9460
  computer_runs: looseObject({
9320
9461
  computerId: id,
@@ -9549,6 +9690,28 @@ function selectedArray(value, fields) {
9549
9690
  return;
9550
9691
  return value.map((entry) => selected(entry, fields) ?? {});
9551
9692
  }
9693
+ function compactTldrawPreview(value) {
9694
+ const preview = record2(value);
9695
+ if (!preview)
9696
+ return;
9697
+ return defined([
9698
+ ["status", preview.status],
9699
+ ["representedDocumentDigest", preview.representedDocumentDigest],
9700
+ ["representedDocumentClock", preview.representedDocumentClock],
9701
+ ["generatedAt", preview.generatedAt],
9702
+ [
9703
+ "image",
9704
+ selected(preview.image, [
9705
+ "attachmentId",
9706
+ "downloadUrl",
9707
+ "mimeType",
9708
+ "width",
9709
+ "height",
9710
+ "size"
9711
+ ])
9712
+ ]
9713
+ ]);
9714
+ }
9552
9715
  function omitNull(value) {
9553
9716
  return value === null ? undefined : value;
9554
9717
  }
@@ -9777,18 +9940,7 @@ var OUTPUT_SHAPERS = {
9777
9940
  ["documentClock", result.documentClock],
9778
9941
  ["documentDigest", result.documentDigest],
9779
9942
  ["scene", result.scene],
9780
- [
9781
- "image",
9782
- selected(result.image, [
9783
- "attachmentId",
9784
- "downloadUrl",
9785
- "mimeType",
9786
- "width",
9787
- "height",
9788
- "size",
9789
- "sha256"
9790
- ])
9791
- ]
9943
+ ["preview", compactTldrawPreview(result.preview)]
9792
9944
  ]),
9793
9945
  computer_write: (result) => defined([
9794
9946
  ["ok", result.ok],
@@ -10589,7 +10741,7 @@ var ACTION_DEFINITIONS = [
10589
10741
  sourceThreadId: string2().optional().describe("merge: duplicate source Thread id"),
10590
10742
  targetThreadId: string2().optional().describe("merge: canonical destination Thread id"),
10591
10743
  objective: string2().min(1).optional().describe("create/update: Thread objective"),
10592
- status: _enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
10744
+ status: _enum(LIFECYCLE_TYPES).optional().describe("transition/update: target Thread lifecycle type"),
10593
10745
  reason: string2().optional().describe("merge: concise auditable rationale")
10594
10746
  },
10595
10747
  surfaces: ["mcp"],
@@ -10623,7 +10775,7 @@ var ACTION_DEFINITIONS = [
10623
10775
  topicId: string2().optional().describe("create/move/update: destination Feedback Topic id"),
10624
10776
  title: string2().min(1).optional().describe("create/update: Thread title"),
10625
10777
  objective: string2().min(1).optional().describe("create/update: Thread objective"),
10626
- status: _enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
10778
+ status: _enum(LIFECYCLE_TYPES).optional().describe("transition/update: target Thread lifecycle type"),
10627
10779
  reason: string2().optional().describe("merge: concise auditable rationale")
10628
10780
  },
10629
10781
  surfaces: ["cli"],
@@ -10869,13 +11021,15 @@ var ACTION_DEFINITIONS = [
10869
11021
  status: _enum([
10870
11022
  "current",
10871
11023
  "all",
11024
+ "backlog",
10872
11025
  "active",
10873
11026
  "needs-review",
10874
11027
  "stuck",
10875
11028
  "standing",
10876
11029
  "resolved",
11030
+ "canceled",
10877
11031
  "archived"
10878
- ]).optional().describe("default current = active + needs-review + stuck; all includes standing/resolved/archived"),
11032
+ ]).optional().describe("default current = active + needs-review + stuck; all includes backlog/standing/resolved/canceled/archived"),
10879
11033
  limit: number2().int().min(1).max(100).optional().describe("page size (default 20, max 100)"),
10880
11034
  cursor: string2().optional().describe("keyset cursor from a prior page's nextCursor")
10881
11035
  },
@@ -10985,7 +11139,7 @@ var ACTION_DEFINITIONS = [
10985
11139
  {
10986
11140
  name: "computer_run_start",
10987
11141
  title: "Start a run",
10988
- 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}.`,
11142
+ description: `Start an isolated write Run or shared/read Run with one idempotencyKey; a pending admission returns runStartId for receipt observation while the lifecycle owner continues independently, and caller work waits for admission. First use: read the Computer guide at ${AGENT_GUIDE_URLS.computer}.`,
10989
11143
  inputSchema: {
10990
11144
  threadId: string2().optional().describe("the Thread whose Computer this Run works in, thr_…; the canonical Run-first front door"),
10991
11145
  computerSessionId: string2().optional().describe("legacy compatibility alternative to threadId: an existing parent computerSessionId, cms_…"),
@@ -11041,9 +11195,10 @@ var ACTION_DEFINITIONS = [
11041
11195
  {
11042
11196
  name: "computer_run_receipt",
11043
11197
  title: "Read a run receipt",
11044
- description: "Read a Run's durable receipt, including finishRequest, derived finishContinuation, Run-owned operation/activity state, and compact providerLifecycle. A verified pending continuation names the stage the existing owner is retrying with callerAction none; reads never advance finish or rewrite terminal reasonCode, so use this instead of parent computer_status for compact history.",
11198
+ description: "Read with exactly one of runId or runStartId: observe pending admission, finish continuation, Run-owned operation/activity state, and providerLifecycle instead of parent computer_status. Reads never drive admission or finish; the existing lifecycle owner continues independently.",
11045
11199
  inputSchema: {
11046
- runId: string2().describe("the run to read, run_ (from computer_run_start or computer_runs)")
11200
+ runId: string2().optional().describe("the Run to read, run_…; provide exactly one of runId or runStartId"),
11201
+ runStartId: string2().optional().describe("the pending or linked RunStart to read, rsr_…; alternative to runId")
11047
11202
  },
11048
11203
  surfaces: ["computer-mcp", "computer-cli"],
11049
11204
  toolset: "loop",
@@ -11355,10 +11510,10 @@ var ACTION_DEFINITIONS = [
11355
11510
  {
11356
11511
  name: "transition_thread",
11357
11512
  title: "Move a thread's lifecycle",
11358
- 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.",
11513
+ description: "Move a Thread among backlog, active, needs-review, stuck, standing, resolved, canceled, or archived with an optional reason; illegal lifecycle jumps are rejected. Park accepted-not-committed work in backlog, resolve finite Decide/Deliver/Investigate/Manage work once its outcome is in, cancel work the room decided not to do, archive retired work (refile misfiled work with `thread_update` instead), use standing only for intentionally open-ended concerns, and curate standout outputs separately.",
11359
11514
  inputSchema: {
11360
11515
  threadId: string2().describe("the thread to move, thr_…"),
11361
- to: _enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).describe("target Thread lifecycle status"),
11516
+ to: _enum(LIFECYCLE_TYPES).describe("target Thread lifecycle type"),
11362
11517
  reason: string2().optional().describe("optional one-line why, recorded on the event")
11363
11518
  },
11364
11519
  surfaces: ["mcp", "cli"],
@@ -12431,7 +12586,7 @@ var ACTION_DEFINITIONS = [
12431
12586
  {
12432
12587
  name: "tldraw_status",
12433
12588
  title: "Check tldraw board status",
12434
- 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.",
12589
+ description: "Read compact operational room health, current latest-preview freshness, and separately reported script sessions for a tldraw board without rendering an image; board geometry/document content stays on tldraw_observe and tldraw_get. Session reports remain per-session observations and are never collapsed into global success.",
12435
12590
  inputSchema: { artifactId: string2().describe("the tldraw Artifact, art_…") },
12436
12591
  surfaces: ["mcp", "cli"],
12437
12592
  toolset: "artifacts",
@@ -12489,12 +12644,13 @@ var ACTION_DEFINITIONS = [
12489
12644
  {
12490
12645
  name: "tldraw_observe",
12491
12646
  title: "Observe a tldraw board",
12492
- 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}.`,
12647
+ description: `Read a fresh bounded tldraw scene, lint result, document clock/digest, and latest-preview freshness; preview defaults to metadata-only with no screenshot/storage write, while preview=ensure reuses a same-digest preview or explicitly renders the canonical latest PNG when visual composition matters, and lint remains advisory rather than ownership/intent evidence. First use: read the tldraw guide at ${AGENT_GUIDE_URLS.tldraw}.`,
12493
12648
  inputSchema: {
12494
12649
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12495
12650
  pageId: string2().min(1).max(200).optional().describe("optional page to observe"),
12496
12651
  viewportWidth: number2().int().min(320).max(1920).optional(),
12497
- viewportHeight: number2().int().min(240).max(1080).optional()
12652
+ viewportHeight: number2().int().min(240).max(1080).optional(),
12653
+ preview: _enum(["metadata", "ensure"]).optional().describe("preview behavior; defaults to metadata, while ensure explicitly refreshes only when stale/missing")
12498
12654
  },
12499
12655
  surfaces: ["mcp", "cli"],
12500
12656
  toolset: "artifacts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.22.39",
3
+ "version": "0.22.41",
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",