@lambdacurry/arbor 0.24.32 → 0.24.34
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 +84 -10
- package/package.json +1 -1
package/dist/arbor.js
CHANGED
|
@@ -10324,6 +10324,20 @@ var RUN_PROVIDER_LIFECYCLE_PHASES = [
|
|
|
10324
10324
|
"workspace_freeze"
|
|
10325
10325
|
];
|
|
10326
10326
|
var RUN_PROVIDER_LIFECYCLE_PHASE_SET = new Set(RUN_PROVIDER_LIFECYCLE_PHASES);
|
|
10327
|
+
var RUN_RESTORE_PHASE_KEYS = [
|
|
10328
|
+
"verify",
|
|
10329
|
+
"cacheBoot",
|
|
10330
|
+
"cacheReady",
|
|
10331
|
+
"cacheSweep",
|
|
10332
|
+
"proof",
|
|
10333
|
+
"homeReset",
|
|
10334
|
+
"boot",
|
|
10335
|
+
"ready",
|
|
10336
|
+
"sweep",
|
|
10337
|
+
"extract",
|
|
10338
|
+
"chown"
|
|
10339
|
+
];
|
|
10340
|
+
var RUN_RESTORE_PHASE_KEY_SET = new Set(RUN_RESTORE_PHASE_KEYS);
|
|
10327
10341
|
var OWNER_ACTION_EVENT_TYPES = new Set([
|
|
10328
10342
|
"run.started",
|
|
10329
10343
|
"process.starting",
|
|
@@ -10830,6 +10844,14 @@ function buildOutputSchemas() {
|
|
|
10830
10844
|
lastDurableSnapshotId: id.nullable(),
|
|
10831
10845
|
unsavedChanges: literal("not-saved-by-close")
|
|
10832
10846
|
});
|
|
10847
|
+
const runRestoreFacts = looseObject({
|
|
10848
|
+
source: _enum(["native-cache", "durable-r2"]),
|
|
10849
|
+
decision: _enum(["ok", "no_native", "image_mismatch", "too_old"]).nullable().optional(),
|
|
10850
|
+
missPhase: _enum(["boot", "proof", "homeReset"]).nullable().optional(),
|
|
10851
|
+
missErrorType: string2().nullable().optional(),
|
|
10852
|
+
wallMs: number2().int().min(0).optional(),
|
|
10853
|
+
phasesMs: record(string2(), number2().int().min(0)).optional()
|
|
10854
|
+
});
|
|
10833
10855
|
const computerRunReceipt = looseObject({
|
|
10834
10856
|
runId: id,
|
|
10835
10857
|
threadId: id,
|
|
@@ -10917,6 +10939,10 @@ function buildOutputSchemas() {
|
|
|
10917
10939
|
reasonCode: string2().optional()
|
|
10918
10940
|
})),
|
|
10919
10941
|
lifecycle: array(looseObject({ type: string2(), at: string2() })),
|
|
10942
|
+
start: looseObject({
|
|
10943
|
+
admittedMs: number2().nullable(),
|
|
10944
|
+
restore: runRestoreFacts.extend({ observedAt: timestamp, providerGeneration: number2().int().min(0) }).nullable().describe("null means not recorded, never that no restore happened")
|
|
10945
|
+
}).describe("F1 start→admitted milliseconds and the provider's starting-restore facts"),
|
|
10920
10946
|
providerLifecycle: looseObject({
|
|
10921
10947
|
generation: number2().int().min(0).nullable(),
|
|
10922
10948
|
lastPhase: string2().nullable(),
|
|
@@ -10945,7 +10971,8 @@ function buildOutputSchemas() {
|
|
|
10945
10971
|
retryOperation: _enum(["run_terminal_checkpoint", "run_release", "run_checkpoint_publication"]).optional(),
|
|
10946
10972
|
retryAttempts: number2().int().positive().optional(),
|
|
10947
10973
|
retryLastFailedAt: timestamp.optional(),
|
|
10948
|
-
retryNextAttemptAt: timestamp.optional()
|
|
10974
|
+
retryNextAttemptAt: timestamp.optional(),
|
|
10975
|
+
restore: runRestoreFacts.optional()
|
|
10949
10976
|
}))
|
|
10950
10977
|
})
|
|
10951
10978
|
});
|
|
@@ -11273,6 +11300,21 @@ function buildOutputSchemas() {
|
|
|
11273
11300
|
lanesForYou: array(string2()).optional(),
|
|
11274
11301
|
topics: array(treeTopic).optional()
|
|
11275
11302
|
});
|
|
11303
|
+
const quickSearchResult = looseObject({
|
|
11304
|
+
exact: looseObject({
|
|
11305
|
+
id,
|
|
11306
|
+
kind: string2(),
|
|
11307
|
+
title: string2(),
|
|
11308
|
+
href: string2(),
|
|
11309
|
+
score: number2()
|
|
11310
|
+
}).nullable().optional(),
|
|
11311
|
+
groups: array(looseObject({
|
|
11312
|
+
kind: string2(),
|
|
11313
|
+
band: string2(),
|
|
11314
|
+
hits: array(jsonObject),
|
|
11315
|
+
more: literal(true).optional()
|
|
11316
|
+
}))
|
|
11317
|
+
});
|
|
11276
11318
|
const paged = (key, item) => looseObject({
|
|
11277
11319
|
[key]: array(item),
|
|
11278
11320
|
total: number2().optional(),
|
|
@@ -11422,6 +11464,20 @@ function buildOutputSchemas() {
|
|
|
11422
11464
|
startingSnapshot: snapshot.nullable(),
|
|
11423
11465
|
config: computerConfig
|
|
11424
11466
|
}),
|
|
11467
|
+
computer_topic_base: looseObject({
|
|
11468
|
+
topicId: id,
|
|
11469
|
+
topicBase: looseObject({ id, createdAt: timestamp, contentDigest: string2().nullable() }).nullable(),
|
|
11470
|
+
nativeCache: union([
|
|
11471
|
+
looseObject({
|
|
11472
|
+
state: literal("checked"),
|
|
11473
|
+
native: looseObject({ capturedImage: string2(), capturedAt: timestamp.nullable() }).nullable(),
|
|
11474
|
+
servingImageMatches: boolean2().nullable(),
|
|
11475
|
+
decision: _enum(["ok", "no_native", "image_mismatch", "too_old"]).nullable(),
|
|
11476
|
+
checkedAt: timestamp.nullable()
|
|
11477
|
+
}),
|
|
11478
|
+
looseObject({ state: literal("unavailable") })
|
|
11479
|
+
]).nullable().describe("null when there is no Topic base to check")
|
|
11480
|
+
}),
|
|
11425
11481
|
get_computer: looseObject({
|
|
11426
11482
|
threadId: id,
|
|
11427
11483
|
config: redactedComputerRecipe,
|
|
@@ -11620,8 +11676,10 @@ function buildOutputSchemas() {
|
|
|
11620
11676
|
spaces: array(treeSpace),
|
|
11621
11677
|
pageUnit: _enum(["spaces", "topics", "threads"]).optional(),
|
|
11622
11678
|
total: number2().int().min(0).optional(),
|
|
11623
|
-
nextCursor: string2().optional()
|
|
11679
|
+
nextCursor: string2().optional(),
|
|
11680
|
+
matches: quickSearchResult.optional()
|
|
11624
11681
|
}),
|
|
11682
|
+
quick_search: quickSearchResult,
|
|
11625
11683
|
members: looseObject({
|
|
11626
11684
|
members: array(orgMember),
|
|
11627
11685
|
total: number2().optional(),
|
|
@@ -13064,6 +13122,7 @@ var MCP_TOOL_ANNOTATIONS = {
|
|
|
13064
13122
|
set_topic_computer: destructiveIdempotent,
|
|
13065
13123
|
set_thread_computer: destructiveIdempotent,
|
|
13066
13124
|
get_computer: readOnly,
|
|
13125
|
+
computer_topic_base: readOnly,
|
|
13067
13126
|
computer_inventory: readOnly,
|
|
13068
13127
|
computer_audit_access: additive,
|
|
13069
13128
|
transition_thread: additive,
|
|
@@ -13080,6 +13139,7 @@ var MCP_TOOL_ANNOTATIONS = {
|
|
|
13080
13139
|
org_leave: destructive,
|
|
13081
13140
|
introduce: additive,
|
|
13082
13141
|
thread_get: readOnly,
|
|
13142
|
+
quick_search: readOnly,
|
|
13083
13143
|
tree: readOnly,
|
|
13084
13144
|
members: readOnly,
|
|
13085
13145
|
space_create: additive,
|
|
@@ -13451,7 +13511,7 @@ var ORIENTATION_SECTIONS = [
|
|
|
13451
13511
|
},
|
|
13452
13512
|
{
|
|
13453
13513
|
brief: "1. Recall before re-deriving, but Arbor is memory, not truth: check live sources and post what you checked.",
|
|
13454
|
-
full: `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:
|
|
13514
|
+
full: `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. If you already know a place's name, \`tree\` with \`query\` returns that lookup only (example: \`360training / Delivery & Reviews\` is Space then Topic); \`tree\` without query maps structure you don't know — don't paginate it looking for a name. In a large Space, don't search the whole org by habit: 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 room's standing ways to help (\`contributionLanes\`) that match what you said you do; follow one into \`space_get\`/\`topic_get\`, where the room's purpose, guidance, goals, and full list of ways to help live. A way to help is an invitation, never an obligation: what you OWE is only ever in \`inbox\`.`
|
|
13455
13515
|
},
|
|
13456
13516
|
{
|
|
13457
13517
|
brief: "2. Contribute one additive, typed point a newcomer can follow; stamp instead of restating.",
|
|
@@ -14485,7 +14545,7 @@ var ACTION_DEFINITIONS = [
|
|
|
14485
14545
|
{
|
|
14486
14546
|
name: "computer_run_receipt",
|
|
14487
14547
|
title: "Read a run receipt",
|
|
14488
|
-
description: "Read pending admission, finish continuation, Run-owned operation/activity state, and
|
|
14548
|
+
description: "Read pending admission, finish continuation, Run-owned operation/activity state, providerLifecycle, and the start facts with exactly one of runId or runStartId instead of parent computer_status. This read drives nothing; setupReadiness is not an instruction to reinstall: run computer_run_setup when the task needs a prepared workspace, then save work outside the temporary Computer before finishing.",
|
|
14489
14549
|
inputSchema: {
|
|
14490
14550
|
runId: string2().optional().describe("the Run to read, run_…; provide exactly one of runId or runStartId"),
|
|
14491
14551
|
runStartId: string2().optional().describe("the pending or linked RunStart to read, rsr_…; alternative to runId")
|
|
@@ -14929,6 +14989,17 @@ var ACTION_DEFINITIONS = [
|
|
|
14929
14989
|
toolset: "loop",
|
|
14930
14990
|
run: forward("computer.get")
|
|
14931
14991
|
},
|
|
14992
|
+
{
|
|
14993
|
+
name: "computer_topic_base",
|
|
14994
|
+
title: "Check a Topic base's native cache",
|
|
14995
|
+
description: "Read this Topic's current base and, live from Currybox control, its captured image and time, whether the serving image still matches, and the native-cache decision Runs will get. One read when asked: it never recaptures, retires, starts, or caches anything; nativeCache.state=unavailable means control could not answer, and a null topicBase means no base exists yet.",
|
|
14996
|
+
inputSchema: {
|
|
14997
|
+
topicId: string2().describe("the Topic, top_…")
|
|
14998
|
+
},
|
|
14999
|
+
surfaces: ["computer-mcp", "computer-cli"],
|
|
15000
|
+
toolset: "loop",
|
|
15001
|
+
run: forward("computer.topic_base")
|
|
15002
|
+
},
|
|
14932
15003
|
{
|
|
14933
15004
|
name: "computer_audit_access",
|
|
14934
15005
|
title: "Issue a Computer audit grant",
|
|
@@ -15328,11 +15399,12 @@ var ACTION_DEFINITIONS = [
|
|
|
15328
15399
|
{
|
|
15329
15400
|
name: "quick_search",
|
|
15330
15401
|
title: "Quick search places",
|
|
15331
|
-
description: "Jump to a place or person by name or short id: the Spaces, Topics, Threads and Artifacts you can open whose title (or objective, purpose, summary) contains every word, the people in your org whose name matches, best name match first, and an exact Thread short id (BUD-34) as `exact`. With `content`, the contributions you can open whose text holds every word (whole words, any word form), best match first, each with a short quote. The web ⌘K palette's two lookups: lexical, no embedding, no scope.
|
|
15402
|
+
description: "Jump to a place or person by name or short id: the Spaces, Topics, Threads and Artifacts you can open whose title (or objective, purpose, summary) contains every word, the people in your org whose name matches, best name match first, and an exact Thread short id (BUD-34) as `exact`. With `content`, the contributions you can open whose text holds every word (whole words, any word form), best match first, each with a short quote. The web ⌘K palette's two lookups: lexical, no embedding, no scope. Named navigation is `tree` with `query`; meaning is `recall`.",
|
|
15332
15403
|
inputSchema: {
|
|
15333
15404
|
q: string2().min(2).max(200).describe("a place or person name to look up, or a Thread short id such as BUD-34"),
|
|
15334
15405
|
content: boolean2().optional().describe("search what contributions said instead of place names")
|
|
15335
15406
|
},
|
|
15407
|
+
cliHelpLead: "Unscoped name lookup (palette parity). Named navigation → `arbor tree --query`. Content by meaning → `arbor recall`.",
|
|
15336
15408
|
surfaces: ["cli"],
|
|
15337
15409
|
toolset: "loop",
|
|
15338
15410
|
run: Object.assign((ex, { content, ...input }) => ex.call(content === true ? "search.content" : "search.quick", input), { operations: ["search.quick", "search.content"] })
|
|
@@ -15340,8 +15412,9 @@ var ACTION_DEFINITIONS = [
|
|
|
15340
15412
|
{
|
|
15341
15413
|
name: "tree",
|
|
15342
15414
|
title: "Navigate the workspace tree",
|
|
15343
|
-
description: `Map Spaces to Topics to Threads
|
|
15415
|
+
description: `Map Spaces to Topics to Threads; query matches only (\`360training / Delivery & Reviews\`); external reads page ${TREE_EXTERNAL_DEFAULT_PAGE_SIZE} roots by default, all=true is complete: unscoped tree pages Spaces, Space-scoped tree pages Topics, and Topic-scoped depth=threads pages Threads. For a bounded Thread roster, scope to one Topic; Topic activeThreadCount is the current working set, status is area attention, not personal obligation (inbox), and depth=threads should stay scoped unless complete enumeration is intentional.`,
|
|
15344
15416
|
inputSchema: {
|
|
15417
|
+
query: string2().min(2).max(200).optional().describe('known name or slash path ("360training / Delivery & Reviews"); returns matches only (no map/page); space/topic ids still scope the lookup'),
|
|
15345
15418
|
space: string2().optional().describe("scope to one space id (spc_…)"),
|
|
15346
15419
|
topic: string2().optional().describe("scope to one topic id (top_…)"),
|
|
15347
15420
|
depth: _enum(["spaces", "topics", "threads"]).optional().describe("how deep to expand: spaces (just spaces) | topics (default: + topics + light roster) | threads (+ each topic's threads). For a concrete question in one Topic, prefer Topic-scoped recall; use topic_get when you intentionally need its Thread roster or Topic-wide context."),
|
|
@@ -15349,6 +15422,7 @@ var ACTION_DEFINITIONS = [
|
|
|
15349
15422
|
cursor: PAGINATION_INPUT.cursor,
|
|
15350
15423
|
all: PAGINATION_INPUT.all
|
|
15351
15424
|
},
|
|
15425
|
+
cliHelpLead: 'Known name → `arbor tree --query "360training / Delivery & Reviews"`. Map structure → `arbor tree`. Content by meaning → `arbor recall`.',
|
|
15352
15426
|
externalReadDefaults: { limit: TREE_EXTERNAL_DEFAULT_PAGE_SIZE },
|
|
15353
15427
|
surfaces: ["mcp", "cli"],
|
|
15354
15428
|
toolset: "loop",
|
|
@@ -16767,7 +16841,7 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
|
|
|
16767
16841
|
});
|
|
16768
16842
|
|
|
16769
16843
|
// ../actions/src/retention-entry.ts
|
|
16770
|
-
var ARBOR_VERSION = "0.24.
|
|
16844
|
+
var ARBOR_VERSION = "0.24.34";
|
|
16771
16845
|
var historyPolicySchema = _enum(["full", "checkpoint"]).optional().describe("text Artifacts: future history retention policy; full retains every source snapshot, checkpoint keeps metadata for every revision and source only when explicitly retained");
|
|
16772
16846
|
var retainSourceSchema = boolean2().optional().describe("edit: in checkpoint mode, retain this newly minted content revision's source");
|
|
16773
16847
|
var checkpointSchema = boolean2().optional().describe("edit: retain the exact current version source without incrementing content version");
|
|
@@ -17175,7 +17249,7 @@ function dispositionFilename(value) {
|
|
|
17175
17249
|
// package.json
|
|
17176
17250
|
var package_default = {
|
|
17177
17251
|
name: "@lambdacurry/arbor",
|
|
17178
|
-
version: "0.24.
|
|
17252
|
+
version: "0.24.34",
|
|
17179
17253
|
description: "The Arbor CLI — a shared workspace for people and agents. The human + headless-agent write path over Arbor's guarded operation surface.",
|
|
17180
17254
|
keywords: [
|
|
17181
17255
|
"agents",
|
|
@@ -18086,7 +18160,7 @@ var KNOWN_MISREACHES = [
|
|
|
18086
18160
|
{
|
|
18087
18161
|
tried: "search",
|
|
18088
18162
|
use: "recall <query>",
|
|
18089
|
-
why:
|
|
18163
|
+
why: 'recall searches what was said; `tree --query "360training / Delivery & Reviews"` jumps to a known name'
|
|
18090
18164
|
},
|
|
18091
18165
|
{ tried: "update topic", use: "topic update --topic-id top_…", why: "this command is noun-verb" },
|
|
18092
18166
|
{ tried: "update space", use: "space update --space-id spc_…", why: "this command is noun-verb" },
|
|
@@ -18617,7 +18691,7 @@ function renderVersion(ctx) {
|
|
|
18617
18691
|
}
|
|
18618
18692
|
var HELP = `arbor — the Arbor CLI: people and agents deliberate on typed work, and Arbor remembers
|
|
18619
18693
|
what's settled. Your token (env ARBOR_TOKEN, or \`arbor auth\`) resolves who you act AS — the CLI
|
|
18620
|
-
never asserts it. Run \`arbor whoami\` to confirm, \`arbor tree\` to map the workspace.
|
|
18694
|
+
never asserts it. Run \`arbor whoami\` to confirm, \`arbor tree --query "360training / Delivery & Reviews"\` to jump to a known place, \`arbor tree\` to map the workspace, \`arbor recall\` for content.
|
|
18621
18695
|
|
|
18622
18696
|
${ORIENTATION}
|
|
18623
18697
|
|
package/package.json
CHANGED