@lambdacurry/arbor 0.21.10 → 0.21.12

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 +65 -40
  2. package/package.json +1 -1
package/dist/arbor.js CHANGED
@@ -17207,6 +17207,17 @@ function date4(params) {
17207
17207
 
17208
17208
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
17209
17209
  config(en_default());
17210
+ // ../actions/src/external-read-defaults.ts
17211
+ var EXTERNAL_DEFAULT_PAGE_SIZE = 50;
17212
+ var EXTERNAL_DEFAULT_CONTRIB_LIMIT = 50;
17213
+ var EXTERNAL_DEFAULT_THREAD_VIEW = "compact";
17214
+ var EXTERNAL_READ_DEFAULTS_BY_OPERATION = {};
17215
+ function recordExternalReadDefaults(operation, defaults) {
17216
+ if (!operation || !defaults)
17217
+ return;
17218
+ EXTERNAL_READ_DEFAULTS_BY_OPERATION[operation] = defaults;
17219
+ }
17220
+
17210
17221
  // ../actions/src/output-schemas.ts
17211
17222
  var id = exports_external.string();
17212
17223
  var timestamp = exports_external.string();
@@ -18507,7 +18518,6 @@ var MCP_OUTPUT_SCHEMAS = {
18507
18518
  function outputSchemaFor(actionName) {
18508
18519
  return MCP_OUTPUT_SCHEMAS[actionName];
18509
18520
  }
18510
-
18511
18521
  // ../actions/src/output-shaping.ts
18512
18522
  function record2(value) {
18513
18523
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -18935,7 +18945,15 @@ function isProseList(schema) {
18935
18945
  return PROSE_LISTS.has(schema);
18936
18946
  }
18937
18947
  function forward(operation) {
18938
- return (ex, input) => ex.call(operation, input);
18948
+ const run = (ex, input) => ex.call(operation, input);
18949
+ run.operation = operation;
18950
+ return run;
18951
+ }
18952
+ function forwardedOperation(run) {
18953
+ if (!("operation" in run))
18954
+ return;
18955
+ const value = run.operation;
18956
+ return typeof value === "string" ? value : undefined;
18939
18957
  }
18940
18958
  function dispatch(map2, reshape) {
18941
18959
  return (ex, input) => {
@@ -18989,10 +19007,11 @@ function runAdminFeedback(ex, input) {
18989
19007
  return ex.call("feedback_admin.topic", rest);
18990
19008
  return Promise.reject(new Error(`unknown verb "${verb ?? ""}" — expected one of: ${ADMIN_FEEDBACK_VERB_HELP}`));
18991
19009
  }
18992
- var NOTIFICATION_TRIAGE_DESCRIPTION = "READ ONLY: List your awareness feed newest first with unseen count and derived triage class: `settled-context` = settled Thread context; `owed-by-me` = an open request pointing to `inbox`; `judgment-available` = live engagement inviting judgment; `closed-loop` = your request completed; `room-motion` = ambient activity. Notifications are FYI, not a second obligation surface: `inbox` alone contains work owed by you; this cannot mark notifications read or modify inbox obligations.";
19010
+ var NOTIFICATION_TRIAGE_DESCRIPTION = "List your awareness feed newest first with unseen count and derived triage class: `settled-context` = settled Thread context; `owed-by-me` = an open request pointing to `inbox`; `judgment-available` = live engagement inviting judgment; `closed-loop` = your request completed; `room-motion` = ambient activity. Notifications are FYI, not a second obligation surface: `inbox` alone contains work owed by you; this cannot mark notifications read or modify inbox obligations.";
18993
19011
  var PAGINATION_INPUT = {
18994
- limit: exports_external.number().int().min(1).optional().describe("max items to return — enables pagination"),
18995
- cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)")
19012
+ limit: exports_external.number().int().min(1).optional().describe(`max items to return. MCP/CLI/API default to ${EXTERNAL_DEFAULT_PAGE_SIZE} and return nextCursor when more remain; pass all=true/--all for the complete list. In-process web omit is still a compatibility full read`),
19013
+ cursor: exports_external.string().optional().describe("opaque cursor from a prior response's nextCursor (use with --limit)"),
19014
+ all: exports_external.boolean().optional().describe("explicit complete retrieval — skip the bounded default page. Prefer limit+cursor unless you need the whole collection")
18996
19015
  };
18997
19016
  var LIVE_PREVIEW_CONFIG_INPUT = {
18998
19017
  livePreview: exports_external.object({
@@ -19006,7 +19025,7 @@ var ACTION_DEFINITIONS = [
19006
19025
  {
19007
19026
  name: "server_info",
19008
19027
  title: "Inspect Arbor server version",
19009
- description: "READ ONLY: Return the Arbor release version and current Cloudflare deployment identity so a client can distinguish a fresh server from a cached tool catalog. This cannot modify Arbor, Computer, App, access, or durable state.",
19028
+ description: "Return the Arbor release version and current Cloudflare deployment identity so a client can distinguish a fresh server from a cached tool catalog. This cannot modify Arbor, Computer, App, access, or durable state.",
19010
19029
  inputSchema: {},
19011
19030
  surfaces: ["mcp", "cli", "computer-mcp", "computer-cli"],
19012
19031
  toolset: "structure",
@@ -19015,7 +19034,7 @@ var ACTION_DEFINITIONS = [
19015
19034
  {
19016
19035
  name: "github_repositories",
19017
19036
  title: "List installed GitHub repositories",
19018
- description: "READ ONLY: List repositories covered by this organization's verified Arbor Computer GitHub App, returning ids and metadata but never credentials. Use github_connect_repository to authorize one at an Arbor scope; listing alone grants no Computer access.",
19037
+ description: "List repositories covered by this organization's verified Arbor Computer GitHub App, returning ids and metadata but never credentials. Use github_connect_repository to authorize one at an Arbor scope; listing alone grants no Computer access.",
19019
19038
  inputSchema: { ...PAGINATION_INPUT },
19020
19039
  surfaces: ["computer-mcp", "cli"],
19021
19040
  toolset: "projects",
@@ -19065,7 +19084,7 @@ var ACTION_DEFINITIONS = [
19065
19084
  {
19066
19085
  name: "recall",
19067
19086
  title: "Recall existing knowledge",
19068
- description: "READ ONLY: Search Arbor semantically for existing contributions, artifacts, and decisions. Use `tree` for lifecycle/attention routing; once you know the area, pass space/topic/thread to keep recall inside that working set before targeted reads.",
19087
+ description: "Search Arbor semantically for existing contributions, artifacts, and decisions. Use `tree` for lifecycle/attention routing; once you know the area, pass space/topic/thread to keep recall inside that working set before targeted reads.",
19069
19088
  inputSchema: {
19070
19089
  query: exports_external.string().min(1).describe("what you want to recall, in natural language"),
19071
19090
  space: exports_external.string().optional().describe("optional space id to scope the search"),
@@ -19081,7 +19100,7 @@ var ACTION_DEFINITIONS = [
19081
19100
  {
19082
19101
  name: "feedback_tree",
19083
19102
  title: "Browse the shared Arbor Feedback forum",
19084
- description: "READ ONLY: Browse the global Arbor Feedback forum by Topic and optional Thread roster; the global scope is implied and no Space id is required. New reports appear as their own shared Threads as submitted; private receipt metadata and reviewer diagnostics are never returned.",
19103
+ description: "Browse the global Arbor Feedback forum by Topic and optional Thread roster; the global scope is implied and no Space id is required. New reports appear as their own shared Threads as submitted; private receipt metadata and reviewer diagnostics are never returned.",
19085
19104
  inputSchema: {
19086
19105
  depth: exports_external.enum(["topics", "threads"]).optional().describe("topics (default) or threads to include each Topic's shared Thread roster"),
19087
19106
  includeArchived: exports_external.boolean().optional().describe("include archived Topics/Threads for historical moderation or lookup (default false)")
@@ -19093,7 +19112,7 @@ var ACTION_DEFINITIONS = [
19093
19112
  {
19094
19113
  name: "feedback_recall",
19095
19114
  title: "Find known Arbor feedback",
19096
- description: "READ ONLY: Search the global shared Arbor Feedback forum for reports, workarounds, and decisions; scope to a Topic after feedback_tree when useful. New report bodies are searchable as submitted; private receipt ids, reporter metadata, and reviewer diagnostics are never returned.",
19115
+ description: "Search the global shared Arbor Feedback forum for reports, workarounds, and decisions; scope to a Topic after feedback_tree when useful. New report bodies are searchable as submitted; private receipt ids, reporter metadata, and reviewer diagnostics are never returned.",
19097
19116
  inputSchema: {
19098
19117
  query: exports_external.string().min(1).describe("the Arbor friction, issue, workaround, or idea to find"),
19099
19118
  topicId: exports_external.string().optional().describe("optional shared Feedback Topic id from feedback_tree"),
@@ -19106,7 +19125,7 @@ var ACTION_DEFINITIONS = [
19106
19125
  {
19107
19126
  name: "feedback_thread_get",
19108
19127
  title: "Read a shared Arbor Feedback thread",
19109
- description: "READ ONLY: Read one shared Arbor Feedback Thread, following a merge redirect to its canonical destination while preserving shared provenance. A newly filed report appears here as submitted; private receipt ids, reporter organization metadata, diagnostics, and private associations are not projected.",
19128
+ description: "Read one shared Arbor Feedback Thread, following a merge redirect to its canonical destination while preserving shared provenance. A newly filed report appears here as submitted; private receipt ids, reporter organization metadata, diagnostics, and private associations are not projected.",
19110
19129
  inputSchema: {
19111
19130
  threadId: exports_external.string().describe("the shared Feedback Thread id, thr_…")
19112
19131
  },
@@ -19135,7 +19154,7 @@ var ACTION_DEFINITIONS = [
19135
19154
  {
19136
19155
  name: "feedback_status",
19137
19156
  title: "Check your Arbor feedback receipt",
19138
- description: "READ ONLY: Check triage metadata and the shared identity for one Arbor feedback receipt you own. Missing and not-owned receipts look identical; receiptPrivate=true covers reviewer metadata, while visibility/sharedThreadId describe the filed report, and no raw body, identities, diagnostics, or private association targets are returned.",
19157
+ description: "Check triage metadata and the shared identity for one Arbor feedback receipt you own. Missing and not-owned receipts look identical; receiptPrivate=true covers reviewer metadata, while visibility/sharedThreadId describe the filed report, and no raw body, identities, diagnostics, or private association targets are returned.",
19139
19158
  inputSchema: {
19140
19159
  feedbackId: exports_external.string().describe("your Arbor feedback receipt id, fbk_…")
19141
19160
  },
@@ -19569,7 +19588,7 @@ var ACTION_DEFINITIONS = [
19569
19588
  {
19570
19589
  name: "computer_repo_work_status",
19571
19590
  title: "Inspect repository finish state",
19572
- description: "READ ONLY: Inspect an active isolated WRITE Run's Git publication, PR, CI, and review before retry, wait, or finish. Returns repository state (e.g. ci-pending) plus runDisposition.action computer_run_suspend when published work waits on CI/review/human authorization — the same runId resumes; dirty, unpublished, unknown-publication, failing, or changes-requested work keeps the local nextAction.",
19591
+ description: "Inspect an active isolated WRITE Run's Git publication, PR, CI, and review before retry, wait, or finish. Returns repository state (e.g. ci-pending) plus runDisposition.action computer_run_suspend when published work waits on CI/review/human authorization — the same runId resumes; dirty, unpublished, unknown-publication, failing, or changes-requested work keeps the local nextAction.",
19573
19592
  inputSchema: {
19574
19593
  runId: exports_external.string().describe("the active isolated WRITE Run to inspect, run_…")
19575
19594
  },
@@ -19594,7 +19613,7 @@ var ACTION_DEFINITIONS = [
19594
19613
  {
19595
19614
  name: "computer_run_receipt",
19596
19615
  title: "Read a run receipt",
19597
- description: "READ ONLY: Inspect one Run's durable receipt during or after execution, including its Run-owned operation/activity state and a compact providerLifecycle journal (generation, last phase, typed reason) separate from command/process activity. Use this instead of parent computer_status; it returns compact history, not transcripts, and does not rewrite terminal reasonCode.",
19616
+ description: "Inspect one Run's durable receipt during or after execution, including its Run-owned operation/activity state and a compact providerLifecycle journal (generation, last phase, typed reason) separate from command/process activity. Use this instead of parent computer_status; it returns compact history, not transcripts, and does not rewrite terminal reasonCode.",
19598
19617
  inputSchema: {
19599
19618
  runId: exports_external.string().describe("the run to read, run_… (from computer_run_start or computer_runs)")
19600
19619
  },
@@ -19605,7 +19624,7 @@ var ACTION_DEFINITIONS = [
19605
19624
  {
19606
19625
  name: "computer_runs",
19607
19626
  title: "List runs",
19608
- description: "READ ONLY: List active or recent Runs for this Thread Computer when deciding whether to resume existing work or start another unit. Returns each Run's mode, execution placement, workspace identity, and lifecycle status.",
19627
+ description: "List active or recent Runs for this Thread Computer when deciding whether to resume existing work or start another unit. Returns each Run's mode, execution placement, workspace identity, and lifecycle status.",
19609
19628
  inputSchema: {
19610
19629
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…"),
19611
19630
  status: exports_external.enum(["active", "finished", "failed", "cancelled"]).optional().describe("filter to one lifecycle status"),
@@ -19637,7 +19656,7 @@ var ACTION_DEFINITIONS = [
19637
19656
  {
19638
19657
  name: "computer_process_read",
19639
19658
  title: "Read a background process",
19640
- description: "READ ONLY: Read a provider-owned process from computer_exec, including a foreground operation recovered from a Run receipt, and use nextCursor for incremental output. Returns compact activity or recovery state plus the final exit result when observable.",
19659
+ description: "Read a provider-owned process from computer_exec, including a foreground operation recovered from a Run receipt, and use nextCursor for incremental output. Returns compact activity or recovery state plus the final exit result when observable.",
19641
19660
  inputSchema: {
19642
19661
  computerSessionId: exports_external.string().optional().describe("the computerSessionId returned by computer_open, cms_…; required unless runId is supplied"),
19643
19662
  runId: exports_external.string().optional().describe("the Run that owns this process, if it was started inside a Run"),
@@ -19665,7 +19684,7 @@ var ACTION_DEFINITIONS = [
19665
19684
  {
19666
19685
  name: "computer_status",
19667
19686
  title: "Inspect a computer",
19668
- description: "READ ONLY: Inspect the live PARENT Thread Computer's capabilities, execution readiness, processes, and profile. If its named command session is unavailable, command capabilities disappear and recovery points to computer_open; this does not report isolated Run command state, so use computer_run_receipt for Run state or get_computer for durable lineage.",
19687
+ description: "Inspect the live PARENT Thread Computer's capabilities, execution readiness, processes, and profile. If its named command session is unavailable, command capabilities disappear and recovery points to computer_open; this does not report isolated Run command state, so use computer_run_receipt for Run state or get_computer for durable lineage.",
19669
19688
  inputSchema: {
19670
19689
  computerSessionId: exports_external.string().describe("the computerSessionId returned by computer_open, cms_…")
19671
19690
  },
@@ -19688,7 +19707,7 @@ var ACTION_DEFINITIONS = [
19688
19707
  {
19689
19708
  name: "code_symbols",
19690
19709
  title: "Outline a file's symbols",
19691
- description: "READ ONLY: Outline real declarations in a file or directory when you need structure without reading or searching the whole source. Uses the language server to return symbols and kinds, distinguishing declarations from textual matches.",
19710
+ description: "Outline real declarations in a file or directory when you need structure without reading or searching the whole source. Uses the language server to return symbols and kinds, distinguishing declarations from textual matches.",
19692
19711
  inputSchema: {
19693
19712
  computerSessionId: exports_external.string().optional().describe("parent Computer target; optional when runId is supplied, otherwise required; if both are supplied they must agree"),
19694
19713
  runId: exports_external.string().optional().describe("Run target that resolves its owning Computer session, run_…"),
@@ -19701,7 +19720,7 @@ var ACTION_DEFINITIONS = [
19701
19720
  {
19702
19721
  name: "code_find_symbol",
19703
19722
  title: "Find a symbol by name path",
19704
- description: "READ ONLY: Locate a declaration by name path when you need the definition rather than text matches. Uses the language server and can include the symbol body and bounded child depth.",
19723
+ description: "Locate a declaration by name path when you need the definition rather than text matches. Uses the language server and can include the symbol body and bounded child depth.",
19705
19724
  inputSchema: {
19706
19725
  computerSessionId: exports_external.string().optional().describe("parent Computer target; optional when runId is supplied, otherwise required; if both are supplied they must agree"),
19707
19726
  runId: exports_external.string().optional().describe("Run target that resolves its owning Computer session, run_…"),
@@ -19717,7 +19736,7 @@ var ACTION_DEFINITIONS = [
19717
19736
  {
19718
19737
  name: "code_references",
19719
19738
  title: "Find what references a symbol",
19720
- description: "READ ONLY: Find semantic references to a declaration when you need to know what actually depends on it before a change. Uses the language server to return resolved references with snippets, excluding unrelated textual matches.",
19739
+ description: "Find semantic references to a declaration when you need to know what actually depends on it before a change. Uses the language server to return resolved references with snippets, excluding unrelated textual matches.",
19721
19740
  inputSchema: {
19722
19741
  computerSessionId: exports_external.string().optional().describe("parent Computer target; optional when runId is supplied, otherwise required; if both are supplied they must agree"),
19723
19742
  runId: exports_external.string().optional().describe("Run target that resolves its owning Computer session, run_…"),
@@ -19731,7 +19750,7 @@ var ACTION_DEFINITIONS = [
19731
19750
  {
19732
19751
  name: "code_implementations",
19733
19752
  title: "Find implementations of a symbol",
19734
- description: "READ ONLY: Find concrete implementations or subtypes of an interface, abstract type, or method. Uses the language server to resolve type relationships that text search cannot follow.",
19753
+ description: "Find concrete implementations or subtypes of an interface, abstract type, or method. Uses the language server to resolve type relationships that text search cannot follow.",
19735
19754
  inputSchema: {
19736
19755
  computerSessionId: exports_external.string().optional().describe("parent Computer target; optional when runId is supplied, otherwise required; if both are supplied they must agree"),
19737
19756
  runId: exports_external.string().optional().describe("Run target that resolves its owning Computer session, run_…"),
@@ -19745,7 +19764,7 @@ var ACTION_DEFINITIONS = [
19745
19764
  {
19746
19765
  name: "code_diagnostics",
19747
19766
  title: "Read language-server diagnostics for a file",
19748
- description: "READ ONLY: Check live language-server errors and warnings for one file, especially after an edit. Returns diagnostics mapped to symbols for fast local feedback; it does not replace a whole-project build or typecheck.",
19767
+ description: "Check live language-server errors and warnings for one file, especially after an edit. Returns diagnostics mapped to symbols for fast local feedback; it does not replace a whole-project build or typecheck.",
19749
19768
  inputSchema: {
19750
19769
  computerSessionId: exports_external.string().optional().describe("parent Computer target; optional when runId is supplied, otherwise required; if both are supplied they must agree"),
19751
19770
  runId: exports_external.string().optional().describe("Run target that resolves its owning Computer session, run_…"),
@@ -19862,7 +19881,7 @@ var ACTION_DEFINITIONS = [
19862
19881
  {
19863
19882
  name: "get_computer",
19864
19883
  title: "Read a Thread computer",
19865
- description: "READ ONLY: Inspect a Thread's durable Computer recipe/materialization state, compatibility, snapshot lineage, recent receipts, Runs, and reprovision outcomes; setup content and credentials stay redacted. Use computer_open or computer_status for live execution state; this surface reports durable Arbor protocol state.",
19884
+ description: "Inspect a Thread's durable Computer recipe/materialization state, compatibility, snapshot lineage, recent receipts, Runs, and reprovision outcomes; setup content and credentials stay redacted. Use computer_open or computer_status for live execution state; this surface reports durable Arbor protocol state.",
19866
19885
  inputSchema: {
19867
19886
  threadId: exports_external.string().describe("the Thread, thr_…"),
19868
19887
  lineageLimit: exports_external.number().int().min(1).max(100).optional().describe("recent receipts/lineage rows (default 20)")
@@ -19874,7 +19893,7 @@ var ACTION_DEFINITIONS = [
19874
19893
  {
19875
19894
  name: "computer_inventory",
19876
19895
  title: "Inventory organization Computers",
19877
- description: "READ ONLY: Inventory materialized Thread Computers in your organization, optionally scoped to a Topic, with active generation, compatibility, lifecycle counts, and factual anomaly flags. Organization owner/admin only; this is evidence, not a deletion recommendation.",
19896
+ description: "Inventory materialized Thread Computers in your organization, optionally scoped to a Topic, with active generation, compatibility, lifecycle counts, and factual anomaly flags. Organization owner/admin only; this is evidence, not a deletion recommendation.",
19878
19897
  inputSchema: {
19879
19898
  topicId: exports_external.string().optional().describe("optional Topic to scope the inventory"),
19880
19899
  limit: exports_external.number().int().min(1).max(50).optional().describe("rows to return (default 25)"),
@@ -20216,14 +20235,19 @@ var ACTION_DEFINITIONS = [
20216
20235
  {
20217
20236
  name: "thread_get",
20218
20237
  title: "Read a thread",
20219
- description: "READ ONLY: Read one Thread; full view returns transcript, requests, and artifacts, while compact returns bounded decision-ready context with distillate/recent items and supports cursored unchanged checks. Read it before contributing so you can answer open requests correctly; use contribution pagination only for full history.",
20238
+ description: "Read one Thread as compact current context (distillate, requests, artifacts, recent tail, cursored unchanged checks) — not the durable transcript; pass view=full to page history (contribLimit default 50) or all=true for the complete transcript. Read it before contributing so you can answer open requests correctly.",
20220
20239
  inputSchema: {
20221
20240
  threadId: exports_external.string().describe("the thread id, e.g. thr_…"),
20222
- view: exports_external.enum(["full", "compact"]).optional().describe("full (default) = complete transcript; compact = bounded decision-ready context packet for recurring checks"),
20241
+ view: exports_external.enum(["full", "compact"]).optional().describe("MCP/CLI/API default compact = bounded decision-ready context; full = transcript page"),
20223
20242
  cursor: exports_external.string().optional().describe("compact reads only: cursor from the previous compact response; if context is unchanged the response collapses to a tiny unchanged envelope"),
20224
20243
  recentLimit: exports_external.number().int().min(1).max(20).optional().describe("compact reads only: latest contributions to include (default 6, max 20)"),
20225
- contribLimit: exports_external.number().int().positive().optional().describe("full reads only: max contributions to return (AD-151 keyset paging) — omit to load the whole thread"),
20226
- contribCursor: exports_external.string().optional().describe("full reads only: continuation cursor from a previous page's contributionPage.nextCursor")
20244
+ contribLimit: exports_external.number().int().positive().optional().describe(`full reads only: max contributions to return (AD-151 keyset paging). MCP/CLI/API default to ${EXTERNAL_DEFAULT_CONTRIB_LIMIT}; pass all=true for the whole thread`),
20245
+ contribCursor: exports_external.string().optional().describe("full reads only: continuation cursor from a previous page's contributionPage.nextCursor"),
20246
+ all: exports_external.boolean().optional().describe("explicit complete transcript on view=full — skip the bounded contribLimit. Prefer contribLimit+contribCursor unless you need every contribution")
20247
+ },
20248
+ externalReadDefaults: {
20249
+ view: EXTERNAL_DEFAULT_THREAD_VIEW,
20250
+ contribLimit: EXTERNAL_DEFAULT_CONTRIB_LIMIT
20227
20251
  },
20228
20252
  surfaces: ["mcp", "cli"],
20229
20253
  toolset: "loop",
@@ -20243,7 +20267,7 @@ var ACTION_DEFINITIONS = [
20243
20267
  {
20244
20268
  name: "tree",
20245
20269
  title: "Navigate the workspace tree",
20246
- description: "READ ONLY: Map Spaces to Topics to Threads for orientation; Topic `activeThreadCount` is the current working set (active/stuck/needs-review/standing), while `status` is area attention (`stuck`=any stuck, `attention`=needs-review or open request, `healthy`=neither), not personal obligation (`inbox`). In a large Space, choose the Topic here, scope recall to it, then read only the returned Thread/Artifact; expand tree or use topic_get only for explicit enumeration or Topic-wide context.",
20270
+ description: "Map Spaces to Topics to Threads for orientation; Topic `activeThreadCount` is the current working set (active/stuck/needs-review/standing), while `status` is area attention (`stuck`=any stuck, `attention`=needs-review or open request, `healthy`=neither), not personal obligation (`inbox`). In a large Space, choose the Topic here, scope recall to it, then read only the returned Thread/Artifact; expand tree or use topic_get only for explicit enumeration or Topic-wide context.",
20247
20271
  inputSchema: {
20248
20272
  space: exports_external.string().optional().describe("scope to one space id (spc_…)"),
20249
20273
  topic: exports_external.string().optional().describe("scope to one topic id (top_…)"),
@@ -20256,7 +20280,7 @@ var ACTION_DEFINITIONS = [
20256
20280
  {
20257
20281
  name: "members",
20258
20282
  title: "List the people + agents in your org",
20259
- description: "READ ONLY: List everyone in your org with profile id, human/agent identity, role, charter, and capabilities needed for routing. Use it to resolve profile ids for mentions or targeted requests; it cannot modify membership.",
20283
+ description: "List everyone in your org with profile id, human/agent identity, role, charter, and capabilities needed for routing. Use it to resolve profile ids for mentions or targeted requests; it cannot modify membership.",
20260
20284
  inputSchema: {},
20261
20285
  surfaces: ["mcp", "cli"],
20262
20286
  toolset: "loop",
@@ -20512,7 +20536,7 @@ var ACTION_DEFINITIONS = [
20512
20536
  {
20513
20537
  name: "space_get",
20514
20538
  title: "Read a space",
20515
- description: "READ ONLY: Read a Space's durable context: purpose, guidance, contribution lanes, Topics, and full member roster with roles, capabilities, and charters. Use it after tree when you need the room's full norms or collaborator context; it cannot modify membership or guidance.",
20539
+ description: "Read a Space's durable context: purpose, guidance, contribution lanes, Topics, and full member roster with roles, capabilities, and charters. Use it after tree when you need the room's full norms or collaborator context; it cannot modify membership or guidance.",
20516
20540
  inputSchema: {
20517
20541
  spaceId: exports_external.string().min(1).describe("the space id")
20518
20542
  },
@@ -20523,7 +20547,7 @@ var ACTION_DEFINITIONS = [
20523
20547
  {
20524
20548
  name: "topic_get",
20525
20549
  title: "Read a topic",
20526
- description: "READ ONLY: Read a Topic's full details, guidance, complete Thread roster, open requests, and promoted artifacts. Use it for intentional Topic-wide context or enumeration; for a concrete question in a large Topic, prefer Topic-scoped recall first.",
20550
+ description: "Read a Topic's full details, guidance, complete Thread roster, open requests, and promoted artifacts. Use it for intentional Topic-wide context or enumeration; for a concrete question in a large Topic, prefer Topic-scoped recall first.",
20527
20551
  inputSchema: {
20528
20552
  topicId: exports_external.string().min(1).describe("the topic id")
20529
20553
  },
@@ -21058,7 +21082,7 @@ var ACTION_DEFINITIONS = [
21058
21082
  {
21059
21083
  name: "app_list",
21060
21084
  title: "List visible Apps",
21061
- description: "READ ONLY: List Apps visible to you, including authorized archived Apps when requested. It cannot modify App state, deployment state, access, or durable SQLite.",
21085
+ description: "List Apps visible to you, including authorized archived Apps when requested. It cannot modify App state, deployment state, access, or durable SQLite.",
21062
21086
  inputSchema: {
21063
21087
  includeArchived: exports_external.boolean().optional().describe("include archived Apps you are authorized to inspect")
21064
21088
  },
@@ -21069,7 +21093,7 @@ var ACTION_DEFINITIONS = [
21069
21093
  {
21070
21094
  name: "app_get",
21071
21095
  title: "Read an App",
21072
- description: "READ ONLY: Inspect one App's stable URL, active deployment, pending control intent, deployment history, provider health, deployment-aware redacted configuration readiness for the active release, and durable state generation. It cannot modify App state, deployment state, access, or durable SQLite; use its activeDeploymentId as app_activate's expectedActiveDeploymentId.",
21096
+ description: "Inspect one App's stable URL, active deployment, pending control intent, deployment history, provider health, deployment-aware redacted configuration readiness for the active release, and durable state generation. It cannot modify App state, deployment state, access, or durable SQLite; use its activeDeploymentId as app_activate's expectedActiveDeploymentId.",
21073
21097
  inputSchema: { appId: exports_external.string().describe("the App, app_…") },
21074
21098
  surfaces: ["computer-mcp", "cli"],
21075
21099
  toolset: "apps",
@@ -21093,7 +21117,7 @@ var ACTION_DEFINITIONS = [
21093
21117
  {
21094
21118
  name: "preview_app_get",
21095
21119
  title: "Read a Preview App",
21096
- description: "READ ONLY: Inspect one Preview App's public URL, pinned ArtifactVersion/AppBundle lineage, absolute expiry, Thread status, and bounded WebSocket room contract. It is not a Space App catalog read.",
21120
+ description: "Inspect one Preview App's public URL, pinned ArtifactVersion/AppBundle lineage, absolute expiry, Thread status, and bounded WebSocket room contract. It is not a Space App catalog read.",
21097
21121
  inputSchema: { previewAppId: exports_external.string().describe("the Preview App, papp_…") },
21098
21122
  surfaces: ["computer-mcp", "cli"],
21099
21123
  toolset: "apps",
@@ -21169,7 +21193,7 @@ var ACTION_DEFINITIONS = [
21169
21193
  {
21170
21194
  name: "app_deployment_get",
21171
21195
  title: "Inspect an App deployment",
21172
- description: "READ ONLY: Inspect one deployment's state, source bundle, provider receipt, phased redacted health (load|activation|runtime), and config readiness. It cannot modify App state, deployment state, access, or durable SQLite.",
21196
+ description: "Inspect one deployment's state, source bundle, provider receipt, phased redacted health (load|activation|runtime), and config readiness. It cannot modify App state, deployment state, access, or durable SQLite.",
21173
21197
  inputSchema: {
21174
21198
  appId: exports_external.string().describe("owning App, app_…"),
21175
21199
  deploymentId: exports_external.string().describe("deployment, dep_…")
@@ -21181,7 +21205,7 @@ var ACTION_DEFINITIONS = [
21181
21205
  {
21182
21206
  name: "app_fetch",
21183
21207
  title: "Fetch from an App",
21184
- description: "READ ONLY: Invoke GET or HEAD on one relative path of an App using your current Arbor identity; for Space Apps, current Space membership is rechecked on every call. It cannot modify App lifecycle, deployments, access, or durable SQLite; browser grants, cookies, credentials, and reserved /__arbor paths are never exposed to App code.",
21208
+ description: "Invoke GET or HEAD on one relative path of an App using your current Arbor identity; for Space Apps, current Space membership is rechecked on every call. It cannot modify App lifecycle, deployments, access, or durable SQLite; browser grants, cookies, credentials, and reserved /__arbor paths are never exposed to App code.",
21185
21209
  inputSchema: {
21186
21210
  appId: exports_external.string().describe("target App, app_…"),
21187
21211
  path: exports_external.string().min(1).max(2048).describe("relative App path beginning with /; may include a query string"),
@@ -21333,15 +21357,16 @@ var ACTIONS = ACTION_DEFINITIONS.map((action) => {
21333
21357
  if (action.requiresCapability && !action.surfaces.includes("mcp")) {
21334
21358
  throw new Error(`${action.name}: requiresCapability is an MCP catalog gate`);
21335
21359
  }
21360
+ const externalReadDefaults = action.inputSchema.limit === PAGINATION_INPUT.limit ? { ...action.externalReadDefaults, limit: EXTERNAL_DEFAULT_PAGE_SIZE } : action.externalReadDefaults;
21361
+ recordExternalReadDefaults(forwardedOperation(action.run), externalReadDefaults);
21336
21362
  if (!action.surfaces.some((surface) => surface === "mcp" || surface === "computer-mcp")) {
21337
- return action;
21363
+ return externalReadDefaults ? { ...action, externalReadDefaults } : action;
21338
21364
  }
21339
21365
  const outputSchema = outputSchemaFor(action.name);
21340
21366
  if (!outputSchema)
21341
21367
  throw new Error(`${action.name}: MCP action is missing an output schema`);
21342
21368
  const annotations = mcpAnnotationsFor(action.name);
21343
- const description = annotations.readOnlyHint && !action.description.startsWith("READ ONLY") ? `READ ONLY: ${action.description}` : action.description;
21344
- return { ...action, description, outputSchema, annotations };
21369
+ return { ...action, externalReadDefaults, outputSchema, annotations };
21345
21370
  });
21346
21371
 
21347
21372
  // src/config.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lambdacurry/arbor",
3
- "version": "0.21.10",
3
+ "version": "0.21.12",
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",