@lambdacurry/arbor 0.21.18 → 0.21.20

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 +84 -34
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -17744,10 +17744,21 @@ var artifact4 = exports_external.looseObject({
17744
17744
  version: exports_external.number().optional(),
17745
17745
  url: exports_external.string().optional()
17746
17746
  });
17747
+ var initiativeThreadRef = exports_external.looseObject({
17748
+ id,
17749
+ title: exports_external.string(),
17750
+ spaceId: id
17751
+ });
17747
17752
  var initiative3 = exports_external.looseObject({
17748
17753
  id,
17749
17754
  title: exports_external.string(),
17750
17755
  status: exports_external.string(),
17756
+ purpose: exports_external.string().optional(),
17757
+ priority: exports_external.string().optional(),
17758
+ ownerProfileId: id.optional(),
17759
+ threadCount: exports_external.number().int().min(0).optional(),
17760
+ relatedThreads: exports_external.array(initiativeThreadRef).optional(),
17761
+ createdAt: timestamp.optional(),
17751
17762
  spaceId: id.optional()
17752
17763
  });
17753
17764
  var app2 = exports_external.looseObject({
@@ -18060,11 +18071,13 @@ var MCP_OUTPUT_SCHEMAS = {
18060
18071
  all: exports_external.array(initiative3).optional(),
18061
18072
  ok: exports_external.boolean().optional()
18062
18073
  }),
18063
- goal_get: exports_external.looseObject({ initiative: initiative3 }),
18074
+ goal_get: exports_external.looseObject({ initiative: initiative3, nextCursor: exports_external.string().optional() }),
18064
18075
  goal_list: exports_external.looseObject({
18065
18076
  initiatives: exports_external.array(initiative3).optional(),
18066
18077
  linked: exports_external.array(initiative3).optional(),
18067
- all: exports_external.array(initiative3).optional()
18078
+ all: exports_external.array(initiative3).optional(),
18079
+ total: exports_external.number().int().min(0),
18080
+ nextCursor: exports_external.string().optional()
18068
18081
  }),
18069
18082
  goal_delete: exports_external.looseObject({ ok: exports_external.boolean() }),
18070
18083
  membership: exports_external.looseObject({
@@ -18285,12 +18298,25 @@ var MCP_OUTPUT_SCHEMAS = {
18285
18298
  defaultCwd: exports_external.string(),
18286
18299
  capabilities: computerOpenCapabilities,
18287
18300
  agentBrief: computerOpenAgentBrief,
18288
- reconciliation: exports_external.object({
18289
- action: exports_external.literal("automatic_reprovision"),
18290
- reason: exports_external.literal("container_profile_revision"),
18291
- fromContainerProfileRevision: exports_external.number().int().nullable(),
18292
- toContainerProfileRevision: exports_external.number().int().nullable()
18293
- }).optional()
18301
+ reconciliation: exports_external.union([
18302
+ exports_external.object({
18303
+ action: exports_external.literal("automatic_reprovision"),
18304
+ reason: exports_external.literal("container_profile_revision"),
18305
+ fromContainerProfileRevision: exports_external.number().int().nullable(),
18306
+ toContainerProfileRevision: exports_external.number().int().nullable()
18307
+ }),
18308
+ exports_external.object({
18309
+ action: exports_external.literal("automatic_reprovision"),
18310
+ reason: exports_external.literal("repository_additions"),
18311
+ reprovisionId: id,
18312
+ previousComputerId: id,
18313
+ successorComputerId: id,
18314
+ restoredSnapshotId: id.nullable(),
18315
+ checkpointOutcome: exports_external.string(),
18316
+ restorationOutcome: exports_external.string(),
18317
+ addedRepositories: exports_external.array(exports_external.string())
18318
+ })
18319
+ ]).optional()
18294
18320
  }),
18295
18321
  computer_run_start: exports_external.object({
18296
18322
  runId: id,
@@ -18640,7 +18666,14 @@ var OUTPUT_SHAPERS = {
18640
18666
  "action",
18641
18667
  "reason",
18642
18668
  "fromContainerProfileRevision",
18643
- "toContainerProfileRevision"
18669
+ "toContainerProfileRevision",
18670
+ "reprovisionId",
18671
+ "previousComputerId",
18672
+ "successorComputerId",
18673
+ "restoredSnapshotId",
18674
+ "checkpointOutcome",
18675
+ "restorationOutcome",
18676
+ "addedRepositories"
18644
18677
  ]);
18645
18678
  return defined([
18646
18679
  ["computerSessionId", result.computerSessionId],
@@ -18975,11 +19008,28 @@ function forward(operation) {
18975
19008
  run.operation = operation;
18976
19009
  return run;
18977
19010
  }
18978
- function forwardedOperation(run) {
18979
- if (!("operation" in run))
18980
- return;
18981
- const value = run.operation;
18982
- return typeof value === "string" ? value : undefined;
19011
+ function forwardedOperations(run) {
19012
+ const tagged = run;
19013
+ if (typeof tagged.operation === "string")
19014
+ return [tagged.operation];
19015
+ if (Array.isArray(tagged.operations)) {
19016
+ return tagged.operations.filter((value) => typeof value === "string");
19017
+ }
19018
+ return [];
19019
+ }
19020
+ function forwardByFirstPresent(routes, missingMessage) {
19021
+ const selectorFields = new Set(Object.keys(routes));
19022
+ const run = (ex, input) => {
19023
+ for (const [field, operation] of Object.entries(routes)) {
19024
+ if (typeof input[field] !== "string")
19025
+ continue;
19026
+ const rest = Object.fromEntries(Object.entries(input).filter(([key]) => !selectorFields.has(key)));
19027
+ return ex.call(operation, { [field]: input[field], ...rest });
19028
+ }
19029
+ return Promise.reject(new Error(missingMessage));
19030
+ };
19031
+ run.operations = Object.values(routes);
19032
+ return run;
18983
19033
  }
18984
19034
  function dispatch(map2, reshape) {
18985
19035
  return (ex, input) => {
@@ -19583,7 +19633,7 @@ var ACTION_DEFINITIONS = [
19583
19633
  {
19584
19634
  name: "computer_open",
19585
19635
  title: "Open a Thread computer",
19586
- description: "Open or resume a Thread's project environment when you need filesystem, command, Run, checkpoint, Preview, or publication work. Returns the session handle, workspace/repositories/default cwd with verified root repository instruction pointers, Agent Brief, profile/capabilities, active Runs, and any reconciliation notice.",
19636
+ description: "Open a Thread project environment and return its session/workspace, verified root repository instruction pointers, Agent Brief, capabilities, Runs, and reconciliation receipt. Forward profile-revision or additive authorized repository drift auto-reconciles through a successor; removal, setup, backend/provider/profile changes, or ambiguous drift refuse with computer_reprovision guidance.",
19587
19637
  inputSchema: {
19588
19638
  threadId: exports_external.string().describe("the Arbor Thread whose stable computer to open, thr_…"),
19589
19639
  vcpus: exports_external.number().int().min(1).max(4).optional().describe("optional container vCPU request"),
@@ -20457,10 +20507,11 @@ var ACTION_DEFINITIONS = [
20457
20507
  },
20458
20508
  {
20459
20509
  name: "get_goal",
20460
- title: "Read one goal fully",
20461
- description: "Read ONE goal (initiative) fully — purpose, lifecycle status, and the related threads you can see. Works for ANY status including archived (retired goals stay inspectable); use `list_goals` for a thread's pick list instead.",
20510
+ title: "Read one goal",
20511
+ description: "Read ONE goal (initiative) — purpose, lifecycle status, and the related threads you can see, including archived goals. Related Threads are paged with threadCount as the visible total; use --limit/--cursor or --all.",
20462
20512
  inputSchema: {
20463
- id: exports_external.string().describe("the goal, ini_…")
20513
+ id: exports_external.string().describe("the goal, ini_…"),
20514
+ ...PAGINATION_INPUT
20464
20515
  },
20465
20516
  surfaces: ["cli"],
20466
20517
  toolset: "goals",
@@ -20468,14 +20519,16 @@ var ACTION_DEFINITIONS = [
20468
20519
  },
20469
20520
  {
20470
20521
  name: "list_goals",
20471
- title: "List a thread's goals",
20472
- description: "For a thread, list the goals it already contributes to PLUS the pick list of goals attached to ITS space (AD-180 — a thread binds only to goals that surface where it lives; `attach_goal_to_space` widens a goal's reach). Reach for this before `link_thread_to_goal` to find the right goal id and avoid creating a duplicate; archived goals are omitted.",
20522
+ title: "List goals",
20523
+ description: "List compact goals attached to one Space, or a Thread's linked goals plus its available pick list. Space lists are compact cards; Thread lists page only the available `all` list and keep `linked` complete. Archived goals are omitted.",
20473
20524
  inputSchema: {
20474
- threadId: exports_external.string().describe("the thread to read goals for, thr_…")
20525
+ spaceId: exports_external.string().optional().describe("a Space whose attached goals to list, spc_…"),
20526
+ threadId: exports_external.string().optional().describe("a Thread whose linked and available goals to list, thr_…"),
20527
+ ...PAGINATION_INPUT
20475
20528
  },
20476
20529
  surfaces: ["cli"],
20477
20530
  toolset: "goals",
20478
- run: forward("initiative.forThread")
20531
+ run: forwardByFirstPresent({ spaceId: "initiative.listForSpace", threadId: "initiative.forThread" }, "list_goals requires a spaceId (a Space's goals) or a threadId (a Thread's goals)")
20479
20532
  },
20480
20533
  {
20481
20534
  name: "update_goal",
@@ -20657,8 +20710,8 @@ var ACTION_DEFINITIONS = [
20657
20710
  {
20658
20711
  name: "goal_get",
20659
20712
  title: "Read one goal",
20660
- description: "Read one goal fully, including its purpose, lifecycle, attached Spaces, and related Threads visible to you. It cannot create, update, link, archive, or delete a goal.",
20661
- inputSchema: { id: exports_external.string().describe("the goal, ini_…") },
20713
+ description: "Read one goal, including its purpose, lifecycle, attached Spaces, and related Threads visible to you; it cannot mutate the goal. Related Threads are paged: threadCount is the visible total, nextCursor continues the page, and all=true returns every visible related Thread.",
20714
+ inputSchema: { id: exports_external.string().describe("the goal, ini_…"), ...PAGINATION_INPUT },
20662
20715
  surfaces: ["mcp"],
20663
20716
  toolset: "goals",
20664
20717
  run: forward("initiative.get")
@@ -20666,20 +20719,15 @@ var ACTION_DEFINITIONS = [
20666
20719
  {
20667
20720
  name: "goal_list",
20668
20721
  title: "List goals",
20669
- description: "List the goals attached to one Space, or the linked and available goals for one Thread. It cannot create, update, link, archive, or delete a goal.",
20722
+ description: "List compact goals attached to one Space, or the linked and available goals for one Thread. Space pages omit relatedThreads; Thread pages keep linked complete and page only the available `all` list; it cannot mutate a goal.",
20670
20723
  inputSchema: {
20671
20724
  spaceId: exports_external.string().optional().describe("a Space whose attached goals to list, spc_…"),
20672
- threadId: exports_external.string().optional().describe("a Thread whose linked and available goals to list, thr_…")
20725
+ threadId: exports_external.string().optional().describe("a Thread whose linked and available goals to list, thr_…"),
20726
+ ...PAGINATION_INPUT
20673
20727
  },
20674
20728
  surfaces: ["mcp"],
20675
20729
  toolset: "goals",
20676
- run: (ex, input) => {
20677
- if (typeof input.spaceId === "string")
20678
- return ex.call("initiative.listForSpace", { spaceId: input.spaceId });
20679
- if (typeof input.threadId === "string")
20680
- return ex.call("initiative.forThread", { threadId: input.threadId });
20681
- return Promise.reject(new Error("goal_list requires a spaceId (a Space's goals) or a threadId (a Thread's goals)"));
20682
- }
20730
+ run: forwardByFirstPresent({ spaceId: "initiative.listForSpace", threadId: "initiative.forThread" }, "goal_list requires a spaceId (a Space's goals) or a threadId (a Thread's goals)")
20683
20731
  },
20684
20732
  {
20685
20733
  name: "goal",
@@ -21404,7 +21452,9 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
21404
21452
  throw new Error(`${action.name}: requiresCapability is an MCP catalog gate`);
21405
21453
  }
21406
21454
  const externalReadDefaults = action.inputSchema.limit === PAGINATION_INPUT.limit ? { ...action.externalReadDefaults, limit: EXTERNAL_DEFAULT_PAGE_SIZE } : action.externalReadDefaults;
21407
- recordExternalReadDefaults(forwardedOperation(action.run), externalReadDefaults);
21455
+ for (const operation of forwardedOperations(action.run)) {
21456
+ recordExternalReadDefaults(operation, externalReadDefaults);
21457
+ }
21408
21458
  if (!action.surfaces.some((surface) => surface === "mcp" || surface === "computer-mcp")) {
21409
21459
  return externalReadDefaults ? { ...action, externalReadDefaults } : action;
21410
21460
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.21.18",
3
+ "version": "0.21.20",
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",