@lambdacurry/arbor 0.23.7 → 0.23.9

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 +41 -16
  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.7",
5
+ version: "0.23.9",
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",
@@ -8438,6 +8438,19 @@ var computerRunFinishRequest = looseObject({
8438
8438
  providerGeneration: number2().int().nonnegative().nullable(),
8439
8439
  releasedSnapshotId: id.nullable()
8440
8440
  });
8441
+ var computerExecOutput = looseObject({
8442
+ stdout: string2().optional(),
8443
+ stderr: string2().optional(),
8444
+ exitCode: number2().optional(),
8445
+ processId: string2().optional(),
8446
+ status: string2().optional(),
8447
+ timedOut: boolean2().optional(),
8448
+ truncated: boolean2().optional().describe("true when returned stdout/stderr is partial and more output remains"),
8449
+ nextCursor: string2().optional().describe("opaque cursor for continuing partial output with computer_process_read"),
8450
+ cwd: string2().optional(),
8451
+ execution: _enum(["completed", "running"]).optional(),
8452
+ nextAction: literal("computer_process_read").optional()
8453
+ });
8441
8454
  var computerRunReceipt2 = looseObject({
8442
8455
  runId: id,
8443
8456
  threadId: id,
@@ -9768,19 +9781,8 @@ var MCP_OUTPUT_SCHEMAS = {
9768
9781
  failureCode: string2().nullable(),
9769
9782
  reason: string2()
9770
9783
  }),
9771
- computer_exec: looseObject({
9772
- stdout: string2().optional(),
9773
- stderr: string2().optional(),
9774
- exitCode: number2().optional(),
9775
- processId: string2().optional(),
9776
- status: string2().optional(),
9777
- timedOut: boolean2().optional(),
9778
- truncated: boolean2().optional().describe("true when returned stdout/stderr is partial and more output remains"),
9779
- nextCursor: string2().optional().describe("opaque cursor for continuing partial output with computer_process_read"),
9780
- cwd: string2().optional(),
9781
- execution: _enum(["completed", "running"]).optional(),
9782
- nextAction: literal("computer_process_read").optional()
9783
- }),
9784
+ computer_exec: computerExecOutput,
9785
+ computer_run_setup: computerExecOutput,
9784
9786
  computer_process_read: looseObject({
9785
9787
  processId: string2(),
9786
9788
  status: string2(),
@@ -10308,6 +10310,12 @@ var openWorld = {
10308
10310
  idempotentHint: false,
10309
10311
  openWorldHint: true
10310
10312
  };
10313
+ var destructiveIdempotentOpenWorld = {
10314
+ readOnlyHint: false,
10315
+ destructiveHint: true,
10316
+ idempotentHint: true,
10317
+ openWorldHint: true
10318
+ };
10311
10319
  var destructiveOpenWorld = {
10312
10320
  readOnlyHint: false,
10313
10321
  destructiveHint: true,
@@ -10429,6 +10437,7 @@ var MCP_TOOL_ANNOTATIONS = {
10429
10437
  computer_run_receipt: readOnly,
10430
10438
  computer_runs: readOnly,
10431
10439
  computer_exec: destructiveOpenWorld,
10440
+ computer_run_setup: destructiveIdempotentOpenWorld,
10432
10441
  computer_process_read: readOnly,
10433
10442
  computer_process_terminate: destructiveOpenWorld,
10434
10443
  computer_status: readOnly,
@@ -10694,6 +10703,8 @@ ${ARBOR_FEEDBACK_GUIDANCE}
10694
10703
 
10695
10704
  Arbor's MCP is the collaboration and durable-knowledge surface. Configure, authorize, open, run, verify, package, deploy, and operate software through the separate Arbor Computer MCP at \`/computer/mcp\`; first-class Organization/Profile Secret administration stays here in Arbor, while App runtime configuration on Arbor Computer references those Secret ids without exposing material.
10696
10705
 
10706
+ 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.
10707
+
10697
10708
  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\`.
10698
10709
  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.
10699
10710
  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).
@@ -11519,7 +11530,7 @@ var ACTION_DEFINITIONS = [
11519
11530
  {
11520
11531
  name: "computer_run_receipt",
11521
11532
  title: "Read a run receipt",
11522
- description: "Read with exactly one of runId or runStartId: observe pending admission, finish continuation, Run-owned operation/activity state, and providerLifecycle instead of parent computer_status. Reads never drive admission or finish; the existing lifecycle owner continues independently.",
11533
+ description: "Read with exactly one of runId or runStartId: observe pending admission, finish continuation, Run-owned operation/activity state, and providerLifecycle instead of parent computer_status. Reads never drive admission or finish; the existing lifecycle owner continues independently. setupReadiness says whether declared setup still matches this workspace; computer_run_setup is what makes it ready.",
11523
11534
  inputSchema: {
11524
11535
  runId: string2().optional().describe("the Run to read, run_…; provide exactly one of runId or runStartId"),
11525
11536
  runStartId: string2().optional().describe("the pending or linked RunStart to read, rsr_…; alternative to runId")
@@ -11528,6 +11539,20 @@ var ACTION_DEFINITIONS = [
11528
11539
  toolset: "loop",
11529
11540
  run: forward("computer_runtime.run_receipt")
11530
11541
  },
11542
+ {
11543
+ name: "computer_run_setup",
11544
+ title: "Run the declared setup",
11545
+ description: "Run this Run's own declared project setup once, explicitly — Arbor resolves the authoritative recipe internally, so you neither supply nor see the command, and reusing the same idempotencyKey recovers a lost response instead of installing twice. Nothing runs it for you: a successful run is what makes setupReadiness ready, and it is refused unless the Run is isolated and a setup is declared.",
11546
+ inputSchema: {
11547
+ runId: string2().describe("the Run whose declared setup should run, run_…"),
11548
+ idempotencyKey: string2().describe("stable key for this ONE logical setup request; reuse it unchanged for retries"),
11549
+ background: boolean2().optional().describe("return a processId immediately instead of waiting; read it with computer_process_read"),
11550
+ timeout: number2().int().optional().describe("process kill deadline in milliseconds")
11551
+ },
11552
+ surfaces: ["computer-mcp", "computer-cli"],
11553
+ toolset: "loop",
11554
+ run: forward("computer_runtime.run_setup")
11555
+ },
11531
11556
  {
11532
11557
  name: "computer_runs",
11533
11558
  title: "List runs",
@@ -12936,7 +12961,7 @@ var ACTION_DEFINITIONS = [
12936
12961
  {
12937
12962
  name: "tldraw_get",
12938
12963
  title: "Read a tldraw board",
12939
- description: "Read the current or one historical tldraw board version, its immutable source references, version list, edit access, and document-script state. Historical versions are read-only.",
12964
+ description: "Read current/historical tldraw versions: immutable source refs, versions, edit access, doc/script state; historical read-only; `liveHref` opens the live board; `url` opens the Arbor Artifact details/history page",
12940
12965
  inputSchema: {
12941
12966
  artifactId: string2().describe("the tldraw Artifact, art_…"),
12942
12967
  version: number2().int().min(1).optional().describe("optional historical version number")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.23.7",
3
+ "version": "0.23.9",
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",