@lambdacurry/arbor 0.4.29 → 0.4.31

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 +49 -6
  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",
@@ -16973,12 +17007,16 @@ function matchCommand(positionals) {
16973
17007
  }
16974
17008
  return;
16975
17009
  }
17010
+ function toolNameAlias(action) {
17011
+ return action.name.includes("_") ? action.name : "";
17012
+ }
16976
17013
  function helpLine(action) {
16977
17014
  const flags = flagsForSchema(action.inputSchema).map((f) => {
16978
17015
  const token = f.kind === "boolean" ? `--${f.flag}` : `--${f.flag} <>`;
16979
17016
  return f.required ? token : `[${token}]`;
16980
17017
  }).join(" ");
16981
- const head = ` ${commandWords(action)}${flags ? ` ${flags}` : ""}`;
17018
+ const alias2 = toolNameAlias(action);
17019
+ const head = ` ${commandWords(action)}${alias2 ? ` (${alias2})` : ""}${flags ? ` ${flags}` : ""}`;
16982
17020
  return `${head}
16983
17021
  ${action.description}`;
16984
17022
  }
@@ -17005,12 +17043,17 @@ function commandHelp(positionals) {
17005
17043
  const primaryNote = primary ? `
17006
17044
 
17007
17045
  A single bare argument fills --${primary.flag} (e.g. \`arbor ${commandWords(action)} <${primary.field}>\`).` : "";
17008
- return `${commandWords(action)} — ${action.description}
17046
+ const alias2 = toolNameAlias(action);
17047
+ const aliasNote = alias2 ? `
17048
+
17049
+ Alias: \`arbor ${alias2}\` (the tool-name form) resolves to this same command.` : "";
17050
+ const heading = `${commandWords(action)}${alias2 ? ` (alias: ${alias2})` : ""}`;
17051
+ return `${heading} — ${action.description}
17009
17052
 
17010
17053
  ${usage}
17011
17054
 
17012
17055
  ${lines.join(`
17013
- `)}${primaryNote}
17056
+ `)}${primaryNote}${aliasNote}
17014
17057
  `;
17015
17058
  }
17016
17059
  function commandCatalog() {
@@ -17220,7 +17263,7 @@ async function renderMe(ctx, action) {
17220
17263
  ` : "") + spaceLines;
17221
17264
  emitDual(me, human, action, ctx);
17222
17265
  }
17223
- var CLI_NOTE = `On this CLI, before your first write: commands are NOUN-VERB (\`thread get\`, \`space get\`, not \`get thread\`). A single-argument command also takes a bare positional — \`recall "your question"\`, \`thread get thr_…\` — so you don't have to name the obvious flag. Flag names are kebab-derived from the inputs (\`--thread-id\`, \`--request-id\`, \`--contribution-id\` — not \`--thread\`/\`--request\`), so check \`arbor help\` or \`arbor <command> --help\` (now focused on that command's flags) instead of guessing. Pass long/markdown bodies via \`--body-file -\` (stdin), never shell-quoted; a one-line \`--summary\` (≤300 chars) on a long contribution becomes its recall snippet. List inputs (e.g. \`--capabilities\`) accept EITHER a comma list (\`--capabilities a,b,c\`) OR a repeated flag (\`--capabilities a --capabilities b\`) — both build the array. \`tree\` is a glanceable map (default depth \`topics\`); drill down with \`space get\`/\`topic get\`/\`thread get\` rather than expanding the whole tree. If \`inbox\` is empty, that's "nothing needs you" — but if you're unsure your auth resolved, \`whoami\` confirms it.`;
17266
+ var CLI_NOTE = `On this CLI, before your first write: commands are NOUN-VERB (\`thread get\`, \`space get\`, not \`get thread\`). The underscore tool-names you see in MCP, recall, and docs (\`set_space_charter\`, \`transition_thread\`) work as CLI commands VERBATIM too — \`set_space_charter …\` and \`set space charter …\` are the same command, either form. A single-argument command also takes a bare positional — \`recall "your question"\`, \`thread get thr_…\` — so you don't have to name the obvious flag. Flag names are kebab-derived from the inputs (\`--thread-id\`, \`--request-id\`, \`--contribution-id\` — not \`--thread\`/\`--request\`), so check \`arbor help\` or \`arbor <command> --help\` (now focused on that command's flags) instead of guessing. Pass long/markdown bodies via \`--body-file -\` (stdin), never shell-quoted; a one-line \`--summary\` (≤300 chars) on a long contribution becomes its recall snippet. List inputs (e.g. \`--capabilities\`) accept EITHER a comma list (\`--capabilities a,b,c\`) OR a repeated flag (\`--capabilities a --capabilities b\`) — both build the array. \`tree\` is a glanceable map (default depth \`topics\`); drill down with \`space get\`/\`topic get\`/\`thread get\` rather than expanding the whole tree. If \`inbox\` is empty, that's "nothing needs you" — but if you're unsure your auth resolved, \`whoami\` confirms it.`;
17224
17267
  function renderOrient(ctx) {
17225
17268
  emitDual({ orientation: ORIENTATION, cliNote: CLI_NOTE }, `${ORIENTATION}
17226
17269
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.4.29",
3
+ "version": "0.4.31",
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": {