@theoremjs/agents 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -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 +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -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 +202 -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 +25 -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 +72 -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 +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -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 +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -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 +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,801 @@
1
+ import { errorKind, isAbortError, throwIfAborted } from '../../guardrails/error.js';
2
+ import { lexiconText } from '../../guardrails/lexicon.js';
3
+ import { resolveGuardrailPolicy } from '../../guardrails/policy.js';
4
+ import { resolveSensitive } from '../../guardrails/sensitive.js';
5
+ import { checkTaintGate, guardToolFailureText, guardToolResult, inspectToolArguments, toolCallEvent, } from '../../guardrails/tool-result.js';
6
+ import { recordToolCheck, startToolTrace, } from '../engine/tool-trace.js';
7
+ import { isAwaitingUserInput } from '../stages.js';
8
+ import { isRecord } from '../util/record.js';
9
+ import { fillActivityLabel } from './activity-label.js';
10
+ import { failureEvent, messageOf, networkBlocked, networkBlockedEvent, requestChecks, sourceEvents, startToolExecution, toolCallArguments, toolEvent, } from './events.js';
11
+ import { formatToolFailureForModel, formatToolResult } from './model-text.js';
12
+ import { checkPermission, isGateResumeDenied, isGateResumeGranted, isResumeContinuation, } from './permission.js';
13
+ import { executeHttpTool, executeMcpTool, failureWithoutSecret, modelResultFromOutput, omitSecret, outcomeFromUnauth, parseToolOutput, refusedCredentialOutcome, resolveToolAuth, withMedia, } from './remote.js';
14
+ import { extractLoadedIds, profileToolAllow, profileToolsSpec, promoteLoadedTools, } from './resolve.js';
15
+ import { plainToolInput } from './schema.js';
16
+ import { CredentialRefusedError, signedInFetch } from './signed-in-fetch.js';
17
+ import { emitGateSettlement, runPostToolStages, runPreToolPipeline, } from './stage-run.js';
18
+ export { checkPermission, isGateResumeGranted, isResumeContinuation, permissionGranted, } from './permission.js';
19
+ function originOfTool(type) {
20
+ if (type === 'http')
21
+ return 'http';
22
+ if (type === 'mcp')
23
+ return 'mcp';
24
+ if (type === 'builtin')
25
+ return 'builtin';
26
+ return 'local';
27
+ }
28
+ function provenanceFor(tool, depth = 1) {
29
+ return { origin: originOfTool(tool.type), tool: tool.name, depth };
30
+ }
31
+ function isStreamHandler(handler) {
32
+ return (typeof handler === 'function' &&
33
+ Object.prototype.toString.call(handler) === '[object AsyncGeneratorFunction]');
34
+ }
35
+ const MEDIA_PART_TYPES = new Set(['image', 'audio', 'video', 'document']);
36
+ /** Invalid entries are dropped. */
37
+ export function coerceToolResultParts(raw) {
38
+ if (!Array.isArray(raw) || raw.length === 0)
39
+ return undefined;
40
+ const parts = [];
41
+ for (const item of raw) {
42
+ if (!isRecord(item) || typeof item.type !== 'string')
43
+ continue;
44
+ if (item.type === 'text' && typeof item.text === 'string') {
45
+ parts.push({ type: 'text', text: item.text });
46
+ continue;
47
+ }
48
+ if (MEDIA_PART_TYPES.has(item.type) &&
49
+ typeof item.mimeType === 'string' &&
50
+ item.mimeType.trim() &&
51
+ typeof item.data === 'string' &&
52
+ item.data.length > 0) {
53
+ parts.push({
54
+ type: item.type,
55
+ mimeType: item.mimeType,
56
+ data: item.data,
57
+ });
58
+ }
59
+ }
60
+ return parts.length > 0 ? parts : undefined;
61
+ }
62
+ export function leanToolResultData(output) {
63
+ if (!isRecord(output))
64
+ return output;
65
+ const { parts: _parts, ...rest } = output;
66
+ return rest;
67
+ }
68
+ export function* yieldHandlerSideEvent(base, event) {
69
+ if (event.kind === 'progress') {
70
+ yield toolEvent(base, { phase: 'progress', data: event.data });
71
+ }
72
+ else if (event.kind === 'trace') {
73
+ yield toolEvent(base, { phase: 'trace', step: event.step });
74
+ }
75
+ else if (event.kind === 'artifact') {
76
+ yield toolEvent(base, { phase: 'artifact', artifact: event.artifact });
77
+ }
78
+ else if (event.kind === 'warning') {
79
+ yield toolEvent(base, { phase: 'warning', warning: event.warning });
80
+ }
81
+ }
82
+ async function* runHandler(handler, input, ctx, base) {
83
+ if (isStreamHandler(handler)) {
84
+ let output;
85
+ const gen = handler(input, ctx);
86
+ for await (const event of gen) {
87
+ throwIfAborted(ctx.signal);
88
+ if (event.kind === 'complete') {
89
+ output = event.output;
90
+ continue;
91
+ }
92
+ yield* yieldHandlerSideEvent(base, event);
93
+ }
94
+ return output;
95
+ }
96
+ const output = await handler(input, ctx);
97
+ return output;
98
+ }
99
+ export function projectForModel(tool, output, lexicon) {
100
+ if (tool.exposeToModel === false) {
101
+ return { finding: lexiconText('tool.completed_hidden', {}, lexicon) };
102
+ }
103
+ if (isAwaitingUserInput(output)) {
104
+ return {
105
+ finding: lexiconText('tool.awaiting_user', { kind: output.kind, prompt: output.prompt }, lexicon),
106
+ data: leanToolResultData(output),
107
+ };
108
+ }
109
+ const parts = isRecord(output) && 'parts' in output ? coerceToolResultParts(output.parts) : undefined;
110
+ const lean = leanToolResultData(output);
111
+ const summarized = isRecord(lean) && 'finding' in lean;
112
+ const { finding: summary, ...rest } = summarized ? lean : {};
113
+ const result = summarized
114
+ ? {
115
+ finding: String(summary),
116
+ ...(Object.keys(rest).length > 0 ? { data: rest } : {}),
117
+ }
118
+ : modelResultFromOutput(lean);
119
+ return { ...result, ...(parts ? { parts } : {}) };
120
+ }
121
+ function loadsT2(tool, ctx) {
122
+ return profileToolsSpec(ctx.profile)?.t2Loader === tool.name;
123
+ }
124
+ function applyT2LoaderPromotion(tools, tool, checkedData, ctx, snapshot) {
125
+ if (!loadsT2(tool, ctx)) {
126
+ return { ok: true, output: checkedData };
127
+ }
128
+ if (!snapshot) {
129
+ return {
130
+ ok: false,
131
+ failure: {
132
+ code: 'invalid_output',
133
+ kind: 'bad_response',
134
+ message: lexiconText('tool.t2_loader_needs_snapshot', { tool: tool.name }, ctx.profile.lexicon),
135
+ },
136
+ };
137
+ }
138
+ const loaded = extractLoadedIds(checkedData);
139
+ if (!loaded) {
140
+ return {
141
+ ok: false,
142
+ failure: {
143
+ code: 'invalid_output',
144
+ kind: 'bad_response',
145
+ message: lexiconText('tool.t2_loader_shape', { tool: tool.name }, ctx.profile.lexicon),
146
+ },
147
+ };
148
+ }
149
+ const { promoted, failure: promoteFailure } = promoteLoadedTools(tools, snapshot, loaded, ctx.profile);
150
+ if (promoteFailure) {
151
+ return { ok: false, failure: promoteFailure };
152
+ }
153
+ const finalOutput = { ...checkedData, loaded: promoted };
154
+ const rechecked = tool.output.safeParse(finalOutput);
155
+ if (!rechecked.success) {
156
+ return {
157
+ ok: false,
158
+ failure: {
159
+ code: 'invalid_output',
160
+ kind: 'bad_response',
161
+ message: lexiconText('tool.t2_loader_output_invalid', {}, ctx.profile.lexicon),
162
+ details: rechecked.error.flatten(),
163
+ },
164
+ };
165
+ }
166
+ return { ok: true, output: rechecked.data };
167
+ }
168
+ /** What a post-tool stage's deny or `mutate` settles the call with instead; `undefined` when it keeps the result. */
169
+ function* reviseAfterStages(post, guard, reproject) {
170
+ if (post.deny) {
171
+ const failure = {
172
+ code: post.deny.code,
173
+ kind: 'blocked',
174
+ message: post.deny.message,
175
+ };
176
+ return {
177
+ failure,
178
+ outputRaw: undefined,
179
+ modelResult: yield* guard.failure(failure),
180
+ awaiting: false,
181
+ };
182
+ }
183
+ if (!post.mutate || !reproject)
184
+ return undefined;
185
+ const next = reproject(plainToolInput(post.mutate.output));
186
+ if (!next.ok) {
187
+ return {
188
+ failure: next.failure,
189
+ outputRaw: undefined,
190
+ modelResult: yield* guard.failure(next.failure),
191
+ awaiting: false,
192
+ };
193
+ }
194
+ return {
195
+ outputRaw: next.outputRaw,
196
+ modelResult: yield* guard.result(next.modelResult),
197
+ awaiting: isAwaitingUserInput(next.outputRaw),
198
+ };
199
+ }
200
+ function completeEvent(base, settled) {
201
+ const { input, outputRaw, modelResult } = settled;
202
+ const activityPast = fillActivityLabel(settled.labels?.activityPast, {
203
+ input,
204
+ output: outputRaw,
205
+ });
206
+ return toolEvent(base, {
207
+ phase: 'complete',
208
+ output: outputRaw,
209
+ readBack: formatToolResult(modelResult),
210
+ ...(modelResult.parts?.length ? { parts: modelResult.parts } : {}),
211
+ ...(activityPast ? { activityPast } : {}),
212
+ });
213
+ }
214
+ /**
215
+ * The one settlement for every transport. `reproject` is absent when the kernel owns the
216
+ * output (the T2 loader), which makes a host `mutate` a warning instead of a replacement.
217
+ */
218
+ async function* settleToolCall(args) {
219
+ const { base, toolName, callId, input, stages, provisional, guard, reproject, sources } = args;
220
+ let modelResult = yield* 'failure' in provisional
221
+ ? guard.failure(provisional.failure)
222
+ : guard.result(provisional.modelResult);
223
+ let failure = 'failure' in provisional ? provisional.failure : undefined;
224
+ let outputRaw = 'outputRaw' in provisional ? provisional.outputRaw : undefined;
225
+ const callNotStarted = 'callNotStarted' in provisional ? provisional.callNotStarted : undefined;
226
+ let denied = 'denied' in provisional ? provisional.denied : undefined;
227
+ let awaiting = !failure && isAwaitingUserInput(outputRaw);
228
+ let post;
229
+ if (stages) {
230
+ post = yield* runPostToolStages({
231
+ stages,
232
+ toolName,
233
+ callId,
234
+ input,
235
+ callNotStarted,
236
+ outputRaw,
237
+ outputModel: modelResult,
238
+ failure,
239
+ awaiting: awaiting || undefined,
240
+ mutable: !failure && reproject !== undefined,
241
+ });
242
+ const revised = yield* reviseAfterStages(post, guard, reproject);
243
+ if (revised) {
244
+ ({ failure, outputRaw, modelResult, awaiting } = revised);
245
+ if (post.deny)
246
+ denied = true;
247
+ }
248
+ }
249
+ if (!failure && sources)
250
+ yield* sourceEvents(base, sources, outputRaw);
251
+ yield failure
252
+ ? failureEvent(base, failure, formatToolResult(modelResult))
253
+ : completeEvent(base, { input, outputRaw, modelResult, labels: args.labels });
254
+ return {
255
+ modelResult,
256
+ ...(failure ? { failure } : { outputRaw }),
257
+ ...(denied ? { denied } : {}),
258
+ ...(callNotStarted ? { callNotStarted: true } : {}),
259
+ ...(awaiting ? { awaiting: true } : {}),
260
+ ...(post?.abort !== undefined ? { aborted: post.abort } : {}),
261
+ ...(post?.inject.length ? { pendingInject: post.inject } : {}),
262
+ };
263
+ }
264
+ function settleToolFailure(guard, base, failure, stages, args) {
265
+ return settleToolCall({
266
+ base,
267
+ toolName: args.toolName,
268
+ callId: args.callId,
269
+ input: args.input,
270
+ stages,
271
+ guard,
272
+ provisional: {
273
+ failure,
274
+ ...(args.callNotStarted ? { callNotStarted: true } : {}),
275
+ ...(args.denied ? { denied: true } : {}),
276
+ },
277
+ });
278
+ }
279
+ function resultGuard(tool, ctx, snapshot, span) {
280
+ const provenance = provenanceFor(tool);
281
+ const policy = resolveGuardrailPolicy(ctx.profile.guardrails);
282
+ const callableTools = snapshot?.executable ?? [];
283
+ const inputs = { provenance, policy, callableTools, lexicon: ctx.profile.lexicon, span };
284
+ return {
285
+ result: (result) => guardResult(result, inputs),
286
+ failure: (failure) => guardFailure(failure, inputs),
287
+ };
288
+ }
289
+ async function* runFunctionPreBodyStages(args) {
290
+ const { tool, base, stages, guard } = args;
291
+ const pre = yield* runPreToolPipeline(args);
292
+ if (pre.ok)
293
+ return pre;
294
+ if (pre.kind === 'aborted') {
295
+ return { aborted: pre.aborted, callNotStarted: true };
296
+ }
297
+ if (pre.kind === 'gated') {
298
+ return { gated: pre.gate, callNotStarted: true };
299
+ }
300
+ return yield* settleToolFailure(guard, base, pre.failure, stages, {
301
+ toolName: tool.name,
302
+ callId: base.callId,
303
+ input: args.input,
304
+ callNotStarted: true,
305
+ ...(pre.denied ? { denied: true } : {}),
306
+ });
307
+ }
308
+ function makeReproject(parse, project, lexicon) {
309
+ return (output) => {
310
+ const checked = parse(output);
311
+ if (!checked.success) {
312
+ return {
313
+ ok: false,
314
+ failure: {
315
+ code: 'invalid_output',
316
+ kind: 'bad_response',
317
+ message: lexiconText('tool.output_invalid_after_mutate', {}, lexicon),
318
+ details: checked.error.flatten(),
319
+ },
320
+ };
321
+ }
322
+ return { ok: true, outputRaw: checked.data, modelResult: project(checked.data) };
323
+ };
324
+ }
325
+ /** Order as for remote tools: schema → permission → auth → preTool/host stages → body. */
326
+ async function* resolveFunctionSignIn(tool, ctx, base) {
327
+ if (!tool.auth)
328
+ return {};
329
+ const resolved = yield* resolveToolAuth(tool.name, tool.auth, ctx, base);
330
+ const outcome = outcomeFromUnauth(resolved);
331
+ if (outcome)
332
+ return { outcome };
333
+ return {
334
+ prepared: {
335
+ authHeaders: resolved.headers,
336
+ ...(resolved.audience ? { audience: resolved.audience } : {}),
337
+ },
338
+ ...(resolved.secret ? { secret: resolved.secret } : {}),
339
+ };
340
+ }
341
+ export async function* executeFunction(tools, tool, rawInput, ctx, base, snapshot, stages) {
342
+ const guard = resultGuard(tool, ctx, snapshot, stages?.span);
343
+ const callId = base.callId;
344
+ const parsed = yield* startToolExecution(tool, rawInput, ctx, base);
345
+ if (!parsed.ok) {
346
+ return yield* settleToolFailure(guard, base, {
347
+ code: 'invalid_input',
348
+ kind: 'bad_response',
349
+ message: lexiconText('tool.input_invalid', {}, ctx.profile.lexicon),
350
+ }, stages, { toolName: tool.name, callId, callNotStarted: true });
351
+ }
352
+ let input = parsed.data;
353
+ const permissionGate = checkPermission(tool.name, tool.permission, ctx.sessionPermissions, ctx.resume);
354
+ if (permissionGate) {
355
+ yield* emitGateSettlement({
356
+ base,
357
+ gate: permissionGate,
358
+ callId,
359
+ toolName: tool.name,
360
+ lexicon: ctx.profile.lexicon,
361
+ });
362
+ return { gated: permissionGate, callNotStarted: true };
363
+ }
364
+ throwIfAborted(ctx.signal);
365
+ const settleOutcome = (outcome) => settleBodyOutcome({
366
+ outcome,
367
+ tool,
368
+ base,
369
+ callId,
370
+ safeInput: input,
371
+ stages,
372
+ guard,
373
+ lexicon: ctx.profile.lexicon,
374
+ });
375
+ const signedIn = yield* resolveFunctionSignIn(tool, ctx, base);
376
+ if (signedIn.outcome)
377
+ return yield* settleOutcome(signedIn.outcome);
378
+ const preBody = yield* runFunctionPreBodyStages({ tool, input, ctx, base, stages, guard });
379
+ if (!('ok' in preBody)) {
380
+ return preBody;
381
+ }
382
+ input = preBody.input;
383
+ throwIfAborted(ctx.signal);
384
+ const { secret } = signedIn;
385
+ const fail = (failure) => settleToolFailure(guard, base, secret ? failureWithoutSecret(failure, secret) : failure, stages, { toolName: tool.name, callId, input });
386
+ const checks = requestChecks(stages?.span);
387
+ const handlerCtx = signedIn.prepared
388
+ ? { ...ctx, signedInFetch: signedInFetch(signedIn.prepared, ctx, checks) }
389
+ : ctx;
390
+ let output;
391
+ try {
392
+ output = yield* runHandler(tool.handler, input, handlerCtx, base);
393
+ checks.record();
394
+ }
395
+ catch (err) {
396
+ if (signedIn.prepared && err instanceof CredentialRefusedError) {
397
+ checks.record();
398
+ const refused = yield* refusedCredentialOutcome(tool, err.refusal, signedIn.prepared.authHeaders, ctx, base);
399
+ if (refused)
400
+ return yield* settleOutcome(refused);
401
+ }
402
+ if (signedIn.prepared && errorKind(err) === 'blocked') {
403
+ const blocked = networkBlockedEvent();
404
+ checks.record(blocked);
405
+ return yield* fail(yield* networkBlocked(err, blocked));
406
+ }
407
+ return yield* fail({ code: 'handler_error', kind: 'failed', message: messageOf(err) });
408
+ }
409
+ if (secret)
410
+ output = omitSecret(output, secret);
411
+ if (output === undefined) {
412
+ return yield* fail({
413
+ code: 'invalid_output',
414
+ kind: 'bad_response',
415
+ message: lexiconText('tool.handler_no_output', {}, ctx.profile.lexicon),
416
+ });
417
+ }
418
+ const checked = tool.output.safeParse(output);
419
+ if (!checked.success) {
420
+ return yield* fail({
421
+ code: 'invalid_output',
422
+ kind: 'bad_response',
423
+ message: lexiconText('tool.output_invalid', {}, ctx.profile.lexicon),
424
+ details: checked.error.flatten(),
425
+ });
426
+ }
427
+ const promoted = applyT2LoaderPromotion(tools, tool, checked.data, ctx, snapshot);
428
+ if (!promoted.ok) {
429
+ return yield* fail(promoted.failure);
430
+ }
431
+ // The T2 loader's output drives the snapshot, so the host may not mutate it.
432
+ const ownsOutput = loadsT2(tool, ctx);
433
+ return yield* settleToolCall({
434
+ base,
435
+ toolName: tool.name,
436
+ callId,
437
+ input,
438
+ stages,
439
+ guard,
440
+ provisional: {
441
+ outputRaw: promoted.output,
442
+ modelResult: projectForModel(tool, promoted.output, ctx.profile.lexicon),
443
+ },
444
+ sources: tool.sources,
445
+ labels: tool.labels,
446
+ ...(ownsOutput
447
+ ? {}
448
+ : {
449
+ reproject: makeReproject((v) => tool.output.safeParse(v), (data) => projectForModel(tool, data, ctx.profile.lexicon), ctx.profile.lexicon),
450
+ }),
451
+ });
452
+ }
453
+ export function notLoadedMessage(tool, lexicon) {
454
+ if (tool.loadTier === 'T1') {
455
+ return lexiconText('tool.not_wired_t1', { tool: tool.name }, lexicon);
456
+ }
457
+ if (tool.loadTier === 'T2') {
458
+ return lexiconText('tool.not_loaded_t2', { tool: tool.name }, lexicon);
459
+ }
460
+ return lexiconText('tool.not_visible', { tool: tool.name }, lexicon);
461
+ }
462
+ function earlyFailure(failure) {
463
+ return { failure, callNotStarted: true, modelResult: formatToolFailureForModel(failure) };
464
+ }
465
+ export async function* executeBuiltin(tool, ctx, base, snapshot) {
466
+ yield toolEvent(base, { phase: 'running' });
467
+ throwIfAborted(ctx.signal);
468
+ if (!snapshot.builtins.includes(tool.name)) {
469
+ const failure = {
470
+ code: 'not_loaded',
471
+ kind: 'request',
472
+ message: lexiconText('tool.builtin_not_enabled', { tool: tool.name }, ctx.profile.lexicon),
473
+ };
474
+ yield failureEvent(base, failure);
475
+ return earlyFailure(failure);
476
+ }
477
+ const failure = {
478
+ code: 'provider_native',
479
+ kind: 'request',
480
+ message: lexiconText('tool.provider_native', { tool: tool.name }, ctx.profile.lexicon),
481
+ };
482
+ yield failureEvent(base, failure);
483
+ return earlyFailure(failure);
484
+ }
485
+ function registeredEligibilityFailure(args) {
486
+ const { tool, profile, name, resume, snapshot } = args;
487
+ if (!profileToolAllow(profile).includes(name)) {
488
+ return {
489
+ code: 'not_allowed',
490
+ kind: 'blocked',
491
+ message: lexiconText('tool.not_allowed', { tool: name, profile: profile.id }, profile.lexicon),
492
+ };
493
+ }
494
+ if (!snapshot)
495
+ return undefined;
496
+ const continuing = isResumeContinuation(resume);
497
+ if (!continuing && !snapshot.gated.includes(name)) {
498
+ return {
499
+ code: 'not_gated',
500
+ kind: 'request',
501
+ message: lexiconText('tool.not_eligible', { tool: name }, profile.lexicon),
502
+ };
503
+ }
504
+ if (!snapshot.visible.includes(name)) {
505
+ const skipLoadCheck = continuing && tool.loadTier === 'T0';
506
+ if (!skipLoadCheck) {
507
+ return {
508
+ code: 'not_loaded',
509
+ kind: 'request',
510
+ message: notLoadedMessage(tool, profile.lexicon),
511
+ };
512
+ }
513
+ }
514
+ return undefined;
515
+ }
516
+ /** Settles an outcome the kernel reached without a handler's own result: a remote body, or a sign-in. */
517
+ async function* settleBodyOutcome(args) {
518
+ const { outcome, tool, base, callId, safeInput, stages, guard, lexicon } = args;
519
+ const name = tool.name;
520
+ if (outcome.kind === 'gated') {
521
+ if (outcome.gate.kind === 'confirmation') {
522
+ return { gated: outcome.gate, callNotStarted: true };
523
+ }
524
+ const gateReadBack = yield* emitGateSettlement({
525
+ base,
526
+ gate: outcome.gate,
527
+ callId,
528
+ toolName: name,
529
+ lexicon,
530
+ });
531
+ return { gated: outcome.gate, callNotStarted: true, ...(gateReadBack ? { gateReadBack } : {}) };
532
+ }
533
+ if (outcome.kind === 'aborted') {
534
+ return { aborted: outcome.aborted, callNotStarted: true };
535
+ }
536
+ if (outcome.kind === 'failed') {
537
+ return yield* settleToolFailure(guard, base, outcome.failure, stages, {
538
+ toolName: name,
539
+ callId,
540
+ input: safeInput,
541
+ callNotStarted: outcome.callNotStarted,
542
+ ...(outcome.denied ? { denied: true } : {}),
543
+ });
544
+ }
545
+ return yield* settleToolCall({
546
+ base,
547
+ toolName: name,
548
+ callId,
549
+ input: safeInput,
550
+ stages,
551
+ guard,
552
+ provisional: { outputRaw: outcome.outputRaw, modelResult: outcome.modelResult },
553
+ sources: tool.sources,
554
+ labels: tool.labels,
555
+ reproject: makeReproject((v) => parseToolOutput(tool.output, v),
556
+ // A hook's edit replaces the value; the media the tool returned stays.
557
+ (data) => withMedia(modelResultFromOutput(data), outcome.modelResult.parts), lexicon),
558
+ });
559
+ }
560
+ function turnReadBack({ modelResult }) {
561
+ return modelResult
562
+ ? { text: formatToolResult(modelResult), parts: modelResult.parts }
563
+ : undefined;
564
+ }
565
+ /** The service a refused sign-in names, from the tool's own auth config. */
566
+ function refusedSignInService(tool, resume) {
567
+ if (!resume?.signIn || tool.type === 'builtin')
568
+ return undefined;
569
+ return tool.auth?.service;
570
+ }
571
+ /**
572
+ * A gate nobody answered: a sign-in for `expiredService` whose link expired, or any other gate
573
+ * left behind. Both settle as `cancelled`.
574
+ */
575
+ export function lapsedGateFailure(toolName, expiredService, lexicon) {
576
+ if (expiredService) {
577
+ return {
578
+ code: 'expired',
579
+ kind: 'cancelled',
580
+ message: lexiconText('sign_in.expired', { service: expiredService }, lexicon),
581
+ };
582
+ }
583
+ return {
584
+ code: 'cancelled',
585
+ kind: 'cancelled',
586
+ message: lexiconText('session.abandon_gated', { tool: toolName }, lexicon),
587
+ };
588
+ }
589
+ /** `abandoned` and `expired` settle as `cancelled`. */
590
+ function refusalFailure(tool, resume, lexicon) {
591
+ const service = refusedSignInService(tool, resume);
592
+ const cause = resume?.cause ?? 'declined';
593
+ if (cause === 'declined') {
594
+ return {
595
+ code: 'denied',
596
+ kind: 'declined',
597
+ message: service
598
+ ? lexiconText('sign_in.declined', { service }, lexicon)
599
+ : lexiconText('session.tool_denied', { tool: tool.name }, lexicon),
600
+ };
601
+ }
602
+ return lapsedGateFailure(tool.name, cause === 'expired' ? service : undefined, lexicon);
603
+ }
604
+ function resumeApproval(resume) {
605
+ if (isGateResumeGranted(resume))
606
+ return true;
607
+ if (isGateResumeDenied(resume))
608
+ return false;
609
+ return undefined;
610
+ }
611
+ function toolCallEnd(settlement, readBack) {
612
+ const { failure } = settlement;
613
+ const result = readBack(settlement);
614
+ const outcome = settlement.gated
615
+ ? 'gated'
616
+ : settlement.aborted !== undefined && settlement.callNotStarted
617
+ ? 'cancelled'
618
+ : settlement.denied
619
+ ? 'denied'
620
+ : failure
621
+ ? 'error'
622
+ : settlement.awaiting
623
+ ? 'paused'
624
+ : 'ok';
625
+ return {
626
+ outcome,
627
+ ...(result ? { result } : {}),
628
+ ...(!failure && 'outputRaw' in settlement ? { data: { value: settlement.outputRaw } } : {}),
629
+ ...(failure ? { failure } : {}),
630
+ };
631
+ }
632
+ export async function* executeRegisteredTool(args) {
633
+ const tool = args.tools.get(args.name);
634
+ if (!args.openSpan) {
635
+ return yield* runRegisteredTool(args, tool);
636
+ }
637
+ const trace = startToolTrace(args.openSpan, {
638
+ name: args.name,
639
+ callId: args.callId,
640
+ call: { arguments: toolCallArguments(plainToolInput(args.input)) },
641
+ origin: tool ? originOfTool(tool.type) : undefined,
642
+ permission: tool && 'permission' in tool ? tool.permission : undefined,
643
+ approved: resumeApproval(args.ctx.resume),
644
+ step: args.ctx.turn?.step,
645
+ });
646
+ const exec = runRegisteredTool({
647
+ ...args,
648
+ ctx: { ...args.ctx, traceparent: trace.span.traceparent() },
649
+ ...(args.stages ? { stages: { ...args.stages, span: trace.span } } : {}),
650
+ }, tool);
651
+ try {
652
+ for (;;) {
653
+ const next = await exec.next();
654
+ if (next.done) {
655
+ trace.end(toolCallEnd(next.value, args.readBack ?? turnReadBack));
656
+ return next.value;
657
+ }
658
+ trace.observe(next.value);
659
+ yield next.value;
660
+ }
661
+ }
662
+ catch (err) {
663
+ trace.end(isAbortError(err) ? { outcome: 'cancelled' } : { outcome: 'error', thrown: err });
664
+ throw err;
665
+ }
666
+ finally {
667
+ // The host stopped reading mid-call.
668
+ if (!trace.span.ended) {
669
+ trace.end({ outcome: 'cancelled' });
670
+ await exec.return({});
671
+ }
672
+ }
673
+ }
674
+ async function* runRegisteredTool(args, tool) {
675
+ const { profile, name, input, callId, ctx, snapshot, stages } = args;
676
+ const safeInput = plainToolInput(input);
677
+ const base = { name, callId };
678
+ if (!tool) {
679
+ const failure = {
680
+ code: 'unknown_tool',
681
+ kind: 'request',
682
+ message: lexiconText('tool.not_registered', { tool: name }, profile.lexicon),
683
+ };
684
+ yield failureEvent(base, failure);
685
+ return earlyFailure(failure);
686
+ }
687
+ if (tool.type === 'builtin') {
688
+ if (!snapshot) {
689
+ const failure = {
690
+ code: 'provider_native',
691
+ kind: 'request',
692
+ message: lexiconText('tool.builtin_needs_snapshot', { tool: name }, profile.lexicon),
693
+ };
694
+ yield failureEvent(base, failure);
695
+ return earlyFailure(failure);
696
+ }
697
+ const fullCtx = { ...ctx, callId, profile };
698
+ return yield* executeBuiltin(tool, fullCtx, base, snapshot);
699
+ }
700
+ const eligibility = registeredEligibilityFailure({
701
+ tool,
702
+ profile,
703
+ name,
704
+ resume: ctx.resume,
705
+ snapshot,
706
+ });
707
+ if (eligibility) {
708
+ yield failureEvent(base, eligibility);
709
+ return earlyFailure(eligibility);
710
+ }
711
+ if (isGateResumeDenied(ctx.resume)) {
712
+ return yield* settleToolFailure(resultGuard(tool, { ...ctx, callId, profile }, snapshot, stages?.span), base, refusalFailure(tool, ctx.resume, profile.lexicon), stages, { toolName: name, callId, input: safeInput, callNotStarted: true, denied: true });
713
+ }
714
+ const fullCtx = { ...ctx, callId, profile };
715
+ const policy = resolveGuardrailPolicy(profile.guardrails);
716
+ const provenance = provenanceFor(tool);
717
+ const argsStart = performance.now();
718
+ const argEvent = toolCallEvent(inspectToolArguments(safeInput, policy), provenance);
719
+ recordToolCheck(stages?.span, 'tool_arguments', performance.now() - argsStart, argEvent);
720
+ if (argEvent) {
721
+ yield { type: 'guardrail', guardrail: argEvent };
722
+ }
723
+ const taintStart = performance.now();
724
+ const taintVerdict = checkTaintGate(ctx.turn?.taint, tool.access, policy, profile.lexicon);
725
+ const taintEvent = toolCallEvent(taintVerdict, provenance);
726
+ recordToolCheck(stages?.span, 'taint', performance.now() - taintStart, taintEvent);
727
+ if (taintEvent) {
728
+ yield { type: 'guardrail', guardrail: taintEvent };
729
+ }
730
+ if (taintVerdict.action === 'block') {
731
+ const failure = {
732
+ code: 'tainted_turn',
733
+ kind: 'blocked',
734
+ message: taintVerdict.rejection,
735
+ };
736
+ yield failureEvent(base, failure);
737
+ return { ...earlyFailure(failure), denied: true };
738
+ }
739
+ return yield* settleByType(args.tools, tool, safeInput, fullCtx, base, snapshot, stages);
740
+ }
741
+ async function* settleByType(tools, tool, safeInput, fullCtx, base, snapshot, stages) {
742
+ const { name } = tool;
743
+ if (tool.type === 'function') {
744
+ return yield* executeFunction(tools, tool, safeInput, fullCtx, base, snapshot, stages);
745
+ }
746
+ if (tool.type !== 'http' && tool.type !== 'mcp') {
747
+ return earlyFailure({
748
+ code: 'unknown_tool',
749
+ kind: 'request',
750
+ message: lexiconText('tool.unsupported_type', { tool: name }, fullCtx.profile.lexicon),
751
+ });
752
+ }
753
+ const remoteOutcome = tool.type === 'http'
754
+ ? yield* executeHttpTool(tool, safeInput, fullCtx, base, stages)
755
+ : yield* executeMcpTool(tool, safeInput, fullCtx, base, stages, tools.mcpSessions);
756
+ return yield* settleBodyOutcome({
757
+ outcome: remoteOutcome,
758
+ tool,
759
+ base,
760
+ callId: base.callId,
761
+ safeInput,
762
+ stages,
763
+ guard: resultGuard(tool, fullCtx, snapshot, stages?.span),
764
+ lexicon: fullCtx.profile.lexicon,
765
+ });
766
+ }
767
+ /**
768
+ * A failure's message is redacted under full detection, whatever the profile
769
+ * enables: the kernel frames it for the model as a system report, and a remote
770
+ * server writes its own error strings. What it changed is a decision like any
771
+ * other, reported and timed; the framed message is then guarded as a result.
772
+ */
773
+ function* guardFailure(failure, guard) {
774
+ const start = performance.now();
775
+ const checked = guardToolFailureText(failure.message, guard.provenance, {
776
+ ...guard.policy,
777
+ sanitizeInput: true,
778
+ redactSensitive: resolveSensitive(true),
779
+ });
780
+ recordToolCheck(guard.span, 'tool_failure', performance.now() - start, checked.event);
781
+ if (checked.event) {
782
+ yield { type: 'guardrail', guardrail: checked.event };
783
+ }
784
+ return yield* guardResult(formatToolFailureForModel({ ...failure, message: checked.text }), guard);
785
+ }
786
+ function* guardResult(result, guard) {
787
+ const { provenance, span } = guard;
788
+ const start = performance.now();
789
+ const guarded = guardToolResult(result.finding, result.data, provenance, guard.policy, guard.callableTools, guard.lexicon);
790
+ recordToolCheck(span, 'tool_result', performance.now() - start, guarded.event);
791
+ if (guarded.event) {
792
+ yield { type: 'guardrail', guardrail: guarded.event };
793
+ }
794
+ return {
795
+ ...result,
796
+ modelText: guarded.text,
797
+ provenance,
798
+ ...(guarded.suspicious ? { suspicious: guarded.suspicious } : {}),
799
+ };
800
+ }
801
+ export { startToolExecution };