@sema-agent/core 7.54.1 → 7.56.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 (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -1,5 +1,5 @@
1
1
  import { canonicalizeTarget, isWinFormPath, pathFamilyOf, writeTargetPath } from "../../tools/fs/safety.js";
2
- import { SESSION_RULES_GRAMMAR, compileSessionRuleBucket, continuesLineage, earlierGrammarAnnouncer, earlierGrammarRefusalClause, readSessionRulesShape, unreadableDenyEntries } from "../session-policy-store.js";
2
+ import { SESSION_RULES_GRAMMAR, compileSessionRuleBucket, continuesLineage, earlierGrammarAnnouncer, earlierGrammarEntries, earlierGrammarRefusalClause, readSessionRulesShape, unreadableDenyEntries } from "../session-policy-store.js";
3
3
  import { compiledEntryName, judgeAllowEntries, uncoveredCommandSegment } from "../allow-entry.js";
4
4
  import { inlineUntrusted } from "../untrusted-text.js";
5
5
  import { callTargetReadingOf, pathTargetBaseOf, readCallTarget } from "../effective-path-target.js";
@@ -32,8 +32,10 @@ const deny = (tool, detail) => ({
32
32
  message: ruleDenialSentence({ source: "session", tool, ...(detail !== undefined ? { detail } : {}) }),
33
33
  decisionReason: "rule",
34
34
  });
35
- const HANDOFF_BOUND = 256;
36
35
  const ANNOUNCED_REASONS_BOUND = 8;
36
+ export function rowFollowsFloor(row, floor) {
37
+ return floor.rev === 0 || continuesLineage(row, floor);
38
+ }
37
39
  export function createLiveSessionRules(store, floor, hooks) {
38
40
  const announced = new Set();
39
41
  const announce = (reason) => {
@@ -46,6 +48,8 @@ export function createLiveSessionRules(store, floor, hooks) {
46
48
  let servedRow = false;
47
49
  let vanished = false;
48
50
  const read = async (signal) => {
51
+ if (store === undefined)
52
+ return (announce(`this leg's runner has no session-policy store to re-read the rules of session ${JSON.stringify(floor.sessionId)} from`), enforced);
49
53
  let live;
50
54
  try {
51
55
  live = await withGateTimeout(store.getRules(floor.sessionId, floor.principal), DEFAULT_GATE_AWAIT_TIMEOUT_MS, signal, "sessionRulesRead");
@@ -64,15 +68,13 @@ export function createLiveSessionRules(store, floor, hooks) {
64
68
  }
65
69
  return enforced;
66
70
  }
67
- if (enforced.rev > 0) {
68
- if (!continuesLineage(live, enforced)) {
69
- announce(`session ${JSON.stringify(floor.sessionId)} has a rules row of a new lineage (generation ${live.gen}, rev ${live.rev}), which does not continue the row this leg enforces (generation ${enforced.gen})`);
70
- return enforced;
71
- }
72
- if (vanished && live.gen === undefined) {
73
- announce(`session ${JSON.stringify(floor.sessionId)} has a new rules row at rev ${live.rev} after the row this leg enforced was deleted, and its backend carries no lineage to continue it by`);
74
- return enforced;
75
- }
71
+ if (!rowFollowsFloor(live, enforced)) {
72
+ announce(`session ${JSON.stringify(floor.sessionId)} has a rules row of a new lineage (generation ${live.gen}, rev ${live.rev}), which does not continue the row this leg enforces (generation ${enforced.gen})`);
73
+ return enforced;
74
+ }
75
+ if (vanished && live.gen === undefined) {
76
+ announce(`session ${JSON.stringify(floor.sessionId)} has a new rules row at rev ${live.rev} after the row this leg enforced was deleted, and its backend carries no lineage to continue it by`);
77
+ return enforced;
76
78
  }
77
79
  if (live.rev <= enforced.rev) {
78
80
  if (live.rev < enforced.rev) {
@@ -85,24 +87,7 @@ export function createLiveSessionRules(store, floor, hooks) {
85
87
  hooks?.onEnforced?.(live);
86
88
  return live;
87
89
  };
88
- const handed = new Map();
89
- return async (toolCallId, signal) => {
90
- const handedRead = handed.get(toolCallId);
91
- if (handedRead !== undefined) {
92
- handed.delete(toolCallId);
93
- const claimed = await handedRead;
94
- if (continuesLineage(claimed, enforced) && claimed.rev >= enforced.rev)
95
- return claimed;
96
- }
97
- const p = read(signal);
98
- handed.set(toolCallId, p);
99
- if (handed.size > HANDOFF_BOUND) {
100
- const oldest = handed.keys().next().value;
101
- if (oldest !== undefined)
102
- handed.delete(oldest);
103
- }
104
- return p;
105
- };
90
+ return (_toolCallId, signal) => read(signal);
106
91
  }
107
92
  function compileSessionRules(rules) {
108
93
  const shaped = readSessionRulesShape(rules);
@@ -110,7 +95,7 @@ function compileSessionRules(rules) {
110
95
  if ("fault" in shaped) {
111
96
  const { field, got } = shaped.fault;
112
97
  const what = got === "not a rule bucket" ? "a key that is no rule bucket" : field === "" ? `a value that is ${got}, not an object of rule buckets` : `${field} holding ${got}`;
113
- return { deny: [], allow: undefined, earlier: { grammar: SESSION_RULES_GRAMMAR, toolAllow: [], toolDeny: [] }, allowDirs: undefined, pathRows: false, names: { deny: [], allow: [] }, unreadable: refuseEvery(what) };
98
+ return { deny: [], allow: undefined, earlier: { grammar: SESSION_RULES_GRAMMAR, toolAllow: [], toolDeny: [] }, announced: { toolAllow: [], toolDeny: [] }, allowDirs: undefined, pathRows: false, names: { deny: [], allow: [] }, unreadable: refuseEvery(what) };
114
99
  }
115
100
  const { toolAllow, allowDirs, grammar } = shaped.rules;
116
101
  const unreadDeny = unreadableDenyEntries(shaped.rules).length;
@@ -124,6 +109,7 @@ function compileSessionRules(rules) {
124
109
  deny,
125
110
  allow,
126
111
  earlier: { grammar, toolAllow: named(allowList, true), toolDeny: named(denyList, true) },
112
+ announced: { toolAllow: earlierGrammarEntries(shaped.rules, "toolAllow"), toolDeny: earlierGrammarEntries(shaped.rules, "toolDeny") },
127
113
  allowDirs: allowDirs !== undefined && allowDirs.length > 0 ? allowDirs : undefined,
128
114
  pathRows: [...deny, ...(allow ?? [])].some((r) => r.compiled.kind === "path"),
129
115
  names: { deny: [...deny.map((r) => compiledEntryName(r.compiled)), ...named(denyList, false)], allow: [...(allow ?? []).map((r) => compiledEntryName(r.compiled)), ...named(allowList, false)] },
@@ -143,7 +129,7 @@ export function createSessionRulePolicy(rules, opts) {
143
129
  if (compiled === undefined || compiledFor !== r) {
144
130
  compiled = compileSessionRules(r);
145
131
  for (const field of ["toolAllow", "toolDeny"])
146
- announceEarlier(compiled.earlier[field], field, compiled.earlier.grammar);
132
+ announceEarlier(compiled.announced[field], field, compiled.earlier.grammar);
147
133
  compiledFor = r;
148
134
  }
149
135
  return compiled;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The run's seat for `inherit_env.names_withheld`: the person whose run drives the engine's shell tool is told which
3
+ * variables of the engine's environment that shell does not receive.
4
+ *
5
+ * ONE FACT, ONE MINT. Which entries a shell child loses is decided by the execution environment's one composition
6
+ * (`inheritedHostEnv(policy, findings)` and the adapter's explicit grants), and the environment hands the result over as
7
+ * the read `ExecutionEnv.withheldEnv`. This seat reads that answer and tells it; it never recomputes it (the policy and
8
+ * the grants are the adapter's, not the run's). The split into the scrub's half and the deployment's own credentials is
9
+ * the one the operator notice uses (`withheldEnvNames`).
10
+ *
11
+ * WHEN. At the start of every call to the engine's own shell tool (its mount, judged by the catalog's mount judge), on a
12
+ * root leg (the person reads the root; the delegation fact is the hook identity's, the leg's one derivation). The answer
13
+ * is read at each such call because it can grow during a run — a credential the engine takes in when it first routes a
14
+ * model, dials a peer or builds a seat is withheld from the next child — and a call follows at least one model request.
15
+ * Told once per SESSION per answer: the digest rides the session's announced record (`advisories`), and a run-time record
16
+ * write is parked for the leg's flush like every other run-time arm of that record.
17
+ *
18
+ * An answer of `"unknown"` is told as unknown, never as silence. A value that is neither a list of findings nor
19
+ * `"unknown"` (or a read that throws) is a wiring fault: it is announced to the operator under the existing
20
+ * capability-shape code, once per run, and the person is told nothing — no reading defaults to `"unknown"`.
21
+ */
22
+ import { type EngineNotice } from "../engine-notice.js";
23
+ import type { ExecutionEnv } from "../../internal/harness.js";
24
+ import type { Prepared } from "./contracts.js";
25
+ export type WithheldShellEnvSeatInput = Pick<Prepared, "sessionId" | "runId" | "hookIdentity" | "toolRosterDeltas" | "announcedListingsRef" | "frameReceipts"> & {
26
+ readonly harness: {
27
+ readonly env: Pick<ExecutionEnv, "withheldEnv">;
28
+ };
29
+ };
30
+ /** The seat, per run. `onToolStart` never throws: a diagnostic may not be what fails a call. */
31
+ export declare function createWithheldShellEnvSeat(prepared: WithheldShellEnvSeatInput, onNotice: ((notice: EngineNotice) => void) | undefined): {
32
+ onToolStart(toolName: string): void;
33
+ };
@@ -0,0 +1,51 @@
1
+ import { deliverEngineNotice } from "../engine-notice.js";
2
+ import { withheldEnvUserNotice } from "../secret-env.js";
3
+ import { isEngineShellFace } from "../tool-catalog-entries.js";
4
+ import { toolCallFaceOf } from "../tool-roster.js";
5
+ import { announceDigest, withAnnounceDigests } from "./announce-once-ledger.js";
6
+ const isFinding = (f) => typeof f === "object" && f !== null && typeof Reflect.get(f, "key") === "string" && typeof Reflect.get(f, "kind") === "string";
7
+ function readWithheldEnv(env) {
8
+ try {
9
+ const value = env.withheldEnv;
10
+ if (value === "unknown")
11
+ return "unknown";
12
+ if (!Array.isArray(value))
13
+ return { malformed: value === null ? "null" : typeof value };
14
+ return value.every(isFinding) ? value : { malformed: "array holding a non-finding" };
15
+ }
16
+ catch {
17
+ return { malformed: "unreadable" };
18
+ }
19
+ }
20
+ export function createWithheldShellEnvSeat(prepared, onNotice) {
21
+ let shapeFaultTold = false;
22
+ return {
23
+ onToolStart(toolName) {
24
+ if (prepared.hookIdentity.isDelegatedChild || !isEngineShellFace(toolCallFaceOf(prepared.toolRosterDeltas.current, toolName)))
25
+ return;
26
+ const answer = readWithheldEnv(prepared.harness.env);
27
+ if (typeof answer === "object" && "malformed" in answer) {
28
+ if (shapeFaultTold)
29
+ return;
30
+ shapeFaultTold = true;
31
+ deliverEngineNotice(onNotice, {
32
+ code: "config.execution_env_capability_invalid",
33
+ message: `The execution environment declares withheldEnv as (${answer.malformed}), not a list of findings or "unknown". The person whose run drives its shell is told nothing about the variables that shell does not receive. Fix the adapter — this is a wiring fault, not a supported way to leave the member unanswered.`,
34
+ detail: { key: "withheldEnv", valueType: answer.malformed },
35
+ });
36
+ return;
37
+ }
38
+ const notice = withheldEnvUserNotice(answer, { sessionId: prepared.sessionId, runId: prepared.runId });
39
+ if (notice === undefined)
40
+ return;
41
+ const d = notice.detail;
42
+ const digest = announceDigest(notice.code, `${d.state}\n${[...(d.names ?? [])].sort().join("\n")}\n\n${[...(d.ownCredentials ?? [])].sort().join("\n")}`);
43
+ const record = prepared.announcedListingsRef;
44
+ if (record.advisories?.includes(digest) === true)
45
+ return;
46
+ deliverEngineNotice(onNotice, notice);
47
+ record.advisories = withAnnounceDigests(record.advisories, [digest]);
48
+ prepared.frameReceipts.listingSnapshotOwed = true;
49
+ },
50
+ };
51
+ }
@@ -1,22 +1,26 @@
1
1
  /**
2
2
  * The run's usage account for the model calls made BESIDE the main loop — the compaction summarizer, the permission
3
- * classifier, a mod's `$.model.complete`: the lanes, what a reply tells the account, the one door a lane books through, and the
4
- * ONE function behind it. The lane table says which `Stats` line keeps a lane's cost besides `costMicroUsd` (every lane folds
5
- * into the total — it is the budget coordinate and the reported figure); it is total over the lanes by its fence, so a fourth
6
- * lane is a row here, not a second accounting function.
3
+ * classifier, a mod's `$.model.complete`, the advisor tool: the lanes, what a reply tells the account, the one door a lane books
4
+ * through, and the ONE function behind it. The lane table says which `Stats` line keeps a lane's cost besides `costMicroUsd`
5
+ * (every lane folds into the total — it is the budget coordinate and the reported figure); it is total over the lanes by its
6
+ * fence, so another lane is a row here, not a second accounting function.
7
7
  */
8
8
  import type { AssistantMessageDiagnostic, Model, Usage } from "../../internal/llm.js";
9
9
  import { type ModelPricing } from "../pricing.js";
10
10
  import type { AssertAllKeysHandled } from "../ask-origin.js";
11
- import type { RunnerDeps, TaskSpec } from "../types.js";
11
+ import type { Brain, RunnerDeps, TaskSpec } from "../types.js";
12
12
  import type { Stats } from "./assemble-result.js";
13
- /** Whose model call it is: the compaction summarizer, the permission classifier, a mod's `$.model.complete`. */
14
- export type SideCallLane = "compaction" | "classifier" | "mod";
15
- /** The `Stats` line a lane's cost is also kept in: compaction is its own partition line; the classifier and the mods share the side-call line. */
13
+ /** Whose model call it is: the compaction summarizer, the permission classifier, a mod's `$.model.complete`, the advisor
14
+ * tool's consultation of its advisor model. The word rides every side-call trace row (`brain.call.lane`). */
15
+ export type SideCallLane = "compaction" | "classifier" | "mod" | "advisor";
16
+ /** The `Stats` line a lane's cost is also kept in: compaction is its own partition line (the engine's upkeep); the
17
+ * classifier, the mods and the advisor share the side-call line (calls the run's own agent caused, so they stay inside the
18
+ * root agent's cost). */
16
19
  export declare const SIDE_CALL_LANE_TOTAL: {
17
20
  readonly compaction: "compactionMicroUsd";
18
21
  readonly classifier: "sideCallMicroUsd";
19
22
  readonly mod: "sideCallMicroUsd";
23
+ readonly advisor: "sideCallMicroUsd";
20
24
  };
21
25
  export type LaneTotalCoversEverySideCallLane = AssertAllKeysHandled<Exclude<SideCallLane, keyof typeof SIDE_CALL_LANE_TOTAL>>;
22
26
  /** A side call's reply as the account reads it: the provider's usage (absent ⇒ none reported), the marks of what is unknown,
@@ -64,5 +68,25 @@ export interface SideCallCall {
64
68
  * unknown is not free). A reply the brain itself marked `usageMissing` does the same for its zero-filled usage.
65
69
  */
66
70
  export declare function recordSideCallUsage(stats: Stats, usage: Usage | undefined, lane: SideCallLane, call: SideCallCall): void;
71
+ /**
72
+ * The accounted brain of a DERIVED LEG — a model call made beside the main loop on the leg's behalf (the compaction summary,
73
+ * the advisor consultation): every reply is booked through `book` exactly once, under `lane`, and the call runs behind
74
+ * NO-OP status and reasoning-wire-facts sinks. Both arms obey the same law, whichever one the caller uses.
75
+ *
76
+ * The shields: a derived call fires inside the leg's `runWithStatusSink` scope (the compaction hook from `turn_boundary`
77
+ * within `harness.prompt`, the advisor from a tool call), so a 429/retry on it must not surface as a `status` event on the
78
+ * user's turn (status-sink.ts / TaskEvent.status), and its model, tier and output cap must not restate the leg's reasoning
79
+ * posture from a request the leg's caller never made — a no-op inner scope swallows the facts rather than consuming the
80
+ * leg's one correction.
81
+ *
82
+ * `complete` is ALWAYS provided (brainToRuntime prefers it), so the booking is awaited INLINE on both the native-complete and
83
+ * derived-from-stream paths, and the message is returned UNCHANGED (its `errorKind` is what the summary path's
84
+ * budget-escalation recovery reads). `stream` opens the inner stream inside the same scopes (the provider work it starts runs
85
+ * in them) and books the stream's final message when it settles: the inner `result()` settles once, whether the caller awaits
86
+ * it or only iterates, and the returned stream's `result()` is that booked settlement — a booking that throws rejects it rather
87
+ * than vanishing. A stream that ends without a final message books nothing; its caller owes the lower-bound mark. `brainOf`
88
+ * is read per call (a swapped deployment brain reaches legs already running).
89
+ */
90
+ export declare function derivedLegBrain(brainOf: () => Brain, lane: SideCallLane, book: SideCallBook): Brain;
67
91
  /** The leg's door: `recordSideCallUsage` bound to the leg's `stats` and account, reading what the reply itself says (its marks, and who served it). */
68
92
  export declare function sideCallBookOf(stats: Stats, account: SideCallAccount): SideCallBook;
@@ -1,4 +1,5 @@
1
1
  import { readDegradation } from "../../brain/degrading.js";
2
+ import { runWithReasoningWireFacts, runWithStatusSink } from "../../brain/status-sink.js";
2
3
  import { isModelPriced, modelCostToPricing } from "../pricing.js";
3
4
  import { emitTrace } from "../trace.js";
4
5
  import { cacheFamilyOf, usageCostMicroUsd } from "./usage-accounting.js";
@@ -6,6 +7,7 @@ export const SIDE_CALL_LANE_TOTAL = {
6
7
  compaction: "compactionMicroUsd",
7
8
  classifier: "sideCallMicroUsd",
8
9
  mod: "sideCallMicroUsd",
10
+ advisor: "sideCallMicroUsd",
9
11
  };
10
12
  function catalogModel(id, catalog) {
11
13
  if (catalog === undefined)
@@ -41,12 +43,32 @@ export function recordSideCallUsage(stats, usage, lane, call) {
41
43
  const total = SIDE_CALL_LANE_TOTAL[lane];
42
44
  stats[total] = (stats[total] ?? 0) + costMicroUsd;
43
45
  emitTrace(account.telemetry.tracer, () => ({
44
- kind: "brain.call", version: 1, taskId: account.telemetry.taskId, model: modelId, ...(served !== undefined ? { provider: served.provider } : {}),
46
+ kind: "brain.call", version: 1, taskId: account.telemetry.taskId, model: modelId, lane, ...(served !== undefined ? { provider: served.provider } : {}),
45
47
  promptTokens: uncachedInputTokens, totalInputTokens, completionTokens: usage.output || 0,
46
48
  cacheRead: usage.cacheRead || 0, cacheWrite: usage.cacheWrite || 0,
47
49
  latencyMs: 0, ...(priced ? { costMicroUsd } : {}), ...(call.stopReason !== undefined ? { stopReason: call.stopReason } : {}), ts: Date.now(),
48
50
  }));
49
51
  }
52
+ export function derivedLegBrain(brainOf, lane, book) {
53
+ const shielded = (fn) => runWithStatusSink(() => { }, async () => await runWithReasoningWireFacts(() => { }, fn));
54
+ return {
55
+ stream: (m, c, o) => shielded(async () => {
56
+ const inner = await Promise.resolve(brainOf().stream(m, c, o));
57
+ const booked = inner.result().then((msg) => {
58
+ book(lane, m, msg);
59
+ return msg;
60
+ });
61
+ booked.catch(() => { });
62
+ return { [Symbol.asyncIterator]: () => inner[Symbol.asyncIterator](), result: () => booked };
63
+ }),
64
+ complete: async (m, c, o) => {
65
+ const brain = brainOf();
66
+ const msg = await shielded(async () => (brain.complete ? await brain.complete(m, c, o) : await (await Promise.resolve(brain.stream(m, c, o))).result()));
67
+ book(lane, m, msg);
68
+ return msg;
69
+ },
70
+ };
71
+ }
50
72
  export function sideCallBookOf(stats, account) {
51
73
  return (lane, model, reply) => {
52
74
  const degradedTo = readDegradation(reply)?.to;
@@ -39,7 +39,7 @@ export function readSkillsSeat(skills) {
39
39
  const at = `${SKILLS_SEAT}[${i}]`;
40
40
  if (typeof raw !== "object" || raw === null || Array.isArray(raw))
41
41
  throw skillsSeatRefusal(at, `must be an object { name, description, content } (got ${kindOf(raw)})`);
42
- const { name, description, content, allowedTools, disallowedTools, files: rawFiles, baseDir, ...rest } = raw;
42
+ const { name, description, content, allowedTools, disallowedTools, files: rawFiles, baseDir, mods: rawMods, ...rest } = raw;
43
43
  void rest;
44
44
  for (const [member, value] of [["name", name], ["description", description], ["content", content]]) {
45
45
  if (typeof value !== "string")
@@ -47,11 +47,15 @@ export function readSkillsSeat(skills) {
47
47
  }
48
48
  const files = readSkillFiles(rawFiles, `${at}.files`);
49
49
  skillBaseDirOf(baseDir);
50
+ if (rawMods !== undefined && !Array.isArray(rawMods))
51
+ throw skillsSeatRefusal(`${at}.mods`, `must be a list of mods registrations (got ${kindOf(rawMods)})`);
50
52
  if (seen.has(name))
51
53
  continue;
52
54
  seen.add(name);
53
55
  const [allowed, denied] = [readSkillTable(allowedTools), readSkillTable(disallowedTools)];
54
- out.push({ name, description, content, ...(allowed !== undefined ? { allowedTools: allowed } : {}), ...(denied !== undefined ? { disallowedTools: denied } : {}), ...(files !== undefined ? { files } : {}), ...(baseDir !== undefined ? { baseDir } : {}) });
56
+ const list = rawMods;
57
+ const mods = list === undefined ? undefined : Object.freeze(Array.from({ length: list.length }, (_, j) => list[j]));
58
+ out.push({ name, description, content, ...(allowed !== undefined ? { allowedTools: allowed } : {}), ...(denied !== undefined ? { disallowedTools: denied } : {}), ...(files !== undefined ? { files } : {}), ...(baseDir !== undefined ? { baseDir } : {}), ...(mods !== undefined ? { mods } : {}) });
55
59
  }
56
60
  return out;
57
61
  }
@@ -74,7 +74,7 @@ export function streamSettleBackstop(input) {
74
74
  sessionId: taskIdRef.sessionId ?? "unknown",
75
75
  ...(taskIdRef.runId !== undefined ? { runId: taskIdRef.runId } : {}),
76
76
  terminal: { kind: "failed", ...(code !== undefined ? { code } : {}), message, ...(detail !== undefined ? { detail } : {}) },
77
- result: "",
77
+ result: "", resultEntryIds: [],
78
78
  ...(remoteEnvFailure !== undefined ? { remoteEnvFailures: remoteEnvFailure } : {}),
79
79
  ...(taskIdRef.effectiveMemoryScopes !== undefined ? { effectiveMemoryScopes: taskIdRef.effectiveMemoryScopes } : {}),
80
80
  ...(taskIdRef.effectiveReasoning !== undefined ? { effectiveReasoning: taskIdRef.effectiveReasoning } : {}),
@@ -26,7 +26,7 @@ export type CompiledOutputSchema =
26
26
  fallbackReason: string;
27
27
  };
28
28
  /**
29
- * Validate + strict-derive a structured-output schema (CC 2.1.205 semantics):
29
+ * Validate + strict-derive a structured-output schema:
30
30
  * invalid / oversized schema → `{error}` (the caller throws — no silent acceptance);
31
31
  * in-subset schema → `{modelSchema: strictForm, strict:true}` (`additionalProperties:false` stamped);
32
32
  * valid-but-unsupported schema → `{modelSchema: original, strict:false, fallbackReason}` (observable).
@@ -6,7 +6,7 @@ import { ENGINE_TOOLS } from "../tool-catalog-entries.js";
6
6
  import { callerToolNameProblem } from "../caller-tool-name.js";
7
7
  import { mintNamespacePrefix } from "../protocol-naming.js";
8
8
  import { PROTOCOL_TABLE, protocolOf } from "../protocol-table.js";
9
- import { mountedToolNames, splitNamespacedName } from "../tool-name-aliases.js";
9
+ import { grantWildcardRefusalOf, mountedToolNames, splitNamespacedName } from "../tool-name-aliases.js";
10
10
  import { projectionToolNames } from "../tool-policy.js";
11
11
  import { declaredDelegationNameOf } from "../delegation-name.js";
12
12
  export function renamedDelegationMountSentence(...rosters) {
@@ -97,9 +97,6 @@ function readableToolNameList(where, side, value, code) {
97
97
  throw refused(notAStringSentence(where, side, index, read.type), code, "not_a_string");
98
98
  if (read.kind === "unreadable")
99
99
  throw grammarRefusal(where, side, { entry: read.entry, reason: "grammar" }, code);
100
- if (side === "denied" && read.name === "*") {
101
- throw refused(`${where} declares ${renderListEntry(entry)} in its ${LIST_WORD[side]}: a denied list has no wildcard — the entry would hide nothing. To give the agent no tools, write an empty allowed list.`, code, "unsupported_pattern");
102
- }
103
100
  return { entry: entry, name: read.name, content: read.content };
104
101
  });
105
102
  }
@@ -117,10 +114,11 @@ function judgeToolNameList(where, side, value, universe, advise, code) {
117
114
  const content = side === "denied" && written;
118
115
  const reach = side === "denied" ? readDeniedToolList([entry]) : (readAllowedToolList([entry]) ?? readDeniedToolList([]));
119
116
  const split = splitNamespacedName(name);
120
- if (split !== undefined && split.peer === "*" && split.tool === undefined) {
117
+ const toolSplit = splitNamespacedName(toolName);
118
+ if (toolName.includes("*") && (toolSplit === undefined || toolSplit.peer.includes("*"))) {
121
119
  if (side === "denied")
122
120
  continue;
123
- throw refused(`${where} declares ${renderListEntry(entry)} in its ${LIST_WORD[side]}: an allowed list has no protocol-wide form — name a peer (\`${split.ns.prefix}<peer>\`) or its tools.`, code, "unsupported_pattern");
121
+ throw refused(`${where} declares ${renderListEntry(entry)} in its ${LIST_WORD[side]}: ${grantWildcardRefusalOf(name)}.`, code, "unsupported_pattern");
124
122
  }
125
123
  const { inert } = compileAllowList([toolName], "deny", universe.known);
126
124
  const flaw = inert[0] === undefined ? undefined : { ...inert[0], entry, ...(inert[0].reason === "near_miss" && inert[0].currentName !== undefined ? { carriedBy: universe.carrierOf(inert[0].currentName) } : {}) };
@@ -3,12 +3,9 @@ import type { AgentTool } from "../../internal/harness-types.js";
3
3
  import type { TerminalBlockedDetail } from "../terminal-cause.js";
4
4
  import { type ResolvedSkillListingBudget } from "../skill-listing-budget.js";
5
5
  import { type SkillGrantTable } from "../skill-grant.js";
6
- /** Reserved name of the injected structured-output tool (CC 2.1.187 `StructuredOutput`; batch-A rename — old
7
- * "submit_output" is canonicalized for pre-rename durable state). */
8
- export declare const OUTPUT_TOOL_NAME = "StructuredOutput";
9
6
  /** Reserved name of the injected blocked-report signal tool (PascalCase: `report_blocked`→`ReportBlocked`). */
10
7
  export declare const REPORT_BLOCKED_TOOL_NAME = "ReportBlocked";
11
- /** Name of the injected code-review findings echo tool (CC 2.1.207 parity — 锚 pretty.js:361412 `BCe`). */
8
+ /** Name of the injected code-review findings echo tool. */
12
9
  export declare const REPORT_FINDINGS_TOOL_NAME = "ReportFindings";
13
10
  /** Default `submit_output` retries (council OS3); total attempts = retries + 1. Overridable via `TaskSpec.outputRetries`. */
14
11
  export declare const OUTPUT_DEFAULT_RETRIES = 2;
@@ -32,7 +29,7 @@ export interface OutputRef {
32
29
  set?: boolean;
33
30
  }
34
31
  /**
35
- * @param strictSchema CC 2.1.205 parity (strict-output-schema.ts): the STRICT derivation of `schema` when
32
+ * @param strictSchema (strict-output-schema.ts): the STRICT derivation of `schema` when
36
33
  * it converted (`additionalProperties:false` stamped, subset-validated). It becomes the tool's
37
34
  * `parameters` — both the model-visible wire schema (CC sends it as `strictInputJSONSchema`) and the
38
35
  * validation schema (the strict form only TIGHTENS the caller's schema, so anything it accepts is valid
@@ -41,7 +38,7 @@ export interface OutputRef {
41
38
  */
42
39
  export declare function createOutputTool(ref: OutputRef, schema: TSchema, strictSchema?: TSchema): AgentTool;
43
40
  export declare function createReportBlockedTool(ref: BlockedRef): AgentTool;
44
- /** One reported finding (the CC 207 wire shape — see {@link createReportFindingsTool}). */
41
+ /** One reported finding (the wire shape — see {@link createReportFindingsTool}). */
45
42
  export interface ReportedFinding {
46
43
  file: string;
47
44
  line?: number;
@@ -51,16 +48,22 @@ export interface ReportedFinding {
51
48
  verdict?: "CONFIRMED" | "PLAUSIBLE";
52
49
  outcome?: "fixed" | "skipped" | "no_change_needed";
53
50
  }
54
- /** Build the injected `ReportFindings` echo tool (CC 2.1.207 parity — description verbatim from 锚
55
- * pretty.js:361413; `effect: "read"` mirrors CC `isReadOnly()`/`isConcurrencySafe()` → parallel-safe). */
51
+ /** Build the injected `ReportFindings` echo tool (
52
+ * `effect: "read"` mirrors CC `isReadOnly()`/`isConcurrencySafe()` → parallel-safe). */
56
53
  export declare function createReportFindingsTool(): AgentTool;
57
54
  /** Reserved name of the injected skill-loading tool (present only when `spec.skills` is non-empty). */
58
55
  export declare const SKILL_TOOL_NAME = "Skill";
59
- /** Per-skill LOAD gate on `SkillSpec.content` (CC 2.1.207 parity: CC's only invoke-time size door is a 1MB file-load gate — an over-limit skill is REJECTED
56
+ /** Per-skill LOAD gate on `SkillSpec.content` (the reference's only invoke-time size door is a 1MB file-load gate — an over-limit skill is REJECTED
60
57
  * WHOLE, never truncated, and the invoked body enters context untruncated). Sema skills are spec-supplied, so the equivalent gate sits at spec assembly:
61
58
  * an oversized skill is excluded from the disclosure block and the tool, with an operator-visible config error. The compaction-time retention caps are a
62
59
  * different door, deliberately. */
63
60
  export declare const SKILL_CONTENT_MAX_CHARS: number;
61
+ /** The skills a leg LOADS — those the load gate above passes ({@link skillLoadReading}, the one predicate): the skills whose
62
+ * hooks the leg's mods admission takes, as the roster's filter (which also reports each one it excludes) takes the same. */
63
+ export declare function skillsThatLoad<T extends {
64
+ readonly content: string;
65
+ readonly baseDir?: unknown;
66
+ }>(skills: readonly T[] | undefined): T[];
64
67
  /** Total per-invoke cap for a skill's inlined attachments (`SkillSpec.files`) — an ATTACHMENT-face budget, distinct from the (gone) body truncation door:
65
68
  * the body is delivered untruncated at invoke time (CC parity), while attachments ride along bounded and truncation-disclosed. */
66
69
  export declare const SKILL_ATTACHMENTS_MAX_CHARS = 50000;
@@ -97,8 +100,8 @@ export interface SkillListingEntry {
97
100
  * their descriptions when the block overflows its byte budget ({@link buildSkillsBlock} tier B); the
98
101
  * DISPLAY order stays name-sorted, so adding this never moves a line.
99
102
  *
100
- * Why declaration order: CC 220's `sbs` (@317547) takes a priority function and is called with
101
- * `uNt(name)` (@608552 → @402383) = usage count decayed by recency of last use, and additionally
103
+ * Why declaration order: the reference takes a priority function and is called with
104
+ * a usage count decayed by recency of last use, and additionally
102
105
  * pins every `bundled` skill's description unconditionally. Core has NEITHER axis — no cross-session
103
106
  * skill-usage store, and no bundled/user distinction (every skill arrives through the same
104
107
  * caller-supplied `TaskSpec.skills`). Declaration order is the one priority statement the deployment
@@ -140,7 +143,7 @@ export declare function buildSkillsBlock(skills: ReadonlyArray<SkillListingEntry
140
143
  /** Render the `<skills>` disclosure block (metadata only — bodies stay behind the tool).
141
144
  * [c209-C] REVERSAL: no longer composed into the stable system prompt — this is now the RENDERER for
142
145
  * the `skills_listing` initial frame (first-user-turn reminder / boundary re-announce), so the
143
- * cached prefix carries zero skill bytes (design/C §2.3; CC 209 classic ships the same listing as a
146
+ * cached prefix carries zero skill bytes (design/C §2.3; the reference ships the same listing as a
144
147
  * first-turn reminder). `budget` absent ⇒ the seat reader's no-knob answer ({@link SKILL_LISTING_DEFAULT_BUDGET}).
145
148
  *
146
149
  * The fence and its four header lines are this lane's frame; the budget arithmetic and the three
@@ -157,7 +160,7 @@ export declare function renderSkillsBlock(skills: ReadonlyArray<SkillListingEntr
157
160
  * reader resolved (`@contract skills.listing_budget_enforced_as_declared`), which is the frame's whole
158
161
  * bound: the listing is an intact-class attachment, so no delivery lane measures it a second time.
159
162
  *
160
- * Tier B follows CC 220 `sbs` @317547-317586 (reserve the marker + every name-only line, then spend
163
+ * Tier B follows the reference (reserve the marker + every name-only line, then spend
161
164
  * the slack on descriptions in {@link SkillListingEntry.declaredRank} order); tier C closes with an
162
165
  * honest `(… +N more skills …)` count line — the tool still serves all of them.
163
166
  */
@@ -3,11 +3,10 @@ import { defineTool } from "../tools.js";
3
3
  import { sanitizeUntrustedText, SHELLED_BODY_ENVELOPE_TAGS } from "../untrusted-text.js";
4
4
  import { SKILL_LISTING_DEFAULT_BUDGET, SKILL_LISTING_DESC_MAX_CHARS_DEFAULT } from "../skill-listing-budget.js";
5
5
  import { readSkillTable, skillNamedBy } from "../skill-grant.js";
6
- import { toolFace } from "../tool-catalog-entries.js";
7
- import { substituteSkillRoot, substituteSkillRootBounded } from "./skill-base-dir.js";
6
+ import { OUTPUT_TOOL_NAME, mountRuleFace, toolFace } from "../tool-catalog-entries.js";
7
+ import { skillLoadReading, substituteSkillRoot, substituteSkillRootBounded } from "./skill-base-dir.js";
8
8
  import { readSkillsSeat } from "./skills-seat.js";
9
9
  import { foldListingWithin } from "./listing-fold.js";
10
- export const OUTPUT_TOOL_NAME = "StructuredOutput";
11
10
  export const REPORT_BLOCKED_TOOL_NAME = "ReportBlocked";
12
11
  export const REPORT_FINDINGS_TOOL_NAME = "ReportFindings";
13
12
  export const OUTPUT_DEFAULT_RETRIES = 2;
@@ -36,6 +35,7 @@ export function createReportBlockedTool(ref) {
36
35
  return defineTool({
37
36
  name: REPORT_BLOCKED_TOOL_NAME,
38
37
  ...toolFace("report-blocked"),
38
+ ruleFace: mountRuleFace("report-blocked"),
39
39
  description: "Call this ONLY when you cannot complete the task — missing information, missing permission/credentials, or an ambiguous request you cannot resolve. Provide a concise reason that an external system or operator can act on. Calling this ends the task.",
40
40
  parameters: Type.Object({ reason: Type.String() }),
41
41
  execute: (args) => {
@@ -64,6 +64,7 @@ export function createReportFindingsTool() {
64
64
  return defineTool({
65
65
  name: REPORT_FINDINGS_TOOL_NAME,
66
66
  ...toolFace("report-findings"),
67
+ ruleFace: mountRuleFace("report-findings"),
67
68
  description: "Report code-review findings as a typed list so the host UI can render them. Use this only when the " +
68
69
  "active code-review instructions tell you to report findings with this tool; otherwise follow whatever " +
69
70
  "output format those instructions specify. When reporting a review's results, call it once with the " +
@@ -89,6 +90,9 @@ export function createReportFindingsTool() {
89
90
  }
90
91
  export const SKILL_TOOL_NAME = "Skill";
91
92
  export const SKILL_CONTENT_MAX_CHARS = 1024 * 1024;
93
+ export function skillsThatLoad(skills) {
94
+ return (skills ?? []).filter((s) => skillLoadReading(s, SKILL_CONTENT_MAX_CHARS).loads);
95
+ }
92
96
  export const SKILL_ATTACHMENTS_MAX_CHARS = 50_000;
93
97
  export const SKILL_ATTACHMENT_PATH_MAX_CHARS = 512;
94
98
  const SKILL_FILES_LIST_MAX_CHARS = 200;
@@ -155,6 +159,7 @@ export function createSkillTool(skills, grants) {
155
159
  return defineTool({
156
160
  name: SKILL_TOOL_NAME,
157
161
  ...toolFace("skill"),
162
+ ruleFace: mountRuleFace("skill"),
158
163
  executionMode: "sequential",
159
164
  description: `Invoke a skill.\n\n` +
160
165
  `A skill is a packaged set of instructions the user or project has set up for a particular kind of task (deploy steps, a review checklist, a repo-specific workflow). ` +
@@ -64,20 +64,18 @@ export declare function buildDeferredRegistry(deferred: ReadonlySet<string>, too
64
64
  * validation, not activation state: a call whose arguments validate against the REAL tool's
65
65
  * declared schema runs the real tool directly (activation is only about whether the model has
66
66
  * been SHOWN the schema, never an execution gate). Governance cannot be laundered through this
67
- * lane: policy/effect/irreversibility gates key on the tool NAME maps built from the real
68
- * declarations, and the engine's approval pipeline runs before any execute — the placeholder
69
- * object on the harness list plays no part in adjudication.
67
+ * lane: the gate judges the call before any execute, and the call runs the one mounted instance its
68
+ * placeholder stands for — the harness resolves a call to its placeholder before the gate, as it
69
+ * resolves any call to its tool, so what runs is fixed before anything is judged.
70
70
  */
71
71
  export interface PlaceholderDirectCall {
72
72
  /**
73
- * Resolve the real tool AT CALL TIME, never from a prepare-time snapshot. The mounted
74
- * roster is a LIVE array: an MCP refresh splices a server's name domain out and pushes freshly
75
- * materialized tool objects back in, so a Map captured when the placeholder was built would hand
76
- * this lane the WITHDRAWN object (stale schema shape gate, stale transport client) long after the
77
- * roster moved on. Returns `undefined` when the name no longer resolves — a withdrawn name has no
78
- * direct lane, and the caller falls back to the teaching rejection.
73
+ * The mounted instance this placeholder stands for, bound when the placeholder is minted for it (one
74
+ * placeholder per instance; a refresh that replaces the instance mints a new placeholder for the new
75
+ * one). Never re-resolved by name: a call the gate judged while a refresh landed runs the instance it
76
+ * was resolved to, whose own checks answer a declaration that changed meanwhile.
79
77
  */
80
- resolveReal: () => PlaceholderDirectTarget | undefined;
78
+ real: PlaceholderDirectTarget;
81
79
  /**
82
80
  * The scheduling declaration this placeholder carries while it stands in for the real
83
81
  * tool. Mirrors the REAL tool's own `executionMode` (see the mirror rationale in
@@ -91,7 +89,7 @@ export interface PlaceholderDirectCall {
91
89
  * schema it hands back actually lives (this result only, versus this result AND every later
92
90
  * request's tools block). Absent ⇒ the swap posture.
93
91
  *
94
- * A FUNCTION, evaluated per call, for the same reason `resolveReal` is: the answer is not
92
+ * A FUNCTION, evaluated per call: the answer is not
95
93
  * a prepare-time constant. The run-wide strategy is, but the per-tool exemption on top of it reads
96
94
  * the LIVE roster — an MCP refresh can replace a tool with a declaration that no longer fits the
97
95
  * result-text carrier (or one that now does), and a boolean captured when the placeholder was built
@@ -113,7 +111,7 @@ export interface PlaceholderDirectCall {
113
111
  */
114
112
  activate: () => Promise<string | undefined>;
115
113
  }
116
- /** The live view of the real tool behind a placeholder, resolved per call (see {@link PlaceholderDirectCall.resolveReal}). */
114
+ /** The real tool behind a placeholder (see {@link PlaceholderDirectCall.real}). */
117
115
  export interface PlaceholderDirectTarget {
118
116
  /** The REAL tool's declared parameter schema — the shape gate for a direct call. */
119
117
  parameters: TSchema;
@@ -2,7 +2,7 @@ import { Type } from "typebox";
2
2
  import { Value } from "typebox/value";
3
3
  import { defineTool, errorResult } from "../tools.js";
4
4
  import { formatZodValidationError, truncateError } from "../tool-errors.js";
5
- import { toolFace } from "../tool-catalog-entries.js";
5
+ import { mountRuleFace, toolFace } from "../tool-catalog-entries.js";
6
6
  export const TOOL_SEARCH_NAME = "ToolSearch";
7
7
  export const TOOL_SEARCH_DEFAULT_MAX_RESULTS = 5;
8
8
  const MAX_QUERY_RESULTS = 25;
@@ -93,9 +93,7 @@ export function createPlaceholderTool(info, direct) {
93
93
  parameters: EMPTY_PARAMS,
94
94
  ...(direct.executionMode !== undefined ? { executionMode: direct.executionMode } : {}),
95
95
  execute: async (toolCallId, params, signal, onUpdate) => {
96
- const real = direct.resolveReal();
97
- if (real === undefined)
98
- return teachingRejection();
96
+ const { real } = direct;
99
97
  if (Value.Check(real.parameters, params)) {
100
98
  lastFailureShape = undefined;
101
99
  repeats = 0;
@@ -262,6 +260,7 @@ export function createToolSearchTool(opts) {
262
260
  return defineTool({
263
261
  name: TOOL_SEARCH_NAME,
264
262
  ...toolFace("tool-search"),
263
+ ruleFace: mountRuleFace("tool-search"),
265
264
  description: "Discover and activate deferred tools. " +
266
265
  activationPosture +
267
266
  "Query forms: " +
@@ -95,7 +95,7 @@ export interface SettledOccurrence extends Pick<OccurrenceEnd, "notExecuted"> {
95
95
  * The END projection — the ONE mint of `tool_end`, for every station that closes a call: the live loop's
96
96
  * `tool_execution_end`, the resumed leg's resolution, an interrupted run's reconcile and the reconcile replayed at
97
97
  * the next process start. It reads the occurrence and nothing else: `gate` is its latest gate record, `isError` is
98
- * the tool's bit or the refusal that record names, and `notExecuted` rides on positive evidence only: the station's own or `refusedBeforeRelease` (returned for the rows).
98
+ * the tool's bit or the refusal that record names, and `notExecuted` rides on positive evidence only: the station's own or `neverExecuted` (returned for the rows).
99
99
  *
100
100
  * A call whose start never went out on this stream (a call the loop never reached, a call announced by a dead
101
101
  * process) gets its start minted here first, marked `recovered` and carrying the input the closing station holds —