@sema-agent/core 7.48.0 → 7.49.0

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 (418) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +2 -2
  3. package/dist/agents/cascade.d.ts +2 -5
  4. package/dist/agents/child-failure.d.ts +20 -0
  5. package/dist/agents/child-failure.js +28 -0
  6. package/dist/agents/cross-session-ref.d.ts +11 -3
  7. package/dist/agents/cross-session-ref.js +6 -0
  8. package/dist/agents/cumulative-stats.d.ts +12 -15
  9. package/dist/agents/cumulative-stats.js +1 -1
  10. package/dist/agents/extra-tool-names.js +1 -1
  11. package/dist/agents/inherited-tool-pool.d.ts +17 -13
  12. package/dist/agents/inherited-tool-pool.js +4 -3
  13. package/dist/agents/peer-session-drain.d.ts +3 -2
  14. package/dist/agents/peer-session-drain.js +5 -4
  15. package/dist/agents/send-message-tool.js +2 -9
  16. package/dist/agents/subagent.d.ts +10 -29
  17. package/dist/agents/subagent.js +65 -53
  18. package/dist/agents/suspend-guard.d.ts +1 -1
  19. package/dist/agents/tool-filter.d.ts +76 -65
  20. package/dist/agents/tool-filter.js +122 -92
  21. package/dist/agents/verify.d.ts +4 -7
  22. package/dist/agents/verify.js +6 -7
  23. package/dist/bench/metrics.d.ts +1 -2
  24. package/dist/brain/anthropic.js +133 -79
  25. package/dist/brain/errors.d.ts +53 -6
  26. package/dist/brain/errors.js +22 -2
  27. package/dist/brain/input-too-long.d.ts +40 -19
  28. package/dist/brain/input-too-long.js +3 -16
  29. package/dist/brain/open-responses.js +19 -10
  30. package/dist/brain/openai.js +123 -32
  31. package/dist/brain/provider-dialect.d.ts +214 -0
  32. package/dist/brain/provider-dialect.js +186 -0
  33. package/dist/brain/request-params.d.ts +27 -8
  34. package/dist/brain/request-params.js +7 -12
  35. package/dist/brain/request-route.d.ts +84 -0
  36. package/dist/brain/request-route.js +41 -0
  37. package/dist/brain/retry.d.ts +8 -0
  38. package/dist/brain/retry.js +10 -4
  39. package/dist/brain/route-adjudicator.d.ts +7 -0
  40. package/dist/brain/route-adjudicator.js +5 -1
  41. package/dist/brain/status-sink.d.ts +20 -0
  42. package/dist/brain/status-sink.js +11 -0
  43. package/dist/brain/stream-engine.d.ts +52 -1
  44. package/dist/brain/stream-engine.js +81 -24
  45. package/dist/brain/stream-shared.d.ts +57 -11
  46. package/dist/brain/stream-shared.js +28 -2
  47. package/dist/core/a2a.d.ts +1 -0
  48. package/dist/core/agent-config-dir.js +3 -2
  49. package/dist/core/allow-entry.d.ts +21 -12
  50. package/dist/core/allow-entry.js +38 -31
  51. package/dist/core/arg-summary.d.ts +17 -24
  52. package/dist/core/arg-summary.js +169 -68
  53. package/dist/core/ask-origin.d.ts +42 -24
  54. package/dist/core/ask-origin.js +18 -13
  55. package/dist/core/auto-mode-prompt-assets.d.ts +2 -2
  56. package/dist/core/auto-mode-prompt-assets.js +1 -1
  57. package/dist/core/auto-mode-prompt.d.ts +11 -1
  58. package/dist/core/auto-mode-prompt.js +13 -10
  59. package/dist/core/auto-mode-rebuild.d.ts +7 -0
  60. package/dist/core/auto-mode-rebuild.js +4 -1
  61. package/dist/core/canonical-json.d.ts +3 -0
  62. package/dist/core/canonical-json.js +2 -1
  63. package/dist/core/checkpoint-requirements.d.ts +892 -0
  64. package/dist/core/checkpoint-requirements.js +333 -0
  65. package/dist/core/checkpoint-store.d.ts +94 -65
  66. package/dist/core/checkpoint-store.js +14 -26
  67. package/dist/core/child-clamp-seats.d.ts +228 -69
  68. package/dist/core/child-clamp-seats.js +211 -17
  69. package/dist/core/classifier-unavailable-arm.d.ts +5 -1
  70. package/dist/core/classifier-unavailable-arm.js +3 -3
  71. package/dist/core/compliance.d.ts +3 -0
  72. package/dist/core/compliance.js +9 -4
  73. package/dist/core/credential-vocabulary.d.ts +140 -0
  74. package/dist/core/credential-vocabulary.js +131 -0
  75. package/dist/core/decision-receipt.js +1 -1
  76. package/dist/core/effective-path-target.d.ts +73 -16
  77. package/dist/core/effective-path-target.js +63 -33
  78. package/dist/core/engine-notice.d.ts +32 -7
  79. package/dist/core/file-history-store.js +2 -2
  80. package/dist/core/fs-write-gate-policy.d.ts +4 -0
  81. package/dist/core/fs-write-gate-policy.js +22 -5
  82. package/dist/core/gate-bounded-await.d.ts +28 -13
  83. package/dist/core/gate-bounded-await.js +41 -4
  84. package/dist/core/gate-fold.d.ts +1 -1
  85. package/dist/core/gate-fold.js +24 -25
  86. package/dist/core/gate-lanes.js +16 -15
  87. package/dist/core/gate-outcome.d.ts +20 -5
  88. package/dist/core/gate-outcome.js +5 -0
  89. package/dist/core/governance-codes.d.ts +11 -4
  90. package/dist/core/governance-codes.js +14 -3
  91. package/dist/core/hooks.d.ts +4 -0
  92. package/dist/core/locked-config.d.ts +8 -0
  93. package/dist/core/locked-config.js +14 -2
  94. package/dist/core/lsp.js +3 -5
  95. package/dist/core/mailbox-store.d.ts +3 -4
  96. package/dist/core/mcp-connection-pool.d.ts +75 -0
  97. package/dist/core/mcp-connection-pool.js +128 -0
  98. package/dist/core/mcp-failure.d.ts +2 -1
  99. package/dist/core/mcp-failure.js +13 -2
  100. package/dist/core/mcp.d.ts +4 -0
  101. package/dist/core/mcp.js +70 -43
  102. package/dist/core/memory-engine/content-origin.js +2 -14
  103. package/dist/core/memory-engine/engine.d.ts +32 -22
  104. package/dist/core/memory-engine/engine.js +103 -55
  105. package/dist/core/memory-engine/file-backend.d.ts +13 -30
  106. package/dist/core/memory-engine/file-backend.js +37 -252
  107. package/dist/core/memory-engine/index.d.ts +1 -1
  108. package/dist/core/memory-engine/index.js +1 -1
  109. package/dist/core/memory-engine/layout.d.ts +139 -9
  110. package/dist/core/memory-engine/layout.js +350 -7
  111. package/dist/core/memory-engine/scope-contract.d.ts +10 -0
  112. package/dist/core/memory-engine/scope-contract.js +8 -0
  113. package/dist/core/memory-engine/session-incarnation.d.ts +14 -4
  114. package/dist/core/memory-engine/session-incarnation.js +5 -2
  115. package/dist/core/memory-engine/types.d.ts +10 -1
  116. package/dist/core/memory.js +5 -17
  117. package/dist/core/model-seat.d.ts +4 -4
  118. package/dist/core/model-seat.js +1 -1
  119. package/dist/core/mounted-mcp.d.ts +57 -0
  120. package/dist/core/mounted-mcp.js +19 -0
  121. package/dist/core/namespaced-rule-name.d.ts +29 -0
  122. package/dist/core/namespaced-rule-name.js +52 -0
  123. package/dist/core/park-selfcheck.d.ts +1 -1
  124. package/dist/core/park-selfcheck.js +16 -6
  125. package/dist/core/path-guard-rows.d.ts +99 -0
  126. package/dist/core/path-guard-rows.js +45 -0
  127. package/dist/core/path-identity.d.ts +22 -16
  128. package/dist/core/path-identity.js +10 -10
  129. package/dist/core/path-rule-binding.d.ts +2 -1
  130. package/dist/core/path-rule-binding.js +3 -1
  131. package/dist/core/pause-registry.d.ts +16 -2
  132. package/dist/core/pause-registry.js +6 -0
  133. package/dist/core/permission-rule-consent.js +0 -7
  134. package/dist/core/permission-rule-model.d.ts +68 -24
  135. package/dist/core/permission-rule-model.js +105 -24
  136. package/dist/core/permission-rule-store.js +2 -2
  137. package/dist/core/permission-rules.d.ts +3 -30
  138. package/dist/core/permission-rules.js +4 -54
  139. package/dist/core/read-root-candidate.d.ts +1 -3
  140. package/dist/core/read-root-candidate.js +4 -15
  141. package/dist/core/real-approval.d.ts +4 -3
  142. package/dist/core/retired-keys.d.ts +13 -0
  143. package/dist/core/retired-keys.js +14 -0
  144. package/dist/core/roles.d.ts +2 -3
  145. package/dist/core/roles.js +15 -6
  146. package/dist/core/runner/assemble-result.d.ts +0 -7
  147. package/dist/core/runner/assemble-result.js +19 -31
  148. package/dist/core/runner/caller-roster.d.ts +78 -0
  149. package/dist/core/runner/caller-roster.js +219 -0
  150. package/dist/core/runner/checkpoint-scope.d.ts +16 -16
  151. package/dist/core/runner/checkpoint-scope.js +2 -2
  152. package/dist/core/runner/child-tree.js +2 -2
  153. package/dist/core/runner/contracts.d.ts +68 -35
  154. package/dist/core/runner/decide-continuation.d.ts +51 -3
  155. package/dist/core/runner/decide-continuation.js +76 -21
  156. package/dist/core/runner/denial-limit-arms.d.ts +17 -5
  157. package/dist/core/runner/denial-limit-arms.js +11 -9
  158. package/dist/core/runner/extra-body-dropped-seat.d.ts +8 -0
  159. package/dist/core/runner/extra-body-dropped-seat.js +22 -0
  160. package/dist/core/runner/finish-reason-seat.d.ts +9 -0
  161. package/dist/core/runner/finish-reason-seat.js +40 -0
  162. package/dist/core/runner/gate-exit.d.ts +44 -32
  163. package/dist/core/runner/gate-exit.js +112 -25
  164. package/dist/core/runner/inherited-ask-grants.js +6 -4
  165. package/dist/core/runner/mcp-redial.d.ts +3 -3
  166. package/dist/core/runner/mcp-redial.js +3 -4
  167. package/dist/core/runner/permission-rule-lanes.d.ts +1 -2
  168. package/dist/core/runner/permission-rule-lanes.js +5 -4
  169. package/dist/core/runner/prepare-artifact.d.ts +4 -0
  170. package/dist/core/runner/prepare-artifact.js +2 -1
  171. package/dist/core/runner/prepare-ask-lane.d.ts +2 -0
  172. package/dist/core/runner/prepare-ask-lane.js +12 -6
  173. package/dist/core/runner/prepare-boundary-parks.d.ts +5 -8
  174. package/dist/core/runner/prepare-boundary-parks.js +4 -7
  175. package/dist/core/runner/prepare-caps-and-workflow.d.ts +11 -15
  176. package/dist/core/runner/prepare-caps-and-workflow.js +19 -27
  177. package/dist/core/runner/prepare-config-doors.d.ts +9 -9
  178. package/dist/core/runner/prepare-config-doors.js +10 -5
  179. package/dist/core/runner/prepare-defer-classify.d.ts +2 -2
  180. package/dist/core/runner/prepare-defer-classify.js +5 -3
  181. package/dist/core/runner/prepare-delegation-surface.d.ts +1 -1
  182. package/dist/core/runner/prepare-delegation-surface.js +3 -3
  183. package/dist/core/runner/prepare-gate-stations.d.ts +4 -4
  184. package/dist/core/runner/prepare-gate-stations.js +9 -7
  185. package/dist/core/runner/prepare-hands-readface.d.ts +7 -7
  186. package/dist/core/runner/prepare-hands-readface.js +7 -7
  187. package/dist/core/runner/prepare-inherited-gate.d.ts +7 -6
  188. package/dist/core/runner/prepare-inherited-gate.js +14 -15
  189. package/dist/core/runner/prepare-listings.d.ts +7 -24
  190. package/dist/core/runner/prepare-listings.js +4 -5
  191. package/dist/core/runner/prepare-memory-engine-session.d.ts +2 -0
  192. package/dist/core/runner/prepare-memory-engine-session.js +4 -3
  193. package/dist/core/runner/prepare-memory.d.ts +6 -0
  194. package/dist/core/runner/prepare-memory.js +13 -13
  195. package/dist/core/runner/prepare-offload-wrappers.d.ts +5 -0
  196. package/dist/core/runner/prepare-offload-wrappers.js +3 -3
  197. package/dist/core/runner/prepare-park-ask.d.ts +7 -8
  198. package/dist/core/runner/prepare-park-ask.js +17 -10
  199. package/dist/core/runner/prepare-policy-chain.js +24 -44
  200. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  201. package/dist/core/runner/prepare-project-context.js +3 -4
  202. package/dist/core/runner/prepare-protocol-tools.d.ts +9 -3
  203. package/dist/core/runner/prepare-protocol-tools.js +3 -4
  204. package/dist/core/runner/prepare-run-refs.d.ts +3 -0
  205. package/dist/core/runner/prepare-run-refs.js +2 -1
  206. package/dist/core/runner/prepare-safety-scan.d.ts +4 -8
  207. package/dist/core/runner/prepare-safety-scan.js +1 -2
  208. package/dist/core/runner/prepare-suspend-saga.d.ts +7 -1
  209. package/dist/core/runner/prepare-suspend-saga.js +28 -12
  210. package/dist/core/runner/prepare-task.d.ts +1 -1
  211. package/dist/core/runner/prepare-task.js +67 -56
  212. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -10
  213. package/dist/core/runner/prepare-wiring-manifest.js +5 -8
  214. package/dist/core/runner/resume-apply.js +7 -14
  215. package/dist/core/runner/resume-checkpoint-screen.js +11 -4
  216. package/dist/core/runner/resume-internals-and-config.js +2 -2
  217. package/dist/core/runner/resume-policy-outcome.js +5 -32
  218. package/dist/core/runner/resume-review-outcome.js +4 -1
  219. package/dist/core/runner/retired-runner-deps.d.ts +6 -0
  220. package/dist/core/runner/retired-runner-deps.js +10 -1
  221. package/dist/core/runner/run-brain-sinks.d.ts +4 -0
  222. package/dist/core/runner/run-brain-sinks.js +5 -2
  223. package/dist/core/runner/run-harness-handlers.js +27 -34
  224. package/dist/core/runner/run-leg.d.ts +0 -2
  225. package/dist/core/runner/run-leg.js +32 -33
  226. package/dist/core/runner/run-terminal-adoption.js +4 -3
  227. package/dist/core/runner/runtask.js +8 -8
  228. package/dist/core/runner/session-rule-policy.js +5 -5
  229. package/dist/core/runner/stream-settle-backstop.js +7 -4
  230. package/dist/core/runner/sub-agent-deny-lists.d.ts +51 -12
  231. package/dist/core/runner/sub-agent-deny-lists.js +111 -80
  232. package/dist/core/runner/terminal-account.d.ts +48 -0
  233. package/dist/core/runner/terminal-account.js +186 -0
  234. package/dist/core/runner/tool-end-body.d.ts +54 -17
  235. package/dist/core/runner/tool-end-body.js +27 -2
  236. package/dist/core/runner/tool-face-overlay.d.ts +3 -1
  237. package/dist/core/runner/tool-face-overlay.js +6 -4
  238. package/dist/core/runner/tool-occurrence.d.ts +106 -0
  239. package/dist/core/runner/tool-occurrence.js +123 -0
  240. package/dist/core/runner/tool-progress-lane.d.ts +16 -8
  241. package/dist/core/runner/tool-progress-lane.js +25 -34
  242. package/dist/core/runner/turn-attachments.d.ts +1 -1
  243. package/dist/core/runner/write-protection-station.d.ts +21 -9
  244. package/dist/core/runner/write-protection-station.js +20 -17
  245. package/dist/core/runner-deps.d.ts +12 -22
  246. package/dist/core/secret-env.d.ts +16 -5
  247. package/dist/core/secret-env.js +23 -63
  248. package/dist/core/sensitive-path-policy.d.ts +19 -18
  249. package/dist/core/sensitive-path-policy.js +73 -49
  250. package/dist/core/session-reconcile.d.ts +3 -0
  251. package/dist/core/session-reconcile.js +5 -4
  252. package/dist/core/session-store.d.ts +5 -0
  253. package/dist/core/session-store.js +12 -0
  254. package/dist/core/session.d.ts +13 -0
  255. package/dist/core/shared-memory/normalize.d.ts +17 -4
  256. package/dist/core/shared-memory/normalize.js +7 -7
  257. package/dist/core/shell-lexer.js +5 -4
  258. package/dist/core/skill-grant.js +1 -1
  259. package/dist/core/store-contracts/checkpoint-store-contract.js +13 -0
  260. package/dist/core/store-contracts/mailbox-store-contract.d.ts +7 -14
  261. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +27 -0
  262. package/dist/core/store-contracts/session-store-incarnation-contract.js +92 -0
  263. package/dist/core/stub-env.d.ts +2 -0
  264. package/dist/core/stub-env.js +1 -0
  265. package/dist/core/synthetic-read-verdict.js +2 -2
  266. package/dist/core/task-event.d.ts +59 -5
  267. package/dist/core/task-result.d.ts +1 -1
  268. package/dist/core/task-spec.d.ts +42 -9
  269. package/dist/core/terminal-cause.d.ts +94 -11
  270. package/dist/core/tighten-task-spec.d.ts +5 -4
  271. package/dist/core/tighten-task-spec.js +20 -25
  272. package/dist/core/tool-catalog-entries.d.ts +5 -7
  273. package/dist/core/tool-catalog-entries.js +14 -15
  274. package/dist/core/tool-face.d.ts +47 -0
  275. package/dist/core/tool-face.js +5 -0
  276. package/dist/core/tool-model-gate.d.ts +5 -5
  277. package/dist/core/tool-name-aliases.d.ts +26 -2
  278. package/dist/core/tool-name-aliases.js +13 -0
  279. package/dist/core/tool-name-list.d.ts +30 -0
  280. package/dist/core/tool-name-list.js +55 -0
  281. package/dist/core/tool-name-readings.d.ts +1 -9
  282. package/dist/core/tool-name-readings.js +1 -3
  283. package/dist/core/tool-policy.d.ts +195 -85
  284. package/dist/core/tool-policy.js +165 -380
  285. package/dist/core/tool-registry.d.ts +44 -1
  286. package/dist/core/tool-registry.js +26 -0
  287. package/dist/core/tool-roster.d.ts +19 -1
  288. package/dist/core/tool-roster.js +21 -2
  289. package/dist/core/tool-spec-members.d.ts +45 -0
  290. package/dist/core/tool-spec-members.js +169 -0
  291. package/dist/core/tool-spec.d.ts +46 -8
  292. package/dist/core/tools.d.ts +6 -2
  293. package/dist/core/tools.js +8 -4
  294. package/dist/core/untrusted-egress.js +29 -26
  295. package/dist/core/untrusted-text.d.ts +13 -10
  296. package/dist/core/untrusted-text.js +6 -44
  297. package/dist/core/workflow-journal-store.d.ts +4 -1
  298. package/dist/core/write-protect.d.ts +65 -29
  299. package/dist/core/write-protect.js +235 -177
  300. package/dist/engine/compaction/compaction.d.ts +2 -2
  301. package/dist/engine/execution-env/node-execution-env.d.ts +5 -23
  302. package/dist/engine/execution-env/node-execution-env.js +16 -38
  303. package/dist/engine/execution-env/symlink-chain.d.ts +23 -0
  304. package/dist/engine/execution-env/symlink-chain.js +32 -0
  305. package/dist/engine/harness/types.d.ts +7 -0
  306. package/dist/engine/llm/tool-turns.d.ts +3 -0
  307. package/dist/engine/llm/tool-turns.js +1 -0
  308. package/dist/engine/llm/types.d.ts +59 -23
  309. package/dist/engine/loop/agent-loop.js +16 -2
  310. package/dist/engine/session/memory-repo.js +11 -3
  311. package/dist/engine/session/repo-utils.d.ts +8 -0
  312. package/dist/engine/session/repo-utils.js +13 -0
  313. package/dist/index.d.ts +20 -23
  314. package/dist/index.js +17 -20
  315. package/dist/internal/harness.d.ts +1 -1
  316. package/dist/internal/harness.js +1 -1
  317. package/dist/internal/llm.d.ts +2 -2
  318. package/dist/internal/llm.js +1 -1
  319. package/dist/orchestration/governance-baseline-validity.js +1 -1
  320. package/dist/orchestration/run-spec.js +3 -3
  321. package/dist/orchestration/run-workflow-tool.d.ts +16 -35
  322. package/dist/orchestration/run-workflow-tool.js +38 -78
  323. package/dist/orchestration/workflow-governance.d.ts +21 -25
  324. package/dist/orchestration/workflow-governance.js +38 -78
  325. package/dist/orchestration/workflow-primitives.d.ts +7 -22
  326. package/dist/orchestration/workflow-primitives.js +5 -12
  327. package/dist/orchestration/workflow-types.d.ts +1 -1
  328. package/dist/orchestration/workflow.d.ts +61 -11
  329. package/dist/orchestration/workflow.js +189 -117
  330. package/dist/scenarios/full-body.d.ts +1 -1
  331. package/dist/shell/lex.d.ts +0 -21
  332. package/dist/shell/lex.js +250 -68
  333. package/dist/shell/shell-words.d.ts +35 -0
  334. package/dist/shell/shell-words.js +65 -0
  335. package/dist/stores/file/checkpoint-store.d.ts +5 -5
  336. package/dist/stores/file/checkpoint-store.js +5 -2
  337. package/dist/stores/file/index.d.ts +0 -8
  338. package/dist/stores/file/index.js +0 -12
  339. package/dist/stores/file/session-store.d.ts +3 -0
  340. package/dist/stores/file/session-store.js +44 -19
  341. package/dist/tools/artifact/artifact-tool.js +2 -0
  342. package/dist/tools/fs/bash-program-position.d.ts +10 -3
  343. package/dist/tools/fs/bash-program-position.js +21 -9
  344. package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -1
  345. package/dist/tools/fs/bash-readonly-classifier.js +8 -7
  346. package/dist/tools/fs/containment-face.d.ts +4 -0
  347. package/dist/tools/fs/containment-face.js +3 -0
  348. package/dist/tools/fs/fs-shared.d.ts +10 -0
  349. package/dist/tools/fs/fs-shared.js +18 -0
  350. package/dist/tools/fs/fs-write.js +4 -2
  351. package/dist/tools/fs/index.d.ts +1 -1
  352. package/dist/tools/fs/program-read-model.d.ts +39 -18
  353. package/dist/tools/fs/program-read-model.js +29 -19
  354. package/dist/tools/fs/program-read-model.rows.d.ts +0 -14
  355. package/dist/tools/fs/program-read-model.rows.js +5 -5
  356. package/dist/tools/fs/read-deny-home.d.ts +33 -47
  357. package/dist/tools/fs/read-deny-home.js +35 -49
  358. package/dist/tools/fs/read-deny.d.ts +23 -22
  359. package/dist/tools/fs/read-deny.js +114 -89
  360. package/dist/tools/fs/removal-targets.d.ts +56 -23
  361. package/dist/tools/fs/removal-targets.js +65 -87
  362. package/dist/tools/fs/safety.d.ts +29 -22
  363. package/dist/tools/fs/safety.js +17 -11
  364. package/dist/tools/fs/search.js +10 -8
  365. package/dist/tools/fs/shell-read-argv.js +1 -1
  366. package/dist/tools/fs/shell-read-bindings.d.ts +169 -37
  367. package/dist/tools/fs/shell-read-bindings.js +324 -86
  368. package/dist/tools/fs/shell-read-builtins.d.ts +35 -0
  369. package/dist/tools/fs/shell-read-builtins.js +43 -0
  370. package/dist/tools/fs/shell-read-check.d.ts +15 -1
  371. package/dist/tools/fs/shell-read-check.js +51 -42
  372. package/dist/tools/fs/shell-read-establish.js +6 -6
  373. package/dist/tools/fs/shell-read-functions.d.ts +22 -0
  374. package/dist/tools/fs/shell-read-functions.js +29 -0
  375. package/dist/tools/fs/shell-read-judge.d.ts +48 -18
  376. package/dist/tools/fs/shell-read-judge.js +33 -4
  377. package/dist/tools/fs/shell-read-plan.d.ts +12 -6
  378. package/dist/tools/fs/shell-read-plan.js +118 -113
  379. package/dist/tools/fs/shell-read-start.d.ts +29 -6
  380. package/dist/tools/fs/shell-read-start.js +16 -9
  381. package/dist/tools/fs/shell-read-word.js +4 -0
  382. package/dist/tools/fs/shell-read-workdir.d.ts +156 -0
  383. package/dist/tools/fs/shell-read-workdir.js +281 -0
  384. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -2
  385. package/dist/tools/fs/shell-read-write-targets.js +14 -5
  386. package/dist/tools/fs/shell-reentry-text.d.ts +4 -6
  387. package/dist/tools/fs/shell-reentry-text.js +3 -11
  388. package/dist/tools/task-list.d.ts +1 -2
  389. package/dist/tools/web.js +1 -1
  390. package/package.json +4 -1
  391. package/test/export-surface.snapshot.json +107 -143
  392. package/wire-changes/core@7.49.0.json +4765 -0
  393. package/dist/agents/teacher.d.ts +0 -159
  394. package/dist/agents/teacher.js +0 -577
  395. package/dist/agents/team.d.ts +0 -226
  396. package/dist/agents/team.js +0 -257
  397. package/dist/core/strategy-store.d.ts +0 -238
  398. package/dist/core/strategy-store.js +0 -253
  399. package/dist/orchestration/builtin-workflows.d.ts +0 -133
  400. package/dist/orchestration/builtin-workflows.js +0 -159
  401. package/dist/scenarios/env.d.ts +0 -40
  402. package/dist/scenarios/env.js +0 -39
  403. package/dist/scenarios/scenario-registry.d.ts +0 -110
  404. package/dist/scenarios/scenario-registry.js +0 -140
  405. package/dist/scenarios/teacher-quickstart.d.ts +0 -40
  406. package/dist/scenarios/teacher-quickstart.js +0 -12
  407. package/dist/stores/cc/lockfile.d.ts +0 -10
  408. package/dist/stores/cc/lockfile.js +0 -98
  409. package/dist/stores/cc/mailbox-store.d.ts +0 -20
  410. package/dist/stores/cc/mailbox-store.js +0 -255
  411. package/dist/stores/cc/roster-adapter.d.ts +0 -12
  412. package/dist/stores/cc/roster-adapter.js +0 -117
  413. package/dist/stores/cc/sidecar-transcript.d.ts +0 -97
  414. package/dist/stores/cc/sidecar-transcript.js +0 -264
  415. package/dist/stores/cc/task-list-store.d.ts +0 -2
  416. package/dist/stores/cc/task-list-store.js +0 -125
  417. package/dist/stores/file/strategy-store.d.ts +0 -97
  418. package/dist/stores/file/strategy-store.js +0 -341
package/README.md CHANGED
@@ -44,7 +44,7 @@ const res = await runner.runTask({ objective: "...", model: "main" });
44
44
  - **Memory engine.** Scoped long-term memory with a pluggable `MemoryBackend`
45
45
  (file-backed or Postgres), plus automatic in-context compaction that keeps long runs inside the
46
46
  model's context window without losing the thread.
47
- - **Multi-agent.** Sub-agent delegation, team discussions, deterministic `runWorkflow`
47
+ - **Multi-agent.** Sub-agent delegation, deterministic `runWorkflow`
48
48
  orchestration with durable journals, and opt-in observer agents that monitor and steer a run.
49
49
  - **Streaming first.** Every task emits a typed `TaskEvent` stream (reasoning deltas, text deltas,
50
50
  tool lifecycle, progress, diagnostics), ready to pipe into SSE via `createTaskServer`.
@@ -110,7 +110,7 @@ token-by-token, or expose the runner over HTTP + SSE — the
110
110
  | [04 – Tools and MCP](docs/sdk/04-tools-and-mcp.md) | `defineTool`, the SQL tool, issue-tracker tools, MCP integration |
111
111
  | [05 – Streaming and the HTTP Server](docs/sdk/05-streaming-and-http-server.md) | The `TaskEvent` protocol, SSE, `createTaskServer` |
112
112
  | [06 – Sessions, Memory, and Compaction](docs/sdk/06-sessions-memory-and-compaction.md) | Session stores, automatic compaction, long-term memory backends |
113
- | [07 – Multi-Agent](docs/sdk/07-multi-agent.md) | Sub-agents, team discussions, teacher mode |
113
+ | [07 – Multi-Agent](docs/sdk/07-multi-agent.md) | Sub-agent delegation, multi-perspective discussion via sub-agents, cross-session peer messaging |
114
114
  | [08 – Workflows](docs/sdk/08-workflows.md) | Deterministic `runWorkflow` orchestration and observability |
115
115
  | [09 – Security and Policies](docs/sdk/09-security-and-policies.md) | Tool policies, approvals, shell gating, human-in-the-loop supervision |
116
116
  | [10 – Extension Points](docs/sdk/10-extension-points.md) | Custom brains, session stores, execution environments, Postgres adapters |
@@ -8,15 +8,12 @@ import type { ModelRef, TaskResult, TaskSpec, TaskStatus } from "../core/types.j
8
8
  *
9
9
  * APPLICABILITY: cascade only helps when the gate is **decidable** (a schema check, a verifier model, a
10
10
  * concrete assertion). Open-ended "completeness" tasks (find every bug, writing quality) have no oracle —
11
- * the gate keeps passing the first plausible cheap answer and escalation idles. Those want breadth /
12
- * falsification-style debate (a `team`), not a depth ladder.
11
+ * the gate keeps passing the first plausible cheap answer and escalation idles. Those want breadth
12
+ * (several independent agents and a judge), not a depth ladder.
13
13
  *
14
14
  * Cost note (design/27 §2): each rung is an independent COLD `runTask` — every escalation repays the
15
15
  * full input cost. Cascade wins when (a) the cheap rung usually passes and (b) the prompt isn't so large
16
16
  * that the restart tax dominates. It is NOT always cheaper than running the strongest model directly.
17
- *
18
- * Boundary vs teacher mode: teacher injects advice and continues the SAME session (recovery); cascade
19
- * does independent re-runs on a model ladder (breadth). Orthogonal, not merged.
20
17
  */
21
18
  /** A gate's verdict: a bare boolean, or `{ pass, diagnostics }` to attach reasoning to `attempts[]`. */
22
19
  export type GateVerdict = boolean | {
@@ -0,0 +1,20 @@
1
+ import { terminalProjection } from "../core/runner/terminal-projection.js";
2
+ import type { TerminalCause } from "../core/types.js";
3
+ /**
4
+ * A child run's failure words are its provider's or tool's own text and can carry a credential. Every parent-facing reader of them
5
+ * takes them from here, so they are secret-redacted with `redactSecrets` — the definition `workflow_run.error` uses — once per
6
+ * source shape, before any field bound can clip a token in half, and no face redacts for itself:
7
+ * - {@link childTerminalFace}: a settled child's cause, projected (the report's `error:` line, the card, the task row, the
8
+ * notification's summary and digest);
9
+ * - {@link childThrownText}: the text of a rejected run;
10
+ * - {@link childRejection}: a rejected run's thrown value itself, for the foreground lane, where the tool loop writes the
11
+ * parent's tool result from the thrown value's `message`.
12
+ */
13
+ export declare const childTerminalFace: (terminal: TerminalCause) => ReturnType<typeof terminalProjection>;
14
+ export declare const childThrownText: (err: unknown) => string;
15
+ /**
16
+ * The thrown value of a rejected child run, re-minted with the redacted sentence: same prototype and own members (`code`,
17
+ * `details`, `errorKind`, `cause`) — only `message` changes. The copy's `stack` is its own, captured here: the original's
18
+ * first line carries the message, so it is not carried over. A value with nothing to redact is returned as it is.
19
+ */
20
+ export declare const childRejection: (err: unknown) => unknown;
@@ -0,0 +1,28 @@
1
+ import { terminalProjection } from "../core/runner/terminal-projection.js";
2
+ import { thrownText } from "../core/thrown-value.js";
3
+ import { redactSecrets } from "../core/untrusted-egress.js";
4
+ export const childTerminalFace = (terminal) => {
5
+ const face = terminalProjection(terminal);
6
+ return typeof face.errorMessage === "string" ? { ...face, errorMessage: redactSecrets(face.errorMessage) } : face;
7
+ };
8
+ export const childThrownText = (err) => redactSecrets(thrownText(err));
9
+ export const childRejection = (err) => {
10
+ const text = thrownText(err);
11
+ const clean = childThrownText(err);
12
+ if (clean === text)
13
+ return err;
14
+ if (typeof err !== "object" || err === null)
15
+ return clean;
16
+ try {
17
+ const copy = new Error(clean);
18
+ Object.setPrototypeOf(copy, Object.getPrototypeOf(err));
19
+ for (const key of Reflect.ownKeys(err)) {
20
+ if (key !== "message" && key !== "stack")
21
+ Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(err, key));
22
+ }
23
+ return copy;
24
+ }
25
+ catch {
26
+ return new Error(clean);
27
+ }
28
+ };
@@ -38,15 +38,23 @@ export declare function normalizePeerName(name: string): string;
38
38
  /** The box-address prefixes of design/385 (`session.<id>` per-session box, `principal.<…>` the
39
39
  * cross-principal inbox family). Reserved: a NAME may never spell an address. */
40
40
  export declare const PEER_ADDRESS_PREFIXES: readonly string[];
41
+ /** The names that already address a fixed party — CC 2.1.296 `fD` (cli296.js:238093) reads `main`
42
+ * (`Og`: the conversation that spawned the run), `team-lead` (`ca`), `user` (`mxe`) and `system`
43
+ * (`adt`) off the NORMALIZED key, so every spelling that normalizes to one of them is the name.
44
+ * The frames a run speaks (`from`, `teammate_id`, a stop attribution) already carry these four
45
+ * words as parties; a spawn named one of them would speak as that party. */
46
+ export declare const RESERVED_AGENT_NAMES: readonly string[];
41
47
  /**
42
48
  * design/385 §2.2 namespace protection (CC `qd` in spirit): a candidate spawn/session name is refused
43
49
  * when its normalized key would shadow an explicit address — a reserved box prefix, a transport
44
- * scheme (`uds:` / `bridge:` / `did:`), a socket path, an `@`-bearing team form, or the `*`
45
- * broadcast token. Returns the reason, or `undefined` when the name is admissible. Registration-side
50
+ * scheme (`uds:` / `bridge:` / `did:`), a socket path, an `@`-bearing team form, the `*` broadcast
51
+ * token, one of the {@link RESERVED_AGENT_NAMES} (`reserved_name`) or the shape of an agent id
52
+ * (`agent_id_shape`). Returns the reason, or `undefined` when the name is admissible. Registration-side
46
53
  * check (loud refusal at write time); the resolution ladder ranks explicit addresses first regardless.
54
+ * The spawn face (the Agent tool's `name`) refuses on every reason this returns.
47
55
  *
48
56
  * The socket-path arm is judged on the RAW name AND on its normalized key (CC `QHe` runs its
49
57
  * classifier over both): a name that is a socket path in either spelling is refused, since the
50
58
  * resolution ladder would read the raw spelling as an address.
51
59
  */
52
- export declare function reservedPeerNameReason(name: string): "empty" | "address_prefix" | "transport_scheme" | "socket_path" | "at_sign" | "wildcard" | undefined;
60
+ export declare function reservedPeerNameReason(name: string): "empty" | "address_prefix" | "transport_scheme" | "socket_path" | "at_sign" | "wildcard" | "reserved_name" | "agent_id_shape" | undefined;
@@ -46,6 +46,8 @@ const NAMED_PIPE_RE = /^[\\/]{2}[.?][\\/]pipe[\\/]/i;
46
46
  function isSocketPathSpelling(text) {
47
47
  return SOCKET_PATH_RE.test(text) || NAMED_PIPE_RE.test(text);
48
48
  }
49
+ export const RESERVED_AGENT_NAMES = Object.freeze(["main", "team-lead", "user", "system"]);
50
+ const AGENT_ID_SHAPE_RE = /^a(?:[\w-]{1,63}-)?[0-9a-f]{16}$/;
49
51
  export function reservedPeerNameReason(name) {
50
52
  const key = normalizePeerName(name);
51
53
  if (key === "")
@@ -60,5 +62,9 @@ export function reservedPeerNameReason(name) {
60
62
  return "transport_scheme";
61
63
  if (isSocketPathSpelling(name) || isSocketPathSpelling(key))
62
64
  return "socket_path";
65
+ if (RESERVED_AGENT_NAMES.includes(key))
66
+ return "reserved_name";
67
+ if (AGENT_ID_SHAPE_RE.test(key))
68
+ return "agent_id_shape";
63
69
  return undefined;
64
70
  }
@@ -1,16 +1,16 @@
1
1
  import type { TaskResult } from "../core/types.js";
2
2
  /**
3
3
  * Shared CUMULATIVE-STATS constructor for the multi-leg agent compositions (cascade rungs, repair-loop
4
- * attempts, teacher student attempts). All three run `runner.runTask` MORE THAN ONCE and must report the
5
- * OPERATION's totals, not the last leg's.
4
+ * attempts, verify legs). Each runs `runner.runTask` MORE THAN ONCE and must report the OPERATION's totals,
5
+ * not the last leg's.
6
6
  *
7
7
  * The invariant this exists to hold in ONE place: **every field the accumulator tracks is OVERRIDDEN over
8
8
  * the base stats**. A field left un-overridden silently leaks the LAST leg's value dressed up as a
9
9
  * cumulative total (the cascade R1-m5 / R3 trap; repair-loop shipped exactly that hole on `humanReview`).
10
- * Three independent copies of this literal is how that hole survived in one copy while the other two were
11
- * fixed — hence one constructor, three call sites.
10
+ * Independent copies of this literal is how that hole survived in one copy while the others were fixed —
11
+ * hence one constructor.
12
12
  *
13
- * OWN and NESTED stay DISJOINT (the cascade R-5 / teacher A-7 convention): a consumer adds
13
+ * OWN and NESTED stay DISJOINT (the cascade R-5 convention): a consumer adds
14
14
  * `stats.X + stats.nested.X` for the true total; nested cost is never folded into `costMicroUsd`.
15
15
  */
16
16
  /** Cumulative delegated-subagent (nested) totals, summed across every leg. */
@@ -47,14 +47,11 @@ export interface CumulativeStatsAccumulator {
47
47
  cacheWriteTokens: number;
48
48
  cacheWriteTokensLong: number;
49
49
  /**
50
- * Cumulative own LLM cost (micro-USD) EXACTLY as the caller wants it published. Callers differ on the
51
- * zero case on purpose and this constructor does not adjudicate: cascade/repair-loop publish a plain `0`
52
- * (a run happened, it cost nothing measurable), teacher collapses `0` to `undefined` (the RB-368
53
- * "unpriced spend is absent, not free" posture). Unifying the two is a BEHAVIOR change, not a refactor.
50
+ * Cumulative own LLM cost (micro-USD): a plain `0` when every leg was priced and cost nothing measurable.
54
51
  *
55
52
  * Ignored entirely when {@link anyLegUnpriced} is set — see there.
56
53
  */
57
- costMicroUsd: number | undefined;
54
+ costMicroUsd: number;
58
55
  /**
59
56
  * TRUE when ANY contributing leg published no `costMicroUsd`, i.e. it ran on a model with neither a
60
57
  * `RunnerDeps.pricing` entry nor a `Model.cost` declaration (`stats.costMicroUsd` is contractually
@@ -100,11 +97,11 @@ export interface CumulativeStatsTracker {
100
97
  * Create a {@link CumulativeStatsTracker}.
101
98
  *
102
99
  * {@link buildCumulativeStats} made the OUTPUT literal single-source, but the INPUT fold stayed copied:
103
- * cascade / repair-loop / teacher each hand-maintain the same dozen `+=` lines, so a new stats field still
104
- * has to be remembered in four places — the same duplication one level down from the hole this module
105
- * exists to close. New call sites take this factory instead. Migrating the three originals onto it is a
106
- * separate change (their folds are equivalent to this one today, but rewriting three shipped compositions
107
- * is not part of a cost-accounting bug fix).
100
+ * cascade / repair-loop each hand-maintain the same dozen `+=` lines, so a new stats field still has to be
101
+ * remembered in three places — the same duplication one level down from the hole this module exists to
102
+ * close. New call sites take this factory instead. Migrating the two originals onto it is a separate change
103
+ * (their folds are equivalent to this one today, but rewriting shipped compositions is not part of a
104
+ * cost-accounting bug fix).
108
105
  *
109
106
  * OWN and NESTED stay DISJOINT here too: `add` never folds a leg's `nested.*` into the own totals.
110
107
  */
@@ -59,7 +59,7 @@ export function createCumulativeStatsTracker() {
59
59
  acc.outputTokens += s.outputTokens ?? 0;
60
60
  acc.cacheWriteTokens += s.cacheWriteTokens ?? 0;
61
61
  acc.cacheWriteTokensLong += s.cacheWriteTokensLong ?? 0;
62
- acc.costMicroUsd = (acc.costMicroUsd ?? 0) + (s.costMicroUsd ?? 0);
62
+ acc.costMicroUsd += s.costMicroUsd ?? 0;
63
63
  if (s.costMicroUsd === undefined)
64
64
  acc.anyLegUnpriced = true;
65
65
  if (s.costBreakdown) {
@@ -1,6 +1,6 @@
1
1
  import { isToolContentOrigin } from "../core/memory-engine/content-origin.js";
2
2
  import { inlineUntrusted } from "../core/untrusted-text.js";
3
- import { readToolNameList, valueTypeLabel } from "./tool-filter.js";
3
+ import { readToolNameList, valueTypeLabel } from "../core/tool-name-list.js";
4
4
  export const EXTRA_TOOL_NAMES_CODE = "config.extra_tool_names";
5
5
  export function extraToolNamesError(message, reason) {
6
6
  const e = new Error(message);
@@ -1,15 +1,18 @@
1
- import type { ToolSpec } from "../core/types.js";
1
+ import type { McpServerSpec, ToolSpec } from "../core/types.js";
2
+ import type { ToolSelector } from "../core/tool-face.js";
3
+ import type { MountedMcp } from "../core/mounted-mcp.js";
2
4
  /**
3
5
  * What a delegated child inherits when its delegation tool has no explicit pool (`SubagentToolOptions.inheritedTools`):
4
- * the parent surface, narrowed at spawn by two laws. The mint of the parent bound ({@link callerToolMembership}) and both
5
- * reads live here, so the law has one home.
6
+ * the parent surface, narrowed at spawn by two laws, and the parent's MCP declarations. The mint of the parent bound
7
+ * ({@link callerToolMembership}) and the reads live here, so the law has one home. Which of these tools the child may USE is
8
+ * not decided here: its own prepare runs its selector over everything it is handed and mounts.
6
9
  */
7
- /** The team task-list family: the pool-borne members of the upstream teammate exception set (the rest of that set,
8
- * SendMessage and the Cron trio, is mounted by a child's own prepare and never rides a delegation pool). */
10
+ /** The team task-list family (pool-borne; the catalog marks it a teammate's protocol UNDER the ceiling — a named child holds the ones its
11
+ * spawner may use). */
9
12
  export declare const TEAM_TASK_LIST_TOOL_NAMES: readonly string[];
10
- /** The run's `mountsCallerTool` seat: membership BY IDENTITY in `spec.tools` as the caller handed it (a copy of the
11
- * array taken now; nothing is read off the entries, so no entry can make the mint throw). */
12
- export declare function callerToolMembership(tools: readonly ToolSpec[] | undefined): (tool: ToolSpec) => boolean;
13
+ /** The run's `mountsCallerTool` seat: membership BY IDENTITY in `spec.tools` as the caller handed it (the roster snapshot's
14
+ * copy of the array — the one read of the slot; nothing is read off the entries, so no entry can make the mint throw). */
15
+ export declare function callerToolMembership(tools: readonly unknown[] | undefined): (tool: ToolSpec) => boolean;
13
16
  /**
14
17
  * The inherited pool for one spawn.
15
18
  * · ⊆ parent: an entry survives only when the spawning run mounts THAT instance — a same-named replacement (a host's
@@ -20,9 +23,10 @@ export declare function callerToolMembership(tools: readonly ToolSpec[] | undefi
20
23
  */
21
24
  export declare function inheritedChildPool(surface: readonly ToolSpec[], mountsCallerTool: ((tool: ToolSpec) => boolean) | undefined, anonymousBackground: boolean): ToolSpec[];
22
25
  /**
23
- * The task-list members of a named child's INHERITED pool that stand past its allowlist (upstream: a teammate built from a
24
- * custom agent type gets `[...type.tools, SendMessage, ...the four when the root has them]` — the root's own first-party
25
- * tools). Only what the child inherited is widened: a pool the host composed (`tools`, `extraTools`) is judged by the
26
- * allowlist as written, since a model-chosen name must not lift a host's restriction. A deny still wins.
26
+ * The MCP servers a delegated child is declared: each server its spawning run declares, exactly as declared, when the child's
27
+ * selector can admit a tool of it ({@link ToolSelector.admitsPeer} — read off the lists, never off what the server lists now).
28
+ * A server the selector can never reach is not declared, so it is never dialled or leased for this child. The child connects
29
+ * from these (through the run tree's pool) and its own selector decides, at intake and on every refresh and re-dial, which of
30
+ * the server's tools mount.
27
31
  */
28
- export declare function teammateInheritedFamily(inherited: readonly ToolSpec[], denyTools: ReadonlyArray<string> | undefined): ToolSpec[];
32
+ export declare function inheritedMcpDeclarations(mounted: MountedMcp, selector: ToolSelector): McpServerSpec[];
@@ -1,4 +1,5 @@
1
- import { resolveToolSubset } from "./tool-filter.js";
1
+ import { mintNamespacePrefix } from "../core/protocol-naming.js";
2
+ import { MCP_NAMESPACE } from "../core/protocol-table.js";
2
3
  import { TASK_CREATE_TOOL_NAME, TASK_GET_TOOL_NAME, TASK_LIST_TOOL_NAME, TASK_UPDATE_TOOL_NAME } from "../core/tool-catalog-entries.js";
3
4
  export const TEAM_TASK_LIST_TOOL_NAMES = Object.freeze([TASK_CREATE_TOOL_NAME, TASK_GET_TOOL_NAME, TASK_LIST_TOOL_NAME, TASK_UPDATE_TOOL_NAME]);
4
5
  export function callerToolMembership(tools) {
@@ -10,6 +11,6 @@ export function inheritedChildPool(surface, mountsCallerTool, anonymousBackgroun
10
11
  return [];
11
12
  return surface.filter((t) => mountsCallerTool(t) && !(anonymousBackground && TEAM_TASK_LIST_TOOL_NAMES.includes(t.name)));
12
13
  }
13
- export function teammateInheritedFamily(inherited, denyTools) {
14
- return resolveToolSubset(inherited.filter((t) => TEAM_TASK_LIST_TOOL_NAMES.includes(t.name)), undefined, denyTools);
14
+ export function inheritedMcpDeclarations(mounted, selector) {
15
+ return mounted.servers.filter((m) => selector.admitsPeer(mintNamespacePrefix(MCP_NAMESPACE, m.server.name))).map((m) => m.server);
15
16
  }
@@ -2,6 +2,7 @@ import { type MailboxCrossProcessVerdict, type MailboxStore } from "../core/mail
2
2
  import { type SessionBoxBinding, type SystemInjectionPriority, type TaskNotificationPayload } from "../core/task-notification.js";
3
3
  import { type FrameSettlement } from "../core/frame-settlement.js";
4
4
  import { type EngineNotice, type RunnerDeps } from "../core/types.js";
5
+ import type { ToolSelector } from "../core/tool-face.js";
5
6
  import { type PermissionModeClass } from "./cross-session-envelope.js";
6
7
  import { type CrossSessionInboundSettingLayers } from "./cross-session-judge.js";
7
8
  import { type PeerLaneConfig } from "./peer-admission.js";
@@ -214,13 +215,13 @@ export declare function peerLaneSendMessageSeats(args: {
214
215
  }): Pick<SendMessageToolOptions, "peerDirectory" | "peerSelfSession" | "peerListingMounted">;
215
216
  /**
216
217
  * design/385 §5.1 — THE ListAgents mount predicate, single source: the built-in mounts only when the
217
- * face does not exclude it and no caller tool owns either spelling (`ListAgents` / `ListPeers`) as its
218
+ * leg's selector admits it and no caller tool owns either spelling (`ListAgents` / `ListPeers`) as its
218
219
  * name OR as an alias. Every reader of "is ListAgents on this roster?" — the mount itself and the
219
220
  * SendMessage face's listing phrase — calls this one predicate, so a face can never name a tool the
220
221
  * roster does not carry (a second, inline copy of the rule drifted on exactly the alias arms).
221
222
  */
222
223
  export declare function listAgentsMountable(face: {
223
- exclude: readonly string[] | undefined;
224
+ selector: Pick<ToolSelector, "admits">;
224
225
  specTools: ReadonlyArray<{
225
226
  name: string;
226
227
  aliases?: readonly string[];
@@ -684,12 +684,13 @@ export function peerLaneSendMessageSeats(args) {
684
684
  };
685
685
  }
686
686
  export function listAgentsMountable(face) {
687
- if ((face.exclude ?? []).includes(LIST_AGENTS_TOOL_NAME))
688
- return false;
689
- return !face.specTools.some((t) => t.name === LIST_AGENTS_TOOL_NAME || t.name === LIST_AGENTS_TOOL_ALIAS || t.aliases?.includes(LIST_AGENTS_TOOL_NAME) || t.aliases?.includes(LIST_AGENTS_TOOL_ALIAS));
687
+ return face.selector.admits({ name: LIST_AGENTS_TOOL_NAME, aliases: [LIST_AGENTS_TOOL_ALIAS] }) && listAgentsNameFree(face.specTools);
688
+ }
689
+ function listAgentsNameFree(specTools) {
690
+ return !specTools.some((t) => t.name === LIST_AGENTS_TOOL_NAME || t.name === LIST_AGENTS_TOOL_ALIAS || t.aliases?.includes(LIST_AGENTS_TOOL_NAME) || t.aliases?.includes(LIST_AGENTS_TOOL_ALIAS));
690
691
  }
691
692
  export function mountListAgents(args) {
692
- if (!listAgentsMountable({ exclude: undefined, specTools: args.specTools }))
693
+ if (!listAgentsNameFree(args.specTools))
693
694
  return undefined;
694
695
  args.toolEffects.set(LIST_AGENTS_TOOL_NAME, "read");
695
696
  args.toolEffects.set(LIST_AGENTS_TOOL_ALIAS, "read");
@@ -18,6 +18,7 @@ import { appendHopToken, judgePeerAdmission, peerAxisToken, resolvePeerLaneConfi
18
18
  import { toolFace } from "../core/tool-catalog-entries.js";
19
19
  import { thrownText } from "../core/thrown-value.js";
20
20
  import { assertNoRetiredKeys } from "../core/retired-keys.js";
21
+ import { clampValuesOf } from "../core/child-clamp-seats.js";
21
22
  import { resolveSubagentTranscriptTier } from "../core/wiring-manifest.js";
22
23
  export const SEND_MESSAGE_TOOL_NAME = "SendMessage";
23
24
  let uplinkSeqGlobal = Date.now();
@@ -1035,16 +1036,8 @@ export function createSendMessageTool(opts) {
1035
1036
  ...(opts.notify ? { currentParentNotify: opts.notify } : {}),
1036
1037
  ...(ctx.onQuestion !== undefined && row.sessionScoped !== true ? { currentOnQuestion: ctx.onQuestion } : {}),
1037
1038
  currentClamps: {
1038
- ...(ctx.handsReadOnly === true ? { handsReadOnly: true } : {}),
1039
- ...(ctx.readFace === "roots" ? { readFaceRoots: true } : {}),
1040
- ...(ctx.writeFace === "roots" ? { writeFaceRoots: true } : {}),
1041
- ...(ctx.readDenyPatterns !== undefined ? { readDenyPatterns: ctx.readDenyPatterns } : {}),
1042
- ...(ctx.interactiveTools === false ? { interactiveTools: false } : {}),
1043
- ...(ctx.approvalReach === "none" ? { approvalReach: "none" } : {}),
1044
- ...(ctx.oneShot === true ? { oneShot: true } : {}),
1045
- ...(ctx.memoryPersistenceCapable === false ? { memoryPersistenceCapable: false } : {}),
1039
+ ...clampValuesOf(ctx, ctx.parentSpecSeat),
1046
1040
  ...(ctx.parentSpecSeat?.memoryOff === true ? { memoryOff: true } : {}),
1047
- ...(ctx.parentSpecSeat?.fileHistory === "disabled" ? { fileHistory: "disabled" } : {}),
1048
1041
  },
1049
1042
  ...(ctx.autoModeReview !== undefined ? { currentAutoModeReview: ctx.autoModeReview } : {}),
1050
1043
  });
@@ -397,19 +397,6 @@ export interface SubagentSteerHandle {
397
397
  * must not be guessable by untrusted content — the old `steer-a<seq>` global counter let injected text
398
398
  * pre-claim "[steer-aN]" and self-declare correlation; the same fix applies to the new resume markers. */
399
399
  export declare function markerFragment(): string;
400
- /**
401
- * design/122 D2 — build the `resume` verb for one delegation (closure over the ledger + delegation runner —
402
- * NEVER the parent tool ctx / spec builder, r1-m5). Validation order: TTL sweep (MAJOR-1) → disposed?
403
- * (MAJOR-3) → retained/evicted? → still running? → cap → SYNCHRONOUS claim (MAJOR-2: `running = true`
404
- * before any await; rolled back on pre-launch failure) → session exists AND non-empty (r1-m1).
405
- * Then: fenced revive prompt (unpredictable marker) →
406
- * `runTaskStream` on the FROZEN spawn snapshot + `requireExistingSession` (spec is tighten-only: the caller
407
- * contributes ONLY `content`) → ledger `activeRun` bookkeeping → completion announced through
408
- * `deps.notify` (no sink ⇒ silent). Which lane
409
- * that is depends on the mount: the background Agent lane wires the deployment-level background-notify
410
- * sink, while the SendMessage mount wires the SENDING run's own notification injector — there the
411
- * completion notice lands in the sender's live injection queue at its next turn boundary.
412
- */
413
400
  export declare function createSubagentResume(deps: {
414
401
  ledger: SubagentRetainLedger | undefined;
415
402
  parentToolCallId: string;
@@ -441,18 +428,11 @@ export declare function createSubagentResume(deps: {
441
428
  * read-only / hard-headless / one-shot run and still act with the spawn turn's capabilities — the
442
429
  * resumer driving actions it could not perform itself. The fold is a union of restrictions (either
443
430
  * side saying "restricted" wins), never a relaxation: a snapshot clamp is not lifted by a resumer
444
- * that lacks it. Absent ⇒ the snapshot governs alone (prior behavior). */
445
- currentClamps?: {
446
- handsReadOnly?: true;
447
- interactiveTools?: false;
448
- approvalReach?: "none";
449
- oneShot?: true;
450
- memoryPersistenceCapable?: false;
431
+ * that lacks it. Absent ⇒ the snapshot governs alone (prior behavior). The seats are the clamp table's rows
432
+ * (`ClampValues`: only restricting values), plus the memory-off fact — a rewrite of the `memory` declaration,
433
+ * not a value seat. */
434
+ currentClamps?: import("../core/child-clamp-seats.js").ClampValues & {
451
435
  memoryOff?: true;
452
- fileHistory?: "disabled";
453
- readFaceRoots?: true;
454
- writeFaceRoots?: true;
455
- readDenyPatterns?: readonly import("../tools/fs/read-deny.js").ReadDenyEntry[];
456
436
  };
457
437
  /** The RESUMING caller's own handback-review seat (its trusted `ToolExecuteContext.autoModeReview`),
458
438
  * same turn-bound reasoning as `currentOnQuestion` above: a resumed cycle is a completion like any
@@ -704,13 +684,14 @@ export interface SubagentToolOptions {
704
684
  inheritedTools?: ToolSpec[];
705
685
  /**
706
686
  * Tool-level allowlist (design/38 1A), used when NO `agent` is selected (a selected agent definition's
707
- * own `allowTools`/`denyTools` REPLACE these). When set, the child sees only these of its pool and of the engine's hand
708
- * tools its run mounts (Read / Write / Bash …) (`["*"]` = all). Omit for everything. Allowlist is the security-recommended shape.
709
- * NOTE: this filters only the WORK tools — the nested delegation tool is governed by `maxDepth`, not
710
- * allow/deny. To deny the child any further delegation, set `maxDepth: 1` (not a `denyTools` entry).
687
+ * own `allowTools`/`denyTools` REPLACE these). When set, the child may use only what it names, out of everything its run would
688
+ * mount (its pool, the hands, the engine's own tools, the MCP tools it inherits) — the child's own selector layer, under the
689
+ * spawning run's selector (`["*"]` = no allowlist of its own). Omit for everything the parent could use. Allowlist is the
690
+ * security-recommended shape. The nested delegation tool is one of the tools it governs: a child gets one only while under
691
+ * `maxDepth` AND when these lists admit the delegation tool's name.
711
692
  */
712
693
  allowTools?: string[];
713
- /** Tool-level denylist (design/38 1A), used when no `agent` is selected: names removed from the pool and the hand tools (a deny wins). */
694
+ /** Tool-level denylist (design/38 1A), used when no `agent` is selected: the denied half of the child's own selector layer (a deny wins). */
714
695
  denyTools?: string[];
715
696
  /** System prompt / persona for the child. Default (1.259.0, CC 198 parity): the LEAN
716
697
  * {@link SUBAGENT_PROMPT} (agent persona + return contract), NOT the full default constitution role