@theoremjs/agents 0.0.0-stage → 0.3.1

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 (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,29 @@
1
+ import type { TraceSink } from '../observability/trace-sink.js';
2
+ import { type RunDecisionOptions } from './engine/decision.js';
3
+ import { type RunEmbeddingOptions } from './engine/embedding.js';
4
+ import { type RunSessionOptions } from './engine/session/mod.js';
5
+ import type { ProviderHostOptions } from './protocols/runtime.js';
6
+ import { type KernelRegistry } from './registry/kernel-registry.js';
7
+ import { resolveTurnInRegistry } from './registry/resolve.js';
8
+ import { type ToolCallResult, type ToolStepCallResult } from './tools/run.js';
9
+ import type { InvokeToolRequest, InvokeToolStepRequest } from './tools/types.js';
10
+ import type { CompactHistoryRequest, CompactionResult, DecisionRequest, DecisionResult, EmbeddingRequest, EmbeddingResult, LiveSession, ProjectedProfile, SessionRequest, TurnEvent, TurnRequest } from './types.js';
11
+ /** A kernel scope: its registries and the operations that run against them (turns, live sessions, history compaction, tool invocation, turn resolution, profile projection, and decisions). */
12
+ interface KernelScope extends KernelRegistry {
13
+ runTurn(req: TurnRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
14
+ runSession(req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;
15
+ compactHistory(req: CompactHistoryRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
16
+ invokeTool(request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
17
+ invokeToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
18
+ runTool(request: InvokeToolRequest, sinkOverride?: TraceSink): Promise<ToolCallResult>;
19
+ runToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<ToolStepCallResult>;
20
+ resolveTurn(req: TurnRequest): ReturnType<typeof resolveTurnInRegistry>;
21
+ projectProfile(id: string): ProjectedProfile;
22
+ runDecision(request: DecisionRequest, options: RunDecisionOptions): Promise<DecisionResult>;
23
+ runEmbedding(request: EmbeddingRequest, options?: RunEmbeddingOptions): Promise<EmbeddingResult>;
24
+ }
25
+ declare function createKernelScope(): KernelScope;
26
+ /** The process-wide scope behind the package's global API. */
27
+ declare const defaultKernelScope: KernelScope;
28
+ export type { KernelScope };
29
+ export { createKernelScope, defaultKernelScope };
@@ -0,0 +1,45 @@
1
+ import { runDecisionInRegistry } from './engine/decision.js';
2
+ import { runEmbeddingInRegistry } from './engine/embedding.js';
3
+ import { compactHistoryInRegistry, runTurnInRegistry } from './engine/runner/mod.js';
4
+ import { runSessionInRegistry } from './engine/session/mod.js';
5
+ import { resolveRegisteredTurnModel } from './provider-dispatch.js';
6
+ import { createKernelRegistry } from './registry/kernel-registry.js';
7
+ import { projectProfileInRegistry, resolveTurnInRegistry } from './registry/resolve.js';
8
+ import { invokeTool, invokeToolStep, startInvoke, startInvokeStep } from './tools/invoke.js';
9
+ import { settledCall, settledCalls, } from './tools/run.js';
10
+ /** Isolated from every other scope: a host that registers per request gives each its own. */
11
+ function selectedTurnProvider(registry, req, options) {
12
+ try {
13
+ return resolveRegisteredTurnModel(registry, req.profile, req.model, options, req);
14
+ }
15
+ catch (error) {
16
+ return {
17
+ complete() {
18
+ throw error;
19
+ },
20
+ };
21
+ }
22
+ }
23
+ function createKernelScope() {
24
+ const registry = createKernelRegistry();
25
+ return {
26
+ providers: registry.providers,
27
+ tools: registry.tools,
28
+ profiles: registry.profiles,
29
+ schemas: registry.schemas,
30
+ runTurn: (req, options = {}, sinkOverride) => runTurnInRegistry(registry, req, selectedTurnProvider(registry, req, options), sinkOverride),
31
+ runSession: (req, options, sinkOverride) => runSessionInRegistry(registry, req, options, sinkOverride),
32
+ compactHistory: (req, options = {}, sinkOverride) => compactHistoryInRegistry(registry, req, resolveRegisteredTurnModel(registry, req.profile, req.model, options), sinkOverride),
33
+ invokeTool: (request, sinkOverride) => invokeTool(registry, request, sinkOverride),
34
+ invokeToolStep: (request, sinkOverride) => invokeToolStep(registry, request, sinkOverride),
35
+ runTool: (request, sinkOverride) => settledCall(startInvoke(registry, request, sinkOverride)),
36
+ runToolStep: (request, sinkOverride) => settledCalls(startInvokeStep(registry, request, sinkOverride)),
37
+ resolveTurn: (req) => resolveTurnInRegistry(registry, req),
38
+ projectProfile: (id) => projectProfileInRegistry(registry, id),
39
+ runDecision: (request, options) => runDecisionInRegistry(registry, request, options),
40
+ runEmbedding: (request, options = {}) => runEmbeddingInRegistry(registry, request, options),
41
+ };
42
+ }
43
+ /** The process-wide scope behind the package's global API. */
44
+ const defaultKernelScope = createKernelScope();
45
+ export { createKernelScope, defaultKernelScope };
@@ -0,0 +1,176 @@
1
+ import type { SpanHandle } from '../observability/trace-span.js';
2
+ import type { StageApplyWarningCode, TurnStage } from './schema.js';
3
+ import type { TurnStop } from './stop.js';
4
+ import type { ModelToolResult, ToolFailure, ToolGate } from './tools/types.js';
5
+ import type { AwaitingUserInput, StageApplyWarning, TurnEventOf } from './turn-events.js';
6
+ import type { Profile, TurnEvent, TurnHistoryMessage } from './types.js';
7
+ export type { AwaitingUserInput, ToolGate };
8
+ /**
9
+ * What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
10
+ * confirmation, mutate it, label it failed, or have it wait for other calls in its step.
11
+ */
12
+ export declare const STAGE_AFFORDANCES: readonly ["inject", "abort", "deny", "confirm", "mutate", "labelFailed", "waitFor"];
13
+ /** One of {@linkcode STAGE_AFFORDANCES}. */
14
+ export type StageAffordance = (typeof STAGE_AFFORDANCES)[number];
15
+ /** Inject still needs the inject gate at apply time. Empty = observe only. */
16
+ export declare const STAGE_AFFORDANCE_MATRIX: Readonly<Record<TurnStage, readonly StageAffordance[]>>;
17
+ /** A call the model made in this step, as the host was shown it. */
18
+ export interface StepCall {
19
+ callId: string;
20
+ tool: string;
21
+ input: unknown;
22
+ }
23
+ export type StageCallBag = {
24
+ callId?: string;
25
+ tool?: string;
26
+ input?: unknown;
27
+ /** `pre_tool` in a turn's step: every call the model made in the step, in the order it made them. */
28
+ stepCalls?: readonly StepCall[];
29
+ callNotStarted?: boolean;
30
+ outputRaw?: unknown;
31
+ outputModel?: ModelToolResult;
32
+ /** `post_tool`: the tool's past activity label, filled from the input and `outputRaw`. */
33
+ activityPast?: string;
34
+ /** `post_tool`: the tool's failed activity label, filled from the input. */
35
+ activityFailed?: string;
36
+ failure?: ToolFailure;
37
+ awaiting?: boolean;
38
+ stop?: TurnStop;
39
+ gate?: ToolGate;
40
+ };
41
+ /** What a stage handler is given: the stage, the step, and what has happened so far. */
42
+ export interface StageContext extends StageCallBag {
43
+ stage: TurnStage;
44
+ /** 1-based provider step (text) or utterance cycle index (live). */
45
+ step: number;
46
+ history: readonly TurnHistoryMessage[];
47
+ /** Opaque host slot — never traced or client-forwarded by the kernel. */
48
+ host?: unknown;
49
+ }
50
+ /** What a stage handler returns: what it asks the turn to do. */
51
+ export interface StageResult {
52
+ inject?: TurnHistoryMessage[];
53
+ /**
54
+ * Names this `inject` in the `stage` event that records it landing. A blank or
55
+ * non-string id refuses the inject whole.
56
+ */
57
+ injectId?: string;
58
+ abort?: boolean | {
59
+ reason?: string;
60
+ };
61
+ /** `pre_tool`: refuse the call. `post_tool`: replace the result with this failure. */
62
+ deny?: {
63
+ code?: string;
64
+ message?: string;
65
+ };
66
+ /** `pre_tool` only — request a confirm/permission gate. */
67
+ confirm?: true | {
68
+ summary?: string;
69
+ };
70
+ /** `pre_tool`: replace the call input. `post_tool`: replace the raw output. Both re-validate. */
71
+ mutate?: StageMutate;
72
+ /**
73
+ * `post_tool` only: the call completed, but show its failed label (`activityFailed`) on the
74
+ * terminal `tool` event. The result and the phase stay as they are.
75
+ */
76
+ labelFailed?: true;
77
+ /**
78
+ * `pre_tool` only: the call ids in `stepCalls` whose calls must settle before this call's body
79
+ * starts. A call held for confirmation is held at once and does not wait.
80
+ */
81
+ waitFor?: string[];
82
+ }
83
+ /** A rewrite of a tool call's input or output. */
84
+ export type StageMutate = {
85
+ input: unknown;
86
+ } | {
87
+ output: unknown;
88
+ };
89
+ /** A host function the turn calls at each stage. */
90
+ export type StageHandler = (ctx: StageContext) => StageResult | undefined | Promise<StageResult | undefined>;
91
+ export type { StageApplyWarning, StageApplyWarningCode };
92
+ /** A stage handler's result and the stage it came from, to be applied. */
93
+ export interface StageApplyInput {
94
+ stage: TurnStage;
95
+ result: unknown;
96
+ injectAllowed: boolean;
97
+ injectWouldExceedMaxSteps?: boolean;
98
+ /**
99
+ * False when the stage's mutate subject is absent at this fire (a `post_tool`
100
+ * whose body never completed, or a tool whose output the kernel must own).
101
+ * `mutate` is then a `mutate_invalid` warning, never a silent no-op.
102
+ */
103
+ mutable?: boolean;
104
+ }
105
+ export interface InjectUnit {
106
+ id?: string;
107
+ messages: TurnHistoryMessage[];
108
+ }
109
+ /** A stage handler's result after validation: the parts the turn will act on. */
110
+ export interface StageApplyOutput {
111
+ inject?: InjectUnit;
112
+ abort?: boolean | {
113
+ reason?: string;
114
+ };
115
+ deny?: {
116
+ code: string;
117
+ message: string;
118
+ };
119
+ confirm?: {
120
+ summary?: string;
121
+ };
122
+ mutate?: StageMutate;
123
+ labelFailed?: true;
124
+ waitFor?: string[];
125
+ warnings: StageApplyWarning[];
126
+ }
127
+ /** True when the affordance is physically allowed at `stage` (ignores inject gate). */
128
+ export declare function stageAllowsAffordance(stage: TurnStage, affordance: StageAffordance): boolean;
129
+ /** Never throws: invalid fields become warnings and are dropped. */
130
+ export declare function applyStageResult(input: StageApplyInput): StageApplyOutput;
131
+ /** What a `stage` event records beside the stage: the tool call, its gate, and any injected messages. */
132
+ export type StageEventExtra = {
133
+ callId?: string;
134
+ toolName?: string;
135
+ callNotStarted?: boolean;
136
+ awaiting?: boolean;
137
+ gate?: ToolGate;
138
+ stop?: TurnStop;
139
+ injected?: {
140
+ id: string;
141
+ }[];
142
+ };
143
+ /** Build a stream `stage` event. Unknown extra keys are not copied. */
144
+ export declare function stageEventFields(stage: TurnStage, extra?: Partial<StageEventExtra>): TurnEventOf<'stage'>;
145
+ export declare function injectMessages(units: readonly InjectUnit[]): TurnHistoryMessage[];
146
+ /**
147
+ * The `stage` event recording that `units` landed, naming the ones the host
148
+ * named; `undefined` when none was named. Emit it where the messages land,
149
+ * never before: an inject that never lands is never reported.
150
+ */
151
+ export declare function injectedStageEvent(stage: TurnStage, units: readonly InjectUnit[], extra?: Pick<StageEventExtra, 'callId' | 'toolName'>): TurnEventOf<'stage'> | undefined;
152
+ export declare function injectWouldExceedMaxSteps(stepCount: number, maxSteps: number | undefined): boolean;
153
+ export interface RunStageArgs extends StageCallBag {
154
+ stage: TurnStage;
155
+ step: number;
156
+ history: readonly TurnHistoryMessage[];
157
+ /**
158
+ * Handlers in call order. Later scalars win, `inject` lists concatenate. A
159
+ * tool-local `preTool` result rides here as the first handler.
160
+ */
161
+ handlers: readonly StageHandler[];
162
+ /** Profile guardrails — every inject site runs the untrusted sanitize path. */
163
+ guardrails: Profile['guardrails'];
164
+ injectAllowed: boolean;
165
+ injectWouldExceedMaxSteps?: boolean;
166
+ mutable?: boolean;
167
+ host?: unknown;
168
+ signal?: AbortSignal;
169
+ span?: SpanHandle;
170
+ }
171
+ /** Applied stage output: every handler's inject, in call order, sanitized. */
172
+ export interface RunStageOutput extends Omit<StageApplyOutput, 'inject'> {
173
+ inject: InjectUnit[];
174
+ }
175
+ /** Stage events always emit, even with no handlers. */
176
+ export declare function runStage(args: RunStageArgs): AsyncGenerator<TurnEvent, RunStageOutput>;
@@ -0,0 +1,431 @@
1
+ import { boundaryReader, detectEvent } from '../guardrails/detect-at.js';
2
+ import { throwIfAborted } from '../guardrails/error.js';
3
+ import { guardrailTurnEvent } from '../guardrails/events.js';
4
+ import { resolveGuardrailPolicy } from '../guardrails/policy.js';
5
+ import { requestRefused, sanitizeHistory } from '../guardrails/sanitize.js';
6
+ import { guardrailAttributes } from './engine/turn-trace.js';
7
+ import { isRecord } from './util/record.js';
8
+ /**
9
+ * What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
10
+ * confirmation, mutate it, label it failed, or have it wait for other calls in its step.
11
+ */
12
+ export const STAGE_AFFORDANCES = [
13
+ 'inject',
14
+ 'abort',
15
+ 'deny',
16
+ 'confirm',
17
+ 'mutate',
18
+ 'labelFailed',
19
+ 'waitFor',
20
+ ];
21
+ /** Inject still needs the inject gate at apply time. Empty = observe only. */
22
+ export const STAGE_AFFORDANCE_MATRIX = Object.freeze({
23
+ pre_turn: Object.freeze(['inject', 'abort']),
24
+ pre_tool: Object.freeze(['abort', 'deny', 'confirm', 'mutate', 'waitFor']),
25
+ post_tool: Object.freeze(['inject', 'abort', 'deny', 'mutate', 'labelFailed']),
26
+ before_end: Object.freeze(['inject', 'abort']),
27
+ post_turn: Object.freeze([]),
28
+ });
29
+ const STAGE_RESULT_KEYS = new Set([...STAGE_AFFORDANCES, 'injectId']);
30
+ /** True when the affordance is physically allowed at `stage` (ignores inject gate). */
31
+ export function stageAllowsAffordance(stage, affordance) {
32
+ return STAGE_AFFORDANCE_MATRIX[stage].includes(affordance);
33
+ }
34
+ function warn(warnings, code, field, message) {
35
+ warnings.push({ code, field, message });
36
+ }
37
+ /** Drops unknown keys and rejects `role: 'tool'`; sanitizeHistory runs at the inject site. */
38
+ function coerceInjectMessage(item, warnings) {
39
+ if (!isRecord(item)) {
40
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject entry must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
41
+ return undefined;
42
+ }
43
+ if (item.role === 'tool') {
44
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject messages with role "tool" are rejected');
45
+ return undefined;
46
+ }
47
+ if (item.role !== 'user' && item.role !== 'assistant' && item.role !== 'system') {
48
+ warn(warnings, 'inject_invalid_messages', 'inject', `inject role not allowed: ${String(item.role)}`);
49
+ return undefined;
50
+ }
51
+ const msg = { role: item.role };
52
+ if (item.content !== undefined) {
53
+ if (typeof item.content !== 'string') {
54
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject content must be a string when present');
55
+ return undefined;
56
+ }
57
+ msg.content = item.content;
58
+ }
59
+ if (item.parts !== undefined) {
60
+ if (!Array.isArray(item.parts)) {
61
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject parts must be an array when present');
62
+ return undefined;
63
+ }
64
+ msg.parts = item.parts;
65
+ }
66
+ if (item.tool_calls !== undefined) {
67
+ if (!Array.isArray(item.tool_calls)) {
68
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject tool_calls must be an array when present');
69
+ return undefined;
70
+ }
71
+ msg.tool_calls = item.tool_calls;
72
+ }
73
+ if (item.name !== undefined) {
74
+ if (typeof item.name !== 'string') {
75
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject name must be a string'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
76
+ return undefined;
77
+ }
78
+ msg.name = item.name;
79
+ }
80
+ if (item.metadata !== undefined) {
81
+ if (!isRecord(item.metadata)) {
82
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject metadata must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
83
+ return undefined;
84
+ }
85
+ msg.metadata = { ...item.metadata };
86
+ }
87
+ if (item.tool_call_id !== undefined) {
88
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject tool_call_id is rejected (not a tool-role message)');
89
+ }
90
+ return msg;
91
+ }
92
+ function coerceHistoryMessages(raw, warnings) {
93
+ if (!Array.isArray(raw)) {
94
+ warn(warnings, 'inject_invalid_messages', 'inject', 'inject must be an array of history messages');
95
+ return undefined;
96
+ }
97
+ const out = [];
98
+ for (const item of raw) {
99
+ const msg = coerceInjectMessage(item, warnings);
100
+ if (msg)
101
+ out.push(msg);
102
+ }
103
+ return out.length > 0 ? out : undefined;
104
+ }
105
+ /** The inject's messages under its id; an unusable id refuses the inject whole. */
106
+ function injectUnit(result, warnings) {
107
+ const messages = coerceHistoryMessages(result.inject, warnings);
108
+ if (!messages)
109
+ return undefined;
110
+ if (result.injectId === undefined)
111
+ return { messages };
112
+ if (typeof result.injectId === 'string' && result.injectId.trim()) {
113
+ return { id: result.injectId, messages };
114
+ }
115
+ warn(warnings, 'inject_id_invalid', 'injectId', 'injectId must be a non-empty string; inject refused');
116
+ return undefined;
117
+ }
118
+ function applyInjectField(result, input, out) {
119
+ if (!('inject' in result) || result.inject === undefined) {
120
+ if (result.injectId !== undefined) {
121
+ warn(out.warnings, 'inject_id_invalid', 'injectId', 'injectId without inject ignored'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
122
+ }
123
+ return;
124
+ }
125
+ const { stage, injectAllowed, injectWouldExceedMaxSteps } = input;
126
+ if (!stageAllowsAffordance(stage, 'inject')) {
127
+ warn(out.warnings, 'affordance_not_allowed', 'inject', `inject is not allowed at stage ${stage}`);
128
+ }
129
+ else if (!injectAllowed) {
130
+ warn(out.warnings, 'inject_not_allowed', 'inject', 'inject gate is closed for this profile/session');
131
+ }
132
+ else if (injectWouldExceedMaxSteps) {
133
+ warn(out.warnings, 'inject_rejected_max_steps', 'inject', 'inject rejected: another model step would exceed maxSteps');
134
+ }
135
+ else {
136
+ const unit = injectUnit(result, out.warnings);
137
+ if (unit)
138
+ out.inject = unit;
139
+ }
140
+ }
141
+ function applyAbortField(result, stage, out) {
142
+ if (!('abort' in result) || result.abort === undefined)
143
+ return;
144
+ if (!stageAllowsAffordance(stage, 'abort')) {
145
+ warn(out.warnings, 'affordance_not_allowed', 'abort', 'abort is not allowed at post_turn'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
146
+ }
147
+ else if (result.abort === true) {
148
+ out.abort = true;
149
+ }
150
+ else if (isRecord(result.abort)) {
151
+ const reason = typeof result.abort.reason === 'string' && result.abort.reason.trim()
152
+ ? result.abort.reason.trim()
153
+ : undefined;
154
+ out.abort = reason ? { reason } : true;
155
+ }
156
+ else if (result.abort !== false) {
157
+ warn(out.warnings, 'abort_invalid', 'abort', 'abort must be boolean or { reason?: string }'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
158
+ }
159
+ }
160
+ function applyDenyField(result, stage, out) {
161
+ if (!('deny' in result) || result.deny === undefined)
162
+ return;
163
+ if (!stageAllowsAffordance(stage, 'deny')) {
164
+ warn(out.warnings, 'affordance_not_allowed', 'deny', `deny is not allowed at stage ${stage}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
165
+ }
166
+ else if (!isRecord(result.deny)) {
167
+ warn(out.warnings, 'deny_invalid', 'deny', 'deny must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
168
+ }
169
+ else {
170
+ const code = typeof result.deny.code === 'string' && result.deny.code.trim()
171
+ ? result.deny.code.trim()
172
+ : 'not_authorized';
173
+ const message = typeof result.deny.message === 'string' && result.deny.message.trim()
174
+ ? result.deny.message.trim()
175
+ : 'Tool execution not authorized'; // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
176
+ out.deny = { code, message };
177
+ }
178
+ }
179
+ function applyLabelFailedField(result, stage, out) {
180
+ if (!('labelFailed' in result) || result.labelFailed === undefined)
181
+ return;
182
+ if (!stageAllowsAffordance(stage, 'labelFailed')) {
183
+ warn(out.warnings, 'affordance_not_allowed', 'labelFailed', `labelFailed is not allowed at stage ${stage}`);
184
+ }
185
+ else if (result.labelFailed === true) {
186
+ out.labelFailed = true;
187
+ }
188
+ else if (result.labelFailed !== false) {
189
+ warn(out.warnings, 'label_failed_invalid', 'labelFailed', 'labelFailed must be true'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
190
+ }
191
+ }
192
+ function applyConfirmField(result, stage, out) {
193
+ if (!('confirm' in result) || result.confirm === undefined)
194
+ return;
195
+ if (!stageAllowsAffordance(stage, 'confirm')) {
196
+ warn(out.warnings, 'affordance_not_allowed', 'confirm', `confirm is not allowed at stage ${stage}`);
197
+ }
198
+ else if (result.confirm === true) {
199
+ out.confirm = {};
200
+ }
201
+ else if (isRecord(result.confirm)) {
202
+ const summary = typeof result.confirm.summary === 'string' && result.confirm.summary.trim()
203
+ ? result.confirm.summary.trim()
204
+ : undefined;
205
+ out.confirm = summary ? { summary } : {};
206
+ }
207
+ else {
208
+ warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm must be true or { summary?: string }');
209
+ }
210
+ }
211
+ function applyWaitForField(result, stage, out) {
212
+ if (!('waitFor' in result) || result.waitFor === undefined)
213
+ return;
214
+ if (!stageAllowsAffordance(stage, 'waitFor')) {
215
+ warn(out.warnings, 'affordance_not_allowed', 'waitFor', `waitFor is not allowed at stage ${stage}`);
216
+ }
217
+ else if (!Array.isArray(result.waitFor) ||
218
+ !result.waitFor.every((id) => typeof id === 'string' && id.trim() !== '')) {
219
+ warn(out.warnings, 'wait_for_invalid', 'waitFor', 'waitFor must be an array of call ids');
220
+ }
221
+ else if (result.waitFor.length > 0) {
222
+ out.waitFor = [...new Set(result.waitFor)];
223
+ }
224
+ }
225
+ const MUTATE_SUBJECT = { pre_tool: 'input', post_tool: 'output' };
226
+ function mutateSubject(stage) {
227
+ return stage in MUTATE_SUBJECT ? MUTATE_SUBJECT[stage] : undefined;
228
+ }
229
+ function applyMutateField(result, input, out) {
230
+ const { stage } = input;
231
+ if (!('mutate' in result) || result.mutate === undefined)
232
+ return;
233
+ if (!stageAllowsAffordance(stage, 'mutate')) {
234
+ warn(out.warnings, 'affordance_not_allowed', 'mutate', `mutate is not allowed at stage ${stage}`);
235
+ return;
236
+ }
237
+ const subject = mutateSubject(stage);
238
+ if (!subject) {
239
+ // why: Matrix allows mutate but no subject is mapped: a kernel drift, surfaced not swallowed.
240
+ warn(out.warnings, 'mutate_invalid', 'mutate',
241
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
242
+ `no mutate subject is defined at stage ${stage}`);
243
+ return;
244
+ }
245
+ if (!isRecord(result.mutate) || result.mutate[subject] === undefined) {
246
+ warn(out.warnings, 'mutate_invalid', 'mutate',
247
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
248
+ `mutate must be { ${subject}: unknown } at stage ${stage}`);
249
+ return;
250
+ }
251
+ if (input.mutable === false) {
252
+ warn(out.warnings, 'mutate_invalid', 'mutate',
253
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
254
+ `there is no ${subject} to replace at this ${stage} fire`);
255
+ return;
256
+ }
257
+ out.mutate =
258
+ subject === 'input' ? { input: result.mutate.input } : { output: result.mutate.output };
259
+ }
260
+ /** Never throws: invalid fields become warnings and are dropped. */
261
+ export function applyStageResult(input) {
262
+ const warnings = [];
263
+ const out = { warnings };
264
+ const { stage, result } = input;
265
+ if (result == null)
266
+ return out;
267
+ if (!isRecord(result)) {
268
+ warn(warnings, 'result_invalid', 'result', 'StageResult must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
269
+ return out;
270
+ }
271
+ for (const key of Object.keys(result)) {
272
+ if (!STAGE_RESULT_KEYS.has(key)) {
273
+ warn(warnings, 'unknown_field', key, `unknown StageResult field "${key}" ignored`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
274
+ }
275
+ }
276
+ applyInjectField(result, input, out);
277
+ applyAbortField(result, stage, out);
278
+ applyDenyField(result, stage, out);
279
+ applyConfirmField(result, stage, out);
280
+ applyMutateField(result, input, out);
281
+ applyLabelFailedField(result, stage, out);
282
+ applyWaitForField(result, stage, out);
283
+ if (out.deny && out.confirm) {
284
+ warn(warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
285
+ delete out.confirm;
286
+ }
287
+ return out;
288
+ }
289
+ /** Build a stream `stage` event. Unknown extra keys are not copied. */
290
+ export function stageEventFields(stage, extra) {
291
+ const event = { type: 'stage', stage };
292
+ if (!extra)
293
+ return event;
294
+ if (extra.callId !== undefined)
295
+ event.callId = extra.callId;
296
+ if (extra.toolName !== undefined)
297
+ event.toolName = extra.toolName;
298
+ if (extra.callNotStarted !== undefined)
299
+ event.callNotStarted = extra.callNotStarted;
300
+ if (extra.awaiting !== undefined)
301
+ event.awaiting = extra.awaiting;
302
+ if (extra.gate !== undefined)
303
+ event.gate = extra.gate;
304
+ if (extra.stop !== undefined)
305
+ event.stop = extra.stop;
306
+ if (extra.injected !== undefined)
307
+ event.injected = extra.injected;
308
+ return event;
309
+ }
310
+ export function injectMessages(units) {
311
+ return units.flatMap((unit) => unit.messages);
312
+ }
313
+ /**
314
+ * The `stage` event recording that `units` landed, naming the ones the host
315
+ * named; `undefined` when none was named. Emit it where the messages land,
316
+ * never before: an inject that never lands is never reported.
317
+ */
318
+ export function injectedStageEvent(stage, units, extra) {
319
+ const injected = units.flatMap((unit) => (unit.id === undefined ? [] : [{ id: unit.id }]));
320
+ if (injected.length === 0)
321
+ return undefined;
322
+ return stageEventFields(stage, { ...extra, injected });
323
+ }
324
+ export function injectWouldExceedMaxSteps(stepCount, maxSteps) {
325
+ if (maxSteps === undefined || maxSteps <= 0)
326
+ return false;
327
+ return stepCount >= maxSteps;
328
+ }
329
+ function appliedAffordance(applied, key) {
330
+ return key === 'inject' ? applied.inject.length > 0 : Boolean(applied[key]);
331
+ }
332
+ /**
333
+ * Merge per-handler applied outputs in call order. Later scalars win, `inject`
334
+ * lists concatenate, `waitFor` ids join, warnings accumulate. `deny` beats `confirm`
335
+ * across handlers exactly as it does within one return.
336
+ */
337
+ function mergeApplied(parts) {
338
+ const out = { warnings: parts.flatMap((part) => part.warnings), inject: [] };
339
+ for (const part of parts) {
340
+ if (part.abort !== undefined)
341
+ out.abort = part.abort;
342
+ if (part.deny)
343
+ out.deny = part.deny;
344
+ if (part.confirm)
345
+ out.confirm = part.confirm;
346
+ if (part.mutate)
347
+ out.mutate = part.mutate;
348
+ if (part.labelFailed)
349
+ out.labelFailed = true;
350
+ if (part.waitFor)
351
+ out.waitFor = [...new Set([...(out.waitFor ?? []), ...part.waitFor])];
352
+ if (part.inject)
353
+ out.inject.push(part.inject);
354
+ }
355
+ if (out.deny && out.confirm) {
356
+ warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
357
+ delete out.confirm;
358
+ }
359
+ return out;
360
+ }
361
+ /**
362
+ * Await each handler in order and apply its return on its own, so one handler's
363
+ * junk is that handler's warning and cannot erase another's affordance. Each
364
+ * handler gets its own shallow context; abort wins over any handler error.
365
+ */
366
+ async function applyHandlers(handlers, ctx, apply, signal) {
367
+ const parts = [];
368
+ for (const handler of handlers) {
369
+ let raw;
370
+ try {
371
+ raw = await handler({ ...ctx });
372
+ }
373
+ catch (err) {
374
+ throwIfAborted(signal);
375
+ throw err;
376
+ }
377
+ throwIfAborted(signal);
378
+ parts.push(applyStageResult({ ...apply, result: raw }));
379
+ }
380
+ return parts;
381
+ }
382
+ /** Stage events always emit, even with no handlers. */
383
+ export async function* runStage(args) {
384
+ const { stage, step, history, handlers, guardrails, injectAllowed, injectWouldExceedMaxSteps, mutable, host, signal, span, ...bag } = args;
385
+ throwIfAborted(signal);
386
+ // why: Stream stage events stay lean (no outputRaw/failure). Hosts read those on
387
+ // StageContext via onStage; tool failures also ride tool events.
388
+ yield stageEventFields(stage, {
389
+ callId: bag.callId,
390
+ toolName: bag.tool,
391
+ callNotStarted: bag.callNotStarted,
392
+ awaiting: bag.awaiting,
393
+ gate: bag.gate,
394
+ stop: bag.stop,
395
+ });
396
+ if (handlers.length === 0) {
397
+ span?.event('theorem.stage', { stage, affordance: [] });
398
+ return { warnings: [], inject: [] };
399
+ }
400
+ const ctx = { stage, step, history, host, ...bag };
401
+ const startedMs = span?.msSinceStart();
402
+ const applied = mergeApplied(await applyHandlers(handlers, ctx, { stage, injectAllowed, injectWouldExceedMaxSteps, mutable }, signal));
403
+ span?.event('theorem.stage', {
404
+ stage,
405
+ ...(startedMs === undefined ? {} : { hook_ms: span.msSinceStart() - startedMs }),
406
+ affordance: STAGE_AFFORDANCES.filter((key) => appliedAffordance(applied, key)),
407
+ ...(applied.warnings.length > 0 ? { warnings: applied.warnings.map((w) => w.code) } : {}),
408
+ });
409
+ if (applied.warnings.length > 0) {
410
+ yield {
411
+ ...stageEventFields(stage, { callId: bag.callId, toolName: bag.tool }),
412
+ stageWarnings: applied.warnings,
413
+ };
414
+ }
415
+ if (applied.inject.length === 0)
416
+ return applied;
417
+ const reader = boundaryReader('injected', resolveGuardrailPolicy(guardrails).detect);
418
+ const sanitized = applied.inject.map((unit) => ({
419
+ ...unit,
420
+ messages: sanitizeHistory(unit.messages, reader),
421
+ }));
422
+ const found = reader.found();
423
+ const event = detectEvent('injected', found);
424
+ if (event) {
425
+ span?.event('theorem.guardrail', guardrailAttributes(event));
426
+ yield guardrailTurnEvent(event);
427
+ }
428
+ if (found.action === 'block')
429
+ throw requestRefused('injected');
430
+ return { ...applied, inject: sanitized };
431
+ }