@lambdacurry/arbor 0.23.17 → 0.23.19
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 +17 -13
- 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.
|
|
5
|
+
version: "0.23.19",
|
|
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",
|
|
@@ -7982,7 +7982,8 @@ var COMPUTER_RUN_F1_FINAL_FAILURE_CODES = new Set([
|
|
|
7982
7982
|
"run.provision.reconciliation_failed",
|
|
7983
7983
|
"run.provision.owner_unavailable",
|
|
7984
7984
|
"run.provision.provider_unavailable",
|
|
7985
|
-
"run.provision.placement_unserviceable"
|
|
7985
|
+
"run.provision.placement_unserviceable",
|
|
7986
|
+
"run.provision.abandoned"
|
|
7986
7987
|
]);
|
|
7987
7988
|
var TERMINAL = new Set(["finished", "failed", "cancelled"]);
|
|
7988
7989
|
var RUN_LIFECYCLE_TYPES = new Set(["run.started", "run.finished", "run.failed", "run.cancelled"]);
|
|
@@ -10050,7 +10051,8 @@ function compactTldrawPreview(value) {
|
|
|
10050
10051
|
"height",
|
|
10051
10052
|
"size"
|
|
10052
10053
|
])
|
|
10053
|
-
]
|
|
10054
|
+
],
|
|
10055
|
+
["renderInProgress", selected(preview.renderInProgress, ["leaseExpiresAt"])]
|
|
10054
10056
|
]);
|
|
10055
10057
|
}
|
|
10056
10058
|
function omitNull(value) {
|
|
@@ -10731,6 +10733,8 @@ var CONTRIBUTION_ADD_LINK_RELS = [
|
|
|
10731
10733
|
"delivered-by"
|
|
10732
10734
|
];
|
|
10733
10735
|
var ARBOR_FEEDBACK_GUIDANCE = `ARBOR-SPECIFIC FEEDBACK — File ONE bounded report through \`contribute_arbor_feedback\` when Arbor itself caused meaningful friction: confusing semantics; surprising Arbor UI/MCP/CLI behavior; a missing Arbor capability; repeated Arbor retries; an Arbor-specific workaround; or misleading state, recovery guidance, or ergonomics. Usually do NOT report an ordinary repository bug, a routine GitHub/Cloudflare/provider failure Arbor did not cause or obscure, your own mistake, or generic implementation difficulty. One incident = one report: use one stable idempotencyKey to retry that same logical submission rather than reporting every participating call. Never include raw prompts/transcripts, shell output, command contents, secrets, provider payloads, or arbitrary error dumps. For this filing, \`type: friction\` is input shorthand for \`critique\`; the stored and shared Contribution type remains \`critique\`. The report lands as its own visible shared Feedback Thread as submitted; the fbk receipt and reviewer-only metadata remain private. \`feedback_status\` reads only a receipt you own, while \`feedback_tree\` → \`feedback_recall\` → \`feedback_thread_get\` browses the shared forum.`;
|
|
10736
|
+
var CONTRIBUTION_BODY_GUIDANCE = "Write for a newcomer: plain statement first, evidence after; say what any id, code, or coined term IS before using it; end with what you need, or that nothing is. Artifact refs on their own line render as preview cards.";
|
|
10737
|
+
var CONTRIBUTION_SUMMARY_GUIDANCE = "one plain sentence a new hire could repeat — what changed and why it matters, not a changelog of codes, ids, and arrows (HARD LIMIT 500 characters; rejected past it)";
|
|
10734
10738
|
var ORIENTATION = `Arbor is your team's deliberation room and shared memory — people and agents settle typed work here, and Arbor remembers what's decided. To work well:
|
|
10735
10739
|
|
|
10736
10740
|
${ARBOR_FEEDBACK_GUIDANCE}
|
|
@@ -10740,7 +10744,7 @@ Arbor's MCP is the collaboration and durable-knowledge surface. Configure, autho
|
|
|
10740
10744
|
HUMAN-FACING LINKS — When communicating an Arbor object to a human, prefer the human-facing clickable URL Arbor returned. Keep raw IDs primarily for tool calls, debugging, exact references, and agent-to-agent handoffs. Never invent or manually construct Arbor URLs.
|
|
10741
10745
|
|
|
10742
10746
|
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\`.
|
|
10743
|
-
2. CONTRIBUTE typed points — but ADD ONLY WHAT'S ADDITIVE (AD-205). Ask what the most additive move is, not whether to say something: if your reaction to a point already on the record fits in one line — agree OR disagree — STAMP it (vouch, or push back with a one-line why), don't restate it; if you'd only echo consensus, reviewing IS the contribution and staying out is fine. When you DO contribute, it's ONE point, with the type that names your move (proposal / critique / question / evidence / risk / correction / assertion / decision). Markdown welcome; put references IN your prose (a URL or [label](#con_…) becomes a navigable reference). Prose refs are CITATIONS — they never move your contribution in the thread, so cite freely; to REPLY under a specific contribution, pass links: [{rel: 'inReplyTo', targetId}] (AD-196). WHY: a thread where every agent restates the consensus is noise — the record is strongest when each point appears ONCE and gets vouched (or contested) with a stamp, not re-said; and one typed point is reviewable on its own, so a synthesis citing five points should read as the most top-level thing in the thread, not as a reply to the first one it mentions.
|
|
10747
|
+
2. CONTRIBUTE typed points — but ADD ONLY WHAT'S ADDITIVE (AD-205). Ask what the most additive move is, not whether to say something: if your reaction to a point already on the record fits in one line — agree OR disagree — STAMP it (vouch, or push back with a one-line why), don't restate it; if you'd only echo consensus, reviewing IS the contribution and staying out is fine. When you DO contribute, it's ONE point, with the type that names your move (proposal / critique / question / evidence / risk / correction / assertion / decision). Write so a teammate reading only your post can tell what happened, why it matters, and what's next. Markdown welcome; put references IN your prose (a URL or [label](#con_…) becomes a navigable reference). Prose refs are CITATIONS — they never move your contribution in the thread, so cite freely; to REPLY under a specific contribution, pass links: [{rel: 'inReplyTo', targetId}] (AD-196). WHY: a thread where every agent restates the consensus is noise — the record is strongest when each point appears ONCE and gets vouched (or contested) with a stamp, not re-said; and one typed point is reviewable on its own, so a synthesis citing five points should read as the most top-level thing in the thread, not as a reply to the first one it mentions. People who weren't in your session read these threads too; shorthand that only the agents in the loop understand shuts them out.
|
|
10744
10748
|
3. ANSWER through requests. When \`inbox\` or a thread shows an open request you can meet, answer THROUGH it — \`respond\` to it, or \`stamp\` the contribution a review request is about — so it completes and the requester is notified. WHY: a plain reply that merely happens to answer leaves their request hanging (the most common failure). Requests are what you OWE; the Threads you are RESPONSIBLE for moving are \`thread_list\` (assign yourself or a teammate with \`thread_assign\` when responsibility is real, not to delegate one action — that is a request).
|
|
10745
10749
|
4. REVIEW honestly; promote the standout, sparingly. \`stamp\` to vouch or push back with a one-line why (you can't stamp your own work — request a review via \`request\`). PROMOTE a contribution/artifact only when it's the standout the org should find FIRST (the \uD83C\uDF96️). One deliberate exception (AD-200): in a STANDING thread, periodically promoting a distilling synthesis IS the job — it's how an open-forever lane compresses for newcomers and recall, not applause inflation; promoting your own synthesis there is fine (only stamps bar self-review). WHY: promotion is curation, not applause — and it's about an OUTPUT, never a whole thread (a thread RESOLVES; it is never "promoted").
|
|
10746
10750
|
5. EDIT, don't repost. \`edit\` your own contribution to sharpen it; the record stays audited. A genuinely different point is a NEW contribution.
|
|
@@ -11201,16 +11205,16 @@ var ACTION_DEFINITIONS = [
|
|
|
11201
11205
|
{
|
|
11202
11206
|
name: "contribute",
|
|
11203
11207
|
title: "Contribute to a thread",
|
|
11204
|
-
description: "Add one
|
|
11208
|
+
description: "Add one point people and agents will read to understand a Thread and decide what's next — make it additive: stamp for one-line agreement or disagreement, respond or mark_as_response for requests. Prose refs stay citations; links create deliberate reply/contest edges.",
|
|
11205
11209
|
inputSchema: {
|
|
11206
11210
|
threadId: string2().describe("the thread id, e.g. thr_…"),
|
|
11207
11211
|
type: _enum(CONTRIBUTION_TYPES).describe("the contribution type (AD-066 taxonomy)"),
|
|
11208
|
-
body: string2().min(1).describe(
|
|
11212
|
+
body: string2().min(1).describe(`the contribution markdown. ${CONTRIBUTION_BODY_GUIDANCE}`),
|
|
11209
11213
|
idempotencyKey: string2().min(1).max(200).optional().describe("stable key for this ONE logical contribution (≤200 chars), e.g. cron-run/work-item + output slot; safe retries return the original contribution. Reusing it with different content is a conflict."),
|
|
11210
|
-
summary: string2().max(500).optional().describe(
|
|
11214
|
+
summary: string2().max(500).optional().describe(`optional gist: ${CONTRIBUTION_SUMMARY_GUIDANCE}. It is what newcomers read first (the Thread distillate and the recall snippet) and it sharpens recall for long bodies; write one when the body is long`),
|
|
11211
11215
|
confidence: number2().int().min(0).max(100).optional().describe("optional 0–100 confidence"),
|
|
11212
11216
|
computerSessionId: string2().optional().describe("the attached computer session that produced this result, cms_…"),
|
|
11213
|
-
attachmentIds: array(string2()).max(10).optional().describe("Thread-scoped files to preserve with the contribution. To show
|
|
11217
|
+
attachmentIds: array(string2()).max(10).optional().describe("Thread-scoped files to preserve with the contribution. To show Computer media inline, place the attachments[].markdown returned by computer_verify or computer_export in the body; an attachment not placed in the body stays a compact download."),
|
|
11214
11218
|
mentions: array(object({
|
|
11215
11219
|
kind: _enum(["person", "contribution", "artifact"]),
|
|
11216
11220
|
id: string2(),
|
|
@@ -11228,8 +11232,8 @@ var ACTION_DEFINITIONS = [
|
|
|
11228
11232
|
description: "Edit the body or summary of your own contribution while preserving audit history; type and deliberate links stay fixed, and body refs update with the edited prose. Use this to sharpen the same point; post a new contribution for a genuinely different point.",
|
|
11229
11233
|
inputSchema: {
|
|
11230
11234
|
contributionId: string2().describe("your contribution's id, con_…"),
|
|
11231
|
-
body: string2().min(1).describe(
|
|
11232
|
-
summary: string2().max(500).optional().describe(
|
|
11235
|
+
body: string2().min(1).describe(`the replacement markdown body. ${CONTRIBUTION_BODY_GUIDANCE}`),
|
|
11236
|
+
summary: string2().max(500).optional().describe(`optional gist: ${CONTRIBUTION_SUMMARY_GUIDANCE} — omit to leave unchanged, empty string to clear`)
|
|
11233
11237
|
},
|
|
11234
11238
|
surfaces: ["mcp", "cli"],
|
|
11235
11239
|
toolset: "loop",
|
|
@@ -11351,7 +11355,7 @@ var ACTION_DEFINITIONS = [
|
|
|
11351
11355
|
spaceId: string2().describe("the space, spc_…"),
|
|
11352
11356
|
topicId: string2().describe("the topic to file it under, top_…"),
|
|
11353
11357
|
title: string2().min(1).describe("name the question, outcome, investigation, instance, or standing concern — not a status"),
|
|
11354
|
-
objective: string2().min(1).describe("what this Thread should accomplish; for finite work, state what done means")
|
|
11358
|
+
objective: string2().min(1).describe("what this Thread should accomplish, in plain words a newcomer understands; for finite work, state what done means")
|
|
11355
11359
|
},
|
|
11356
11360
|
surfaces: ["mcp", "cli"],
|
|
11357
11361
|
toolset: "loop",
|
|
@@ -12103,8 +12107,8 @@ var ACTION_DEFINITIONS = [
|
|
|
12103
12107
|
inputSchema: {
|
|
12104
12108
|
requestId: string2().describe("the request id, req_…"),
|
|
12105
12109
|
type: _enum(CONTRIBUTION_TYPES).describe("the contribution type"),
|
|
12106
|
-
body: string2().min(1).describe(
|
|
12107
|
-
summary: string2().max(500).optional().describe(
|
|
12110
|
+
body: string2().min(1).describe(`your response markdown. ${CONTRIBUTION_BODY_GUIDANCE}`),
|
|
12111
|
+
summary: string2().max(500).optional().describe(`optional gist: ${CONTRIBUTION_SUMMARY_GUIDANCE}`),
|
|
12108
12112
|
confidence: number2().int().min(0).max(100).optional(),
|
|
12109
12113
|
computerSessionId: string2().optional().describe("computer receipt to cite when the response came from computer work, cms_…"),
|
|
12110
12114
|
attachmentIds: array(string2()).max(10).optional().describe("Thread-scoped files preserved with the response; place computer_verify attachments[].markdown in the body for exact inline image placement")
|
package/package.json
CHANGED