@lambdacurry/arbor 0.21.7 → 0.21.9

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 +134 -10
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -2774,6 +2774,22 @@ var watches = sqliteTable("watches", {
2774
2774
  var TERMINAL = new Set(["finished", "failed", "cancelled"]);
2775
2775
  var RUN_LIFECYCLE_TYPES = new Set(["run.started", "run.finished", "run.failed", "run.cancelled"]);
2776
2776
  var COMPUTER_RUN_ACTIVITY_LABEL_MAX = 120;
2777
+ var RUN_PROVIDER_LIFECYCLE_PHASES = [
2778
+ "allocate",
2779
+ "boot",
2780
+ "restore",
2781
+ "session",
2782
+ "probe",
2783
+ "readiness",
2784
+ "ready",
2785
+ "checkpoint",
2786
+ "publish",
2787
+ "suspend",
2788
+ "release",
2789
+ "lost",
2790
+ "workspace_freeze"
2791
+ ];
2792
+ var RUN_PROVIDER_LIFECYCLE_PHASE_SET = new Set(RUN_PROVIDER_LIFECYCLE_PHASES);
2777
2793
 
2778
2794
  // ../core/src/ops/computer.ts
2779
2795
  var MAX_COMPUTER_REPOSITORIES = 10;
@@ -17475,7 +17491,32 @@ var computerRunReceipt = exports_external.looseObject({
17475
17491
  targetId: exports_external.string().optional(),
17476
17492
  reasonCode: exports_external.string().optional()
17477
17493
  })),
17478
- lifecycle: exports_external.array(exports_external.looseObject({ type: exports_external.string(), at: exports_external.string() }))
17494
+ lifecycle: exports_external.array(exports_external.looseObject({ type: exports_external.string(), at: exports_external.string() })),
17495
+ providerLifecycle: exports_external.looseObject({
17496
+ generation: exports_external.number().int().min(0).nullable(),
17497
+ lastPhase: exports_external.string().nullable(),
17498
+ lastReasonCode: exports_external.string().nullable(),
17499
+ lastEventId: exports_external.string().nullable(),
17500
+ lastObservedAt: exports_external.string().nullable(),
17501
+ replacementGeneration: exports_external.number().int().min(0).nullable(),
17502
+ droppedCount: exports_external.number().int().min(0),
17503
+ events: exports_external.array(exports_external.looseObject({
17504
+ eventId: exports_external.string(),
17505
+ observedAt: exports_external.string(),
17506
+ phase: exports_external.string(),
17507
+ providerGeneration: exports_external.number().int().min(0),
17508
+ controlRelease: exports_external.string(),
17509
+ attemptId: exports_external.string().optional(),
17510
+ snapshotId: exports_external.string().optional(),
17511
+ runtimeState: exports_external.enum(["live", "suspended"]).optional(),
17512
+ releaseState: exports_external.enum(["live", "pending", "released"]).optional(),
17513
+ reasonCode: exports_external.string().optional(),
17514
+ providerHttpStatus: exports_external.number().int().optional(),
17515
+ providerStopClass: exports_external.string().optional(),
17516
+ providerRoute: exports_external.enum(["primary", "standby", "service"]).optional(),
17517
+ parentWorkspaceFrozen: exports_external.boolean().optional()
17518
+ }))
17519
+ })
17479
17520
  });
17480
17521
  var computerCapabilityCard = exports_external.looseObject({
17481
17522
  capabilities: exports_external.array(exports_external.looseObject({
@@ -17823,6 +17864,7 @@ var MCP_OUTPUT_SCHEMAS = {
17823
17864
  }),
17824
17865
  admin_feedback_capability: jsonObject,
17825
17866
  admin_feedback_evidence: jsonObject,
17867
+ admin_feedback: jsonObject,
17826
17868
  admin_feedback_topic: jsonObject,
17827
17869
  admin_feedback_thread: jsonObject,
17828
17870
  admin_feedback_publish: jsonObject,
@@ -18289,7 +18331,12 @@ var MCP_OUTPUT_SCHEMAS = {
18289
18331
  prCreate: exports_external.enum(["not-needed", "safe", "manual", "unknown"])
18290
18332
  }),
18291
18333
  nextAction: exports_external.string()
18292
- }))
18334
+ })),
18335
+ runDisposition: exports_external.looseObject({
18336
+ action: exports_external.enum(["computer_run_suspend", "continue-local-work", "none"]),
18337
+ resumeSameRunId: exports_external.boolean(),
18338
+ reason: exports_external.string()
18339
+ })
18293
18340
  }),
18294
18341
  computer_run_receipt: exports_external.looseObject({
18295
18342
  receipt: computerRunReceipt
@@ -18724,6 +18771,7 @@ var MCP_TOOL_ANNOTATIONS = {
18724
18771
  feedback_status: readOnly,
18725
18772
  admin_feedback_capability: destructiveIdempotent,
18726
18773
  admin_feedback_evidence: destructive,
18774
+ admin_feedback: destructive,
18727
18775
  admin_feedback_topic: destructive,
18728
18776
  admin_feedback_thread: destructive,
18729
18777
  admin_feedback_publish: additive,
@@ -18892,6 +18940,49 @@ function dispatch(map2, reshape) {
18892
18940
  return ex.call(op, reshape && verb ? reshape(verb, rest) : rest);
18893
18941
  };
18894
18942
  }
18943
+ var ADMIN_FEEDBACK_VERBS = [
18944
+ "publish",
18945
+ "merge",
18946
+ "transition",
18947
+ "edit",
18948
+ "curate",
18949
+ "topic",
18950
+ "create",
18951
+ "update",
18952
+ "move",
18953
+ "archive",
18954
+ "restore"
18955
+ ];
18956
+ var ADMIN_FEEDBACK_THREAD_VERBS = new Set([
18957
+ "create",
18958
+ "update",
18959
+ "move",
18960
+ "transition",
18961
+ "archive",
18962
+ "restore",
18963
+ "merge"
18964
+ ]);
18965
+ var ADMIN_FEEDBACK_VERB_HELP = ADMIN_FEEDBACK_VERBS.join(" | ");
18966
+ function runAdminFeedback(ex, input) {
18967
+ const { verb, ...rest } = input;
18968
+ if (verb === "curate") {
18969
+ if (rest.curate === "delete")
18970
+ return ex.call("feedback_admin.remove", rest);
18971
+ if (rest.curate === "restore")
18972
+ return ex.call("feedback_admin.restore", rest);
18973
+ return Promise.reject(new Error('curate requires curate "delete" or "restore"'));
18974
+ }
18975
+ if (verb && ADMIN_FEEDBACK_THREAD_VERBS.has(verb)) {
18976
+ return ex.call("feedback_admin.thread", { ...rest, action: verb });
18977
+ }
18978
+ if (verb === "publish")
18979
+ return ex.call("feedback_admin.publish", rest);
18980
+ if (verb === "edit")
18981
+ return ex.call("feedback_admin.edit", rest);
18982
+ if (verb === "topic")
18983
+ return ex.call("feedback_admin.topic", rest);
18984
+ return Promise.reject(new Error(`unknown verb "${verb ?? ""}" — expected one of: ${ADMIN_FEEDBACK_VERB_HELP}`));
18985
+ }
18895
18986
  var NOTIFICATION_TRIAGE_DESCRIPTION = "READ ONLY: List your awareness feed newest first with unseen count and derived triage class: `settled-context` = settled Thread context; `owed-by-me` = an open request pointing to `inbox`; `judgment-available` = live engagement inviting judgment; `closed-loop` = your request completed; `room-motion` = ambient activity. Notifications are FYI, not a second obligation surface: `inbox` alone contains work owed by you; this cannot mark notifications read or modify inbox obligations.";
18896
18987
  var PAGINATION_INPUT = {
18897
18988
  limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
@@ -19083,6 +19174,36 @@ var ACTION_DEFINITIONS = [
19083
19174
  status: "feedback_admin.status"
19084
19175
  })
19085
19176
  },
19177
+ {
19178
+ name: "admin_feedback",
19179
+ title: "Moderate shared Arbor Feedback",
19180
+ description: "After a ship, recall matching Feedback, merge duplicates, publish the outcome, and transition the canonical Thread to resolved. Moderators only: this cannot file reports or expose receipt metadata.",
19181
+ inputSchema: {
19182
+ verb: exports_external.enum(ADMIN_FEEDBACK_VERBS).describe("close loop: publish, merge, transition; also edit, curate, topic, and thread lifecycle"),
19183
+ threadId: exports_external.string().optional().describe("publish / update / move / transition / archive / restore: Thread id"),
19184
+ type: exports_external.enum(CONTRIBUTION_TYPES).optional().describe("publish/edit: shared contribution type, including maintainer decision"),
19185
+ body: exports_external.string().min(1).optional().describe("publish: follow-on body · edit: replacement body"),
19186
+ summary: exports_external.string().max(500).nullable().optional().describe("publish/edit: gist; edit null/empty clears"),
19187
+ confidence: exports_external.number().int().min(0).max(100).optional().describe("publish: 0–100 confidence"),
19188
+ idempotencyKey: exports_external.string().min(1).max(200).optional().describe("publish: stable retry key"),
19189
+ feedbackId: exports_external.string().optional().describe("publish: optional receipt id; additionally requires review_private"),
19190
+ contributionId: exports_external.string().optional().describe("edit/curate: shared contribution id"),
19191
+ curate: exports_external.enum(["delete", "restore"]).optional().describe("curate: delete or restore a shared contribution"),
19192
+ action: exports_external.enum(["create", "update", "archive", "restore"]).optional().describe("topic: create, update, archive, or restore"),
19193
+ topicId: exports_external.string().optional().describe("topic / create / move / update: Feedback Topic id"),
19194
+ title: exports_external.string().min(1).optional().describe("topic/create/update: title"),
19195
+ purpose: exports_external.string().optional().describe("topic: purpose"),
19196
+ sourceThreadId: exports_external.string().optional().describe("merge: duplicate source Thread id"),
19197
+ targetThreadId: exports_external.string().optional().describe("merge: canonical destination Thread id"),
19198
+ objective: exports_external.string().min(1).optional().describe("create/update: Thread objective"),
19199
+ status: exports_external.enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
19200
+ reason: exports_external.string().optional().describe("merge: concise auditable rationale")
19201
+ },
19202
+ surfaces: ["mcp"],
19203
+ toolset: "admin",
19204
+ requiresCapability: "moderate",
19205
+ run: runAdminFeedback
19206
+ },
19086
19207
  {
19087
19208
  name: "admin_feedback_topic",
19088
19209
  title: "Maintain shared Feedback Topics",
@@ -19093,7 +19214,7 @@ var ACTION_DEFINITIONS = [
19093
19214
  title: exports_external.string().min(1).optional().describe("create/update: Topic title"),
19094
19215
  purpose: exports_external.string().optional().describe("create/update: Topic purpose")
19095
19216
  },
19096
- surfaces: ["mcp", "cli"],
19217
+ surfaces: ["cli"],
19097
19218
  toolset: "admin",
19098
19219
  run: forward("feedback_admin.topic")
19099
19220
  },
@@ -19112,7 +19233,7 @@ var ACTION_DEFINITIONS = [
19112
19233
  status: exports_external.enum(["active", "needs-review", "stuck", "standing", "resolved", "archived"]).optional().describe("transition/update: target Thread status"),
19113
19234
  reason: exports_external.string().optional().describe("merge: concise auditable rationale")
19114
19235
  },
19115
- surfaces: ["mcp", "cli"],
19236
+ surfaces: ["cli"],
19116
19237
  toolset: "admin",
19117
19238
  run: forward("feedback_admin.thread")
19118
19239
  },
@@ -19129,7 +19250,7 @@ var ACTION_DEFINITIONS = [
19129
19250
  idempotencyKey: exports_external.string().min(1).max(200).optional(),
19130
19251
  feedbackId: exports_external.string().optional().describe("optional receipt id; additionally requires review_private")
19131
19252
  },
19132
- surfaces: ["mcp", "cli"],
19253
+ surfaces: ["cli"],
19133
19254
  toolset: "admin",
19134
19255
  run: forward("feedback_admin.publish")
19135
19256
  },
@@ -19143,7 +19264,7 @@ var ACTION_DEFINITIONS = [
19143
19264
  summary: exports_external.string().max(500).nullable().optional().describe("replacement gist; null/empty clears"),
19144
19265
  type: exports_external.enum(CONTRIBUTION_TYPES).optional().describe("replacement shared contribution type")
19145
19266
  },
19146
- surfaces: ["mcp", "cli"],
19267
+ surfaces: ["cli"],
19147
19268
  toolset: "admin",
19148
19269
  run: forward("feedback_admin.edit")
19149
19270
  },
@@ -19155,7 +19276,7 @@ var ACTION_DEFINITIONS = [
19155
19276
  verb: exports_external.enum(["delete", "restore"]),
19156
19277
  contributionId: exports_external.string().describe("shared Feedback contribution id")
19157
19278
  },
19158
- surfaces: ["mcp", "cli"],
19279
+ surfaces: ["cli"],
19159
19280
  toolset: "admin",
19160
19281
  run: dispatch({ delete: "feedback_admin.remove", restore: "feedback_admin.restore" })
19161
19282
  },
@@ -19442,7 +19563,7 @@ var ACTION_DEFINITIONS = [
19442
19563
  {
19443
19564
  name: "computer_repo_work_status",
19444
19565
  title: "Inspect repository finish state",
19445
- description: "READ ONLY: Inspect an active isolated WRITE Run before a push/PR retry or finish when Git publication, PR, CI, or review state matters. Returns authoritative durability/finishability, retry safety, mismatches, and the next repository action without mutating GitHub.",
19566
+ description: "READ ONLY: Inspect an active isolated WRITE Run's Git publication, PR, CI, and review before retry, wait, or finish. Returns repository state (e.g. ci-pending) plus runDisposition.action computer_run_suspend when published work waits on CI/review/human authorization the same runId resumes; dirty, unpublished, unknown-publication, failing, or changes-requested work keeps the local nextAction.",
19446
19567
  inputSchema: {
19447
19568
  runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
19448
19569
  },
@@ -19467,7 +19588,7 @@ var ACTION_DEFINITIONS = [
19467
19588
  {
19468
19589
  name: "computer_run_receipt",
19469
19590
  title: "Read a run receipt",
19470
- description: "READ ONLY: Inspect one Run's durable receipt during or after execution, including its Run-owned operation/activity state; use this instead of parent computer_status to establish whether an isolated Run still has work in flight. Returns compact history/assessments and durable operation receipts, not raw command transcripts or process output.",
19591
+ description: "READ ONLY: Inspect one Run's durable receipt during or after execution, including its Run-owned operation/activity state and a compact providerLifecycle journal (generation, last phase, typed reason) separate from command/process activity. Use this instead of parent computer_status; it returns compact history, not transcripts, and does not rewrite terminal reasonCode.",
19471
19592
  inputSchema: {
19472
19593
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
19473
19594
  },
@@ -20360,7 +20481,7 @@ var ACTION_DEFINITIONS = [
20360
20481
  {
20361
20482
  name: "service_register",
20362
20483
  title: "Register a Computer lifecycle service",
20363
- description: "Register a persistent service identity for Currybox Computer lifecycle maintenance and mint its API key (shown ONCE). Human owner/admin CLI setup only. The credential is restricted to computer.get + computer.lifecycle_runs + computer.checkpoint + computer.suspend_run + computer.resume_run + computer.reconcile_runs and to the Spaces listed here; store it as the Currybox control plane's Arbor credential.",
20484
+ description: "Register a persistent service identity for Currybox Computer lifecycle maintenance and mint its API key (shown ONCE). Human owner/admin CLI setup only. The credential is restricted to computer.get + computer.lifecycle_runs + computer.append_run_lifecycle + computer.checkpoint + computer.suspend_run + computer.resume_run + computer.reconcile_runs and to the Spaces listed here; store it as the Currybox control plane's Arbor credential.",
20364
20485
  inputSchema: {
20365
20486
  displayName: exports_external.string().min(1).describe("the service display name, e.g. Currybox lifecycle service"),
20366
20487
  spaceIds: exports_external.array(exports_external.string().min(1)).min(1).describe("Spaces whose Thread computers the service may maintain")
@@ -21203,6 +21324,9 @@ var ACTION_DEFINITIONS = [
21203
21324
  }
21204
21325
  ];
21205
21326
  var ACTIONS = ACTION_DEFINITIONS.map((action) => {
21327
+ if (action.requiresCapability && !action.surfaces.includes("mcp")) {
21328
+ throw new Error(`${action.name}: requiresCapability is an MCP catalog gate`);
21329
+ }
21206
21330
  if (!action.surfaces.some((surface) => surface === "mcp" || surface === "computer-mcp")) {
21207
21331
  return action;
21208
21332
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.21.7",
3
+ "version": "0.21.9",
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",