@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,1173 @@
1
+ import { toolBoundary } from '../../guardrails/boundaries.js';
2
+ import { checkDestinationGate } from '../../guardrails/destinations.js';
3
+ import { scopeOf } from '../../guardrails/detect-at.js';
4
+ import { errorKind, isAbortError, TheoremError, throwIfAborted } from '../../guardrails/error.js';
5
+ import { labelText } from '../../guardrails/labels.js';
6
+ import { resolveGuardrailPolicy } from '../../guardrails/policy.js';
7
+ import { checkTaintGate, guardShownValue, guardToolFailureText, guardToolResult, inspectToolArguments, toolCallEvent, } from '../../guardrails/tool-result.js';
8
+ import { recordToolCheck, startToolTrace, } from '../engine/tool-trace.js';
9
+ import { jsonObjectSchema } from '../json.js';
10
+ import { isAwaitingUserInput } from '../turn-events.js';
11
+ import { isRecord } from '../util/record.js';
12
+ import { fillActivityLabel } from './activity-label.js';
13
+ import { AgentCallFailed, agentToolOrigin } from './agent.js';
14
+ import { coordinateTool } from './coordinate.js';
15
+ import { dispatchToolBody, failedActivity, failedActivityOf, failureEvent, messageOf, networkBlocked, networkBlockedEvent, requestChecks, sourceEvents, startToolExecution, toolCallArguments, toolEvent, } from './events.js';
16
+ import { HandlerEvents } from './handler-events.js';
17
+ import { formatToolFailureForModel, formatToolResult, frameToolFailure } from './model-text.js';
18
+ import { operationUnavailable, operationWireValue } from './operation.js';
19
+ import { checkPermission, gateDetails, isGateResumeDenied, isGateResumeGranted, isResumeContinuation, } from './permission.js';
20
+ import { executeHttpTool, executeMcpTool, failureWithoutSecret, modelResultFromOutput, omitSecret, outcomeFromUnauth, parseToolOutput, refusedCredentialOutcome, resolveToolAuth, withMedia, } from './remote.js';
21
+ import { extractLoadedIds, profileToolAllow, profileToolsSpec, promoteLoadedTools, } from './resolve.js';
22
+ import { plainToolInput } from './schema.js';
23
+ import { CredentialRefusedError, signedInFetch } from './signed-in-fetch.js';
24
+ import { emitGateSettlement, runPostToolStages, runPreToolPipeline, } from './stage-run.js';
25
+ export { checkPermission, isGateResumeGranted, isResumeContinuation, permissionGranted, } from './permission.js';
26
+ import { UncheckedOutput } from './unchecked-output.js';
27
+ function originOfTool(tool, tools) {
28
+ if (tool.type === 'agent')
29
+ return agentToolOrigin(tools.findProfile(tool.profile));
30
+ if (tool.type === 'http')
31
+ return 'http';
32
+ if (tool.type === 'mcp')
33
+ return 'mcp';
34
+ if (tool.type === 'builtin')
35
+ return 'builtin';
36
+ return 'local';
37
+ }
38
+ /** The kind whose boundaries a tool's calls cross. A provider builtin crosses none. */
39
+ function toolKindOf(tool) {
40
+ return tool.type === 'builtin' ? undefined : tool.type;
41
+ }
42
+ /**
43
+ * The boundary a call of `name` is read at before its tool gets it: none for a provider builtin,
44
+ * whose text the kernel never reads. A call no tool takes is read as a function tool's.
45
+ */
46
+ export function toolArgumentsBoundary(tools, name) {
47
+ const tool = tools.get(name);
48
+ const kind = tool ? toolKindOf(tool) : 'function';
49
+ return kind && toolBoundary('tool_arguments', kind);
50
+ }
51
+ /** A delegated reply is one hop past the called agent's own tools. */
52
+ function provenanceFor(tool, tools) {
53
+ const origin = originOfTool(tool, tools);
54
+ return { origin, tool: tool.name, depth: origin === 'delegated' ? 2 : 1 };
55
+ }
56
+ function isStreamHandler(handler) {
57
+ return (typeof handler === 'function' &&
58
+ Object.prototype.toString.call(handler) === '[object AsyncGeneratorFunction]');
59
+ }
60
+ const MEDIA_PART_TYPES = new Set(['image', 'audio', 'video', 'document']);
61
+ /** Invalid entries are dropped. */
62
+ export function coerceToolResultParts(raw) {
63
+ if (!Array.isArray(raw) || raw.length === 0)
64
+ return undefined;
65
+ const parts = [];
66
+ for (const item of raw) {
67
+ if (!isRecord(item) || typeof item.type !== 'string')
68
+ continue;
69
+ if (item.type === 'text' && typeof item.text === 'string') {
70
+ parts.push({ type: 'text', text: item.text });
71
+ continue;
72
+ }
73
+ if (MEDIA_PART_TYPES.has(item.type) &&
74
+ typeof item.mimeType === 'string' &&
75
+ item.mimeType.trim() &&
76
+ typeof item.data === 'string' &&
77
+ item.data.length > 0) {
78
+ parts.push({
79
+ type: item.type,
80
+ mimeType: item.mimeType,
81
+ data: item.data,
82
+ });
83
+ }
84
+ }
85
+ return parts.length > 0 ? parts : undefined;
86
+ }
87
+ /** A tool's output without its `parts` key, which carries media the model receives separately; any other value is returned as it is. */
88
+ export function leanToolResultData(output) {
89
+ if (!isRecord(output))
90
+ return output;
91
+ const { parts: _parts, ...rest } = output;
92
+ return rest;
93
+ }
94
+ async function* runHandler(handler, input, ctx, shown) {
95
+ if (isStreamHandler(handler)) {
96
+ let output;
97
+ const gen = handler(input, ctx);
98
+ for await (const event of gen) {
99
+ throwIfAborted(ctx.signal);
100
+ if (event.kind === 'complete') {
101
+ output = event.output;
102
+ continue;
103
+ }
104
+ yield* shown.show(event);
105
+ }
106
+ yield* shown.end();
107
+ return output;
108
+ }
109
+ const output = await handler(input, ctx);
110
+ return output instanceof UncheckedOutput ? output.value : output;
111
+ }
112
+ /** What the model is told of a function tool's output: a fixed finding for a hidden tool, a finding plus the output for an awaiting-user result, otherwise the tool's own summary or finding and its data. */
113
+ export function projectForModel(tool, output, labels) {
114
+ if (tool.exposeToModel === false) {
115
+ return { finding: labelText('tool.completed_hidden', {}, labels) };
116
+ }
117
+ if (isAwaitingUserInput(output)) {
118
+ return {
119
+ finding: labelText('tool.awaiting_user', { kind: output.kind, prompt: output.prompt }, labels),
120
+ data: leanToolResultData(output),
121
+ };
122
+ }
123
+ const parts = isRecord(output) && 'parts' in output ? coerceToolResultParts(output.parts) : undefined;
124
+ const lean = leanToolResultData(output);
125
+ const summarized = isRecord(lean) && 'finding' in lean;
126
+ const { finding: summary, ...rest } = summarized ? lean : {};
127
+ const result = summarized
128
+ ? {
129
+ finding: String(summary),
130
+ ...(Object.keys(rest).length > 0 ? { data: rest } : {}),
131
+ }
132
+ : modelResultFromOutput(lean);
133
+ return { ...result, ...(parts ? { parts } : {}) };
134
+ }
135
+ function loadsT2(tool, ctx) {
136
+ return profileToolsSpec(ctx.profile)?.t2Loader === tool.name;
137
+ }
138
+ function applyT2LoaderPromotion(tools, tool, checkedData, ctx, snapshot) {
139
+ if (!loadsT2(tool, ctx)) {
140
+ return { ok: true, output: checkedData };
141
+ }
142
+ if (!snapshot) {
143
+ return {
144
+ ok: false,
145
+ failure: {
146
+ code: 'invalid_output',
147
+ kind: 'bad_response',
148
+ message: labelText('tool.t2_loader_needs_snapshot', { tool: tool.name }, ctx.profile.labels),
149
+ },
150
+ };
151
+ }
152
+ const loaded = extractLoadedIds(checkedData);
153
+ if (!loaded) {
154
+ return {
155
+ ok: false,
156
+ failure: {
157
+ code: 'invalid_output',
158
+ kind: 'bad_response',
159
+ message: labelText('tool.t2_loader_shape', { tool: tool.name }, ctx.profile.labels),
160
+ },
161
+ };
162
+ }
163
+ const { promoted, failure: promoteFailure } = promoteLoadedTools(tools, snapshot, loaded, ctx.profile);
164
+ if (promoteFailure) {
165
+ return { ok: false, failure: promoteFailure };
166
+ }
167
+ const finalOutput = { ...checkedData, loaded: promoted };
168
+ const rechecked = tool.output.safeParse(finalOutput);
169
+ if (!rechecked.success) {
170
+ return {
171
+ ok: false,
172
+ failure: {
173
+ code: 'invalid_output',
174
+ kind: 'bad_response',
175
+ message: labelText('tool.t2_loader_output_invalid', {}, ctx.profile.labels),
176
+ details: rechecked.error.flatten(),
177
+ },
178
+ };
179
+ }
180
+ return { ok: true, output: rechecked.data };
181
+ }
182
+ /** What a post-tool stage's deny or `mutate` settles the call with instead; `undefined` when it keeps the result. */
183
+ function* reviseAfterStages(post, guard, reproject) {
184
+ if (post.deny) {
185
+ const failure = {
186
+ code: post.deny.code,
187
+ kind: 'blocked',
188
+ message: post.deny.message,
189
+ };
190
+ return {
191
+ failure,
192
+ outputRaw: undefined,
193
+ modelResult: (yield* guard.failure(failure)).modelResult,
194
+ awaiting: false,
195
+ };
196
+ }
197
+ if (!post.mutate || !reproject)
198
+ return undefined;
199
+ const next = reproject(plainToolInput(post.mutate.output));
200
+ if (!next.ok) {
201
+ return {
202
+ failure: next.failure,
203
+ outputRaw: undefined,
204
+ modelResult: (yield* guard.failure(next.failure)).modelResult,
205
+ awaiting: false,
206
+ };
207
+ }
208
+ const guarded = yield* guard.result(next.modelResult);
209
+ if (guarded.withheld) {
210
+ return {
211
+ failure: guarded.withheld,
212
+ outputRaw: undefined,
213
+ modelResult: guarded.modelResult,
214
+ awaiting: false,
215
+ };
216
+ }
217
+ return {
218
+ outputRaw: next.outputRaw,
219
+ modelResult: guarded.modelResult,
220
+ awaiting: isAwaitingUserInput(next.outputRaw),
221
+ };
222
+ }
223
+ function pastActivity(labels, input, output) {
224
+ return fillActivityLabel(labels?.activityPast, { input, output });
225
+ }
226
+ function completeEvent(base, settled) {
227
+ const { input, outputRaw, modelResult } = settled;
228
+ const activityPast = settled.labelFailed
229
+ ? failedActivityOf(base)
230
+ : pastActivity(settled.labels, input, outputRaw);
231
+ return toolEvent(base, {
232
+ phase: 'complete',
233
+ output: outputRaw,
234
+ readBack: formatToolResult(modelResult),
235
+ ...(modelResult.parts?.length ? { parts: modelResult.parts } : {}),
236
+ ...(activityPast ? { activityPast } : {}),
237
+ });
238
+ }
239
+ /**
240
+ * The one settlement for every transport. `reproject` is absent when the kernel owns the
241
+ * output (the T2 loader), which makes a host `mutate` a warning instead of a replacement.
242
+ */
243
+ async function* settleToolCall(args) {
244
+ const { base, toolName, callId, input, stages, provisional, guard, reproject, sources } = args;
245
+ const guarded = yield* 'failure' in provisional
246
+ ? guard.failure(provisional.failure)
247
+ : guard.result(provisional.modelResult);
248
+ let modelResult = guarded.modelResult;
249
+ let failure = 'failure' in provisional ? provisional.failure : guarded.withheld;
250
+ let outputRaw = 'outputRaw' in provisional && !failure ? provisional.outputRaw : undefined;
251
+ const callNotStarted = 'callNotStarted' in provisional ? provisional.callNotStarted : undefined;
252
+ let denied = 'denied' in provisional ? provisional.denied : undefined;
253
+ let awaiting = !failure && isAwaitingUserInput(outputRaw);
254
+ let post;
255
+ if (stages) {
256
+ const activityPast = failure ? undefined : pastActivity(args.labels, input, outputRaw);
257
+ post = yield* runPostToolStages({
258
+ stages,
259
+ toolName,
260
+ callId,
261
+ input,
262
+ callNotStarted,
263
+ outputRaw,
264
+ outputModel: modelResult,
265
+ ...(activityPast ? { activityPast } : {}),
266
+ activityFailed: failedActivityOf(base),
267
+ failure,
268
+ awaiting: awaiting || undefined,
269
+ mutable: !failure && reproject !== undefined,
270
+ });
271
+ const revised = yield* reviseAfterStages(post, guard, reproject);
272
+ if (revised) {
273
+ ({ failure, outputRaw, modelResult, awaiting } = revised);
274
+ if (post.deny)
275
+ denied = true;
276
+ }
277
+ }
278
+ if (!failure && sources)
279
+ yield* sourceEvents(base, sources, outputRaw);
280
+ yield failure
281
+ ? failureEvent(base, { ...failure, message: String(yield* guard.shown(failure.message)) }, formatToolResult(modelResult))
282
+ : completeEvent(base, {
283
+ input,
284
+ outputRaw: yield* guard.shown(outputRaw),
285
+ modelResult,
286
+ labels: args.labels,
287
+ ...(post?.labelFailed ? { labelFailed: true } : {}),
288
+ });
289
+ return {
290
+ modelResult,
291
+ ...(failure ? { failure } : { outputRaw }),
292
+ ...(denied ? { denied } : {}),
293
+ ...(callNotStarted ? { callNotStarted: true } : {}),
294
+ ...(awaiting ? { awaiting: true } : {}),
295
+ ...stageSettlement(post),
296
+ };
297
+ }
298
+ /** What the after-call stages add to a settlement: a turn to stop, input to hand the model. */
299
+ function stageSettlement(post) {
300
+ return {
301
+ ...(post?.abort !== undefined ? { aborted: post.abort } : {}),
302
+ ...(post?.inject.length ? { pendingInject: post.inject } : {}),
303
+ };
304
+ }
305
+ function settleToolFailure(guard, base, failure, stages, args) {
306
+ return settleToolCall({
307
+ base,
308
+ toolName: args.toolName,
309
+ callId: args.callId,
310
+ input: args.input,
311
+ stages,
312
+ guard,
313
+ provisional: {
314
+ failure,
315
+ ...(args.callNotStarted ? { callNotStarted: true } : {}),
316
+ ...(args.denied ? { denied: true } : {}),
317
+ },
318
+ });
319
+ }
320
+ function resultGuard(tools, tool, ctx, snapshot, span) {
321
+ const provenance = provenanceFor(tool, tools);
322
+ const policy = resolveGuardrailPolicy(ctx.profile.guardrails);
323
+ const callableTools = snapshot?.executable ?? [];
324
+ const inputs = {
325
+ provenance,
326
+ policy,
327
+ kind: toolKindOf(tool),
328
+ callableTools,
329
+ labels: ctx.profile.labels,
330
+ span,
331
+ };
332
+ const { kind } = inputs;
333
+ const handlerEvents = (drafts) => kind && {
334
+ profileId: ctx.profile.id,
335
+ provenance,
336
+ policy,
337
+ boundary: toolBoundary('tool_output', kind),
338
+ shown: toolBoundary('tool_shown', kind),
339
+ callableTools,
340
+ drafts,
341
+ };
342
+ const shown = (value) => showValue(value, inputs);
343
+ const service = isGateResumeGranted(ctx.resume) ? signInService(tool, ctx.resume) : undefined;
344
+ if (!service) {
345
+ return {
346
+ result: (result) => guardResult(result, inputs),
347
+ failure: (failure) => guardFailure(failure, inputs),
348
+ handlerEvents,
349
+ shown,
350
+ };
351
+ }
352
+ const note = labelText('sign_in.done', { service }, ctx.profile.labels);
353
+ return {
354
+ result: (result) => afterSignIn(note, guardResult(result, inputs)),
355
+ failure: (failure) => afterSignIn(note, guardFailure(failure, inputs)),
356
+ handlerEvents,
357
+ shown,
358
+ };
359
+ }
360
+ /** A call the person signed in for tells the model so before what it read back. */
361
+ function* afterSignIn(note, guarded) {
362
+ const read = yield* guarded;
363
+ const modelText = `${note}\n\n${formatToolResult(read.modelResult)}`;
364
+ return { ...read, modelResult: { ...read.modelResult, modelText } };
365
+ }
366
+ async function* runFunctionPreBodyStages(args) {
367
+ const { tool, base, stages, guard } = args;
368
+ const pre = yield* runPreToolPipeline(args);
369
+ if (pre.ok)
370
+ return pre;
371
+ if (pre.kind === 'aborted') {
372
+ return { aborted: pre.aborted, callNotStarted: true };
373
+ }
374
+ if (pre.kind === 'gated') {
375
+ return { gated: pre.gate, callNotStarted: true };
376
+ }
377
+ return yield* settleToolFailure(guard, base, pre.failure, stages, {
378
+ toolName: tool.name,
379
+ callId: base.callId,
380
+ input: args.input,
381
+ callNotStarted: true,
382
+ ...(pre.denied ? { denied: true } : {}),
383
+ });
384
+ }
385
+ function makeReproject(parse, project, labels) {
386
+ return (output) => {
387
+ const checked = parse(output);
388
+ if (!checked.success) {
389
+ return {
390
+ ok: false,
391
+ failure: {
392
+ code: 'invalid_output',
393
+ kind: 'bad_response',
394
+ message: labelText('tool.output_invalid_after_mutate', {}, labels),
395
+ details: checked.error.flatten(),
396
+ },
397
+ };
398
+ }
399
+ return { ok: true, outputRaw: checked.data, modelResult: project(checked.data) };
400
+ };
401
+ }
402
+ /** Order as for remote tools: schema → permission → auth → preTool/host stages → body. */
403
+ async function* resolveFunctionSignIn(tool, ctx, base) {
404
+ if (!tool.auth)
405
+ return {};
406
+ const resolved = yield* resolveToolAuth(tool.name, tool.auth, ctx, base);
407
+ const outcome = outcomeFromUnauth(resolved);
408
+ if (outcome)
409
+ return { outcome };
410
+ return {
411
+ prepared: {
412
+ authHeaders: resolved.headers,
413
+ ...(resolved.query ? { query: resolved.query } : {}),
414
+ ...(resolved.audience ? { audience: resolved.audience } : {}),
415
+ },
416
+ ...(resolved.secret ? { secret: resolved.secret } : {}),
417
+ };
418
+ }
419
+ function functionHandlerFailure(error) {
420
+ return {
421
+ code: 'handler_error',
422
+ kind: error instanceof TheoremError ? error.kind : 'failed',
423
+ message: messageOf(error),
424
+ };
425
+ }
426
+ function waitsForPage(tool, ctx) {
427
+ return tool.answeredBy === 'page' && ctx.page === undefined && !ctx.pageExecution;
428
+ }
429
+ async function* receivePageAnswer(tool, ctx, claim, base) {
430
+ const execution = ctx.pageExecution;
431
+ if (tool.answeredBy !== 'page' || !execution)
432
+ return ctx;
433
+ if (!claim?.invocation)
434
+ throw operationUnavailable();
435
+ const argumentsForPage = jsonObjectSchema.parse(operationWireValue(claim.invocation.preparedInput));
436
+ const dispatch = await execution.dispatch(claim, ctx.signal);
437
+ throwIfAborted(ctx.signal);
438
+ if (!dispatch.grantId)
439
+ throw operationUnavailable();
440
+ yield toolEvent(base, {
441
+ phase: 'dispatch',
442
+ grantId: dispatch.grantId,
443
+ arguments: argumentsForPage,
444
+ });
445
+ ctx = { ...ctx, page: await dispatch.result };
446
+ throwIfAborted(ctx.signal);
447
+ return ctx;
448
+ }
449
+ export async function* executeFunction(tools, tool, rawInput, ctx, base, snapshot, stages,
450
+ /** Set when `tool` runs an agent tool: its trust, and its handler's failures and faults. */
451
+ agent, beginBody) {
452
+ const guard = resultGuard(tools, agent ?? tool, ctx, snapshot, stages?.span);
453
+ const callId = base.callId;
454
+ const parsed = startToolExecution(tool, rawInput, ctx);
455
+ if (!parsed.ok) {
456
+ return yield* settleToolFailure(guard, base, parsed.failure, stages, {
457
+ toolName: tool.name,
458
+ callId,
459
+ callNotStarted: true,
460
+ });
461
+ }
462
+ let input = parsed.data;
463
+ const permissionGate = checkPermission(tool.name, tool.permission, ctx.sessionPermissions, ctx.resume, gateDetails(tool, input));
464
+ if (permissionGate) {
465
+ yield* emitGateSettlement({
466
+ base,
467
+ gate: permissionGate,
468
+ callId,
469
+ toolName: tool.name,
470
+ labels: ctx.profile.labels,
471
+ });
472
+ return { gated: permissionGate, callNotStarted: true };
473
+ }
474
+ throwIfAborted(ctx.signal);
475
+ const settleOutcome = (outcome) => settleBodyOutcome({
476
+ outcome,
477
+ tool,
478
+ base,
479
+ callId,
480
+ safeInput: input,
481
+ stages,
482
+ guard,
483
+ labels: ctx.profile.labels,
484
+ });
485
+ const signedIn = yield* resolveFunctionSignIn(tool, ctx, base);
486
+ if (signedIn.outcome)
487
+ return yield* settleOutcome(signedIn.outcome);
488
+ const preBody = yield* runFunctionPreBodyStages({ tool, input, ctx, base, stages, guard });
489
+ if (!('ok' in preBody)) {
490
+ return preBody;
491
+ }
492
+ input = preBody.input;
493
+ if (waitsForPage(tool, ctx)) {
494
+ // why: Last of the checks, so the page is asked only for a call every guardrail and gate let through.
495
+ const gate = { kind: 'page', tool: tool.name, ...gateDetails(tool, input) };
496
+ yield* emitGateSettlement({
497
+ base,
498
+ gate,
499
+ callId,
500
+ toolName: tool.name,
501
+ labels: ctx.profile.labels,
502
+ });
503
+ return { gated: gate, callNotStarted: true };
504
+ }
505
+ throwIfAborted(ctx.signal);
506
+ const claim = yield* dispatchToolBody(tool, input, ctx, base, beginBody);
507
+ ctx = yield* receivePageAnswer(tool, ctx, claim, base);
508
+ const { secret } = signedIn;
509
+ const fail = (failure) => settleToolFailure(guard, base, secret ? failureWithoutSecret(failure, secret) : failure, stages, { toolName: tool.name, callId, input });
510
+ const checks = requestChecks(stages?.span);
511
+ const handlerCtx = signedIn.prepared
512
+ ? { ...ctx, signedInFetch: signedInFetch(signedIn.prepared, ctx, checks) }
513
+ : ctx;
514
+ let output;
515
+ try {
516
+ const shown = new HandlerEvents(base, guard.handlerEvents(stages?.drafts === true));
517
+ output = yield* runHandler(tool.handler, input, handlerCtx, shown);
518
+ checks.record();
519
+ }
520
+ catch (err) {
521
+ if (agent) {
522
+ // why: Anything but a settled failure is the host's to fix, as a compactor's is.
523
+ if (err instanceof AgentCallFailed)
524
+ return yield* fail(err.failure);
525
+ throw err;
526
+ }
527
+ if (signedIn.prepared && err instanceof CredentialRefusedError) {
528
+ checks.record();
529
+ const refused = yield* refusedCredentialOutcome(tool, err.refusal, signedIn.secret !== undefined, ctx, base);
530
+ if (refused)
531
+ return yield* settleOutcome(refused);
532
+ }
533
+ if (signedIn.prepared && errorKind(err) === 'blocked') {
534
+ const blocked = networkBlockedEvent();
535
+ checks.record(blocked);
536
+ return yield* fail(yield* networkBlocked(err, blocked));
537
+ }
538
+ return yield* fail(functionHandlerFailure(err));
539
+ }
540
+ if (secret)
541
+ output = omitSecret(output, secret);
542
+ if (output === undefined) {
543
+ return yield* fail({
544
+ code: 'invalid_output',
545
+ kind: 'bad_response',
546
+ message: labelText('tool.handler_no_output', {}, ctx.profile.labels),
547
+ });
548
+ }
549
+ const checked = tool.output.safeParse(output);
550
+ if (!checked.success) {
551
+ return yield* fail({
552
+ code: 'invalid_output',
553
+ kind: 'bad_response',
554
+ message: labelText('tool.output_invalid', {}, ctx.profile.labels),
555
+ details: checked.error.flatten(),
556
+ });
557
+ }
558
+ const promoted = applyT2LoaderPromotion(tools, tool, checked.data, ctx, snapshot);
559
+ if (!promoted.ok) {
560
+ return yield* fail(promoted.failure);
561
+ }
562
+ // why: The T2 loader's output drives the snapshot, so the host may not mutate it.
563
+ const ownsOutput = loadsT2(tool, ctx);
564
+ return yield* settleToolCall({
565
+ base,
566
+ toolName: tool.name,
567
+ callId,
568
+ input,
569
+ stages,
570
+ guard,
571
+ provisional: {
572
+ outputRaw: promoted.output,
573
+ modelResult: projectForModel(tool, promoted.output, ctx.profile.labels),
574
+ },
575
+ sources: tool.sources,
576
+ labels: tool.labels,
577
+ ...(ownsOutput
578
+ ? {}
579
+ : {
580
+ reproject: makeReproject((v) => tool.output.safeParse(v), (data) => projectForModel(tool, data, ctx.profile.labels), ctx.profile.labels),
581
+ }),
582
+ });
583
+ }
584
+ /** Names the profile's loader when it can load the tool, so the model knows which call comes first. */
585
+ export function notLoadedMessage(tool, profile) {
586
+ const loader = profileToolsSpec(profile)?.t2Loader;
587
+ if (tool.loadTier === 'T2' && loader) {
588
+ return labelText('tool.not_loaded_t2', { tool: tool.name, loader }, profile.labels);
589
+ }
590
+ return labelText('tool.not_visible', { tool: tool.name }, profile.labels);
591
+ }
592
+ function earlyFailure(failure) {
593
+ return { failure, callNotStarted: true, modelResult: formatToolFailureForModel(failure) };
594
+ }
595
+ export async function* executeBuiltin(tool, ctx, base, snapshot) {
596
+ yield toolEvent(base, { phase: 'running' });
597
+ throwIfAborted(ctx.signal);
598
+ if (!snapshot.builtins.includes(tool.name)) {
599
+ const failure = {
600
+ code: 'not_loaded',
601
+ kind: 'request',
602
+ message: labelText('tool.builtin_not_enabled', { tool: tool.name }, ctx.profile.labels),
603
+ };
604
+ yield failureEvent(base, failure);
605
+ return earlyFailure(failure);
606
+ }
607
+ const failure = {
608
+ code: 'provider_native',
609
+ kind: 'request',
610
+ message: labelText('tool.provider_native', { tool: tool.name }, ctx.profile.labels),
611
+ };
612
+ yield failureEvent(base, failure);
613
+ return earlyFailure(failure);
614
+ }
615
+ function registeredEligibilityFailure(args) {
616
+ const { tool, profile, name, resume, snapshot } = args;
617
+ if (!profileToolAllow(profile).includes(name)) {
618
+ return {
619
+ code: 'not_allowed',
620
+ kind: 'blocked',
621
+ message: labelText('tool.not_allowed', { tool: name, profile: profile.id }, profile.labels),
622
+ };
623
+ }
624
+ if (!snapshot)
625
+ return undefined;
626
+ const continuing = isResumeContinuation(resume);
627
+ if (!continuing && !snapshot.gated.includes(name)) {
628
+ return {
629
+ code: 'not_gated',
630
+ kind: 'request',
631
+ message: labelText('tool.not_eligible', { tool: name }, profile.labels),
632
+ };
633
+ }
634
+ if (!(args.visible ?? snapshot.visible).includes(name)) {
635
+ const skipLoadCheck = continuing && tool.loadTier === 'T0';
636
+ if (!skipLoadCheck) {
637
+ return {
638
+ code: 'not_loaded',
639
+ kind: 'request',
640
+ message: notLoadedMessage(tool, profile),
641
+ };
642
+ }
643
+ }
644
+ return undefined;
645
+ }
646
+ export function authorizeToolReplay(args) {
647
+ const tool = args.tools.get(args.name);
648
+ if (!tool || tool.type === 'builtin') {
649
+ throw new TheoremError('blocked', labelText('error.blocked'));
650
+ }
651
+ const failure = registeredEligibilityFailure({ ...args, tool });
652
+ if (failure)
653
+ throw new TheoremError(failure.kind, failure.message);
654
+ if (args.outcome)
655
+ authorizeSavedDisclosure(args, tool, args.outcome);
656
+ }
657
+ function authorizeSavedDisclosure(args, tool, outcome) {
658
+ const blocked = () => new TheoremError('blocked', labelText('detect.output_blocked', {}, args.profile.labels));
659
+ const result = outcome.replay.modelResult;
660
+ if (tool.type === 'function' &&
661
+ tool.exposeToModel === false &&
662
+ result?.finding !== labelText('tool.completed_hidden', {}, args.profile.labels))
663
+ throw blocked();
664
+ const guard = guardToolResult(outcome.event.tool.readBack ?? '', { event: outcome.event, output: outcome.replay.outputRaw }, provenanceFor(tool, args.tools), resolveGuardrailPolicy(args.profile.guardrails), tool.type === 'builtin' ? undefined : toolBoundary('tool_output', tool.type), args.snapshot?.executable ?? [], args.profile.labels);
665
+ if (guard.event?.action === 'block' || guard.event?.action === 'redact')
666
+ throw blocked();
667
+ }
668
+ /** Settles an outcome the kernel reached without a handler's own result: a remote body, or a sign-in. */
669
+ async function* settleBodyOutcome(args) {
670
+ const { outcome, tool, base, callId, safeInput, stages, guard, labels } = args;
671
+ const name = tool.name;
672
+ if (outcome.kind === 'gated') {
673
+ if (outcome.gate.kind === 'confirmation') {
674
+ return { gated: outcome.gate, callNotStarted: true };
675
+ }
676
+ const gateReadBack = yield* emitGateSettlement({
677
+ base,
678
+ gate: outcome.gate,
679
+ callId,
680
+ toolName: name,
681
+ labels,
682
+ });
683
+ return { gated: outcome.gate, callNotStarted: true, ...(gateReadBack ? { gateReadBack } : {}) };
684
+ }
685
+ if (outcome.kind === 'aborted') {
686
+ return { aborted: outcome.aborted, callNotStarted: true };
687
+ }
688
+ if (outcome.kind === 'failed') {
689
+ return yield* settleToolFailure(guard, base, outcome.failure, stages, {
690
+ toolName: name,
691
+ callId,
692
+ input: safeInput,
693
+ callNotStarted: outcome.callNotStarted,
694
+ ...(outcome.denied ? { denied: true } : {}),
695
+ });
696
+ }
697
+ return yield* settleToolCall({
698
+ base,
699
+ toolName: name,
700
+ callId,
701
+ input: safeInput,
702
+ stages,
703
+ guard,
704
+ provisional: { outputRaw: outcome.outputRaw, modelResult: outcome.modelResult },
705
+ sources: tool.sources,
706
+ labels: tool.labels,
707
+ reproject: makeReproject((v) => parseToolOutput(tool.output, v),
708
+ // why: A hook's edit replaces the value; the media the tool returned stays.
709
+ (data) => withMedia(modelResultFromOutput(data), outcome.modelResult.parts), labels),
710
+ });
711
+ }
712
+ function turnReadBack({ modelResult }) {
713
+ return modelResult
714
+ ? { text: formatToolResult(modelResult), parts: modelResult.parts }
715
+ : undefined;
716
+ }
717
+ /** The service a sign-in gate's answer names, from the tool's own auth config. */
718
+ function signInService(tool, resume) {
719
+ if (!resume?.signIn || tool.type === 'builtin' || tool.type === 'agent')
720
+ return undefined;
721
+ return tool.auth?.service;
722
+ }
723
+ /**
724
+ * A gate nobody answered: a sign-in for `expiredService` whose link expired, or any other gate
725
+ * left behind. Both settle as `cancelled`.
726
+ */
727
+ export function lapsedGateFailure(toolName, expiredService, labels) {
728
+ if (expiredService) {
729
+ return {
730
+ code: 'expired',
731
+ kind: 'cancelled',
732
+ message: labelText('sign_in.expired', { service: expiredService }, labels),
733
+ };
734
+ }
735
+ return {
736
+ code: 'cancelled',
737
+ kind: 'cancelled',
738
+ message: labelText('session.abandon_gated', { tool: toolName }, labels),
739
+ };
740
+ }
741
+ /** `abandoned` and `expired` settle as `cancelled`. */
742
+ function refusalFailure(tool, resume, labels) {
743
+ const service = signInService(tool, resume);
744
+ const cause = resume?.cause ?? 'declined';
745
+ if (cause === 'declined') {
746
+ return {
747
+ code: 'denied',
748
+ kind: 'declined',
749
+ message: service
750
+ ? labelText('sign_in.declined', { service }, labels)
751
+ : labelText('session.tool_denied', { tool: tool.name }, labels),
752
+ };
753
+ }
754
+ return lapsedGateFailure(tool.name, cause === 'expired' ? service : undefined, labels);
755
+ }
756
+ function resumeApproval(resume) {
757
+ if (isGateResumeGranted(resume))
758
+ return true;
759
+ if (isGateResumeDenied(resume))
760
+ return false;
761
+ return undefined;
762
+ }
763
+ function toolCallEnd(settlement, readBack) {
764
+ const { failure } = settlement;
765
+ const result = readBack(settlement);
766
+ const outcome = settlement.gated
767
+ ? 'gated'
768
+ : settlement.aborted !== undefined && settlement.callNotStarted
769
+ ? 'cancelled'
770
+ : settlement.denied
771
+ ? 'denied'
772
+ : failure
773
+ ? 'error'
774
+ : settlement.awaiting
775
+ ? 'paused'
776
+ : 'ok';
777
+ return {
778
+ outcome,
779
+ ...(result ? { result } : {}),
780
+ ...(!failure && 'outputRaw' in settlement ? { data: { value: settlement.outputRaw } } : {}),
781
+ ...(failure ? { failure } : {}),
782
+ };
783
+ }
784
+ /** Runs one registered tool call as a stream of turn events and returns how it settled; when `openSpan` is given the call is recorded as a tool span that ends with the outcome. */
785
+ /**
786
+ * A call's arguments as its tool gets them, which is what the call's first
787
+ * event shows the host: a detector's placeholder where it redacts, and none
788
+ * when the call is stopped. A call no tool takes is read as a function tool's.
789
+ */
790
+ export function shownToolArguments(call) {
791
+ const tool = call.tools.get(call.name);
792
+ const policy = resolveGuardrailPolicy(call.profile.guardrails);
793
+ const inspected = inspectToolArguments(plainToolInput(call.input), tool ? provenanceFor(tool, call.tools) : { origin: 'local', tool: call.name, depth: 1 }, policy, toolArgumentsBoundary(call.tools, call.name), scopeOf(policy, call.scope ?? {}));
794
+ const { args } = inspected;
795
+ return args !== null && typeof args === 'object' && !Array.isArray(args)
796
+ ? args
797
+ : {};
798
+ }
799
+ export async function* executeRegisteredTool(args) {
800
+ args = {
801
+ ...args,
802
+ ctx: { ...args.ctx, operationId: args.ctx.operationId ?? crypto.randomUUID() },
803
+ };
804
+ return yield* coordinateTool(args.execution, {
805
+ operationId: args.ctx.operationId ?? crypto.randomUUID(),
806
+ callId: args.callId,
807
+ profileId: args.profile.id,
808
+ toolId: args.name,
809
+ }, {
810
+ input: args.input,
811
+ resume: args.ctx.resume,
812
+ snapshot: args.snapshot,
813
+ context: args.invocation,
814
+ }, args.ctx.signal, (beginBody) => executeTracedTool({
815
+ ...args,
816
+ beginBody: async (input) => {
817
+ const claim = (await beginBody?.(input)) ?? (await args.beginBody?.(input));
818
+ args.onDispatch?.();
819
+ return claim;
820
+ },
821
+ }), (outcome) => authorizeToolReplay({
822
+ outcome,
823
+ tools: args.tools,
824
+ profile: args.profile,
825
+ name: args.name,
826
+ resume: args.ctx.resume,
827
+ snapshot: args.snapshot,
828
+ }));
829
+ }
830
+ async function* executeTracedTool(args) {
831
+ const tool = args.tools.get(args.name);
832
+ if (!args.openSpan) {
833
+ return yield* runRegisteredTool(args, tool);
834
+ }
835
+ const trace = startToolTrace(args.openSpan, {
836
+ name: args.name,
837
+ callId: args.callId,
838
+ call: { arguments: toolCallArguments(plainToolInput(args.input)) },
839
+ origin: tool ? originOfTool(tool, args.tools) : undefined,
840
+ permission: tool && 'permission' in tool ? tool.permission : undefined,
841
+ approved: resumeApproval(args.ctx.resume),
842
+ step: args.ctx.turn?.step,
843
+ });
844
+ const exec = runRegisteredTool({
845
+ ...args,
846
+ ctx: { ...args.ctx, traceparent: trace.span.traceparent() },
847
+ ...(args.stages ? { stages: { ...args.stages, span: trace.span } } : {}),
848
+ }, tool);
849
+ try {
850
+ for (;;) {
851
+ const next = await exec.next();
852
+ if (next.done) {
853
+ trace.end(toolCallEnd(next.value, args.readBack ?? turnReadBack));
854
+ return next.value;
855
+ }
856
+ trace.observe(next.value);
857
+ yield next.value;
858
+ }
859
+ }
860
+ catch (err) {
861
+ trace.end(isAbortError(err) ? { outcome: 'cancelled' } : { outcome: 'error', thrown: err });
862
+ throw err;
863
+ }
864
+ finally {
865
+ // why: The host stopped reading mid-call.
866
+ if (!trace.span.ended) {
867
+ trace.end({ outcome: 'cancelled' });
868
+ await exec.return({});
869
+ }
870
+ }
871
+ }
872
+ async function* runRegisteredTool(args, tool) {
873
+ const { profile, name, input, callId, ctx, snapshot, stages } = args;
874
+ const safeInput = plainToolInput(input);
875
+ const operationId = ctx.operationId ?? crypto.randomUUID();
876
+ const base = {
877
+ name,
878
+ callId,
879
+ operationId,
880
+ activityFailed: failedActivity(name, profile.labels, tool?.labels, safeInput),
881
+ };
882
+ if (!tool) {
883
+ const failure = {
884
+ code: 'unknown_tool',
885
+ kind: 'request',
886
+ message: labelText('tool.not_registered', { tool: name }, profile.labels),
887
+ };
888
+ yield failureEvent(base, failure);
889
+ return earlyFailure(failure);
890
+ }
891
+ if (tool.type === 'builtin') {
892
+ if (!snapshot) {
893
+ const failure = {
894
+ code: 'provider_native',
895
+ kind: 'request',
896
+ message: labelText('tool.builtin_needs_snapshot', { tool: name }, profile.labels),
897
+ };
898
+ yield failureEvent(base, failure);
899
+ return earlyFailure(failure);
900
+ }
901
+ const fullCtx = { ...ctx, callId, profile, operationId };
902
+ return yield* executeBuiltin(tool, fullCtx, base, snapshot);
903
+ }
904
+ const eligibility = registeredEligibilityFailure({
905
+ tool,
906
+ profile,
907
+ name,
908
+ resume: ctx.resume,
909
+ snapshot,
910
+ visible: ctx.turn?.visible,
911
+ });
912
+ if (eligibility) {
913
+ yield failureEvent(base, eligibility);
914
+ return earlyFailure(eligibility);
915
+ }
916
+ if (isGateResumeDenied(ctx.resume)) {
917
+ return yield* settleToolFailure(resultGuard(args.tools, tool, { ...ctx, callId, profile, operationId }, snapshot, stages?.span), base, refusalFailure(tool, ctx.resume, profile.labels), stages, { toolName: name, callId, input: safeInput, callNotStarted: true, denied: true });
918
+ }
919
+ const fullCtx = { ...ctx, callId, profile, operationId };
920
+ const policy = resolveGuardrailPolicy(profile.guardrails);
921
+ const provenance = provenanceFor(tool, args.tools);
922
+ const argsStart = performance.now();
923
+ const kind = toolKindOf(tool);
924
+ const inspected = inspectToolArguments(safeInput, provenance, policy, kind && toolBoundary('tool_arguments', kind), scopeOf(policy, args.scope ?? {}));
925
+ recordToolCheck(stages?.span, 'tool_arguments', performance.now() - argsStart, inspected.event);
926
+ if (inspected.event) {
927
+ yield { type: 'guardrail', guardrail: inspected.event };
928
+ }
929
+ if (!('args' in inspected)) {
930
+ const failure = {
931
+ code: 'arguments_blocked',
932
+ kind: 'blocked',
933
+ message: labelText('detect.call_blocked', {}, profile.labels),
934
+ };
935
+ yield failureEvent(base, failure);
936
+ return { ...earlyFailure(failure), denied: true };
937
+ }
938
+ const taintStart = performance.now();
939
+ const taintVerdict = checkTaintGate(ctx.turn?.taint, tool.access, policy, profile.labels);
940
+ const taintEvent = toolCallEvent(taintVerdict, provenance);
941
+ recordToolCheck(stages?.span, 'taint', performance.now() - taintStart, taintEvent);
942
+ if (taintEvent) {
943
+ yield { type: 'guardrail', guardrail: taintEvent };
944
+ }
945
+ if (taintVerdict.action === 'block') {
946
+ const failure = {
947
+ code: 'tainted_turn',
948
+ kind: 'blocked',
949
+ message: taintVerdict.rejection,
950
+ };
951
+ yield failureEvent(base, failure);
952
+ return { ...earlyFailure(failure), denied: true };
953
+ }
954
+ const stopped = yield* settleRemoteDestination({
955
+ tool,
956
+ input: inspected.args,
957
+ ctx: fullCtx,
958
+ base,
959
+ provenance,
960
+ policy,
961
+ span: stages?.span,
962
+ });
963
+ if (stopped)
964
+ return stopped;
965
+ return yield* settleByType(args.tools, tool, inspected.args, fullCtx, base, snapshot, stages, args.agents, args.beginBody);
966
+ }
967
+ /** The call's settlement when a destination in its arguments stops it: refused, or held for the user's answer. */
968
+ async function* settleRemoteDestination(args) {
969
+ const { tool, input, ctx, base } = args;
970
+ const { labels } = ctx.profile;
971
+ const start = performance.now();
972
+ const { verdict, confirm } = checkDestinationGate(ctx.turn?.destinations, input, args.policy, labels);
973
+ const event = toolCallEvent(verdict, args.provenance);
974
+ recordToolCheck(args.span, 'destination', performance.now() - start, event);
975
+ if (event) {
976
+ yield { type: 'guardrail', guardrail: event };
977
+ }
978
+ if (verdict.action === 'block') {
979
+ const failure = {
980
+ code: 'remote_destination',
981
+ kind: 'blocked',
982
+ message: verdict.rejection,
983
+ };
984
+ yield failureEvent(base, failure);
985
+ return { ...earlyFailure(failure), denied: true };
986
+ }
987
+ if (!confirm || isGateResumeGranted(ctx.resume))
988
+ return undefined;
989
+ const gate = {
990
+ kind: 'confirmation',
991
+ tool: tool.name,
992
+ summary: confirm,
993
+ ...gateDetails(tool, input),
994
+ };
995
+ yield* emitGateSettlement({
996
+ base,
997
+ gate,
998
+ callId: ctx.callId,
999
+ toolName: tool.name,
1000
+ labels,
1001
+ });
1002
+ return { gated: gate, callNotStarted: true };
1003
+ }
1004
+ /**
1005
+ * An agent tool runs as a function tool whose handler is the called agent's
1006
+ * turn, so input checks, gates, stages, and the result guard are the same. The
1007
+ * agent's reply streams as the call's drafts and its other events as its
1008
+ * `progress`, and its usage rides on the call's last phase.
1009
+ */
1010
+ async function* executeAgentTool(args) {
1011
+ const { tool, ctx, base, agents } = args;
1012
+ if (!agents) {
1013
+ const failure = {
1014
+ code: 'unknown_tool',
1015
+ kind: 'unsupported',
1016
+ message: labelText('tool.unsupported_type', { tool: tool.name }, ctx.profile.labels),
1017
+ };
1018
+ yield failureEvent(base, failure);
1019
+ return earlyFailure(failure);
1020
+ }
1021
+ let tokens;
1022
+ const span = args.stages?.span;
1023
+ const handler = async function* (input, handlerCtx) {
1024
+ const run = agents.run({
1025
+ tool,
1026
+ callId: handlerCtx.callId,
1027
+ // why: Checked against the tool's input schema before the handler runs.
1028
+ input: input,
1029
+ caller: handlerCtx.profile,
1030
+ ...(span ? { span } : {}),
1031
+ ...(handlerCtx.signal ? { signal: handlerCtx.signal } : {}),
1032
+ });
1033
+ // why: A retry throws away the reply drafted so far; the drafts stop there, and the output arrives whole.
1034
+ let retried = false;
1035
+ for (;;) {
1036
+ const next = await run.next();
1037
+ if (next.done) {
1038
+ tokens = next.value.tokens;
1039
+ if ('failure' in next.value)
1040
+ throw new AgentCallFailed(next.value.failure);
1041
+ yield { kind: 'complete', output: next.value.output };
1042
+ return;
1043
+ }
1044
+ const event = next.value;
1045
+ if (event.type === 'attempt')
1046
+ retried = true;
1047
+ if (event.type === 'text' || event.type === 'structured_draft') {
1048
+ if (!retried)
1049
+ yield { kind: 'draft', text: event.text };
1050
+ continue;
1051
+ }
1052
+ yield { kind: 'progress', data: { agent: tool.profile, event } };
1053
+ }
1054
+ };
1055
+ // why: Its hooks take `AgentToolInput`, which the input schema has already checked.
1056
+ const asFunction = { ...tool, type: 'function', handler };
1057
+ const exec = executeFunction(args.tools, asFunction, args.safeInput, ctx, base, args.snapshot, args.stages, tool, args.beginBody);
1058
+ for (;;) {
1059
+ const next = await exec.next();
1060
+ if (next.done)
1061
+ return next.value;
1062
+ yield withAgentTokens(next.value, base.callId, tokens);
1063
+ }
1064
+ }
1065
+ /** The called agent's usage on the call's `complete` or `error` phase. */
1066
+ function withAgentTokens(event, callId, tokens) {
1067
+ if (!tokens || event.type !== 'tool' || event.tool.callId !== callId)
1068
+ return event;
1069
+ const { tool } = event;
1070
+ if (tool.phase !== 'complete' && tool.phase !== 'error')
1071
+ return event;
1072
+ return { ...event, tool: { ...tool, tokens } };
1073
+ }
1074
+ async function* settleByType(tools, tool, safeInput, fullCtx, base, snapshot, stages, agents, beginBody) {
1075
+ const { name } = tool;
1076
+ if (tool.type === 'function') {
1077
+ return yield* executeFunction(tools, tool, safeInput, fullCtx, base, snapshot, stages, undefined, beginBody);
1078
+ }
1079
+ if (tool.type === 'agent') {
1080
+ return yield* executeAgentTool({
1081
+ tools,
1082
+ tool,
1083
+ safeInput,
1084
+ ctx: fullCtx,
1085
+ base,
1086
+ snapshot,
1087
+ stages,
1088
+ agents,
1089
+ beginBody,
1090
+ });
1091
+ }
1092
+ if (tool.type !== 'http' && tool.type !== 'mcp') {
1093
+ return earlyFailure({
1094
+ code: 'unknown_tool',
1095
+ kind: 'request',
1096
+ message: labelText('tool.unsupported_type', { tool: name }, fullCtx.profile.labels),
1097
+ });
1098
+ }
1099
+ const guard = resultGuard(tools, tool, fullCtx, snapshot, stages?.span);
1100
+ const remoteOutcome = tool.type === 'http'
1101
+ ? yield* executeHttpTool(tool, safeInput, fullCtx, base, stages, beginBody, new HandlerEvents(base, guard.handlerEvents(stages?.drafts === true)))
1102
+ : yield* executeMcpTool(tool, safeInput, fullCtx, base, stages, tools.mcpSessions, beginBody);
1103
+ return yield* settleBodyOutcome({
1104
+ outcome: remoteOutcome,
1105
+ tool,
1106
+ base,
1107
+ callId: base.callId,
1108
+ safeInput,
1109
+ stages,
1110
+ guard,
1111
+ labels: fullCtx.profile.labels,
1112
+ });
1113
+ }
1114
+ /**
1115
+ * A remote server writes its own error strings, so a failure's message is read
1116
+ * at `tool_failure_<kind>` before the kernel frames it for the model as a system
1117
+ * report. A blocked message is replaced by the labels' words. The framed
1118
+ * report is the kernel's own text and is not read again.
1119
+ */
1120
+ function* guardFailure(failure, guard) {
1121
+ const start = performance.now();
1122
+ const checked = guardToolFailureText(failure.message, guard.provenance, guard.policy, guard.kind && toolBoundary('tool_failure', guard.kind));
1123
+ recordToolCheck(guard.span, 'tool_failure', performance.now() - start, checked.event);
1124
+ if (checked.event) {
1125
+ yield { type: 'guardrail', guardrail: checked.event };
1126
+ }
1127
+ const message = checked.text ?? labelText('detect.output_blocked', {}, guard.labels);
1128
+ return { modelResult: yield* reportFailure({ ...failure, message }, guard) };
1129
+ }
1130
+ /** A failure framed for the model in the kernel's own words, fenced and labelled like any result. */
1131
+ function* reportFailure(failure, guard) {
1132
+ const framed = frameToolFailure(failure);
1133
+ return (yield* readBack(framed, guard, undefined)) ?? framed;
1134
+ }
1135
+ /** A result read at `tool_output_<kind>`. A blocked one settles as a failed call the model is told about. */
1136
+ function* guardResult(result, guard) {
1137
+ const read = yield* readBack(result, guard, guard.kind && toolBoundary('tool_output', guard.kind));
1138
+ if (read)
1139
+ return { modelResult: read };
1140
+ const withheld = {
1141
+ code: 'output_blocked',
1142
+ kind: 'blocked',
1143
+ message: labelText('detect.output_blocked', {}, guard.labels),
1144
+ };
1145
+ return { modelResult: yield* reportFailure(withheld, guard), withheld };
1146
+ }
1147
+ /** What the person is shown of `value`, read at `tool_shown_<kind>`; a blocked one is the labels' words. */
1148
+ function* showValue(value, guard) {
1149
+ const boundary = guard.kind && toolBoundary('tool_shown', guard.kind);
1150
+ const shown = guardShownValue(value, guard.provenance, guard.policy, boundary);
1151
+ if (shown.event)
1152
+ yield { type: 'guardrail', guardrail: shown.event };
1153
+ return 'value' in shown ? shown.value : labelText('detect.shown_blocked', {}, guard.labels);
1154
+ }
1155
+ /** What the model reads of `result`, or `undefined` when a match at `boundary` blocks it. */
1156
+ function* readBack(result, guard, boundary) {
1157
+ const { provenance, span } = guard;
1158
+ const start = performance.now();
1159
+ const guarded = guardToolResult(result.finding, result.data, provenance, guard.policy, boundary, guard.callableTools, guard.labels);
1160
+ recordToolCheck(span, 'tool_result', performance.now() - start, guarded.event);
1161
+ if (guarded.event) {
1162
+ yield { type: 'guardrail', guardrail: guarded.event };
1163
+ }
1164
+ if (guarded.text === undefined)
1165
+ return undefined;
1166
+ return {
1167
+ ...result,
1168
+ modelText: guarded.text,
1169
+ provenance,
1170
+ ...(guarded.suspicious ? { suspicious: guarded.suspicious } : {}),
1171
+ };
1172
+ }
1173
+ export { startToolExecution };