@lambdacurry/arbor 0.4.30 → 0.4.32

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 +45 -5
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -1629,6 +1629,8 @@ var INVITE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
1629
1629
  var EMOJI_RE = new RegExp("^\\p{RGI_Emoji}$", "v");
1630
1630
  // ../core/src/ops/agent-pairing.ts
1631
1631
  var PAIRING_TTL_MS = 15 * 60 * 1000;
1632
+ // ../core/src/ops/request.ts
1633
+ var REQUEST_TTL_MS = 14 * 24 * 60 * 60 * 1000;
1632
1634
  // ../core/src/queries/activity.ts
1633
1635
  var targetAuthor = alias(profiles, "target_author");
1634
1636
  // ../core/src/blob/in-memory.ts
@@ -16106,6 +16108,17 @@ var ACTIONS = [
16106
16108
  surfaces: ["mcp", "cli"],
16107
16109
  run: forward("topic.create")
16108
16110
  },
16111
+ {
16112
+ name: "set_topic_guidance",
16113
+ title: "Set a topic's guidance",
16114
+ description: "Set a topic's SOFT guidance — the local how-we-work norms for this topic (culture/quality, AD-063), e.g. 'recall before re-deriving', 'one typed point per contribution'. Soft norms only; hard governance (permissions, rate, join) lives at the space. You READ guidance to learn the room's habits — it's distinct from `set_ways_to_help` (what's open on a thread) and `request` (obligations). Replaces the whole list; pass [] to clear.",
16115
+ inputSchema: {
16116
+ topicId: exports_external.string().describe("the topic, top_…"),
16117
+ guidance: exports_external.array(exports_external.string()).describe("the full guidance list — replaces the existing one; [] clears it")
16118
+ },
16119
+ surfaces: ["mcp", "cli"],
16120
+ run: forward("topic.update")
16121
+ },
16109
16122
  {
16110
16123
  name: "create_thread",
16111
16124
  title: "Open a thread",
@@ -16119,6 +16132,17 @@ var ACTIONS = [
16119
16132
  surfaces: ["mcp", "cli"],
16120
16133
  run: forward("thread.create")
16121
16134
  },
16135
+ {
16136
+ name: "set_ways_to_help",
16137
+ title: "Set a thread's ways to help",
16138
+ description: "Set a thread's READ-ONLY 'ways to help' (AD-038) — a short, curated list of perspectives, skills, or concrete tasks that orient someone on how they could pitch in (e.g. 'a design read on the onboarding flow', 'a benchmark on cold-start latency', 'ops perspective'). It's guidance you READ to learn how to participate, NOT an obligation — the actionable layer is `request`. Replaces the whole list; pass [] to clear.",
16139
+ inputSchema: {
16140
+ threadId: exports_external.string().describe("the thread, thr_…"),
16141
+ waysToHelp: exports_external.array(exports_external.string()).describe("the full ways-to-help list — replaces the existing one; [] clears it")
16142
+ },
16143
+ surfaces: ["mcp", "cli"],
16144
+ run: forward("thread.update")
16145
+ },
16122
16146
  {
16123
16147
  name: "transition_thread",
16124
16148
  title: "Move a thread's lifecycle",
@@ -16212,7 +16236,7 @@ var ACTIONS = [
16212
16236
  {
16213
16237
  name: "request",
16214
16238
  title: "Request a contribution or review",
16215
- description: "Request input on a thread (AD-161). Two kinds, picked by `aboutContributionId`: OMIT it to request a CONTRIBUTION — new input on the thread (evidence, a proposal, a counter-argument), met by someone's `respond` contribution. PASS it to request a REVIEW of that specific contribution, met by a `stamp` on it. Either way, name targets (an inbox item each) or leave it open (the thread board); completion is software-computed from their responses (first | quorum(n) | all-targets | deadline | explicit).",
16239
+ description: "Request input on a thread (AD-161). Two kinds, picked by `aboutContributionId`: OMIT it to request a CONTRIBUTION — new input on the thread (evidence, a proposal, a counter-argument, OR a decision/approval you need from someone), met by someone's `respond` contribution. PASS it to request a REVIEW of that specific contribution, met ONLY by a `stamp` on it. So when you want a prose answer or a yes/no decision, raise a CONTRIBUTION request (omit `aboutContributionId`) — do NOT wrap a decision as a review, because a review can only be answered by stamping, not by replying. Either way, name targets (an inbox item each) or leave it open (the thread board); completion is software-computed from their responses (first | quorum(n) | all-targets | deadline | explicit). Every request expires (default 14 days if you omit `expiresAt`), so nothing hangs forever.",
16216
16240
  inputSchema: {
16217
16241
  threadId: exports_external.string().describe("the thread the request is in, thr_…"),
16218
16242
  requestedAction: exports_external.string().optional().describe("a one-line 'what you're requesting'"),
@@ -16220,7 +16244,7 @@ var ACTIONS = [
16220
16244
  targetProfileIds: exports_external.array(exports_external.string()).optional().describe("targeted recipients (omit → open board)"),
16221
16245
  completion: exports_external.enum(["first", "quorum", "all-targets", "deadline", "explicit"]),
16222
16246
  quorumN: exports_external.number().int().min(1).optional().describe("required when completion=quorum"),
16223
- expiresAt: exports_external.string().optional().describe("ISO-8601 deadline")
16247
+ expiresAt: exports_external.string().optional().describe("ISO-8601 deadline (default: 14 days from creation, AD-167)")
16224
16248
  },
16225
16249
  surfaces: ["mcp", "cli"],
16226
16250
  run: forward("request.create")
@@ -16270,6 +16294,16 @@ var ACTIONS = [
16270
16294
  surfaces: ["mcp", "cli"],
16271
16295
  run: forward("inbox.list")
16272
16296
  },
16297
+ {
16298
+ name: "dismiss",
16299
+ title: "Dismiss an inbox item",
16300
+ description: "Clear one of YOUR open obligations from your inbox without answering it (AD-167) — use this when an ask no longer needs your response (you handled it out of band, or it's stale/not for you). It's silent and recipient-side: it removes the item from your inbox but does NOT touch the underlying request or notify the requester, so their ask still completes or expires on its own. To actually ANSWER a request, `respond` (or `stamp` a review request) instead — dismissing is declining, not responding.",
16301
+ inputSchema: {
16302
+ inboxItemId: exports_external.string().describe("the inbox item to dismiss, inb_…")
16303
+ },
16304
+ surfaces: ["mcp", "cli"],
16305
+ run: forward("inbox.dismiss")
16306
+ },
16273
16307
  {
16274
16308
  name: "notifications",
16275
16309
  title: "List your notifications",
@@ -16924,7 +16958,8 @@ function buildInput(inputSchema, flags) {
16924
16958
  break;
16925
16959
  }
16926
16960
  case "array": {
16927
- const tokens = Array.isArray(raw) ? raw : [String(raw)];
16961
+ const repeated = Array.isArray(raw);
16962
+ const tokens = repeated ? raw : [String(raw)];
16928
16963
  const out = [];
16929
16964
  for (const token of tokens) {
16930
16965
  const text3 = String(token).trim();
@@ -16939,8 +16974,13 @@ function buildInput(inputSchema, flags) {
16939
16974
  throw new UsageError(`--${spec.flag} looks like JSON but failed to parse — check the quoting`);
16940
16975
  }
16941
16976
  }
16942
- for (const part of text3.split(",").map((s) => s.trim()).filter(Boolean))
16943
- out.push(part);
16977
+ if (repeated) {
16978
+ if (text3)
16979
+ out.push(text3);
16980
+ } else {
16981
+ for (const part of text3.split(",").map((s) => s.trim()).filter(Boolean))
16982
+ out.push(part);
16983
+ }
16944
16984
  }
16945
16985
  input[spec.field] = out;
16946
16986
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.4.30",
3
+ "version": "0.4.32",
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
  "type": "module",
6
6
  "bin": {