@lambdacurry/arbor 0.22.40 → 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 +167 -31
  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.40",
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(),
@@ -6699,6 +6711,60 @@ var computerRuns = sqliteTable("computer_runs", {
6699
6711
  statusIdx: index("computer_runs_status_idx").on(t.computerId, t.status),
6700
6712
  runtimeIdx: index("computer_runs_runtime_idx").on(t.computerId, t.runtimeState)
6701
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
+ }));
6702
6768
  var computerSnapshots = sqliteTable("computer_snapshots", {
6703
6769
  id: text("id").primaryKey(),
6704
6770
  ownerScope: text("owner_scope").$type().notNull(),
@@ -7064,6 +7130,22 @@ var artifactTldrawBoards = sqliteTable("artifact_tldraw_boards", {
7064
7130
  }, (t) => ({
7065
7131
  createKeyUq: uniqueIndex("artifact_tldraw_boards_create_key_uq").on(t.createActorProfileId, t.createThreadId, t.createIdempotencyKey)
7066
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
+ }));
7067
7149
  var artifactTldrawCheckpoints = sqliteTable("artifact_tldraw_checkpoints", {
7068
7150
  id: text("id").primaryKey(),
7069
7151
  artifactId: text("artifact_id").notNull().references(() => artifacts.id, { onDelete: "cascade" }),
@@ -7589,6 +7671,36 @@ var threadAssignments = sqliteTable("thread_assignments", {
7589
7671
  assigneeUq: uniqueIndex("thread_assignments_thread_profile_uniq").on(t.threadId, t.profileId),
7590
7672
  profileIdx: index("thread_assignments_profile_idx").on(t.profileId, t.createdAt)
7591
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");
7592
7704
  // ../core/src/ops/secret.ts
7593
7705
  var SECRET_PERMISSIONS = [
7594
7706
  "create",
@@ -7671,6 +7783,9 @@ var assigneeColumns = {
7671
7783
  color: profiles.color,
7672
7784
  emoji: profiles.emoji
7673
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;
7674
7789
  // ../core/src/ops/computer-output.ts
7675
7790
  var COMPUTER_OUTPUT_DEFAULT_STALE_MS = 24 * 60 * 60 * 1000;
7676
7791
  // ../core/src/ops/computer-recovery.ts
@@ -7830,6 +7945,20 @@ var recallHit = looseObject({
7830
7945
  url: nullableString,
7831
7946
  createdAt: timestamp
7832
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
+ });
7833
7962
  var artifactLivePreviewThread = looseObject({
7834
7963
  id,
7835
7964
  title: string2()
@@ -9000,6 +9129,7 @@ var MCP_OUTPUT_SCHEMAS = {
9000
9129
  retryCount: number2().int().min(0)
9001
9130
  })
9002
9131
  }),
9132
+ preview: tldrawLatestPreview,
9003
9133
  script: object({
9004
9134
  artifactId: id,
9005
9135
  revision: number2().int().min(0),
@@ -9050,15 +9180,7 @@ var MCP_OUTPUT_SCHEMAS = {
9050
9180
  serializedByteLimit: number2().int().positive()
9051
9181
  })
9052
9182
  }),
9053
- image: object({
9054
- attachmentId: id,
9055
- downloadUrl: string2(),
9056
- mimeType: literal("image/png"),
9057
- width: number2().int().positive(),
9058
- height: number2().int().positive(),
9059
- size: number2().int().positive(),
9060
- sha256: string2()
9061
- }).strict()
9183
+ preview: tldrawLatestPreview
9062
9184
  }),
9063
9185
  tldraw_exec: looseObject({
9064
9186
  executionId: id,
@@ -9568,6 +9690,28 @@ function selectedArray(value, fields) {
9568
9690
  return;
9569
9691
  return value.map((entry) => selected(entry, fields) ?? {});
9570
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
+ }
9571
9715
  function omitNull(value) {
9572
9716
  return value === null ? undefined : value;
9573
9717
  }
@@ -9796,18 +9940,7 @@ var OUTPUT_SHAPERS = {
9796
9940
  ["documentClock", result.documentClock],
9797
9941
  ["documentDigest", result.documentDigest],
9798
9942
  ["scene", result.scene],
9799
- [
9800
- "image",
9801
- selected(result.image, [
9802
- "attachmentId",
9803
- "downloadUrl",
9804
- "mimeType",
9805
- "width",
9806
- "height",
9807
- "size",
9808
- "sha256"
9809
- ])
9810
- ]
9943
+ ["preview", compactTldrawPreview(result.preview)]
9811
9944
  ]),
9812
9945
  computer_write: (result) => defined([
9813
9946
  ["ok", result.ok],
@@ -10608,7 +10741,7 @@ var ACTION_DEFINITIONS = [
10608
10741
  sourceThreadId: string2().optional().describe("merge: duplicate source Thread id"),
10609
10742
  targetThreadId: string2().optional().describe("merge: canonical destination Thread id"),
10610
10743
  objective: string2().min(1).optional().describe("create/update: Thread objective"),
10611
- 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"),
10612
10745
  reason: string2().optional().describe("merge: concise auditable rationale")
10613
10746
  },
10614
10747
  surfaces: ["mcp"],
@@ -10642,7 +10775,7 @@ var ACTION_DEFINITIONS = [
10642
10775
  topicId: string2().optional().describe("create/move/update: destination Feedback Topic id"),
10643
10776
  title: string2().min(1).optional().describe("create/update: Thread title"),
10644
10777
  objective: string2().min(1).optional().describe("create/update: Thread objective"),
10645
- 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"),
10646
10779
  reason: string2().optional().describe("merge: concise auditable rationale")
10647
10780
  },
10648
10781
  surfaces: ["cli"],
@@ -10888,13 +11021,15 @@ var ACTION_DEFINITIONS = [
10888
11021
  status: _enum([
10889
11022
  "current",
10890
11023
  "all",
11024
+ "backlog",
10891
11025
  "active",
10892
11026
  "needs-review",
10893
11027
  "stuck",
10894
11028
  "standing",
10895
11029
  "resolved",
11030
+ "canceled",
10896
11031
  "archived"
10897
- ]).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"),
10898
11033
  limit: number2().int().min(1).max(100).optional().describe("page size (default 20, max 100)"),
10899
11034
  cursor: string2().optional().describe("keyset cursor from a prior page's nextCursor")
10900
11035
  },
@@ -11375,10 +11510,10 @@ var ACTION_DEFINITIONS = [
11375
11510
  {
11376
11511
  name: "transition_thread",
11377
11512
  title: "Move a thread's lifecycle",
11378
- 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.",
11379
11514
  inputSchema: {
11380
11515
  threadId: string2().describe("the thread to move, thr_…"),
11381
- to: _enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).describe("target Thread lifecycle status"),
11516
+ to: _enum(LIFECYCLE_TYPES).describe("target Thread lifecycle type"),
11382
11517
  reason: string2().optional().describe("optional one-line why, recorded on the event")
11383
11518
  },
11384
11519
  surfaces: ["mcp", "cli"],
@@ -12451,7 +12586,7 @@ var ACTION_DEFINITIONS = [
12451
12586
  {
12452
12587
  name: "tldraw_status",
12453
12588
  title: "Check tldraw board status",
12454
- 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.",
12455
12590
  inputSchema: { artifactId: string2().describe("the tldraw Artifact, art_…") },
12456
12591
  surfaces: ["mcp", "cli"],
12457
12592
  toolset: "artifacts",
@@ -12509,12 +12644,13 @@ var ACTION_DEFINITIONS = [
12509
12644
  {
12510
12645
  name: "tldraw_observe",
12511
12646
  title: "Observe a tldraw board",
12512
- 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}.`,
12513
12648
  inputSchema: {
12514
12649
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12515
12650
  pageId: string2().min(1).max(200).optional().describe("optional page to observe"),
12516
12651
  viewportWidth: number2().int().min(320).max(1920).optional(),
12517
- 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")
12518
12654
  },
12519
12655
  surfaces: ["mcp", "cli"],
12520
12656
  toolset: "artifacts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.22.40",
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",