@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,28 @@
1
+ import { type InjectUnit, type StageApplyWarning, type StageCallBag, type StageContext, type StageHandler } from '../../stages.js';
2
+ import type { Profile, ResolvedGeneration, TurnEvent, TurnStage } from '../../types.js';
3
+ import type { StepExecutionState } from './state.js';
4
+ export interface ApplyTurnStageArgs extends StageCallBag {
5
+ profile: Profile;
6
+ generation: ResolvedGeneration;
7
+ state: StepExecutionState;
8
+ stage: StageContext['stage'];
9
+ step: number;
10
+ onStage?: StageHandler;
11
+ signal?: AbortSignal;
12
+ /** Another provider step would exceed maxSteps — reject inject. */
13
+ injectWouldExceedMaxSteps?: boolean;
14
+ host?: unknown;
15
+ }
16
+ export interface ApplyTurnStageResult {
17
+ abort?: boolean | {
18
+ reason?: string;
19
+ };
20
+ injectCount: number;
21
+ warnings: StageApplyWarning[];
22
+ }
23
+ /** Injects must arrive sanitized; they are mirrored into an active Interactions continuation too. */
24
+ export declare function applyStageInjects(state: StepExecutionState, stage: TurnStage, units: readonly InjectUnit[], extra?: {
25
+ callId?: string;
26
+ toolName?: string;
27
+ }): Generator<TurnEvent, number>;
28
+ export declare function applyTurnStage(args: ApplyTurnStageArgs): AsyncGenerator<TurnEvent, ApplyTurnStageResult>;
@@ -0,0 +1,48 @@
1
+ import { throwIfAborted } from '../../../guardrails/error.js';
2
+ import { injectedStageEvent, injectMessages, runStage, } from '../../stages.js';
3
+ import { profileAllowsInject } from '../../stop.js';
4
+ /** Injects must arrive sanitized; they are mirrored into an active Interactions continuation too. */
5
+ export function* applyStageInjects(state, stage, units, extra) {
6
+ const inject = injectMessages(units);
7
+ if (inject.length === 0)
8
+ return 0;
9
+ state.currentHistory.push(...inject);
10
+ if (state.interactionsContinuation) {
11
+ for (const msg of inject) {
12
+ if (msg.role === 'tool')
13
+ continue;
14
+ state.interactionsContinuation.messages.push(msg);
15
+ }
16
+ }
17
+ const landed = injectedStageEvent(stage, units, extra);
18
+ if (landed) {
19
+ state.allEmittedEvents.push(landed);
20
+ yield landed;
21
+ }
22
+ return inject.length;
23
+ }
24
+ export async function* applyTurnStage(args) {
25
+ const { profile, generation, state, onStage, host, ...call } = args;
26
+ throwIfAborted(call.signal);
27
+ const run = runStage({
28
+ ...call,
29
+ history: state.currentHistory,
30
+ handlers: onStage ? [onStage] : [],
31
+ guardrails: profile.guardrails,
32
+ injectAllowed: profileAllowsInject(profile),
33
+ host: host ?? generation.host,
34
+ span: state.trace.root,
35
+ });
36
+ let next = await run.next();
37
+ while (!next.done) {
38
+ state.allEmittedEvents.push(next.value);
39
+ yield next.value;
40
+ next = await run.next();
41
+ }
42
+ const out = next.value;
43
+ return {
44
+ abort: out.abort,
45
+ injectCount: yield* applyStageInjects(state, call.stage, out.inject),
46
+ warnings: out.warnings,
47
+ };
48
+ }
@@ -0,0 +1,76 @@
1
+ import { type GivenUrlSets } from '../../../guardrails/egress-urls.js';
2
+ import type { GuardrailHit, TurnTaint } from '../../../guardrails/types.js';
3
+ import type { SpanHandle } from '../../../observability/trace-span.js';
4
+ import type { ToolRegistry } from '../../tools/registry.js';
5
+ import type { InteractionPart, ModelBinding, Profile, ResolvedGeneration, TurnEvent, TurnHistoryMessage, TurnRequest, TurnStop } from '../../types.js';
6
+ import type { MediaTokenFamily } from '../token-estimate.js';
7
+ import type { CallUsage } from './usage.js';
8
+ interface TurnTraceState {
9
+ /** The turn's `invoke_agent` span; model calls and tools open under it. */
10
+ root: SpanHandle;
11
+ /** Validation / egress attempt the next model call belongs to (0-based). */
12
+ attempt: number;
13
+ calls: number;
14
+ binding: ModelBinding | undefined;
15
+ }
16
+ interface StepExecutionState {
17
+ /** The turn's scope's tools: calls and provider builtins are looked up here. */
18
+ tools: ToolRegistry;
19
+ trace: TurnTraceState;
20
+ currentHistory: TurnHistoryMessage[];
21
+ stepCount: number;
22
+ /** Media family of the turn's model binding, for estimating unreported usage. */
23
+ mediaFamily: MediaTokenFamily | undefined;
24
+ allEmittedEvents: TurnEvent[];
25
+ attemptEvents: TurnEvent[];
26
+ /**
27
+ * If the mid-stream window tripped but the final verdict on the whole text passes, nothing was
28
+ * streamed, so the attempt gate must release the buffered text rather than drop it.
29
+ */
30
+ withheldVisible?: boolean;
31
+ /** The canary opening the last provider call ended on, read in front of the next call's reply. */
32
+ canaryCarry?: string;
33
+ /** What the last provider call's thoughts ended on, read in front of the next call's thoughts. */
34
+ thoughtCarry?: string;
35
+ /** System-prompt leaks withheld under a host policy; they pin the end-of-attempt verdict to block. */
36
+ promptLeaks?: GuardrailHit[];
37
+ /** Untrusted content read so far, so a later tool call is judged against all the turn ingested. */
38
+ taint?: TurnTaint;
39
+ /** Every URL the model has been given this turn (`GuardrailContext.givenUrls`). */
40
+ givenUrls: GivenUrlSets;
41
+ /** Last provider stop from a discarded provider `done` event. */
42
+ lastStop?: TurnStop;
43
+ lastInteractionId?: string;
44
+ /** Tool results and stage injects pending for the next step's Interactions `continuation`. */
45
+ interactionsContinuation?: {
46
+ previousInteractionId: string;
47
+ messages: TurnHistoryMessage[];
48
+ };
49
+ /** Usage of the last model call; a continuation's prompt estimate extends it. */
50
+ lastCall?: CallUsage;
51
+ }
52
+ interface AttemptFlowState {
53
+ currentAttempt: number;
54
+ currentReq: TurnRequest;
55
+ currentGen: ResolvedGeneration;
56
+ }
57
+ declare function recordStepEvent(event: TurnEvent, state: StepExecutionState): void;
58
+ /** Append user parts to turn history as one user message (plain text stays a string). */
59
+ declare function appendUserInput(state: StepExecutionState, parts: readonly InteractionPart[]): void;
60
+ /**
61
+ * Step state for one turn. A text turn's history grows inside the turn (tool
62
+ * steps, stage injects, repair retries), so its opening input moves into turn
63
+ * history here and everything later lands after it; `generation.input` is then
64
+ * empty. Image and speech turns are one call that reads only the input, so
65
+ * theirs stays put.
66
+ */
67
+ declare function openTurnState(args: {
68
+ tools: ToolRegistry;
69
+ profile: Profile;
70
+ generation: ResolvedGeneration;
71
+ trace: TurnTraceState;
72
+ mediaFamily: MediaTokenFamily | undefined;
73
+ allEmittedEvents?: TurnEvent[];
74
+ }): StepExecutionState;
75
+ export type { AttemptFlowState, StepExecutionState, TurnTraceState };
76
+ export { appendUserInput, openTurnState, recordStepEvent };
@@ -0,0 +1,40 @@
1
+ import { givenUrlSets } from '../../../guardrails/egress-urls.js';
2
+ function recordStepEvent(event, state) {
3
+ state.allEmittedEvents.push(event);
4
+ state.attemptEvents.push(event);
5
+ }
6
+ /** Append user parts to turn history as one user message (plain text stays a string). */
7
+ function appendUserInput(state, parts) {
8
+ if (parts.length === 0)
9
+ return;
10
+ const textOnly = parts.every((p) => p.type === 'text');
11
+ state.currentHistory.push(textOnly
12
+ ? { role: 'user', content: parts.map((p) => (p.type === 'text' ? p.text : '')).join('') }
13
+ : { role: 'user', parts: [...parts] });
14
+ }
15
+ /**
16
+ * Step state for one turn. A text turn's history grows inside the turn (tool
17
+ * steps, stage injects, repair retries), so its opening input moves into turn
18
+ * history here and everything later lands after it; `generation.input` is then
19
+ * empty. Image and speech turns are one call that reads only the input, so
20
+ * theirs stays put.
21
+ */
22
+ function openTurnState(args) {
23
+ const { profile, generation } = args;
24
+ const state = {
25
+ tools: args.tools,
26
+ trace: args.trace,
27
+ currentHistory: [...(generation.history ?? [])],
28
+ stepCount: 0,
29
+ mediaFamily: args.mediaFamily,
30
+ allEmittedEvents: args.allEmittedEvents ?? [],
31
+ attemptEvents: [],
32
+ givenUrls: givenUrlSets(),
33
+ };
34
+ if (profile.type === 'text') {
35
+ appendUserInput(state, generation.input);
36
+ generation.input = [];
37
+ }
38
+ return state;
39
+ }
40
+ export { appendUserInput, openTurnState, recordStepEvent };
@@ -0,0 +1,14 @@
1
+ import type { BoundSystem } from '../../system-parts.js';
2
+ import type { ModelProvider, Profile, ResolvedGeneration, TurnEvent, TurnRequest } from '../../types.js';
3
+ import { type StepExecutionState } from './state.js';
4
+ declare function executeAttempt(args: {
5
+ safe: TurnRequest;
6
+ profile: Profile;
7
+ generation: ResolvedGeneration;
8
+ system: BoundSystem;
9
+ provider: ModelProvider;
10
+ state: StepExecutionState;
11
+ }): AsyncGenerator<TurnEvent, {
12
+ latestStructured?: unknown;
13
+ }>;
14
+ export { executeAttempt };
@@ -0,0 +1,360 @@
1
+ import { addRequestUrls } from '../../../guardrails/egress-urls.js';
2
+ import { isAbortError, throwIfAborted } from '../../../guardrails/error.js';
3
+ import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
4
+ import { recordTaint } from '../../../guardrails/tool-result.js';
5
+ import { profileTurnOutputs } from '../../registry/profile-outputs.js';
6
+ import { providerCompleteRequest } from '../../registry/provider-request.js';
7
+ import { injectWouldExceedMaxSteps } from '../../stages.js';
8
+ import { profileAllowsInject, stageAbortStop } from '../../stop.js';
9
+ import { failureEvent, toolCallRequestEvent } from '../../tools/events.js';
10
+ import { executeRegisteredTool } from '../../tools/execute.js';
11
+ import { formatToolFailureForModel, formatToolResult } from '../../tools/model-text.js';
12
+ import { findLast } from '../../util/find-last.js';
13
+ import { startToolTrace } from '../tool-trace.js';
14
+ import { startCallTrace } from '../turn-trace.js';
15
+ import { applyStageInjects } from './stages.js';
16
+ import { recordStepEvent } from './state.js';
17
+ import { isWithheldOnBlock, yieldProviderEvents } from './stream.js';
18
+ import { callTokensEvent, observeCallEvent, startCallUsage } from './usage.js';
19
+ function isStepLimitReached(step, maxSteps) {
20
+ if (maxSteps === undefined || maxSteps <= 0) {
21
+ return false;
22
+ }
23
+ return step >= maxSteps;
24
+ }
25
+ function generationForProviderStep(generation, state) {
26
+ if (state.interactionsContinuation) {
27
+ const { previousInteractionId, messages } = state.interactionsContinuation;
28
+ state.interactionsContinuation = undefined;
29
+ return {
30
+ ...generation,
31
+ history: [],
32
+ input: [],
33
+ previousInteractionId,
34
+ continuation: [...messages],
35
+ };
36
+ }
37
+ return { ...generation, history: state.currentHistory };
38
+ }
39
+ function captureInteractionId(event, state) {
40
+ if ((event.type === 'tokens' || event.type === 'done') && event.interactionId) {
41
+ state.lastInteractionId = event.interactionId;
42
+ }
43
+ }
44
+ /**
45
+ * Hold the model's calls until its stream ends: a raw call, and a provider's
46
+ * failure for a call it already sent. Returns false for any other tool event.
47
+ */
48
+ function holdModelCall(calls, tool) {
49
+ if (tool.phase === undefined) {
50
+ calls.push({
51
+ name: tool.name,
52
+ callId: tool.callId,
53
+ arguments: tool.arguments,
54
+ ...(tool.thoughtSignature ? { thoughtSignature: tool.thoughtSignature } : {}),
55
+ });
56
+ return true;
57
+ }
58
+ const call = findLast(calls, (held) => held.callId === tool.callId);
59
+ if (tool.phase !== 'error' || !call)
60
+ return false;
61
+ call.failure = tool.failure;
62
+ return true;
63
+ }
64
+ async function* executeAutonomousStep(args, state, buffer = {
65
+ holdLate: false,
66
+ }) {
67
+ const { generation, system, provider, signal } = args;
68
+ const continuation = state.interactionsContinuation;
69
+ const usage = startCallUsage(system.text, continuation && state.lastCall
70
+ ? { previous: state.lastCall, continuation: continuation.messages }
71
+ : { history: state.currentHistory, input: generation.input });
72
+ state.lastCall = usage;
73
+ const genForStep = generationForProviderStep(generation, state);
74
+ const request = providerCompleteRequest(state.tools, genForStep, system.text);
75
+ addRequestUrls(state.givenUrls, request);
76
+ state.trace.calls += 1;
77
+ const call = startCallTrace((name, options) => state.trace.root.child(name, options), {
78
+ req: request,
79
+ usage,
80
+ binding: state.trace.binding,
81
+ transport: genForStep.transport,
82
+ step: state.stepCount,
83
+ attempt: state.trace.attempt,
84
+ });
85
+ const calls = [];
86
+ let latestStructured;
87
+ // The stop this call ended with after gates: a canary block or provider
88
+ // error outranks what the provider reported.
89
+ let stop;
90
+ const control = {
91
+ withholdVisible: false,
92
+ ...(state.canaryCarry ? { canaryCarry: state.canaryCarry } : {}),
93
+ ...(state.thoughtCarry ? { thoughtCarry: state.thoughtCarry } : {}),
94
+ };
95
+ try {
96
+ for await (const event of yieldProviderEvents({
97
+ profile: args.profile,
98
+ generation: genForStep,
99
+ request,
100
+ privateSystem: system.private,
101
+ provider,
102
+ call,
103
+ signal,
104
+ control,
105
+ givenUrls: state.givenUrls,
106
+ })) {
107
+ captureInteractionId(event, state);
108
+ if (observeCallEvent(usage, event)) {
109
+ continue;
110
+ }
111
+ if (event.type === 'guardrail') {
112
+ call.guardrail(event.guardrail);
113
+ }
114
+ if (event.type === 'structured') {
115
+ latestStructured = event.structured;
116
+ }
117
+ if (event.type === 'done') {
118
+ stop = event.stop;
119
+ state.lastStop = event.stop;
120
+ continue;
121
+ }
122
+ if (event.type === 'tool' && holdModelCall(calls, event.tool)) {
123
+ continue;
124
+ }
125
+ recordStepEvent(event, state);
126
+ if (control.withholdVisible && isWithheldOnBlock(event)) {
127
+ // Progressive-yield blocked this attempt — keep events for egress/repair only.
128
+ // Record the decision so the attempt gate knows nothing reached the host.
129
+ state.withheldVisible = true;
130
+ continue;
131
+ }
132
+ // Text and media stream via progressive-yield under egress, thoughts
133
+ // stream unguarded; holdLate only buffers non-visible events (e.g.
134
+ // structured) for validation.
135
+ const isUserVisible = event.type === 'thought' || event.type === 'text' || event.type === 'media';
136
+ const streamNow = !buffer.holdLate || isUserVisible;
137
+ if (streamNow) {
138
+ yield event;
139
+ }
140
+ }
141
+ }
142
+ catch (err) {
143
+ call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop, thrown: err });
144
+ throw err;
145
+ }
146
+ state.canaryCarry = control.canaryCarry;
147
+ state.thoughtCarry = control.thoughtCarry;
148
+ if (control.promptLeaks) {
149
+ state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
150
+ }
151
+ const tokens = await callTokensEvent(usage, generation, state.mediaFamily);
152
+ call.end({ tokens: tokens?.tokens, stop });
153
+ if (tokens) {
154
+ recordStepEvent(tokens, state);
155
+ yield tokens;
156
+ }
157
+ return { calls, latestStructured };
158
+ }
159
+ function toolResultMessage(call, result) {
160
+ return {
161
+ role: 'tool',
162
+ tool_call_id: call.callId,
163
+ name: call.name,
164
+ content: formatToolResult(result),
165
+ ...(result.parts && result.parts.length > 0 ? { parts: result.parts } : {}),
166
+ };
167
+ }
168
+ /**
169
+ * One step's calls as one assistant message, the way the model made them.
170
+ * Providers read a step's calls together, then their results: Google rejects
171
+ * a call replayed after an earlier call's result (probe 25/09/2026).
172
+ */
173
+ function stepCallsMessage(calls) {
174
+ return {
175
+ role: 'assistant',
176
+ tool_calls: calls.map((call) => ({
177
+ id: call.callId,
178
+ type: 'function',
179
+ function: { name: call.name, arguments: JSON.stringify(call.arguments) },
180
+ ...(call.thoughtSignature ? { thoughtSignature: call.thoughtSignature } : {}),
181
+ })),
182
+ };
183
+ }
184
+ /**
185
+ * The stored interaction a step's results chain on, or `undefined` when they go
186
+ * in history: the turn does not chain, or no interaction id arrived to chain on.
187
+ */
188
+ function chainedInteractionId(generation, state) {
189
+ return generation.chains
190
+ ? (state.lastInteractionId ?? generation.previousInteractionId)
191
+ : undefined;
192
+ }
193
+ function queueInteractionsToolContinuation(state, message, previousInteractionId) {
194
+ if (state.interactionsContinuation?.previousInteractionId === previousInteractionId) {
195
+ state.interactionsContinuation.messages.push(message);
196
+ return;
197
+ }
198
+ state.interactionsContinuation = { previousInteractionId, messages: [message] };
199
+ }
200
+ /** A call's result: chained on the stored interaction, else after the step's calls in history. */
201
+ function recordToolModelResult(state, call, modelResult, chainOn) {
202
+ const message = toolResultMessage(call, modelResult);
203
+ if (chainOn) {
204
+ queueInteractionsToolContinuation(state, message, chainOn);
205
+ return;
206
+ }
207
+ state.currentHistory.push(message);
208
+ }
209
+ async function* forwardToolEvents(exec, state) {
210
+ let next = await exec.next();
211
+ while (!next.done) {
212
+ state.allEmittedEvents.push(next.value);
213
+ yield next.value;
214
+ next = await exec.next();
215
+ }
216
+ return next.value;
217
+ }
218
+ function toolSpanOpener(state) {
219
+ return (name, attributes) => state.trace.root.child(name, { attributes });
220
+ }
221
+ /**
222
+ * Settle a call the provider handed over already failed (malformed arguments,
223
+ * no function name): nothing runs, and the model reads the failure back.
224
+ */
225
+ function recordProviderToolFailure(state, call, failure, chainOn) {
226
+ const event = failureEvent(call, failure);
227
+ state.allEmittedEvents.push(event);
228
+ const modelResult = formatToolFailureForModel(failure);
229
+ startToolTrace(toolSpanOpener(state), {
230
+ name: call.name,
231
+ callId: call.callId,
232
+ call,
233
+ step: state.stepCount,
234
+ }).end({
235
+ outcome: 'error',
236
+ result: { text: formatToolResult(modelResult) },
237
+ failure,
238
+ });
239
+ recordToolModelResult(state, call, modelResult, chainOn);
240
+ return event;
241
+ }
242
+ function* applyToolSettlement(settlement, state, call, chainOn) {
243
+ if (settlement.aborted) {
244
+ state.lastStop = stageAbortStop(settlement.aborted);
245
+ return 'stop_cancelled';
246
+ }
247
+ if (settlement.gated) {
248
+ return 'gated';
249
+ }
250
+ if (settlement.modelResult?.provenance) {
251
+ state.taint = recordTaint(state.taint, settlement.modelResult.provenance, settlement.modelResult.suspicious);
252
+ }
253
+ if (!settlement.modelResult)
254
+ return 'continue';
255
+ recordToolModelResult(state, call, settlement.modelResult, chainOn);
256
+ if (settlement.pendingInject) {
257
+ yield* applyStageInjects(state, 'post_tool', settlement.pendingInject, {
258
+ callId: call.callId,
259
+ toolName: call.name,
260
+ });
261
+ }
262
+ return 'continue';
263
+ }
264
+ /**
265
+ * Run the model's calls in order. Each reaches the host as its raw call first,
266
+ * then its phases. A call that gates waits for its own approval; the step's
267
+ * other calls still run. After the step, any gate stops the turn.
268
+ */
269
+ async function* handleModelCalls(calls, generation, profile, state, { onStage, signal, credentials, resolveHost } = {}) {
270
+ const chainOn = chainedInteractionId(generation, state);
271
+ if (!chainOn && calls.length > 0) {
272
+ state.currentHistory.push(stepCallsMessage(calls));
273
+ }
274
+ // One id for every call this model response made.
275
+ const stepId = crypto.randomUUID();
276
+ const announce = (call) => {
277
+ const request = toolCallRequestEvent(call, call.arguments, {
278
+ thoughtSignature: call.thoughtSignature,
279
+ stepId,
280
+ });
281
+ state.allEmittedEvents.push(request);
282
+ return request;
283
+ };
284
+ let gated = false;
285
+ for (const call of calls) {
286
+ yield announce(call);
287
+ if (call.failure) {
288
+ yield recordProviderToolFailure(state, call, call.failure, chainOn);
289
+ continue;
290
+ }
291
+ const stages = {
292
+ handlers: onStage ? [onStage] : [],
293
+ profile,
294
+ step: state.stepCount,
295
+ history: () => state.currentHistory,
296
+ injectAllowed: profileAllowsInject(profile),
297
+ injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
298
+ host: generation.host,
299
+ signal,
300
+ };
301
+ const settlement = yield* forwardToolEvents(executeRegisteredTool({
302
+ tools: state.tools,
303
+ profile,
304
+ name: call.name,
305
+ input: call.arguments,
306
+ callId: call.callId,
307
+ ctx: {
308
+ sessionPermissions: generation.sessionPermissions,
309
+ path: generation.tools.path,
310
+ turn: { step: state.stepCount, taint: state.taint },
311
+ credentials,
312
+ resolveHost,
313
+ host: generation.host,
314
+ resume: undefined,
315
+ signal,
316
+ },
317
+ snapshot: generation.tools,
318
+ stages,
319
+ openSpan: toolSpanOpener(state),
320
+ }), state);
321
+ const outcome = yield* applyToolSettlement(settlement, state, call, chainOn);
322
+ if (outcome === 'stop_cancelled')
323
+ return false;
324
+ if (outcome === 'gated')
325
+ gated = true;
326
+ }
327
+ if (gated) {
328
+ state.lastStop = { kind: 'gate' };
329
+ return false;
330
+ }
331
+ return calls.length > 0;
332
+ }
333
+ async function* executeAttempt(args) {
334
+ const { profile, generation, system, provider, state } = args;
335
+ let latestStructured;
336
+ // Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
337
+ // both hold non-visible events (structured) until the attempt gate, so a policy
338
+ // sees the structured payload before any of it reaches the host.
339
+ const holdLate = Boolean(profileTurnOutputs(profile)?.validation ||
340
+ resolveGuardrailPolicy(profile.guardrails).egress?.enforce);
341
+ // Ceiling is cumulative `state.stepCount` across before_end inject re-entries
342
+ // within this attempt. Validation/egress repair resets stepCount at the start
343
+ // of each attempt cycle.
344
+ while (!isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
345
+ throwIfAborted(args.safe.signal);
346
+ state.stepCount++;
347
+ // Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
348
+ // outside this loop.
349
+ const stepResult = yield* executeAutonomousStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate });
350
+ if (stepResult.latestStructured !== undefined) {
351
+ latestStructured = stepResult.latestStructured;
352
+ }
353
+ const executed = yield* handleModelCalls(stepResult.calls, generation, profile, state, args.safe);
354
+ if (!executed) {
355
+ break;
356
+ }
357
+ }
358
+ return { latestStructured };
359
+ }
360
+ export { executeAttempt };
@@ -0,0 +1,40 @@
1
+ import type { GivenUrls } from '../../../guardrails/egress-urls.js';
2
+ import type { GuardrailHit } from '../../../guardrails/types.js';
3
+ import type { ModelProvider, Profile, ProviderCompleteRequest, ProviderEvent, ResolvedGeneration } from '../../types.js';
4
+ import type { CallTrace } from '../turn-trace.js';
5
+ /** What the stream yields to the step runner: every provider event but `response`, which only the trace reads. */
6
+ export type StreamEvent = Exclude<ProviderEvent, {
7
+ type: 'response';
8
+ }>;
9
+ interface OutboundStreamControl {
10
+ /** Stop releasing text/media to the host; keep recording for egress. */
11
+ withholdVisible: boolean;
12
+ /**
13
+ * The canary opening the turn's earlier steps ended on (`canaryCarry`): read
14
+ * in front of this call's reply, and replaced by where this call ends.
15
+ */
16
+ canaryCarry?: string;
17
+ /** System-prompt leak hits this call withheld under a host policy; they pin its verdict. */
18
+ promptLeaks?: GuardrailHit[];
19
+ /** What the turn's thoughts so far ended on (`ThoughtGuard.carryOut`): read in front of this call's, and replaced. */
20
+ thoughtCarry?: string;
21
+ }
22
+ declare function shouldSkipStreamEvent(event: ProviderEvent, profile: Profile): boolean;
23
+ /** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
24
+ declare function isWithheldOnBlock(event: ProviderEvent): boolean;
25
+ declare function yieldProviderEvents(args: {
26
+ profile: Profile;
27
+ generation: ResolvedGeneration;
28
+ request: ProviderCompleteRequest;
29
+ /** The private stretches of `request.system` (`BoundSystem.private`). */
30
+ privateSystem: readonly string[];
31
+ provider: ModelProvider;
32
+ /** This call's recorder: sees every tap row and every provider event before any gate. */
33
+ call: Pick<CallTrace, 'tap' | 'observe'> & Partial<Pick<CallTrace, 'guardTime'>>;
34
+ signal?: AbortSignal;
35
+ control?: OutboundStreamControl;
36
+ /** Every URL the model has been given this turn. */
37
+ givenUrls: GivenUrls;
38
+ }): AsyncGenerator<StreamEvent>;
39
+ export type { OutboundStreamControl };
40
+ export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };