@lambdacurry/arbor 0.23.25 → 0.23.27

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 -25
  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.23.25",
5
+ version: "0.23.27",
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",
@@ -6457,12 +6457,13 @@ var workflows = sqliteTable("workflows", {
6457
6457
  name: text("name").notNull(),
6458
6458
  summary: text("summary").notNull(),
6459
6459
  labels: text("labels", { mode: "json" }).$type().notNull(),
6460
+ derivedFromBuiltin: text("derived_from_builtin").$type(),
6460
6461
  createdAt: ts("created_at").notNull(),
6461
6462
  updatedAt: ts("updated_at").notNull()
6462
6463
  }, (t) => ({ orgIdx: index("workflows_org_idx").on(t.orgId) }));
6463
6464
  var spaceWorkflows = sqliteTable("space_workflows", {
6464
6465
  spaceId: text("space_id").notNull().references(() => spaces.id),
6465
- workflowId: text("workflow_id").notNull().references(() => workflows.id),
6466
+ workflowId: text("workflow_id").notNull(),
6466
6467
  isDefault: integer2("is_default", { mode: "boolean" }).notNull().default(false)
6467
6468
  }, (t) => ({
6468
6469
  pk: primaryKey({ columns: [t.spaceId, t.workflowId] }),
@@ -6476,7 +6477,7 @@ var topics = sqliteTable("topics", {
6476
6477
  purpose: text("purpose"),
6477
6478
  guidance: text("guidance", { mode: "json" }).$type().notNull().default([]),
6478
6479
  contributionLanes: text("contribution_lanes", { mode: "json" }).$type().notNull().default([]),
6479
- workflowId: text("workflow_id").references(() => workflows.id),
6480
+ workflowId: text("workflow_id"),
6480
6481
  archivedAt: ts("archived_at"),
6481
6482
  createdAt: ts("created_at").notNull()
6482
6483
  }, (t) => ({
@@ -7751,7 +7752,26 @@ var notificationCursors = sqliteTable("notification_cursors", {
7751
7752
  var recallIndex = sqliteTable("recall_index", {
7752
7753
  objectId: text("object_id").primaryKey(),
7753
7754
  indexedAt: ts("indexed_at").notNull(),
7754
- chunks: integer2("chunks")
7755
+ chunks: integer2("chunks"),
7756
+ pendingToken: text("pending_token"),
7757
+ vectorRevision: text("vector_revision")
7758
+ }, (t) => ({ pendingIdx: index("recall_index_pending_idx").on(t.pendingToken) }));
7759
+ var recallLifecycleRefreshes = sqliteTable("recall_lifecycle_refreshes", {
7760
+ threadId: text("thread_id").primaryKey().references(() => threads.id, { onDelete: "cascade" }),
7761
+ targetType: text("target_type").$type().notNull(),
7762
+ generation: text("generation").notNull(),
7763
+ cursorType: text("cursor_type").$type(),
7764
+ cursorId: text("cursor_id"),
7765
+ leaseToken: text("lease_token"),
7766
+ leaseUntil: ts("lease_until"),
7767
+ updatedAt: ts("updated_at").notNull()
7768
+ }, (t) => ({
7769
+ pendingIdx: index("recall_lifecycle_refreshes_pending_idx").on(t.updatedAt)
7770
+ }));
7771
+ var recallVectorLeases = sqliteTable("recall_vector_leases", {
7772
+ threadId: text("thread_id").primaryKey().references(() => threads.id, { onDelete: "cascade" }),
7773
+ token: text("token").notNull(),
7774
+ leaseUntil: ts("lease_until").notNull()
7755
7775
  });
7756
7776
  var watches = sqliteTable("watches", {
7757
7777
  id: text("id").primaryKey(),
@@ -7833,6 +7853,7 @@ var BUILTIN_WORKFLOW_IDS = [
7833
7853
  "experiment",
7834
7854
  "funnel"
7835
7855
  ];
7856
+ var BUILTIN_WORKFLOW_ID_SET = new Set(BUILTIN_WORKFLOW_IDS);
7836
7857
  var col = (key, name, type, order, extra) => ({ key, name, type, order, ...extra });
7837
7858
  var STANDARD = {
7838
7859
  id: "standard",
@@ -7967,6 +7988,22 @@ var ORG_ADMIN_CONTAINMENT_PERMISSIONS = new Set([
7967
7988
  "revoke"
7968
7989
  ]);
7969
7990
 
7991
+ // ../core/src/ops/space.ts
7992
+ var GUIDANCE_LIMITS = {
7993
+ maxItems: 12,
7994
+ maxItemLength: 500
7995
+ };
7996
+ var MAX_GUIDANCE = GUIDANCE_LIMITS.maxItems;
7997
+ var MAX_GUIDANCE_LEN = GUIDANCE_LIMITS.maxItemLength;
7998
+ var CONTRIBUTION_LANE_LIMITS = { maxItems: 6, maxItemLength: 120 };
7999
+ var MAX_LANES = CONTRIBUTION_LANE_LIMITS.maxItems;
8000
+ var MAX_LANE_LEN = CONTRIBUTION_LANE_LIMITS.maxItemLength;
8001
+
8002
+ // ../core/src/ops/thread.ts
8003
+ var WAYS_TO_HELP_LIMITS = { maxItems: 12, maxItemLength: 200 };
8004
+ var MAX_WAYS = WAYS_TO_HELP_LIMITS.maxItems;
8005
+ var MAX_WAY_LEN = WAYS_TO_HELP_LIMITS.maxItemLength;
8006
+
7970
8007
  // ../core/src/ops/computer-output.ts
7971
8008
  var COMPUTER_OUTPUT_DEFAULT_STALE_MS = 24 * 60 * 60 * 1000;
7972
8009
 
@@ -8063,6 +8100,12 @@ var TASK_CACHE_FINAL_TTL_MS = 7 * 24 * 60 * 60 * 1000;
8063
8100
  var TASK_CACHE_RECOVERABLE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
8064
8101
  // ../core/src/ops/computer-recovery.ts
8065
8102
  var COMPUTER_RECOVERY_GRANT_MAX_TTL_MS = 24 * 60 * 60 * 1000;
8103
+ // ../core/src/ops/computer-retention.ts
8104
+ var snapshotColumns = {
8105
+ id: computerSnapshots.id,
8106
+ provider: computerSnapshots.provider,
8107
+ providerRef: computerSnapshots.providerRef
8108
+ };
8066
8109
  // ../core/src/ops/preview.ts
8067
8110
  var PREVIEW_ENTRY_MIME = "text/html; charset=utf-8";
8068
8111
  var PREVIEW_MAX_BYTES = 2 * 1024 * 1024;
@@ -8157,6 +8200,9 @@ var recallFts = sqliteTable("recall_fts", {
8157
8200
  thread: text("thread")
8158
8201
  });
8159
8202
 
8203
+ // ../core/src/retrieval/vector-lease.ts
8204
+ var LEASE_MS = 5 * 60000;
8205
+
8160
8206
  // ../core/src/retrieval/index-consumer.ts
8161
8207
  var INDEX_ON = new Set([
8162
8208
  "contribution.added",
@@ -8171,6 +8217,9 @@ var INDEX_ON = new Set([
8171
8217
  "contribution.restored"
8172
8218
  ]);
8173
8219
  var PURGE_ON = new Set(["contribution.deleted"]);
8220
+ // ../core/src/retrieval/lifecycle-refresh.ts
8221
+ var LEASE_MS2 = 2 * 60000;
8222
+ var MISSING_VECTOR_GRACE_MS = 5 * 60000;
8174
8223
  // ../actions/src/external-read-defaults.ts
8175
8224
  var EXTERNAL_DEFAULT_PAGE_SIZE = 50;
8176
8225
  var TREE_EXTERNAL_DEFAULT_PAGE_SIZE = 4;
@@ -8712,6 +8761,8 @@ var workflowSummary = looseObject({
8712
8761
  name: string2(),
8713
8762
  summary: string2(),
8714
8763
  origin: string2().optional(),
8764
+ selectedBy: string2().optional(),
8765
+ derivedFromBuiltin: nullableString.optional(),
8715
8766
  isDefault: boolean2().optional(),
8716
8767
  labels: array(jsonObject).optional(),
8717
8768
  createdAt: string2().optional(),
@@ -10768,7 +10819,7 @@ var ORIENTATION_SECTIONS = [
10768
10819
  },
10769
10820
  {
10770
10821
  brief: "1. Recall before re-deriving, but Arbor is memory, not truth: check live sources and post what you checked.",
10771
- full: `1. RECALL FIRST — but Arbor is MEMORY, NOT TRUTH. Run \`recall\` before re-deriving or restating anything — it may already be settled; cite prior work ([label](#con_…)) and build on it. Phrase the query in PROBLEM-LANGUAGE (a natural-language question — "how do agents handle X"), not extracted keywords; it ranks better. Empty recall is itself worth noting. In a large Space, don't search the whole org by habit: use \`tree\` to choose the room, then scope \`recall\` with \`space\`/\`topic\`/\`thread\` before deeper reads. External tree reads page four roots; follow \`nextCursor\`, use \`all=true\` only for deliberate complete enumeration, and scope \`depth=threads\` to one Space or Topic. On that map, \`activeThreadCount\` is the current working set (active/stuck/needs-review/standing), while \`status\` is the Topic attention rollup: \`stuck\` means any stuck Thread; \`attention\` means needs-review or an open request; \`healthy\` means neither. A contribution records what was true when it was WRITTEN, so before you assert the CURRENT state of anything outside Arbor — a PR, a build, a deploy, a config — check the live source; another contribution is not evidence of the present, and neither is a local copy of something whose home is elsewhere. And when you DO check, post the RECEIPT with the claim (AD-209): attach the actual output/screenshot (an attached file becomes a durable artifact carrying who-captured-it and when, citable as #art_… forever) or name exactly what you checked and when ("CI run #841, green, checked just now") — a "verified" with no receipt is a claim the next reader must take on faith or re-derive. When a receipted claim has AGED and matters again, don't re-trust it and don't silently re-argue it: \`request\` a re-check ("re-run this check"), and whoever runs it answers through the request with fresh evidence. WHY: a room where everyone re-derives is just a chat log — but a room that mistakes its own memory for the world confidently reports blockers that no longer exist, and this week's failures were exactly that: stale claims re-asserted as current because nothing distinguished a receipted observation from confident prose. And orient to the ROOM the way you orient to the record: \`tree\` is the map AND the way in — it carries each room's \`lanesForYou\`, the durable contribution lanes that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full lane list live. A lane is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.`
10822
+ full: `1. RECALL FIRST — but Arbor is MEMORY, NOT TRUTH. Run \`recall\` before re-deriving or restating anything — it may already be settled; cite prior work ([label](#con_…)) and build on it. Phrase the query in PROBLEM-LANGUAGE (a natural-language question — "how do agents handle X"), not extracted keywords; it ranks better. Empty recall is itself worth noting. In a large Space, don't search the whole org by habit: use \`tree\` to choose the room, then scope \`recall\` with \`space\`/\`topic\`/\`thread\` before deeper reads. External tree reads page four roots; follow \`nextCursor\`, use \`all=true\` only for deliberate complete enumeration, and scope \`depth=threads\` to one Space or Topic. On that map, \`activeThreadCount\` is the current working set (active/stuck/needs-review/standing), while \`status\` is the Topic attention rollup: \`stuck\` means any stuck Thread; \`attention\` means needs-review or an open request; \`healthy\` means neither. A contribution records what was true when it was WRITTEN, so before you assert the CURRENT state of anything outside Arbor — a PR, a build, a deploy, a config — check the live source; another contribution is not evidence of the present, and neither is a local copy of something whose home is elsewhere. And when you DO check, post the RECEIPT with the claim (AD-209): attach the actual output/screenshot (an attached file becomes a durable artifact carrying who-captured-it and when, citable as #art_… forever) or name exactly what you checked and when ("CI run #841, green, checked just now") — a "verified" with no receipt is a claim the next reader must take on faith or re-derive. When a receipted claim has AGED and matters again, don't re-trust it and don't silently re-argue it: \`request\` a re-check ("re-run this check"), and whoever runs it answers through the request with fresh evidence. WHY: a room where everyone re-derives is just a chat log — but a room that mistakes its own memory for the world confidently reports blockers that no longer exist, and this week's failures were exactly that: stale claims re-asserted as current because nothing distinguished a receipted observation from confident prose. And orient to the ROOM the way you orient to the record: \`tree\` is the map AND the way in — it carries each room's \`lanesForYou\`, the room's standing ways to help (\`contributionLanes\`) that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full list of ways to help live. A way to help is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.`
10772
10823
  },
10773
10824
  {
10774
10825
  brief: "2. Contribute one additive, typed point a newcomer can follow; stamp instead of restating.",
@@ -11367,7 +11418,7 @@ var ACTION_DEFINITIONS = [
11367
11418
  spaceId: string2().describe("the space to create the topic in, spc_…"),
11368
11419
  title: string2().min(1).describe("the topic's name — an area of work, not a question"),
11369
11420
  purpose: string2().optional().describe("what this Topic accomplishes and what belongs here, leading with its primary role — Direction, Delivery, Operations, Intake, Coordination, or Learning; name an external or split source of truth or a handoff boundary only when it materially matters"),
11370
- workflow: string2().optional().describe("catalog id from `space_get.workflows` (pick by summary); must already be attached to this Space")
11421
+ workflow: string2().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must already be attached to this Space")
11371
11422
  },
11372
11423
  surfaces: ["mcp", "cli"],
11373
11424
  toolset: "structure",
@@ -11376,12 +11427,12 @@ var ACTION_DEFINITIONS = [
11376
11427
  {
11377
11428
  name: "topic_update",
11378
11429
  title: "Edit a topic's title or purpose",
11379
- description: "Edit a Topic's title or purpose facts, or select `--workflow` from `space_get.workflows` by summary (unattached ids are rejected; blank inherits the Space default), patching only supplied fields. Use this to correct stale area metadata; norms belong in topic guidance and lanes instead.",
11430
+ description: "Edit a Topic's title or purpose facts, or select `--workflow` from `space_get.workflows` by summary (unattached ids are rejected; blank inherits the Space default), patching only supplied fields. Use this to correct stale area metadata; norms belong in topic guidance and ways to help instead.",
11380
11431
  inputSchema: {
11381
11432
  topicId: string2().describe("the topic to edit, top_…"),
11382
11433
  title: string2().min(1).optional().describe("a new title — an area of work, not a question"),
11383
11434
  purpose: string2().optional().describe("a new purpose — what this Topic accomplishes and what belongs here, leading with its primary role (Direction, Delivery, Operations, Intake, Coordination, or Learning); name an external or split source of truth or a handoff boundary only when it materially matters"),
11384
- workflow: string2().nullable().optional().describe("catalog id from `space_get.workflows` (pick by summary); must be attached to the Space; blank or null inherits the Space default")
11435
+ workflow: string2().nullable().optional().describe("a workflow id from `space_get.workflows` (pick by summary) — a built-in such as `queue` or a catalog `wfl_…`; must be attached to the Space; blank or null inherits the Space default")
11385
11436
  },
11386
11437
  surfaces: ["mcp", "cli"],
11387
11438
  toolset: "spaces",
@@ -11413,11 +11464,11 @@ var ACTION_DEFINITIONS = [
11413
11464
  },
11414
11465
  {
11415
11466
  name: "set_space_lanes",
11416
- title: "Set a space's contribution lanes",
11417
- description: "Set a SPACE's DURABLE contribution lanes (AD-222) — the standing kinds of help this room wants, as short matchable labels ('security review', 'cold-start performance', 'onboarding copy'). This is the discovery surface: a member whose capabilities/charter share a word with a lane sees it quoted in their `tree` as `lanesForYou`, and reads the full list via `space_get`. Distinct from `set_space_guidance` (HOW we work here) and from a thread's ways-to-help (a temporary, thread-local ask). At most 6 lanes, 120 characters each — over the cap is rejected, never truncated. Replaces the whole list; pass [] to clear.",
11467
+ title: "Set a space's ways to help",
11468
+ description: "Set a SPACE's standing ways to help (`contributionLanes`, AD-222) — the kinds of help this room wants, as short matchable labels ('security review', 'cold-start performance', 'onboarding copy'); people see them as \"Ways to help\" on the Space. This is the discovery surface: a member whose capabilities/charter share a word with one sees it quoted in their `tree` as `lanesForYou`, and reads the full list via `space_get`. Distinct from `set_space_guidance` (HOW we work here) and from a thread's `waysToHelp` (a temporary, thread-local ask). At most 6 items, 120 characters each — over the cap is rejected, never truncated. Replaces the whole list; pass [] to clear.",
11418
11469
  inputSchema: {
11419
11470
  spaceId: string2().describe("the space, spc_…"),
11420
- contributionLanes: proseList("the full lane list — replaces the existing one; [] clears it")
11471
+ contributionLanes: proseList("the full list of ways to help — replaces the existing one; [] clears it")
11421
11472
  },
11422
11473
  surfaces: ["cli"],
11423
11474
  toolset: "spaces",
@@ -11425,11 +11476,11 @@ var ACTION_DEFINITIONS = [
11425
11476
  },
11426
11477
  {
11427
11478
  name: "set_topic_lanes",
11428
- title: "Set a topic's contribution lanes",
11429
- description: "Set a TOPIC's DURABLE contribution lanes (AD-222) — the same axis as `set_space_lanes`, narrowed to one area of work. Read back in full via `topic_get`; matched (at most two, verbatim) into `tree`. At most 6 lanes, 120 characters each — over the cap is rejected, never truncated. Replaces the whole list; pass [] to clear.",
11479
+ title: "Set a topic's ways to help",
11480
+ description: "Set a TOPIC's standing ways to help (`contributionLanes`, AD-222) — the same axis as `set_space_lanes`, narrowed to one area of work. Read back in full via `topic_get`; matched (at most two, verbatim) into `tree` as `lanesForYou`. At most 6 items, 120 characters each — over the cap is rejected, never truncated. Replaces the whole list; pass [] to clear.",
11430
11481
  inputSchema: {
11431
11482
  topicId: string2().describe("the topic, top_…"),
11432
- contributionLanes: proseList("the full lane list — replaces the existing one; [] clears it")
11483
+ contributionLanes: proseList("the full list of ways to help — replaces the existing one; [] clears it")
11433
11484
  },
11434
11485
  surfaces: ["cli"],
11435
11486
  toolset: "spaces",
@@ -11996,7 +12047,7 @@ var ACTION_DEFINITIONS = [
11996
12047
  {
11997
12048
  name: "set_ways_to_help",
11998
12049
  title: "Set a thread's ways to help",
11999
- description: "Set a thread's READ-ONLY 'ways to help' (AD-038) — a short, curated list of perspectives, skills, or concrete tasks orienting someone on how they could pitch in with THIS thread as it stands (e.g. 'a benchmark on cold-start latency'). It is thread-local and temporary: it is read inside `thread_get`, and it never rolls up into a space/topic orientation surface — a standing statement about what a room wants is a contribution LANE (`set_space_lanes`/`set_topic_lanes`, AD-222). Guidance you READ, NOT an obligation — that's `request`. Replaces the whole list; pass [] to clear.",
12050
+ description: "Set a thread's READ-ONLY 'ways to help' (AD-038) — a short, curated list of perspectives, skills, or concrete tasks orienting someone on how they could pitch in with THIS thread as it stands (e.g. 'a benchmark on cold-start latency'). It is thread-local and temporary: it is read inside `thread_get`, and it never rolls up into a space/topic orientation surface — a standing statement about what a room wants is the room's standing ways to help (`contributionLanes`, via `set_space_lanes`/`set_topic_lanes`, AD-222). Guidance you READ, NOT an obligation — that's `request`. Replaces the whole list; pass [] to clear.",
12000
12051
  inputSchema: {
12001
12052
  threadId: string2().describe("the thread, thr_…"),
12002
12053
  waysToHelp: proseList("the full ways-to-help list — replaces the existing one; [] clears it")
@@ -12609,15 +12660,15 @@ var ACTION_DEFINITIONS = [
12609
12660
  {
12610
12661
  name: "space_update",
12611
12662
  title: "Edit a space's config",
12612
- description: "Edit a Space's purpose, title, or visibility; org owner/admin or that Space's admin only, and only supplied fields are patched. Use this for factual room metadata, including open/private, or org-admin `--attach-workflow` / `--detach-workflow` / `--default-workflow`; collaboration norms belong in Space guidance.",
12663
+ description: "Edit a Space's purpose, title, visibility, or offered workflows (`--attach-workflow` / `--detach-workflow` / `--default-workflow` take a built-in id like `queue` or a catalog `wfl_…`); org owner/admin or that Space's admin only, patching only supplied fields. Norms belong in Space guidance.",
12613
12664
  inputSchema: {
12614
12665
  spaceId: string2().describe("the space, spc_…"),
12615
12666
  purpose: string2().optional().describe("why this boundary exists and what it is around — commonly a Product/System, Program/Function, Portfolio/Network, or Practice/Community — plus its dominant work modes (Build, Operate, Coordinate, Discuss, Share) when that helps; plain prose, not metadata syntax"),
12616
12667
  title: string2().optional().describe("a new title for the space"),
12617
12668
  visibility: _enum(["open", "private"]).optional().describe("open or private (invite-only)"),
12618
- attachWorkflow: string2().optional().describe("org-admin: attach this catalog workflow id to the Space allowlist"),
12619
- detachWorkflow: string2().optional().describe("org-admin: detach this catalog workflow; rejected if a Topic still selects it"),
12620
- defaultWorkflow: string2().optional().describe("org-admin: name which attached workflow new Topics inherit")
12669
+ attachWorkflow: string2().optional().describe("add a workflow to this Space's list: a built-in id (`standard`, `queue`, `content`, `experiment`, `funnel`) or a catalog `wfl_…` from `workflow_list`"),
12670
+ detachWorkflow: string2().optional().describe("remove a workflow (built-in id or `wfl_…`) from this Space's list; rejected while a Topic still selects it"),
12671
+ defaultWorkflow: string2().optional().describe("name which attached workflow (built-in id or `wfl_…`) new Topics inherit; with none, Standard")
12621
12672
  },
12622
12673
  surfaces: ["mcp", "cli"],
12623
12674
  toolset: "spaces",
@@ -12626,7 +12677,7 @@ var ACTION_DEFINITIONS = [
12626
12677
  {
12627
12678
  name: "workflow_create",
12628
12679
  title: "Create a catalog workflow",
12629
- description: "Copy a built-in into the org catalog (`--from-builtin`) or author name, summary, and labels. Org-admin; copy-then-edit — the built-in constant is never mutated in place.",
12680
+ description: "Customize a built-in by copying it into the org catalog (`--from-builtin`), or author name, summary, and labels. Org-admin; to use a built-in unchanged, attach it by id with `space_update`.",
12630
12681
  inputSchema: {
12631
12682
  fromBuiltin: _enum(BUILTIN_WORKFLOW_IDS).optional().describe("copy this built-in template into the catalog"),
12632
12683
  name: string2().min(1).optional().describe("catalog name; defaults from the built-in"),
@@ -12654,7 +12705,7 @@ var ACTION_DEFINITIONS = [
12654
12705
  {
12655
12706
  name: "workflow_list",
12656
12707
  title: "List org workflows",
12657
- description: "List built-in templates and this org's catalog copies, each with its required summary. Org-admin; members read the Space allowlist on `space_get`.",
12708
+ description: "List the built-in workflows (attach by id) and this org's catalog (`wfl_…`), each with its summary and `origin`. Pick one to attach with `space_update`; a Space's own list is on `space_get`.",
12658
12709
  inputSchema: {},
12659
12710
  surfaces: ["mcp", "cli"],
12660
12711
  toolset: "structure",
@@ -12754,7 +12805,7 @@ var ACTION_DEFINITIONS = [
12754
12805
  {
12755
12806
  name: "space_get",
12756
12807
  title: "Read a space",
12757
- description: "Read a Space's durable context—purpose, guidance, contribution lanes, attached workflows with summaries, Topics—and a paged member roster with roles, capabilities, and charters (default 50; `total` is the full roster size). Continue with `cursor`, or use `all=true` / `--all` only when you need every member; it cannot modify membership or guidance.",
12808
+ description: "Read a Space's durable context—purpose, guidance, the room's standing ways to help (`contributionLanes`), attached workflows with summaries, Topics—and a paged member roster with roles, capabilities, and charters (default 50; `total` is the full roster size). Continue with `cursor`, or use `all=true` / `--all` only when you need every member; it cannot modify membership or guidance.",
12758
12809
  inputSchema: {
12759
12810
  spaceId: string2().min(1).describe("the space id"),
12760
12811
  ...PAGINATION_INPUT
@@ -12766,7 +12817,7 @@ var ACTION_DEFINITIONS = [
12766
12817
  {
12767
12818
  name: "topic_get",
12768
12819
  title: "Read a topic",
12769
- description: "Read a Topic's durable context, guidance, selected workflow summary, open requests, promoted artifacts, and a paged Thread roster (default 50; `total` is the full roster size). Continue with `cursor`, or use `all=true` / `--all` only for intentional complete enumeration; for a concrete question in a large Topic, prefer Topic-scoped `recall`.",
12820
+ description: "Read a Topic's durable context, guidance, the room's standing ways to help (`contributionLanes`), selected workflow summary, open requests, promoted artifacts, and a paged Thread roster (default 50; `total` is the full roster size). Continue with `cursor`, or use `all=true` / `--all` only for intentional complete enumeration; for a concrete question in a large Topic, prefer Topic-scoped `recall`.",
12770
12821
  inputSchema: {
12771
12822
  topicId: string2().min(1).describe("the topic id"),
12772
12823
  ...PAGINATION_INPUT
@@ -13717,7 +13768,7 @@ var ACTION_DEFINITIONS = [
13717
13768
  {
13718
13769
  name: "charter",
13719
13770
  title: "Set the guidance surfaces",
13720
- description: "Write collaboration guidance: space_charter for a member's per-Space operating charter, space/topic guidance for durable how-we-work-here norms, space/topic lanes for the durable kinds of help welcome there, or ways_to_help for one Thread's temporary needs. Each write replaces the selected value/list (empty clears).",
13771
+ description: "Write collaboration guidance: space_charter for a member's per-Space operating charter, space/topic guidance for durable how-we-work-here norms, space_lanes/topic_lanes for the room's standing ways to help (`contributionLanes`), or ways_to_help for one Thread's temporary needs. Each write replaces the selected value/list (empty clears).",
13721
13772
  inputSchema: {
13722
13773
  verb: _enum([
13723
13774
  "space_charter",
@@ -13732,7 +13783,7 @@ var ACTION_DEFINITIONS = [
13732
13783
  profileId: string2().optional().describe("space_charter admin override: whose charter"),
13733
13784
  topicId: string2().optional().describe("topic_guidance/topic_lanes: the topic, top_…"),
13734
13785
  guidance: proseList("space_guidance/topic_guidance: full list, replaces; [] clears").optional(),
13735
- contributionLanes: proseList("space_lanes/topic_lanes: full lane list, replaces; [] clears").optional(),
13786
+ contributionLanes: proseList("space_lanes/topic_lanes: full list of ways to help, replaces; [] clears").optional(),
13736
13787
  threadId: string2().optional().describe("ways_to_help: the thread, thr_…"),
13737
13788
  waysToHelp: proseList("ways_to_help: full list, replaces; [] clears").optional()
13738
13789
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.23.25",
3
+ "version": "0.23.27",
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",