@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.
Files changed (2) hide show
  1. package/dist/arbor.js +17 -13
  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.17",
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 genuinely additive typed contribution to a Thread; use stamp for one-line agreement/disagreement and respond or mark_as_response for requests, while prose refs stay citations and links create deliberate reply/contest edges. For Computer media evidence, place the attachments[].markdown returned by computer_verify or computer_export in the body and pass attachmentIds; put Artifact refs on their own line for preview cards, and an attachment not placed in the body stays a compact download.",
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("the contribution text"),
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("optional gist, 1-2 short sentences — HARD LIMIT 500 characters (the request is rejected past it, so keep well under). Becomes the recall snippet AND sharpens recall for long contributions (it's prepended to the embedded text); write one when the body is long"),
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 computer_verify image evidence inline, also place its returned attachments[].markdown in the body."),
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("the replacement markdown body"),
11232
- summary: string2().max(500).optional().describe("optional gist, 1-2 short sentences (HARD LIMIT 500 characters) — omit to leave unchanged, empty string to clear")
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("your response"),
12107
- summary: string2().max(500).optional().describe("optional gist, 1-2 short sentences (HARD LIMIT 500 characters)"),
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.23.17",
3
+ "version": "0.23.19",
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",