@lambdacurry/arbor 0.20.12 → 0.20.13

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 +139 -19
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1806,6 +1806,18 @@ var previewViewerGrantUses = sqliteTable("preview_viewer_grant_uses", {
1806
1806
  profileId: text("profile_id").notNull().references(() => profiles.id),
1807
1807
  consumedAt: ts("consumed_at").notNull()
1808
1808
  });
1809
+ var livePreviewViewerGrantUses = sqliteTable("live_preview_viewer_grant_uses", {
1810
+ jti: text("jti").primaryKey(),
1811
+ threadId: text("thread_id").notNull().references(() => threads.id),
1812
+ profileId: text("profile_id").notNull().references(() => profiles.id),
1813
+ consumedAt: ts("consumed_at").notNull()
1814
+ });
1815
+ var threadLivePreviewSessions = sqliteTable("thread_live_preview_sessions", {
1816
+ threadId: text("thread_id").notNull().references(() => threads.id),
1817
+ profileId: text("profile_id").notNull().references(() => profiles.id),
1818
+ computerSessionId: text("computer_session_id").notNull().references(() => computerSessions.id),
1819
+ updatedAt: ts("updated_at").notNull()
1820
+ }, (t) => ({ pk: primaryKey({ columns: [t.threadId, t.profileId] }) }));
1809
1821
  var threadInitiatives = sqliteTable("thread_initiatives", {
1810
1822
  threadId: text("thread_id").notNull().references(() => threads.id),
1811
1823
  initiativeId: text("initiative_id").notNull().references(() => initiatives.id)
@@ -16796,6 +16808,18 @@ var computerProfile = exports_external.looseObject({
16796
16808
  recommendedEditingPrimitive: exports_external.string()
16797
16809
  });
16798
16810
  var computerRunPublicationState = exports_external.enum(["not-required", "durable", "not-durable", "unknown"]);
16811
+ var computerRunGitState = exports_external.looseObject({
16812
+ head: exports_external.string().nullable(),
16813
+ branch: exports_external.string().nullable(),
16814
+ upstream: exports_external.string().nullable(),
16815
+ dirty: exports_external.boolean(),
16816
+ remote: exports_external.looseObject({ name: exports_external.string(), repository: exports_external.string().nullable() }).nullable()
16817
+ });
16818
+ var computerRunPublication = exports_external.looseObject({
16819
+ state: computerRunPublicationState,
16820
+ reasonCode: exports_external.string(),
16821
+ remoteRef: exports_external.string().optional()
16822
+ });
16799
16823
  var computerRunDurability = exports_external.looseObject({
16800
16824
  workspace: exports_external.enum(["shared", "isolated"]),
16801
16825
  parentMutation: exports_external.enum(["direct", "none"]),
@@ -16817,11 +16841,7 @@ var computerRunFinishAssessment = exports_external.looseObject({
16817
16841
  currentHead: exports_external.string().nullable(),
16818
16842
  currentDirty: exports_external.boolean().nullable(),
16819
16843
  changedSinceStart: exports_external.boolean().nullable(),
16820
- publication: exports_external.looseObject({
16821
- state: computerRunPublicationState,
16822
- reasonCode: exports_external.string(),
16823
- remoteRef: exports_external.string().optional()
16824
- })
16844
+ publication: computerRunPublication
16825
16845
  }))
16826
16846
  });
16827
16847
  var operatingGuidanceEntry = exports_external.looseObject({
@@ -16839,7 +16859,12 @@ var computerAgentBrief = exports_external.looseObject({
16839
16859
  backend: exports_external.enum(["worker-shell", "container"]),
16840
16860
  containerProfile: exports_external.string().nullable(),
16841
16861
  repositories: exports_external.array(exports_external.looseObject({ repository: exports_external.string(), path: exports_external.string() })),
16842
- durableSnapshotId: id.nullable()
16862
+ durableSnapshotId: id.nullable(),
16863
+ repositoryState: exports_external.looseObject({
16864
+ source: exports_external.enum(["durable-snapshot", "workspace"]),
16865
+ remoteFreshness: exports_external.literal("unchecked"),
16866
+ guidance: exports_external.string()
16867
+ })
16843
16868
  }),
16844
16869
  activeRuns: exports_external.array(exports_external.looseObject({
16845
16870
  runId: id,
@@ -16853,13 +16878,7 @@ var computerRunGitStart = exports_external.looseObject({
16853
16878
  repositories: exports_external.array(exports_external.looseObject({
16854
16879
  repository: exports_external.string(),
16855
16880
  path: exports_external.string(),
16856
- git: exports_external.looseObject({
16857
- head: exports_external.string().nullable(),
16858
- branch: exports_external.string().nullable(),
16859
- upstream: exports_external.string().nullable(),
16860
- dirty: exports_external.boolean(),
16861
- remote: exports_external.looseObject({ name: exports_external.string(), repository: exports_external.string().nullable() }).nullable()
16862
- }).nullable()
16881
+ git: computerRunGitState.nullable()
16863
16882
  }))
16864
16883
  });
16865
16884
  var computerRun = exports_external.looseObject({
@@ -17212,6 +17231,19 @@ var MCP_OUTPUT_SCHEMAS = {
17212
17231
  effectiveRecipe: redactedComputerRecipe,
17213
17232
  materializedRecipe: redactedComputerRecipe.nullable()
17214
17233
  }),
17234
+ livePreview: exports_external.looseObject({
17235
+ url: exports_external.string(),
17236
+ surface: exports_external.looseObject({
17237
+ command: exports_external.string(),
17238
+ cwd: exports_external.string(),
17239
+ port: exports_external.number().int(),
17240
+ healthPath: exports_external.string()
17241
+ }),
17242
+ configuredBy: exports_external.looseObject({
17243
+ scope: exports_external.enum(["topic", "thread"]),
17244
+ scopeId: id
17245
+ })
17246
+ }).nullable(),
17215
17247
  topicBase: jsonObject.nullable(),
17216
17248
  computer: jsonObject.nullable(),
17217
17249
  activeGenerationId: id.nullable(),
@@ -17531,6 +17563,63 @@ var MCP_OUTPUT_SCHEMAS = {
17531
17563
  durability: computerRunDurability,
17532
17564
  finishAssessment: computerRunFinishAssessment.nullable()
17533
17565
  }),
17566
+ computer_repo_work_status: exports_external.looseObject({
17567
+ runId: id,
17568
+ status: exports_external.enum(["blocked", "unknown", "reviewable", "in-progress"]),
17569
+ canFinishRun: exports_external.boolean(),
17570
+ durablyFinishable: exports_external.boolean(),
17571
+ finishAssessment: computerRunFinishAssessment,
17572
+ repositories: exports_external.array(exports_external.looseObject({
17573
+ repository: exports_external.string(),
17574
+ path: exports_external.string(),
17575
+ start: computerRunGitState.nullable(),
17576
+ current: computerRunGitState.nullable(),
17577
+ changedSinceRunStart: exports_external.boolean().nullable(),
17578
+ publication: computerRunPublication,
17579
+ pullRequest: exports_external.looseObject({
17580
+ state: exports_external.enum(["none", "head-mismatch", "open", "merged", "closed", "unknown"]),
17581
+ number: exports_external.number().int().positive().optional(),
17582
+ url: exports_external.string().optional(),
17583
+ headSha: exports_external.string().optional(),
17584
+ baseRef: exports_external.string().optional(),
17585
+ draft: exports_external.boolean().optional()
17586
+ }),
17587
+ ci: exports_external.looseObject({
17588
+ state: exports_external.enum(["none", "pending", "passed", "failed", "unknown"]),
17589
+ total: exports_external.number().int().min(0),
17590
+ pending: exports_external.number().int().min(0),
17591
+ passed: exports_external.number().int().min(0),
17592
+ failed: exports_external.number().int().min(0)
17593
+ }),
17594
+ review: exports_external.looseObject({
17595
+ state: exports_external.enum(["not-applicable", "none", "approved", "changes-requested", "unknown"]),
17596
+ approvals: exports_external.number().int().min(0),
17597
+ changesRequested: exports_external.number().int().min(0)
17598
+ }),
17599
+ githubProof: exports_external.looseObject({
17600
+ state: exports_external.enum(["known", "unknown"]),
17601
+ reasonCode: exports_external.string()
17602
+ }),
17603
+ state: exports_external.enum([
17604
+ "unchanged",
17605
+ "working",
17606
+ "committed-local",
17607
+ "publication-unknown",
17608
+ "pushed-durable",
17609
+ "github-unknown",
17610
+ "pr-head-mismatch",
17611
+ "pr-open",
17612
+ "ci-pending",
17613
+ "reviewable",
17614
+ "merged"
17615
+ ]),
17616
+ retrySafety: exports_external.looseObject({
17617
+ push: exports_external.enum(["not-needed", "safe", "unknown"]),
17618
+ prCreate: exports_external.enum(["not-needed", "safe", "manual", "unknown"])
17619
+ }),
17620
+ nextAction: exports_external.string()
17621
+ }))
17622
+ }),
17534
17623
  computer_run_receipt: exports_external.looseObject({
17535
17624
  receipt: computerRunReceipt
17536
17625
  }),
@@ -17568,7 +17657,15 @@ var MCP_OUTPUT_SCHEMAS = {
17568
17657
  stderr: exports_external.string().optional(),
17569
17658
  truncated: exports_external.boolean().optional(),
17570
17659
  nextCursor: exports_external.string().optional(),
17571
- exitCode: exports_external.number().int().nullable().optional()
17660
+ exitCode: exports_external.number().int().nullable().optional(),
17661
+ activity: exports_external.looseObject({
17662
+ state: exports_external.enum(["output", "compute", "quiet", "terminal", "unknown"]),
17663
+ observedAt: timestamp,
17664
+ outputAdvanced: exports_external.boolean(),
17665
+ cpuPercent: exports_external.number().min(0).nullable(),
17666
+ processCount: exports_external.number().int().min(0).nullable(),
17667
+ reasonCode: exports_external.string()
17668
+ }).optional()
17572
17669
  }),
17573
17670
  computer_process_terminate: exports_external.looseObject({
17574
17671
  status: exports_external.string(),
@@ -17766,7 +17863,8 @@ var OUTPUT_SHAPERS = {
17766
17863
  ["nextCursor", result.nextCursor],
17767
17864
  ["endedAt", result.endedAt],
17768
17865
  ["durationMs", result.durationMs],
17769
- ["exitCode", result.exitCode]
17866
+ ["exitCode", result.exitCode],
17867
+ ["activity", result.activity]
17770
17868
  ]),
17771
17869
  computer_process_terminate: (result) => defined([
17772
17870
  ["status", result.status],
@@ -17908,6 +18006,7 @@ var MCP_TOOL_ANNOTATIONS = {
17908
18006
  computer_open: additive,
17909
18007
  computer_reprovision: destructiveIdempotent,
17910
18008
  computer_run_start: additive,
18009
+ computer_repo_work_status: readOnly,
17911
18010
  computer_run_finish: idempotent,
17912
18011
  computer_run_receipt: readOnly,
17913
18012
  computer_runs: readOnly,
@@ -17982,6 +18081,14 @@ var PAGINATION_INPUT = {
17982
18081
  limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
17983
18082
  cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)")
17984
18083
  };
18084
+ var LIVE_PREVIEW_CONFIG_INPUT = {
18085
+ livePreview: exports_external.object({
18086
+ command: exports_external.string().min(1).max(4000).describe("explicit project preview command"),
18087
+ cwd: exports_external.string().startsWith("/workspace/").describe("workspace directory containing the project"),
18088
+ port: exports_external.number().int().min(1).max(65535).describe("local HTTP/WebSocket port"),
18089
+ healthPath: exports_external.string().startsWith("/").describe("HTTP health path checked before proxying")
18090
+ }).nullable().optional().describe("one inherited Thread Live Preview startup surface; null disables an inherited surface. This is runtime policy and does not change Computer recipe identity")
18091
+ };
17985
18092
  var ACTION_DEFINITIONS = [
17986
18093
  {
17987
18094
  name: "server_info",
@@ -18253,7 +18360,8 @@ var ACTION_DEFINITIONS = [
18253
18360
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
18254
18361
  containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.3.3, 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"),
18255
18362
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
18256
- repositories: exports_external.array(exports_external.string()).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")
18363
+ repositories: exports_external.array(exports_external.string()).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"),
18364
+ ...LIVE_PREVIEW_CONFIG_INPUT
18257
18365
  },
18258
18366
  surfaces: ["mcp", "cli"],
18259
18367
  toolset: "structure",
@@ -18268,7 +18376,8 @@ var ACTION_DEFINITIONS = [
18268
18376
  backend: exports_external.enum(["worker-shell", "container"]).nullable().optional().describe("override execution tier, or null to inherit"),
18269
18377
  containerProfile: exports_external.string().nullable().optional().describe("logical container profile; bun-typescript-v1 guarantees Bash, Git, GitHub CLI (gh), Bun 1.3.3, 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"),
18270
18378
  setupScript: exports_external.string().nullable().optional().describe("optional strict Bash setup run after connected repositories materialize"),
18271
- repositories: exports_external.array(exports_external.string()).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")
18379
+ repositories: exports_external.array(exports_external.string()).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"),
18380
+ ...LIVE_PREVIEW_CONFIG_INPUT
18272
18381
  },
18273
18382
  surfaces: ["mcp", "cli"],
18274
18383
  toolset: "structure",
@@ -18288,7 +18397,7 @@ var ACTION_DEFINITIONS = [
18288
18397
  {
18289
18398
  name: "computer_open",
18290
18399
  title: "Open a Thread computer",
18291
- description: "Open or resume this Thread's project environment for filesystem or command work. A safe living-profile revision drift is reconciled automatically by replacing the generation, restoring supported state, and returning reconciliation metadata; structural recipe changes still fail explicitly with computer_reprovision as the suggested action. Every configured repository is re-authorized through its explicit GitHub connection; a fresh reusable base clones it with a request-scoped contents:read credential before strict setup runs, while a restore receives no credential. Returns computerSessionId — pass it unchanged to later Computer tools and cited work — plus a compact Agent Brief with Thread objective, scoped Space/Topic guidance and provenance, durable parent snapshot, repositories, and active Runs; the selected profile contract; a resolved capabilities card; workspaceRoot; each materialized repositories[].path; and defaultCwd. Omitted computer_exec.cwd uses defaultCwd: the single checkout when exactly one repository is configured, workspaceRoot otherwise.",
18400
+ description: "Open or resume this Thread's project environment for filesystem or command work. A safe living-profile revision drift is reconciled automatically by replacing the generation, restoring supported state, and returning reconciliation metadata; structural recipe changes still fail explicitly with computer_reprovision as the suggested action. Every configured repository is re-authorized through its explicit GitHub connection; a fresh reusable base clones it with a request-scoped contents:read credential before strict setup runs, while a restore receives no credential. Returns computerSessionId — pass it unchanged to later Computer tools and cited work — plus a compact Agent Brief with Thread objective, scoped Space/Topic guidance and provenance, durable parent snapshot, repositories, explicit unchecked remote-freshness guidance, and active Runs; the selected profile contract; a resolved capabilities card; workspaceRoot; each materialized repositories[].path; and defaultCwd. Omitted computer_exec.cwd uses defaultCwd: the single checkout when exactly one repository is configured, workspaceRoot otherwise.",
18292
18401
  inputSchema: {
18293
18402
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
18294
18403
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -18325,6 +18434,17 @@ var ACTION_DEFINITIONS = [
18325
18434
  toolset: "loop",
18326
18435
  run: forward("computer_runtime.run_start")
18327
18436
  },
18437
+ {
18438
+ name: "computer_repo_work_status",
18439
+ title: "Inspect repository finish state",
18440
+ description: "READ ONLY: resolve repository-finish state for an active isolated WRITE Run from authoritative Git remote proof plus GitHub PR, CI, and review reads; the bounded inspection uses three batched provider exec phases and at most four GitHub REST calls per eligible repository. It reports durable state, explicit push/PR retrySafety, known PR-head mismatches versus unavailable GitHub proof, the next action, and Run finishability; it never commits, pushes, creates a PR, merges, or deploys.",
18441
+ inputSchema: {
18442
+ runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
18443
+ },
18444
+ surfaces: ["computer-mcp", "computer-cli"],
18445
+ toolset: "loop",
18446
+ run: forward("computer_runtime.repo_work_status")
18447
+ },
18328
18448
  {
18329
18449
  name: "computer_run_finish",
18330
18450
  title: "Finish a run",
@@ -18385,7 +18505,7 @@ var ACTION_DEFINITIONS = [
18385
18505
  {
18386
18506
  name: "computer_process_read",
18387
18507
  title: "Read a background process",
18388
- description: "READ ONLY: Tail one process returned by computer_exec(background=true). With no cursor, returns only the latest small output window; pass nextCursor on the next read to receive only newer output. Defaults to 4 KB total and allows an explicit larger read up to 64 KB. Once terminal, also returns the final exit result.",
18508
+ description: "READ ONLY: Tail one process returned by computer_exec(background=true). With no cursor, returns only the latest small output window; pass nextCursor on the next read to receive only newer output. Defaults to 4 KB total and allows an explicit larger read up to 64 KB. Returns a compact activity receipt that distinguishes fresh output, active CPU work, quiet running, terminal state, and unavailable telemetry without exposing raw process tables. Once terminal, also returns the final exit result.",
18389
18509
  inputSchema: {
18390
18510
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
18391
18511
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.20.12",
3
+ "version": "0.20.13",
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",