@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.
- package/dist/arbor.js +49 -6
- 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
|
|
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
|
-
|
|
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