@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,6 @@
1
1
  import { describe } from "./events.js";
2
- import { describeFault, isPlainRecord, MODS_PAYLOAD_MODE, receive } from "./receive.js";
2
+ import { describeFault, isPlainRecord, MODS_PAYLOAD_MODE, receive, sealedObjects } from "./receive.js";
3
+ export { sealedObjects } from "./receive.js";
3
4
  export const MODS_VALUE_DEPTH = 1_000;
4
5
  const HANDED_MODE = Object.freeze({ ...MODS_PAYLOAD_MODE, depth: MODS_VALUE_DEPTH + 1, past: "refuse" });
5
6
  function payloadMode(isProxy) {
@@ -190,13 +191,13 @@ function rehomed(pinned, held, passed, homes, engines) {
190
191
  Object.freeze(to);
191
192
  return twins.get(passed);
192
193
  }
193
- export function answerViolation(answer, check, e, by, below) {
194
+ export function answerViolation(answer, check, e, by, below, run) {
194
195
  if (answer === undefined)
195
196
  return "returned no answer (return next(e) to pass the event on)";
196
197
  if (check === undefined)
197
198
  return undefined;
198
199
  try {
199
- return check(answer, e, by, below);
200
+ return check(answer, e, by, below, run);
200
201
  }
201
202
  catch {
202
203
  return "returned an answer the station cannot read";
@@ -247,50 +248,31 @@ export function receiveEvent(e) {
247
248
  const r = receiveRecord(e, MODS_PAYLOAD_MODE);
248
249
  return "refusal" in r ? { refusal: r.refusal } : r;
249
250
  }
250
- export function answerUpward(v) {
251
- if (typeof v !== "object" || v === null || Object.isFrozen(v))
251
+ export function answerUpward(v, isProxy) {
252
+ if (typeof v !== "object" || v === null)
252
253
  return v;
253
- if (Array.isArray(v) && Object.getPrototypeOf(v) === Array.prototype)
254
- return Object.freeze([...v]);
255
- return isPlainRecord(v) ? Object.freeze({ ...v }) : v;
254
+ const sealed = sealedObjects([v]);
255
+ if (sealed.has(v))
256
+ return v;
257
+ const r = receive(v, payloadMode(isProxy), sealed);
258
+ if (!r.ok)
259
+ throw new TypeError(`the chain's bottom answered ${faultClause(r.fault)}`);
260
+ return r.value;
256
261
  }
257
- export function receiveAnswer(answer, engines, isProxy) {
258
- const r = receive(answer, payloadMode(isProxy), engines);
259
- return r.ok ? { answer: r.value } : { refusal: `answered ${faultClause(r.fault)}` };
262
+ function answerMode(isProxy) {
263
+ return Object.freeze({ ...payloadMode(isProxy), others: "refuse" });
260
264
  }
261
- const DETACHED_MODE = Object.freeze({ accessors: "refuse", depth: Infinity, others: "as-is" });
265
+ export function receiveAnswer(answer, held, isProxy) {
266
+ const r = receive(answer, answerMode(isProxy), held);
267
+ if (r.ok)
268
+ return { answer: r.value };
269
+ const notData = r.fault.kind === "not-data" || r.fault.kind === "cycle";
270
+ return { refusal: `answered ${faultClause(r.fault)}${notData ? " (an answer is data: strings, numbers, booleans, null, plain objects and arrays)" : ""}` };
271
+ }
272
+ const DETACHED_MODE = Object.freeze({ accessors: "refuse", depth: Infinity, others: "as-is", leaves: "cloned" });
262
273
  export function detachedCopy(e) {
263
274
  const r = receive(e, DETACHED_MODE);
264
275
  if (!r.ok)
265
276
  throw new Error(`the observer's copy of the event could not be made: ${describeFault(r.fault)}`);
266
- const copy = r.value;
267
- const clones = new Map();
268
- const walked = new Set([copy]);
269
- const stack = [copy];
270
- while (stack.length > 0) {
271
- const node = stack.pop();
272
- for (const k of Object.keys(node)) {
273
- const v = node[k];
274
- if (typeof v !== "object" || v === null)
275
- continue;
276
- if (isPlainRecord(v) || (Array.isArray(v) && Object.getPrototypeOf(v) === Array.prototype)) {
277
- if (!walked.has(v)) {
278
- walked.add(v);
279
- stack.push(v);
280
- }
281
- continue;
282
- }
283
- if (!clones.has(v)) {
284
- let own = v;
285
- try {
286
- own = structuredClone(v);
287
- }
288
- catch {
289
- }
290
- clones.set(v, own);
291
- }
292
- Object.defineProperty(node, k, { value: clones.get(v), enumerable: true, writable: true, configurable: true });
293
- }
294
- }
295
- return copy;
277
+ return r.value;
296
278
  }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The skill seats of the mods bus (`SkillSpec.mods`), admitted with the leg's other registrations on the task seat. Theirs alone:
3
+ * · the SCOPE RECORD — which skill each registration belongs to and which skills are active on the leg (opened by the grant
4
+ * table's activation write, or by a resumed leg's frozen scopes; closed with the run that holds the record);
5
+ * · two VIEWS of the leg bus: the leg's own raises take a skill's handlers only while its scope is open (presence counts them
6
+ * always, so what prepare arms is armed for a scope that opens later); the STANDING chain never holds them — what the leg
7
+ * hands its descendants, and what guards every call unconditionally;
8
+ * · the SEAT RULE — a skill carries hooks, `classic.*` events only (a method event's chain is dispatched inside the kernel,
9
+ * where no scope is read).
10
+ */
11
+ import type { SkillSpec } from "../agent-definition.js";
12
+ import type { EngineDollar } from "./dollar.js";
13
+ import { type ModBus, type ModRegistration } from "./kernel/index.js";
14
+ /** The leg's record of its skills' scopes, as the activation write point and the park read it. */
15
+ export interface SkillScopes {
16
+ /** Open `skill`'s scope on this leg: from now to the run's end its registrations take part in the leg's raises. */
17
+ open(skill: string): void;
18
+ /** The active skills that carry registrations, sorted — what a park freezes (`undefined` = none). */
19
+ frozen(): string[] | undefined;
20
+ }
21
+ /** The record, with the readings the views take. */
22
+ export interface ScopeRecord extends SkillScopes {
23
+ /** The skill a registration (by name) belongs to, or undefined for a registration of no skill. */
24
+ ownerOf(registration: string): string | undefined;
25
+ isOpen(skill: string): boolean;
26
+ /** Whether any skill of the leg carries a registration (none ⇒ both views are the bus itself). */
27
+ carries(): boolean;
28
+ }
29
+ /** The registrations the leg's skills carry, in the skills' order, and which skill each belongs to. */
30
+ export interface SkillSeats {
31
+ readonly registrations: readonly ModRegistration<EngineDollar>[];
32
+ readonly owners: ReadonlyMap<string, string>;
33
+ }
34
+ /**
35
+ * Read the leg's skills (the skills seat's copy) into their registrations, each READ ONCE into a frozen copy of its members
36
+ * (`register` still runs with the host's object as `this`): the name the scope owns it by is the very name the kernel admits
37
+ * it under, and the `uses` the seat rule judges is the very `uses` the kernel holds its `on` to. The seat rule is judged here,
38
+ * before admission — so no handler of a refused registration ever runs, not even on another registration's `plugin.register`.
39
+ * Anything else about a registration (its shape, its tier, a duplicate name) is the admission's screen, given the copy.
40
+ */
41
+ export declare function skillSeatsOf(skills: readonly Pick<SkillSpec, "name" | "mods">[] | undefined): SkillSeats;
42
+ /**
43
+ * Mint the leg's scope record; `reopened` = the scopes a resumed leg's park froze (open from the start). What a park freezes:
44
+ * every open scope of a skill that carries registrations on this leg, and every scope this leg reopened (a reopened skill
45
+ * stays recorded whatever the resumed definition carries — the next resume may restore its hooks). A plain skill's
46
+ * activation is not recorded: the hooks a skill brings are the ones its definition carried when it was active.
47
+ */
48
+ export declare function skillScopeRecord(owners: ReadonlyMap<string, string>, reopened: readonly string[] | undefined): ScopeRecord;
49
+ /**
50
+ * Read a park's frozen skill scopes (`CheckpointState.skillScopes`): absent ⇒ none; a list of skill names ⇒ those (copied by
51
+ * index, once); anything else ⇒ `undefined`, a damaged section — the resume screen refuses it before the claim, never read as
52
+ * "no scope" (that would resume the run with the skills' hooks silently shut).
53
+ */
54
+ export declare function readFrozenSkillScopes(section: unknown): readonly string[] | undefined;
55
+ /** A resumed leg's reopened scopes off its checkpoint state; throws on a damaged section (the screen refused it pre-claim). */
56
+ export declare function frozenSkillScopesOf(state: {
57
+ readonly skillScopes?: unknown;
58
+ } | undefined): readonly string[] | undefined;
59
+ /**
60
+ * The leg's own raises over the admitted bus: a skill's handler takes part only while its scope is open; presence
61
+ * (`hasHandlers`, `mounted`) counts it always. With no skill registration, the bus itself.
62
+ */
63
+ export declare function scopedLegBus(bus: ModBus, record: ScopeRecord): ModBus;
64
+ /**
65
+ * The leg's STANDING chain, over the leg bus: every registration that takes part on every raise — a skill's handlers are
66
+ * absent from it, from presence and from every dispatch. Two readers: what the leg hands its descendants (the screening
67
+ * constraint is minted over it; the chain identity is its), and what guards every call of the leg unconditionally.
68
+ */
69
+ export declare function standingBus(leg: ModBus, record: ScopeRecord): ModBus;
@@ -0,0 +1,114 @@
1
+ import { expandOnSide } from "./kernel/index.js";
2
+ import { modsInvalid } from "./kernel/registration.js";
3
+ export function skillSeatsOf(skills) {
4
+ const registrations = [];
5
+ const owners = new Map();
6
+ for (const s of skills ?? []) {
7
+ for (const r of s.mods ?? []) {
8
+ const copy = registrationCopy(r);
9
+ registrations.push(copy);
10
+ if (typeof copy !== "object" || copy === null)
11
+ continue;
12
+ const name = Reflect.get(copy, "name");
13
+ if (typeof name !== "string")
14
+ continue;
15
+ owners.set(name, s.name);
16
+ refuseNonClassic(name, s.name, Reflect.get(copy, "uses"));
17
+ }
18
+ }
19
+ return { registrations, owners };
20
+ }
21
+ function registrationCopy(r) {
22
+ if (typeof r !== "object" || r === null)
23
+ return r;
24
+ const get = (k) => Reflect.get(r, k);
25
+ const register = get("register");
26
+ const uses = get("uses");
27
+ const list = (v) => (Array.isArray(v) ? Object.freeze(Array.from({ length: v.length }, (_, i) => v[i])) : v);
28
+ const usesCopy = typeof uses === "object" && uses !== null ? Object.freeze({ events: list(Reflect.get(uses, "events")), calls: list(Reflect.get(uses, "calls")) }) : uses;
29
+ const copy = { name: get("name"), uses: usesCopy };
30
+ for (const k of ["tier", "provenance", "budgetMs", "options"]) {
31
+ const v = get(k);
32
+ if (v !== undefined)
33
+ copy[k] = v;
34
+ }
35
+ copy["register"] = typeof register === "function" ? (on, options) => Reflect.apply(register, r, [on, options]) : register;
36
+ return Object.freeze(copy);
37
+ }
38
+ function refuseNonClassic(name, skill, uses) {
39
+ const events = typeof uses === "object" && uses !== null ? Reflect.get(uses, "events") : undefined;
40
+ if (!Array.isArray(events))
41
+ return;
42
+ for (const p of events) {
43
+ const expanded = expandOnSide(p, "engine");
44
+ const other = "names" in expanded ? expanded.names.find((n) => !n.startsWith("classic.")) : undefined;
45
+ if (other !== undefined)
46
+ throw modsInvalid(`${name} (TaskSpec.skills["${skill}"].mods): declares "${other}"; a registration a SkillSpec carries hangs classic.* events only — its handlers take part only while that SkillSpec is active, which is read where the leg's stations raise`);
47
+ }
48
+ }
49
+ export function skillScopeRecord(owners, reopened) {
50
+ const carrying = new Set(owners.values());
51
+ const carried = new Set(reopened ?? []);
52
+ const open = new Set(reopened ?? []);
53
+ return {
54
+ open: (skill) => void open.add(skill),
55
+ frozen: () => {
56
+ const names = [...open].filter((s) => carrying.has(s) || carried.has(s)).sort();
57
+ return names.length > 0 ? names : undefined;
58
+ },
59
+ ownerOf: (registration) => owners.get(registration),
60
+ isOpen: (skill) => open.has(skill),
61
+ carries: () => owners.size > 0,
62
+ };
63
+ }
64
+ export function readFrozenSkillScopes(section) {
65
+ if (section === undefined)
66
+ return [];
67
+ if (!Array.isArray(section))
68
+ return undefined;
69
+ const out = [];
70
+ for (let i = 0; i < section.length; i++) {
71
+ const name = section[i];
72
+ if (typeof name !== "string")
73
+ return undefined;
74
+ out.push(name);
75
+ }
76
+ return out;
77
+ }
78
+ export function frozenSkillScopesOf(state) {
79
+ if (state === undefined)
80
+ return undefined;
81
+ const scopes = readFrozenSkillScopes(state.skillScopes);
82
+ if (scopes === undefined)
83
+ throw new Error("the resumed checkpoint's skill-scope section does not read as a list of SkillSpec names — refusing to resume the run with its active skills' hooks shut (the resume screen refuses this row before the claim)");
84
+ return scopes;
85
+ }
86
+ const withPart = (options, part) => {
87
+ const caller = options.participant;
88
+ return { ...options, participant: (p) => part(p) && (caller === undefined || caller(p)) };
89
+ };
90
+ export function scopedLegBus(bus, record) {
91
+ if (!record.carries())
92
+ return bus;
93
+ const openOrNone = (p) => {
94
+ const skill = record.ownerOf(p.plugin);
95
+ return skill === undefined || record.isOpen(skill);
96
+ };
97
+ return {
98
+ records: bus.records,
99
+ mounted: () => bus.mounted(),
100
+ hasHandlers: (event, participant) => bus.hasHandlers(event, participant),
101
+ dispatch: (event, e, options) => bus.dispatch(event, e, withPart(options, openOrNone)),
102
+ };
103
+ }
104
+ export function standingBus(leg, record) {
105
+ if (!record.carries())
106
+ return leg;
107
+ const noSkill = (p) => record.ownerOf(p.plugin) === undefined;
108
+ return {
109
+ records: leg.records,
110
+ mounted: () => leg.mounted().filter(noSkill),
111
+ hasHandlers: (event, participant) => leg.hasHandlers(event, (p) => noSkill(p) && (participant === undefined || participant(p))),
112
+ dispatch: (event, e, options) => leg.dispatch(event, e, withPart(options, noSkill)),
113
+ };
114
+ }
@@ -2,15 +2,18 @@ import type { ExecutionEnv } from "../../internal/harness-types.js";
2
2
  import type { AssistantMessage, Message, Model, Usage } from "../../internal/llm.js";
3
3
  import type { CwdRef } from "../../tools/fs/fs-shared.js";
4
4
  import { type PermissionResult, type ToolCallRequest } from "../tool-policy.js";
5
- import type { HookInvocationIdentity, PermissionDeniedPayload } from "../hooks.js";
5
+ import type { ClassicEventBase, HookInvocationIdentity, PermissionDeniedPayload, UserPromptSubmitEvent } from "../hooks.js";
6
+ import type { ClassicEventMap, ClassicEventName } from "./classic-events.js";
6
7
  import type { PermissionMode } from "../ask-origin.js";
7
8
  import type { RunnerDeps } from "../runner-deps.js";
8
9
  import type { TaskSpec } from "../task-spec.js";
9
- import { type ModBus, type ModMountedHandler, type ModDispatchOutcome, type ModEventName, type ModEventPayload, type ModRegistration } from "./kernel/index.js";
10
+ import { type ModAnswerRanks, type ModBus, type ModCallEntry, type ModMountedHandler, type ModDispatchOutcome, type ModEventPayload, type ModRegistration } from "./kernel/index.js";
10
11
  import { type SourcedOverlay } from "../../prompt-assembly/overlay.js";
11
12
  import type { BandId } from "../../prompt-assembly/catalog/schema.js";
12
13
  import type { ModParticipant } from "./kernel/dispatch.js";
13
14
  import { type EngineDollar, type ModelCompleteRequest, type ModelCompleteResult, type ModSeatView } from "./dollar.js";
15
+ import type { SkillSpec } from "../agent-definition.js";
16
+ import { type SkillScopes } from "./spec-seats.js";
14
17
  /**
15
18
  * What the engine's core answers at the bottom of every classic chain: the engine itself has nothing to add.
16
19
  * Frozen and empty, so it reads as "no opinion" in every classic station's answer form, and a handler that
@@ -151,21 +154,23 @@ export declare function inheritedToolChecks<E extends InstallationEntry & {
151
154
  readonly mods?: readonly ModChainLink[];
152
155
  }>(entries: readonly E[], standsIn: (pc: E) => boolean, settleOf: (pc: E) => InstallationAskSettlement): readonly InheritedToolCheck[];
153
156
  /** The members every classic `e` of a leg carries: the identity envelope, the delegated leg's `agentId`, the leg's observed mode. */
154
- export declare function classicEventBase(identity: HookInvocationIdentity | undefined, permissionMode?: PermissionMode): ModEventPayload;
157
+ export declare function classicEventBase(identity: HookInvocationIdentity | undefined, permissionMode?: PermissionMode): ClassicEventBase;
155
158
  /**
156
159
  * Raise an observation event (a skip-on-failure event whose answer no station reads): no handler, no dispatch.
157
160
  * Its failures are the bus's to report; a rejected dispatch (an engine fault, never a handler's) is swallowed —
158
- * an observation must never change what it observes.
161
+ * an observation must never change what it observes. The `e` is the event's own, as {@link ClassicEventMap} types it.
159
162
  */
160
- export declare function observeClassic(bus: LegModBus, event: ModEventName, e: ModEventPayload, signal: AbortSignal | undefined): Promise<void>;
163
+ export declare function observeClassic<K extends ClassicEventName>(bus: LegModBus, event: K, e: ClassicEventMap[K]["e"], signal: AbortSignal | undefined): Promise<void>;
161
164
  /**
162
165
  * Raise a classic event whose answer the station reads: `undefined` when no handler hangs on it (the station
163
166
  * runs as if the bus were not there), else the dispatch outcome. A rejection is an engine fault, never a
164
167
  * handler's (handlers fail into the outcome); a decision station fails closed on it, an observation swallows it.
168
+ * The `e` is the event's own, as {@link ClassicEventMap} types it; a decision event names its answer ranks.
165
169
  */
166
- export declare function dispatchClassic(bus: LegModBus, event: ModEventName, e: ModEventPayload, options: {
170
+ export declare function dispatchClassic<K extends ClassicEventName>(bus: LegModBus, event: K, e: ClassicEventMap[K]["e"], options: {
167
171
  readonly signal?: AbortSignal;
168
172
  readonly checkAnswer?: (answer: unknown) => string | undefined;
173
+ readonly ranks?: ModAnswerRanks;
169
174
  }): Promise<ModDispatchOutcome | undefined>;
170
175
  /** The answer form of a classic event whose answer is an object of optional string members (`block`, `additionalContext`, …). */
171
176
  export declare function stringMembersAnswer(event: string, members: readonly string[]): (answer: unknown) => string | undefined;
@@ -205,7 +210,7 @@ export type PromptScreen = {
205
210
  * runs past its budget or breaks the site's contract ends the screen `failed`, and every entrance fails closed on it;
206
211
  * a cancelled screen ends `aborted` at once. A dispatch the engine itself could not run is `failed` too.
207
212
  */
208
- export declare function screenUserPrompt(bus: LegModBus, e: ModEventPayload, signal: AbortSignal | undefined): Promise<PromptScreen | undefined>;
213
+ export declare function screenUserPrompt(bus: LegModBus, e: UserPromptSubmitEvent, signal: AbortSignal | undefined): Promise<PromptScreen | undefined>;
209
214
  /** The three words a `tool.check` verdict speaks. */
210
215
  export declare const TOOL_CHECK_DECISIONS: readonly ["allow", "ask", "deny"];
211
216
  export type ToolCheckDecision = (typeof TOOL_CHECK_DECISIONS)[number];
@@ -282,12 +287,21 @@ export interface LegFacadeSeats {
282
287
  now(): number;
283
288
  tools(): readonly string[];
284
289
  agents(): readonly string[];
290
+ /** `$.tool.call`'s host entry (`createToolCallEntry`, `tool-call.ts`). */
291
+ readonly toolCall: ModCallEntry;
285
292
  }
286
293
  /** The leg's admitted bus, its chain identity (the one its admission recorded, {@link chainOfBus}) and the binding of the
287
- * facade its `$` reaches. */
294
+ * facade its `$` reaches. `bus` is the leg bus every station raises on ({@link legBusOf}: an extension's own call's
295
+ * events are raised under its frames). */
288
296
  export interface LegMods {
289
297
  readonly bus: ModBus;
298
+ /** The leg's standing chain ({@link standingBus}): the bus without the skills' registrations — what the leg hands its
299
+ * descendants (its screening constraint is minted over it) and what guards each of its calls unconditionally. The bus
300
+ * itself when no skill carries one. */
301
+ readonly standing: ModBus;
290
302
  readonly chain: readonly ModChainLink[];
303
+ /** The leg's skill scopes (`SkillSpec.mods`): the grant table opens one on each activation, the park freezes them. */
304
+ readonly skillScopes: SkillScopes;
291
305
  /** Bind the engine facade once the leg is prepared. Until then a `$` call throws, naming the method. */
292
306
  bindFacade(seats: LegFacadeSeats): void;
293
307
  }
@@ -301,6 +315,10 @@ export declare function admitLegMods(input: {
301
315
  readonly spec: Pick<TaskSpec, "mods">;
302
316
  readonly deps: Pick<RunnerDeps, "mods" | "onError" | "onNotice">;
303
317
  readonly sessionId: string;
318
+ /** The leg's skills as the skills seat read them: each one's registrations join the task seat, scoped to its activation. */
319
+ readonly skills?: readonly Pick<SkillSpec, "name" | "mods">[];
320
+ /** The skills a resumed leg's park recorded active (their scopes open from the start). */
321
+ readonly reopenedSkills?: readonly string[];
304
322
  }): Promise<LegMods>;
305
323
  /** What a leg hands {@link legFacadeSeats}: the seats it already has. */
306
324
  export interface LegFacadeInput {
@@ -328,6 +346,8 @@ export interface LegFacadeInput {
328
346
  readonly usage: Usage | undefined;
329
347
  readonly diagnostics?: AssistantMessage["diagnostics"];
330
348
  }) => void;
349
+ /** `$.tool.call`'s host entry, over the leg's harness and occurrence table. */
350
+ readonly toolCall: ModCallEntry;
331
351
  }
332
352
  /** The engine facade's seats over a prepared leg — each one a seat the leg already has (no new capability). */
333
353
  export declare function legFacadeSeats(input: LegFacadeInput): LegFacadeSeats;
@@ -6,11 +6,13 @@ import { inlineUntrusted } from "../untrusted-text.js";
6
6
  import { extensionWords } from "../untrusted-egress.js";
7
7
  import { askApproverIdentity, describeThrown, ownArgs } from "../tool-policy.js";
8
8
  import { admitMods, expandModPattern } from "./kernel/index.js";
9
+ import { legBusOf } from "./extension-call.js";
9
10
  import { validateOverlay } from "../../prompt-assembly/overlay.js";
10
11
  import { modsInvalid } from "./kernel/registration.js";
11
12
  import { isPlainRecord } from "./kernel/receive.js";
12
13
  import { engineMethodBottoms } from "./dollar.js";
13
14
  import { modSeatsOf, modsReportToOnError, registrationRefusedNotice } from "./host.js";
15
+ import { scopedLegBus, skillScopeRecord, skillSeatsOf, standingBus } from "./spec-seats.js";
14
16
  export const ENGINE_CORE_ANSWER = Object.freeze({});
15
17
  export function engineCore() {
16
18
  return ENGINE_CORE_ANSWER;
@@ -141,6 +143,7 @@ export async function dispatchClassic(bus, event, e, options) {
141
143
  bottom: engineCore,
142
144
  ...(options.signal !== undefined ? { signal: options.signal } : {}),
143
145
  ...(check !== undefined ? { checkAnswer: (a) => (a === ENGINE_CORE_ANSWER ? undefined : check(a)) } : {}),
146
+ ...(options.ranks !== undefined ? { ranks: options.ranks } : {}),
144
147
  });
145
148
  }
146
149
  export function stringMembersAnswer(event, members) {
@@ -196,12 +199,14 @@ export async function observePermissionDenied(input) {
196
199
  }, input.onHostObserverFailure);
197
200
  await observeClassic(own, "classic.PermissionDenied", e, input.signal);
198
201
  }
202
+ const USER_PROMPT_RANKS = Object.freeze({ of: (a) => (stringMembersOf(a, ["block"]).block ? 1 : 0), top: 1 });
199
203
  export async function screenUserPrompt(bus, e, signal) {
200
204
  let outcome;
201
205
  try {
202
206
  outcome = await dispatchClassic(bus, "classic.UserPromptSubmit", e, {
203
207
  ...(signal !== undefined ? { signal } : {}),
204
208
  checkAnswer: stringMembersAnswer("classic.UserPromptSubmit", ["block", "additionalContext"]),
209
+ ranks: USER_PROMPT_RANKS,
205
210
  });
206
211
  }
207
212
  catch (err) {
@@ -215,6 +220,13 @@ export async function screenUserPrompt(bus, e, signal) {
215
220
  }
216
221
  export const TOOL_CHECK_DECISIONS = Object.freeze(["allow", "ask", "deny"]);
217
222
  const isToolCheckDecision = (v) => TOOL_CHECK_DECISIONS.some((d) => d === v);
223
+ const TOOL_CHECK_RANKS = Object.freeze({
224
+ of: (a) => {
225
+ const read = readToolCheckAnswer(a);
226
+ return typeof read === "string" ? 0 : read.decision === "deny" ? 2 : read.decision === "ask" ? 1 : 0;
227
+ },
228
+ top: 2,
229
+ });
218
230
  function readToolCheckAnswer(answer) {
219
231
  if (typeof answer !== "object" || answer === null)
220
232
  return `answered ${answer === null ? "null" : typeof answer}; tool.check takes { decision, reason? }`;
@@ -239,6 +251,7 @@ export async function raiseToolCheck(bus, e, projection, signal, judges) {
239
251
  const read = readToolCheckAnswer(a);
240
252
  return typeof read === "string" ? read : undefined;
241
253
  },
254
+ ranks: TOOL_CHECK_RANKS,
242
255
  });
243
256
  }
244
257
  catch (err) {
@@ -253,14 +266,13 @@ export async function raiseToolCheck(bus, e, projection, signal, judges) {
253
266
  }
254
267
  const NO_COMPOSE = Object.freeze({ deploy: Object.freeze([]), task: Object.freeze([]), warnings: Object.freeze([]) });
255
268
  function composeOverlaysOf(answer) {
256
- if (!isPlainRecord(answer)) {
257
- return `answered ${answer === null ? "null" : Array.isArray(answer) ? "an array" : typeof answer === "object" ? "an object that is not a plain record" : typeof answer}; prompt.compose takes a plain { overlays }`;
258
- }
269
+ if (!isPlainRecord(answer))
270
+ return `answered ${answer === null ? "null" : Array.isArray(answer) ? "an array" : typeof answer}; prompt.compose takes { overlays }`;
259
271
  const stray = Object.keys(answer).filter((k) => k !== "overlays");
260
272
  if (stray.length > 0)
261
273
  return `the answer carries ${stray.slice(0, 5).map((k) => JSON.stringify(extensionWords(k, 40))).join(", ")} (overlays only)`;
262
274
  const overlays = answer["overlays"];
263
- return Array.isArray(overlays) && Object.getPrototypeOf(overlays) === Array.prototype ? overlays : "the answer's overlays is not an ordinary array";
275
+ return Array.isArray(overlays) ? overlays : "the answer's overlays is not an array";
264
276
  }
265
277
  export async function raisePromptCompose(bus, e, options) {
266
278
  if (!bus.hasHandlers("prompt.compose"))
@@ -357,6 +369,7 @@ function lateView() {
357
369
  };
358
370
  return {
359
371
  view,
372
+ entries: { "tool.call": (args, ctx) => need("tool.call").toolCall(args, ctx) },
360
373
  bind: (s) => {
361
374
  seats = s;
362
375
  },
@@ -365,19 +378,21 @@ function lateView() {
365
378
  export async function admitLegMods(input) {
366
379
  const late = lateView();
367
380
  const seats = modSeatsOf(input.spec, input.deps);
368
- const bus = await admitMods({
369
- side: "engine",
370
- seats,
371
- bottoms: engineMethodBottoms(late.view),
372
- report: modsReportToOnError(input.deps.onError, input.sessionId),
373
- describeThrown,
374
- isProxy: types.isProxy,
375
- });
381
+ const skillSeats = skillSeatsOf(input.skills);
382
+ const admitted = skillSeats.registrations.length === 0 ? seats : { ...seats, task: [...(seats.task ?? []), ...skillSeats.registrations] };
383
+ const report = modsReportToOnError(input.deps.onError, input.sessionId);
384
+ const kernelBus = await admitMods({ side: "engine", seats: admitted, bottoms: engineMethodBottoms(late.view), entries: late.entries, report, describeThrown, isProxy: types.isProxy });
385
+ const skillScopes = skillScopeRecord(skillSeats.owners, input.reopenedSkills);
386
+ const bus = legBusOf(scopedLegBus(kernelBus, skillScopes), report);
387
+ const standing = standingBus(bus, skillScopes);
376
388
  for (const record of bus.records) {
377
389
  if ("refusedBy" in record)
378
390
  deliverEngineNotice(input.deps.onNotice, registrationRefusedNotice(record, input.sessionId));
379
391
  }
380
- return { bus, chain: recordAdmittedChain(bus, seats), bindFacade: late.bind };
392
+ const chain = recordAdmittedChain(bus, seats);
393
+ if (standing !== bus)
394
+ ADMITTED_CHAINS.set(standing, chain);
395
+ return { bus, standing, chain, skillScopes, bindFacade: late.bind };
381
396
  }
382
397
  function replyText(reply) {
383
398
  return reply.content.flatMap((c) => (c.type === "text" ? [c.text] : [])).join("");
@@ -415,6 +430,7 @@ export function legFacadeSeats(input) {
415
430
  now: () => (input.deps.now ?? Date.now)(),
416
431
  tools: () => [...input.activeTools],
417
432
  agents: () => (input.agentListing?.entries ?? []).map((e) => e.name),
433
+ toolCall: input.toolCall,
418
434
  };
419
435
  }
420
436
  export async function admitModChain(seats, onError) {
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The `tool.call` station: raised on the leg's bus between the gate letting a call go and the tool's body, for every
3
+ * execution of a call (the live loop's lanes through the loop's execution seat, the resumed leg's approved call through
4
+ * the same function). The chain's bottom is the tool's body; the event's failure column is `refuse_until_run`, so a
5
+ * handler's failure refuses the call while the body has not started and, once it has, the body's real result stands.
6
+ *
7
+ * `e = { tool, tool_use_id, agentId?, input }` (all four pinned — what the gate judged is what runs; a rewrite belongs to
8
+ * `classic.PreToolUse`) plus the identity envelope. A handler answers:
9
+ * - `next(e)` — the body runs; what came up is `{ result: { content, isError } }`, a frozen view of the real result;
10
+ * - `{ deny: <reason> }` — refused before the body: the call is not executed and the record says an extension refused it
11
+ * (a deny once the body has started stands in place of a call that ran: a violation, the real result stands);
12
+ * - `{ result }` — an extension's own result in place of the body (a string, or a list of text blocks), taken only when
13
+ * both facts hold: the gate let this call go without anyone being asked about it (its latest gate record is an allow
14
+ * with no settlement, release or clearance — a person's or a rule's yes is a yes to running the tool), and the body
15
+ * has not started (the kernel's own record). Either missing, the answer is a violation: before the body the call is
16
+ * refused, after it the real result stands. A taken result is the call's result; the record says the body never ran
17
+ * and names the extension (`tool_end.notExecuted`, `tool_end.answeredBy`).
18
+ * Context for the model is added at `classic.PostToolUse`, not here. Whatever an extension answered in place of the body,
19
+ * the call's post-execution stations stay silent, as for a call the gate blocked.
20
+ *
21
+ * `$.tool.call({ tool, ...input })` is the event called (the table's `call` column): the host entry
22
+ * ({@link createToolCallEntry}) runs the loop's own per-call pipeline for the named tool — the whole gate, this station,
23
+ * the body, the post-execution stations — under the run's principal, with the caller's frames and origin on every event
24
+ * its pipeline raises (`extension-call.ts`), and no model message carrying it. It answers this event's own forms:
25
+ * `{ result: { content, isError } }` (the frozen view a handler's `next` gets), or `{ deny: <reason> }` when the call was
26
+ * refused (returned, not thrown).
27
+ */
28
+ import type { AgentToolResult } from "../../internal/harness-types.js";
29
+ import type { HookInvocationIdentity } from "../hooks.js";
30
+ import type { ToolOccurrenceTable } from "../runner/tool-occurrence.js";
31
+ import { type LegModBus } from "./stations.js";
32
+ import type { ModBus, ModCallEntry } from "./kernel/index.js";
33
+ /** One execution as the station sees it: the call, the tool that runs (its mounted name), the arguments the gate let go. */
34
+ export interface ToolCallExecution {
35
+ readonly toolCallId: string;
36
+ readonly toolName: string;
37
+ readonly args: unknown;
38
+ }
39
+ /** The station over one execution: `run` runs the tool's body (at most once); the result is the call's result. */
40
+ export type ToolCallStation = (call: ToolCallExecution, run: () => Promise<AgentToolResult<unknown>>, signal: AbortSignal | undefined) => Promise<AgentToolResult<unknown>>;
41
+ export interface ToolCallStationInput {
42
+ readonly bus: LegModBus;
43
+ /** The leg's occurrence table: the gate record a substitute result is read against, and the answered-in-place record. */
44
+ readonly occurrences: Pick<ToolOccurrenceTable, "get" | "answeredInPlace" | "refuse">;
45
+ /** The calls whose post-execution stations stay silent (the gate's blocked set). */
46
+ readonly blockedToolCalls: Set<string>;
47
+ readonly identity?: HookInvocationIdentity;
48
+ readonly reminderMark?: string;
49
+ }
50
+ /** The station over the leg's bus, or undefined when no handler hangs on `tool.call` (nothing is raised; the body runs). */
51
+ export declare function createToolCallStation(input: ToolCallStationInput): ToolCallStation | undefined;
52
+ /** What the host entry runs a call on: the leg's harness (the loop's pipeline under the running prompt) and the tool identities. */
53
+ export interface ToolCallEntryInput {
54
+ /** The leg bus every station raises on ({@link import("./extension-call.js").legBusOf}). */
55
+ readonly bus: ModBus;
56
+ readonly harness: Pick<import("../../internal/harness.js").AgentHarness, "callTool">;
57
+ /** The live roster's face of a mounted tool, by the name it is mounted under (`toolCallFaceOf`): its catalog contract. */
58
+ readonly faceOf: (toolName: string) => {
59
+ readonly contractId: string;
60
+ } | undefined;
61
+ /** The tool the leg mounted under this name, as the caller handed it (the one an `execute` binding is read off). */
62
+ readonly specOf: (toolName: string) => unknown;
63
+ }
64
+ /** `$.tool.call`'s host entry: the loop's per-call pipeline for the named tool, run as the caller's call (see the module header). */
65
+ export declare function createToolCallEntry(input: ToolCallEntryInput): ModCallEntry;
66
+ /**
67
+ * The gate's last word on an extension's own call, at its allow exit, on the arguments it lets go: the loop gives a call that
68
+ * is not batch-safe (a `cd`) the run to itself, and an extension's call is in no batch of the loop's — so one that is not
69
+ * batch-safe is let go only when no other call of the run is in flight, and a batch-safe one only while no call that is not
70
+ * batch-safe has been let go. `batchSafe` is the loop's own reading (`isBatchSafeToolCall`, through the harness). Undefined:
71
+ * let it go; a sentence: refused before it runs.
72
+ */
73
+ export declare function extensionCallOverlap(input: {
74
+ readonly occurrences: Pick<ToolOccurrenceTable, "live">;
75
+ readonly toolCallId: string;
76
+ readonly toolName: string;
77
+ readonly args: unknown;
78
+ readonly batchSafe: (toolName: string, args: unknown) => boolean;
79
+ }): string | undefined;