@lambdacurry/arbor 0.23.8 → 0.23.10
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 +57 -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.
|
|
5
|
+
version: "0.23.10",
|
|
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",
|
|
@@ -8012,6 +8012,17 @@ var COMPUTER_WORKSPACE_RECOVERY_LEASE_MS = COMPUTER_WORKSPACE_RECOVERY_CHECKPOIN
|
|
|
8012
8012
|
|
|
8013
8013
|
// ../core/src/queries/artifact-base.ts
|
|
8014
8014
|
var eventChronology = sql`_rowid_`;
|
|
8015
|
+
var SPACE_ARTIFACT_STATUSES = [
|
|
8016
|
+
"draft",
|
|
8017
|
+
"proposed",
|
|
8018
|
+
"active",
|
|
8019
|
+
"promoted",
|
|
8020
|
+
"needs-review",
|
|
8021
|
+
"superseded",
|
|
8022
|
+
"deprecated",
|
|
8023
|
+
"archived"
|
|
8024
|
+
];
|
|
8025
|
+
var artifactUpdatedAt = sql`coalesce((select max(${events.createdAt}) from ${events} where ${events.objectType} = 'artifact' and ${events.objectId} = ${artifacts.id}), ${artifacts.createdAt})`;
|
|
8015
8026
|
// ../core/src/ops/request.ts
|
|
8016
8027
|
var REQUEST_TTL_MS = 14 * 24 * 60 * 60 * 1000;
|
|
8017
8028
|
|
|
@@ -9336,6 +9347,21 @@ var MCP_OUTPUT_SCHEMAS = {
|
|
|
9336
9347
|
threadId: id.nullable().optional(),
|
|
9337
9348
|
changed: boolean2().optional()
|
|
9338
9349
|
}),
|
|
9350
|
+
artifact_list: looseObject({
|
|
9351
|
+
artifacts: array(object({
|
|
9352
|
+
id,
|
|
9353
|
+
title: string2(),
|
|
9354
|
+
type: string2(),
|
|
9355
|
+
status: string2(),
|
|
9356
|
+
topicId: id,
|
|
9357
|
+
topicTitle: string2(),
|
|
9358
|
+
threadId: id,
|
|
9359
|
+
threadTitle: string2(),
|
|
9360
|
+
updatedAt: timestamp
|
|
9361
|
+
})),
|
|
9362
|
+
total: number2().int().nonnegative(),
|
|
9363
|
+
nextCursor: string2().optional()
|
|
9364
|
+
}),
|
|
9339
9365
|
artifact_get: object({
|
|
9340
9366
|
id,
|
|
9341
9367
|
title: string2(),
|
|
@@ -10394,6 +10420,7 @@ var MCP_TOOL_ANNOTATIONS = {
|
|
|
10394
10420
|
curation: additive,
|
|
10395
10421
|
artifact: additive,
|
|
10396
10422
|
artifact_get: readOnly,
|
|
10423
|
+
artifact_list: readOnly,
|
|
10397
10424
|
tldraw_create: idempotent,
|
|
10398
10425
|
tldraw_import: idempotent,
|
|
10399
10426
|
tldraw_get: readOnly,
|
|
@@ -10703,6 +10730,8 @@ ${ARBOR_FEEDBACK_GUIDANCE}
|
|
|
10703
10730
|
|
|
10704
10731
|
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.
|
|
10705
10732
|
|
|
10733
|
+
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.
|
|
10734
|
+
|
|
10706
10735
|
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\`.
|
|
10707
10736
|
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.
|
|
10708
10737
|
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).
|
|
@@ -10834,6 +10863,14 @@ var PAGINATION_INPUT = {
|
|
|
10834
10863
|
cursor: string2().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)"),
|
|
10835
10864
|
all: boolean2().optional().describe("explicit complete retrieval — skip the bounded default page. Prefer limit+cursor unless you need the whole collection")
|
|
10836
10865
|
};
|
|
10866
|
+
var ARTIFACT_LIST_DESCRIPTION = "List one Space's Artifacts, most recently updated first, one page at a time. Topic, type, and status filters run before the page; deleted Artifacts stay out, and this read cannot edit one.";
|
|
10867
|
+
var ARTIFACT_LIST_INPUT = {
|
|
10868
|
+
spaceId: string2().describe("the Space, spc_…"),
|
|
10869
|
+
topicId: union([string2().min(1), array(string2().min(1)).min(1)]).optional().describe("source Topic ids, top_…. One or more. Filters before the page. Omit for every Topic in the Space."),
|
|
10870
|
+
type: union([_enum(ARTIFACT_TYPES), array(_enum(ARTIFACT_TYPES)).min(1)]).optional().describe("existing Artifact type. One or more. Filters before the page."),
|
|
10871
|
+
status: union([_enum(SPACE_ARTIFACT_STATUSES), array(_enum(SPACE_ARTIFACT_STATUSES)).min(1)]).optional().describe("lifecycle: draft, proposed, active, promoted, needs-review, superseded, deprecated, or archived. One or more. Deleted stays out. Omit for every non-deleted Artifact. Filters before the page."),
|
|
10872
|
+
...PAGINATION_INPUT
|
|
10873
|
+
};
|
|
10837
10874
|
var WORKFLOW_LABEL_INPUT = object({
|
|
10838
10875
|
key: string2().min(1).describe("stable id within this workflow"),
|
|
10839
10876
|
name: string2().min(1).describe("room-facing column name"),
|
|
@@ -11898,6 +11935,15 @@ var ACTION_DEFINITIONS = [
|
|
|
11898
11935
|
toolset: "artifacts",
|
|
11899
11936
|
run: forward("artifact.get")
|
|
11900
11937
|
},
|
|
11938
|
+
{
|
|
11939
|
+
name: "list_artifacts",
|
|
11940
|
+
title: "List a Space's Artifacts",
|
|
11941
|
+
description: ARTIFACT_LIST_DESCRIPTION,
|
|
11942
|
+
inputSchema: ARTIFACT_LIST_INPUT,
|
|
11943
|
+
surfaces: ["cli"],
|
|
11944
|
+
toolset: "artifacts",
|
|
11945
|
+
run: forward("artifact.listBySpace")
|
|
11946
|
+
},
|
|
11901
11947
|
{
|
|
11902
11948
|
name: "edit_artifact",
|
|
11903
11949
|
title: "Edit a text artifact",
|
|
@@ -12914,6 +12960,15 @@ var ACTION_DEFINITIONS = [
|
|
|
12914
12960
|
toolset: "artifacts",
|
|
12915
12961
|
run: forward("artifact.get")
|
|
12916
12962
|
},
|
|
12963
|
+
{
|
|
12964
|
+
name: "artifact_list",
|
|
12965
|
+
title: "List a Space's Artifacts",
|
|
12966
|
+
description: ARTIFACT_LIST_DESCRIPTION,
|
|
12967
|
+
inputSchema: ARTIFACT_LIST_INPUT,
|
|
12968
|
+
surfaces: ["mcp"],
|
|
12969
|
+
toolset: "artifacts",
|
|
12970
|
+
run: forward("artifact.listBySpace")
|
|
12971
|
+
},
|
|
12917
12972
|
{
|
|
12918
12973
|
name: "artifact_transition",
|
|
12919
12974
|
title: "Change an Artifact's lifecycle",
|
|
@@ -12959,7 +13014,7 @@ var ACTION_DEFINITIONS = [
|
|
|
12959
13014
|
{
|
|
12960
13015
|
name: "tldraw_get",
|
|
12961
13016
|
title: "Read a tldraw board",
|
|
12962
|
-
description: "Read
|
|
13017
|
+
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",
|
|
12963
13018
|
inputSchema: {
|
|
12964
13019
|
artifactId: string2().describe("the tldraw Artifact, art_…"),
|
|
12965
13020
|
version: number2().int().min(1).optional().describe("optional historical version number")
|
package/package.json
CHANGED