@lambdacurry/arbor 0.21.6 → 0.21.8

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 +76 -22
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -2635,6 +2635,8 @@ var arborFeedback = sqliteTable("arbor_feedback", {
2635
2635
  reporterOrgId: text("reporter_org_id").notNull().references(() => orgs.id),
2636
2636
  executionContextId: text("execution_context_id").notNull().references(() => executionContexts.id),
2637
2637
  computerSessionId: text("computer_session_id").references(() => computerSessions.id),
2638
+ sharedThreadId: text("shared_thread_id"),
2639
+ sharedContributionId: text("shared_contribution_id"),
2638
2640
  type: text("type").$type().notNull(),
2639
2641
  body: text("body").notNull(),
2640
2642
  summary: text("summary"),
@@ -2651,6 +2653,8 @@ var arborFeedback = sqliteTable("arbor_feedback", {
2651
2653
  updatedAt: ts("updated_at").notNull()
2652
2654
  }, (t) => ({
2653
2655
  reporterReplayUq: uniqueIndex("arbor_feedback_reporter_replay_uq").on(t.reporterProfileId, t.idempotencyKey),
2656
+ sharedThreadUq: uniqueIndex("arbor_feedback_shared_thread_uq").on(t.sharedThreadId).where(sql`${t.sharedThreadId} is not null`),
2657
+ sharedContributionUq: uniqueIndex("arbor_feedback_shared_contribution_uq").on(t.sharedContributionId).where(sql`${t.sharedContributionId} is not null`),
2654
2658
  statusCreatedIdx: index("arbor_feedback_status_created_idx").on(t.status, t.createdAt),
2655
2659
  orgCreatedIdx: index("arbor_feedback_org_created_idx").on(t.reporterOrgId, t.createdAt)
2656
2660
  }));
@@ -2770,6 +2774,22 @@ var watches = sqliteTable("watches", {
2770
2774
  var TERMINAL = new Set(["finished", "failed", "cancelled"]);
2771
2775
  var RUN_LIFECYCLE_TYPES = new Set(["run.started", "run.finished", "run.failed", "run.cancelled"]);
2772
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);
2773
2793
 
2774
2794
  // ../core/src/ops/computer.ts
2775
2795
  var MAX_COMPUTER_REPOSITORIES = 10;
@@ -17471,7 +17491,32 @@ var computerRunReceipt = exports_external.looseObject({
17471
17491
  targetId: exports_external.string().optional(),
17472
17492
  reasonCode: exports_external.string().optional()
17473
17493
  })),
17474
- 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
+ })
17475
17520
  });
17476
17521
  var computerCapabilityCard = exports_external.looseObject({
17477
17522
  capabilities: exports_external.array(exports_external.looseObject({
@@ -17794,7 +17839,8 @@ var MCP_OUTPUT_SCHEMAS = {
17794
17839
  feedbackId: id,
17795
17840
  type: exports_external.string(),
17796
17841
  status: exports_external.string(),
17797
- private: exports_external.literal(true),
17842
+ visibility: exports_external.literal("shared"),
17843
+ receiptPrivate: exports_external.literal(true),
17798
17844
  sharedThreadId: id,
17799
17845
  sharedContributionId: id,
17800
17846
  replayed: exports_external.boolean(),
@@ -17805,7 +17851,10 @@ var MCP_OUTPUT_SCHEMAS = {
17805
17851
  feedbackId: id,
17806
17852
  type: exports_external.enum(ARBOR_FEEDBACK_TYPES),
17807
17853
  status: exports_external.enum(ARBOR_FEEDBACK_STATUSES),
17808
- private: exports_external.literal(true),
17854
+ visibility: exports_external.enum(["shared", "receipt-only"]),
17855
+ receiptPrivate: exports_external.literal(true),
17856
+ sharedThreadId: id.nullable(),
17857
+ sharedContributionId: id.nullable(),
17809
17858
  associatedWithSharedKnowledge: exports_external.boolean(),
17810
17859
  createdAt: timestamp,
17811
17860
  updatedAt: timestamp,
@@ -18281,7 +18330,12 @@ var MCP_OUTPUT_SCHEMAS = {
18281
18330
  prCreate: exports_external.enum(["not-needed", "safe", "manual", "unknown"])
18282
18331
  }),
18283
18332
  nextAction: exports_external.string()
18284
- }))
18333
+ })),
18334
+ runDisposition: exports_external.looseObject({
18335
+ action: exports_external.enum(["computer_run_suspend", "continue-local-work", "none"]),
18336
+ resumeSameRunId: exports_external.boolean(),
18337
+ reason: exports_external.string()
18338
+ })
18285
18339
  }),
18286
18340
  computer_run_receipt: exports_external.looseObject({
18287
18341
  receipt: computerRunReceipt
@@ -19012,7 +19066,7 @@ var ACTION_DEFINITIONS = [
19012
19066
  {
19013
19067
  name: "contribute_arbor_feedback",
19014
19068
  title: "Contribute feedback about Arbor",
19015
- description: "File one bounded report when Arbor itself caused meaningful product or ergonomics friction; do not use this for ordinary repository bugs, routine un-obscured provider failures, agent mistakes, or generic implementation difficulty. The body lands as the first contribution in its own visible shared Feedback Thread; one incident should produce one report, with a stable idempotencyKey used only to retry that same submission.",
19069
+ description: "File one bounded report when Arbor itself caused meaningful product or ergonomics friction; not for ordinary repository bugs, obvious provider failures, agent mistakes, or generic implementation difficulty. It immediately creates its own shared Feedback Thread and returns sharedThreadId/sharedContributionId, visibility=shared, and receiptPrivate=true; use one stable idempotencyKey only to retry that same incident.",
19016
19070
  inputSchema: {
19017
19071
  type: exports_external.enum(ARBOR_FEEDBACK_TYPES).optional().describe("the contribution move (default comment); decision is reserved for shared forum curation"),
19018
19072
  body: exports_external.string().min(1).describe("the feedback body, shared as submitted in its own Thread"),
@@ -19030,9 +19084,9 @@ var ACTION_DEFINITIONS = [
19030
19084
  {
19031
19085
  name: "feedback_status",
19032
19086
  title: "Check your Arbor feedback receipt",
19033
- description: "READ ONLY: Check the useful lifecycle of one private Arbor feedback receipt you own. Missing and not-owned receipts look identical, and this returns no raw body, identities, moderator diagnostics, or shared association targets.",
19087
+ description: "READ ONLY: Check triage metadata and the shared identity for one Arbor feedback receipt you own. Missing and not-owned receipts look identical; receiptPrivate=true covers reviewer metadata, while visibility/sharedThreadId describe the filed report, and no raw body, identities, diagnostics, or private association targets are returned.",
19034
19088
  inputSchema: {
19035
- feedbackId: exports_external.string().describe("your private Arbor feedback receipt id, fbk_…")
19089
+ feedbackId: exports_external.string().describe("your Arbor feedback receipt id, fbk_…")
19036
19090
  },
19037
19091
  surfaces: ["mcp", "cli"],
19038
19092
  toolset: "feedback",
@@ -19045,7 +19099,7 @@ var ACTION_DEFINITIONS = [
19045
19099
  inputSchema: {
19046
19100
  verb: exports_external.enum(["list", "set"]).describe("list grants, or set one profile capability"),
19047
19101
  profileId: exports_external.string().optional().describe("set: the profile receiving or losing the grant"),
19048
- capability: exports_external.enum(ARBOR_FEEDBACK_CAPABILITIES).optional().describe("set: moderate shared forum or review_private raw evidence"),
19102
+ capability: exports_external.enum(ARBOR_FEEDBACK_CAPABILITIES).optional().describe("set: moderate shared forum or review_private receipt metadata"),
19049
19103
  enabled: exports_external.boolean().optional().describe("set: true to grant; false to revoke")
19050
19104
  },
19051
19105
  surfaces: ["mcp", "cli"],
@@ -19054,11 +19108,11 @@ var ACTION_DEFINITIONS = [
19054
19108
  },
19055
19109
  {
19056
19110
  name: "admin_feedback_evidence",
19057
- title: "Review private Arbor feedback evidence",
19111
+ title: "Review Arbor feedback receipt metadata",
19058
19112
  description: "Privileged receipt-review surface: list/get fbk receipt metadata, associate or disassociate receipts with shared Topics/Threads, and mark review state. Report bodies are already filed in their own shared Threads; this surface additionally exposes reporter/reviewer metadata and does not grant shared-forum moderation.",
19059
19113
  inputSchema: {
19060
19114
  verb: exports_external.enum(["list", "get", "associate", "disassociate", "status"]).describe("the private-evidence review action"),
19061
- feedbackId: exports_external.string().optional().describe("get/associate/disassociate/status: private feedback id"),
19115
+ feedbackId: exports_external.string().optional().describe("get/associate/disassociate/status: feedback receipt id"),
19062
19116
  associationId: exports_external.string().optional().describe("disassociate: association id to remove"),
19063
19117
  topicId: exports_external.string().optional().describe("associate: shared Feedback Topic id"),
19064
19118
  threadId: exports_external.string().optional().describe("associate: shared Feedback Thread id"),
@@ -19078,7 +19132,7 @@ var ACTION_DEFINITIONS = [
19078
19132
  {
19079
19133
  name: "admin_feedback_topic",
19080
19134
  title: "Maintain shared Feedback Topics",
19081
- description: "Privileged shared-forum moderation: create, update, archive, or restore one global Feedback Topic without database intervention. This capability does not expose private evidence.",
19135
+ description: "Privileged shared-forum moderation: create, update, archive, or restore one global Feedback Topic without database intervention. This capability does not expose receipt/reviewer metadata.",
19082
19136
  inputSchema: {
19083
19137
  action: exports_external.enum(["create", "update", "archive", "restore"]),
19084
19138
  topicId: exports_external.string().optional().describe("update/archive/restore: shared Feedback Topic id"),
@@ -19110,16 +19164,16 @@ var ACTION_DEFINITIONS = [
19110
19164
  },
19111
19165
  {
19112
19166
  name: "admin_feedback_publish",
19113
- title: "Publish sanitized shared Feedback content",
19114
- description: "Privileged: author a new sanitized shared contribution in a Feedback Thread, optionally recording that private evidence informed it. The body must be separately authored; Arbor refuses an exact raw-body copy and never flips private visibility.",
19167
+ title: "Author a moderator Feedback follow-on",
19168
+ description: "Privileged legacy/follow-on tool, never required to make a filing visible: author a separately written shared contribution in an existing Feedback Thread and optionally record receipt provenance. Arbor refuses an exact duplicate of the filed report body; normal filing and backfill never call this action.",
19115
19169
  inputSchema: {
19116
19170
  threadId: exports_external.string().describe("shared Feedback Thread id or merged source redirect"),
19117
19171
  type: exports_external.enum(CONTRIBUTION_TYPES).describe("shared contribution type, including maintainer decision"),
19118
- body: exports_external.string().min(1).describe("deliberately sanitized shared body"),
19172
+ body: exports_external.string().min(1).describe("separately authored shared follow-on body"),
19119
19173
  summary: exports_external.string().max(500).optional().describe("optional shared gist"),
19120
19174
  confidence: exports_external.number().int().min(0).max(100).optional(),
19121
19175
  idempotencyKey: exports_external.string().min(1).max(200).optional(),
19122
- feedbackId: exports_external.string().optional().describe("optional private evidence id; additionally requires review_private")
19176
+ feedbackId: exports_external.string().optional().describe("optional receipt id; additionally requires review_private")
19123
19177
  },
19124
19178
  surfaces: ["mcp", "cli"],
19125
19179
  toolset: "admin",
@@ -19127,11 +19181,11 @@ var ACTION_DEFINITIONS = [
19127
19181
  },
19128
19182
  {
19129
19183
  name: "admin_feedback_edit",
19130
- title: "Edit sanitized shared Feedback content",
19131
- description: "Privileged shared-forum moderation: correct a shared Feedback contribution's body, summary, or type while preserving normal Arbor audit history. This cannot target private feedback records.",
19184
+ title: "Edit shared Feedback content",
19185
+ description: "Privileged shared-forum moderation: correct a shared Feedback contribution's body, summary, or type while preserving normal Arbor audit history. This cannot edit feedback receipt/reviewer metadata.",
19132
19186
  inputSchema: {
19133
19187
  contributionId: exports_external.string().describe("shared Feedback contribution id"),
19134
- body: exports_external.string().min(1).optional().describe("replacement sanitized body"),
19188
+ body: exports_external.string().min(1).optional().describe("replacement shared body"),
19135
19189
  summary: exports_external.string().max(500).nullable().optional().describe("replacement gist; null/empty clears"),
19136
19190
  type: exports_external.enum(CONTRIBUTION_TYPES).optional().describe("replacement shared contribution type")
19137
19191
  },
@@ -19142,7 +19196,7 @@ var ACTION_DEFINITIONS = [
19142
19196
  {
19143
19197
  name: "admin_feedback_curate",
19144
19198
  title: "Curate shared Feedback content",
19145
- description: "Privileged shared-forum moderation: soft-delete or restore a sanitized shared contribution. This capability remains independent of private-feedback review access.",
19199
+ description: "Privileged shared-forum moderation: soft-delete or restore a shared contribution. This capability remains independent of receipt-review access.",
19146
19200
  inputSchema: {
19147
19201
  verb: exports_external.enum(["delete", "restore"]),
19148
19202
  contributionId: exports_external.string().describe("shared Feedback contribution id")
@@ -19434,7 +19488,7 @@ var ACTION_DEFINITIONS = [
19434
19488
  {
19435
19489
  name: "computer_repo_work_status",
19436
19490
  title: "Inspect repository finish state",
19437
- 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.",
19491
+ 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.",
19438
19492
  inputSchema: {
19439
19493
  runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
19440
19494
  },
@@ -19459,7 +19513,7 @@ var ACTION_DEFINITIONS = [
19459
19513
  {
19460
19514
  name: "computer_run_receipt",
19461
19515
  title: "Read a run receipt",
19462
- 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.",
19516
+ 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.",
19463
19517
  inputSchema: {
19464
19518
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
19465
19519
  },
@@ -20352,7 +20406,7 @@ var ACTION_DEFINITIONS = [
20352
20406
  {
20353
20407
  name: "service_register",
20354
20408
  title: "Register a Computer lifecycle service",
20355
- 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.",
20409
+ 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.",
20356
20410
  inputSchema: {
20357
20411
  displayName: exports_external.string().min(1).describe("the service display name, e.g. Currybox lifecycle service"),
20358
20412
  spaceIds: exports_external.array(exports_external.string().min(1)).min(1).describe("Spaces whose Thread computers the service may maintain")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.21.6",
3
+ "version": "0.21.8",
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",