@theoremjs/agents 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +23 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +874 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +7 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +173 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +328 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +128 -87
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,45 +1,44 @@
1
+ import { requestGivesCanary } from '../../../guardrails/canary.js';
2
+ import { addRequestDestinations, addResultDestinations } from '../../../guardrails/destinations.js';
3
+ import { TURN_REPLY } from '../../../guardrails/detect-reply.js';
1
4
  import { addRequestUrls } from '../../../guardrails/egress-urls.js';
2
5
  import { isAbortError, throwIfAborted } from '../../../guardrails/error.js';
3
6
  import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
7
+ import { replyIsJudged } from '../../../guardrails/progressive-yield.js';
4
8
  import { recordTaint } from '../../../guardrails/tool-result.js';
9
+ import { waitDefault } from '../../../providers/shared/retry.js';
10
+ import { historyToolCalls } from '../../interaction-parts.js';
5
11
  import { profileTurnOutputs } from '../../registry/profile-outputs.js';
6
12
  import { providerCompleteRequest } from '../../registry/provider-request.js';
7
13
  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';
14
+ import { AUTO_CONTINUE_DELAY_MS, isFailedStopKind, profileAllowsInject, profileTurnResumption, shouldAutoContinue, stageAbortStop, } from '../../stop.js';
15
+ import { failedActivity, failureEvent, toolCallRequestEvent, } from '../../tools/events.js';
16
+ import { executeRegisteredTool, shownToolArguments, } from '../../tools/execute.js';
11
17
  import { formatToolFailureForModel, formatToolResult } from '../../tools/model-text.js';
18
+ import { profileToolsParallel } from '../../tools/resolve.js';
12
19
  import { findLast } from '../../util/find-last.js';
13
20
  import { startToolTrace } from '../tool-trace.js';
14
21
  import { startCallTrace } from '../turn-trace.js';
15
22
  import { applyStageInjects } from './stages.js';
16
23
  import { recordStepEvent } from './state.js';
17
- import { isWithheldOnBlock, yieldProviderEvents } from './stream.js';
24
+ import { inStep, runSideBySide, stepOrder } from './step-order.js';
25
+ import { isWithheldOnBlock, StructuredDrafts, yieldProviderEvents, } from './stream.js';
18
26
  import { callTokensEvent, observeCallEvent, startCallUsage } from './usage.js';
19
27
  function isStepLimitReached(step, maxSteps) {
20
- if (maxSteps === undefined || maxSteps <= 0) {
21
- return false;
22
- }
23
- return step >= maxSteps;
28
+ return maxSteps > 0 && step >= maxSteps;
24
29
  }
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 };
30
+ /** The step's generation: the turn's history so far, and no tools when the step must answer. */
31
+ function generationForProviderStep(generation, state, answerOnly) {
32
+ const forStep = { ...generation, history: state.currentHistory };
33
+ if (!answerOnly)
34
+ return forStep;
35
+ return { ...forStep, builtins: [], tools: { ...generation.tools, wire: [] } };
38
36
  }
39
- function captureInteractionId(event, state) {
40
- if ((event.type === 'tokens' || event.type === 'done') && event.interactionId) {
41
- state.lastInteractionId = event.interactionId;
42
- }
37
+ /** True on the last step `maxSteps` allows, for a profile whose `atStepLimit` is `'answer'`. */
38
+ function isAnswerOnlyStep(profile, generation, step) {
39
+ return (profile.type === 'text' &&
40
+ profile.turnBehaviour?.atStepLimit === 'answer' &&
41
+ isStepLimitReached(step, generation.maxSteps ?? 0));
43
42
  }
44
43
  /**
45
44
  * Hold the model's calls until its stream ends: a raw call, and a provider's
@@ -51,7 +50,6 @@ function holdModelCall(calls, tool) {
51
50
  name: tool.name,
52
51
  callId: tool.callId,
53
52
  arguments: tool.arguments,
54
- ...(tool.thoughtSignature ? { thoughtSignature: tool.thoughtSignature } : {}),
55
53
  });
56
54
  return true;
57
55
  }
@@ -61,18 +59,20 @@ function holdModelCall(calls, tool) {
61
59
  call.failure = tool.failure;
62
60
  return true;
63
61
  }
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 });
62
+ /** The step's request, with what it gives the model noted on `state`, and its call's usage and trace. */
63
+ function startProviderCall(generation, system, state, answerOnly) {
64
+ const usage = startCallUsage(system.text, {
65
+ history: state.currentHistory,
66
+ input: generation.input,
67
+ });
72
68
  state.lastCall = usage;
73
- const genForStep = generationForProviderStep(generation, state);
69
+ const genForStep = generationForProviderStep(generation, state, answerOnly);
74
70
  const request = providerCompleteRequest(state.tools, genForStep, system.text);
75
71
  addRequestUrls(state.givenUrls, request);
72
+ addRequestDestinations(state.destinations, request, state.givenUrls.own);
73
+ if (generation.canary && !state.canaryGiven) {
74
+ state.canaryGiven = requestGivesCanary(request, generation.canary, state.canaryScanned);
75
+ }
76
76
  state.trace.calls += 1;
77
77
  const call = startCallTrace((name, options) => state.trace.root.child(name, options), {
78
78
  req: request,
@@ -82,79 +82,202 @@ async function* executeAutonomousStep(args, state, buffer = {
82
82
  step: state.stepCount,
83
83
  attempt: state.trace.attempt,
84
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;
85
+ return { usage, genForStep, request, call };
86
+ }
87
+ /**
88
+ * True when the profile itself lists the stop in `turnBehaviour.resumption.autoContinue`.
89
+ *
90
+ * why: `DEFAULT_AUTO_CONTINUE` advises a host; a turn spends another model call only where the profile says so.
91
+ */
92
+ function resendsFailedCall(profile, stop) {
93
+ const policy = profileTurnResumption(profile);
94
+ return policy?.autoContinue !== undefined && shouldAutoContinue(stop, policy);
95
+ }
96
+ /** The events that are a model call's reply, as opposed to its thoughts, usage, or failure. */
97
+ const REPLY_EVENTS = new Set([
98
+ 'text',
99
+ 'media',
100
+ 'structured',
101
+ 'citation',
102
+ ]);
103
+ /** Takes what an event says about the call itself. True when the event goes no further. */
104
+ function tallyCallEvent(event, tally, call) {
105
+ if (event.type === 'error') {
106
+ tally.failures.push(event);
107
+ return true;
108
+ }
109
+ if (event.type === 'tool')
110
+ return holdModelCall(tally.calls, event.tool);
111
+ if (event.type === 'guardrail')
112
+ call.guardrail(event.guardrail);
113
+ if (event.type === 'structured')
114
+ tally.latestStructured = event.structured;
115
+ if (REPLY_EVENTS.has(event.type))
116
+ tally.replied = true;
117
+ return false;
118
+ }
119
+ /** Records an event the call gave. True when the host gets it now. */
120
+ function releasesNow(event, control, state, buffer) {
121
+ recordStepEvent(event, state);
122
+ if (control.withholdVisible && isWithheldOnBlock(event)) {
123
+ // why: Progressive-yield blocked this attempt — keep events for egress/repair only.
124
+ // Record the decision so the attempt gate knows nothing reached the host.
125
+ state.withheldVisible = true;
126
+ return false;
127
+ }
128
+ if (event.type === 'text')
129
+ state.released += event.text;
130
+ // why: Text and media stream via progressive-yield under egress, thoughts
131
+ // stream unguarded; holdLate only buffers non-visible events (e.g.
132
+ // structured) for validation.
133
+ const isUserVisible = event.type === 'thought' || (!buffer.holdVisible && isWithheldOnBlock(event));
134
+ return !buffer.holdLate || isUserVisible;
135
+ }
136
+ // why: Every other kind is the provider's answer to the request itself (it refused a part, a key, a setting); the same call sent again gets the same answer.
137
+ const PASSING_ERROR_KINDS = new Set([
138
+ 'unavailable',
139
+ 'bad_response',
140
+ 'network',
141
+ 'timeout',
142
+ 'rate_limit',
143
+ ]);
144
+ /**
145
+ * The re-send a finished call is due, if any.
146
+ *
147
+ * A failure the same call would meet again is not sent again (`PASSING_ERROR_KINDS`).
148
+ *
149
+ * why: A failed call that gave no reply and no tool call left nothing behind, so sending it again repeats
150
+ * nothing. A reply cut at `length` is not a failure: the same call would be cut at the same place.
151
+ */
152
+ function resumeOf(mayResume, profile, tally) {
153
+ const { stop } = tally;
154
+ if (!mayResume || tally.replied || tally.calls.length > 0 || !stop)
155
+ return undefined;
156
+ if (!isFailedStopKind(stop.kind) || !resendsFailedCall(profile, stop))
157
+ return undefined;
158
+ const failure = tally.failures[0];
159
+ if (failure?.errorKind && !PASSING_ERROR_KINDS.has(failure.errorKind))
160
+ return undefined;
161
+ return { stop, failure };
162
+ }
163
+ /** Carries what the call's stream guards still hold into the turn's next call. */
164
+ function keepStreamCarry(state, control) {
165
+ state.canaryCarry = control.canaryCarry;
166
+ state.thoughtCarry = control.thoughtCarry;
167
+ if (control.promptLeaks) {
168
+ state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
169
+ }
170
+ }
171
+ async function* executeAutonomousStep(args, state, buffer = {
172
+ holdLate: false,
173
+ holdVisible: false,
174
+ }) {
175
+ const { profile, generation, system, provider, signal } = args;
176
+ const { usage, genForStep, request, call } = startProviderCall(generation, system, state, isAnswerOnlyStep(profile, generation, state.stepCount));
177
+ const tally = { calls: [], reasoning: [], failures: [], replied: false };
90
178
  const control = {
91
179
  withholdVisible: false,
92
180
  ...(state.canaryCarry ? { canaryCarry: state.canaryCarry } : {}),
93
181
  ...(state.thoughtCarry ? { thoughtCarry: state.thoughtCarry } : {}),
94
182
  };
183
+ const seen = {
184
+ profile: args.profile,
185
+ generation: genForStep,
186
+ privateSystem: system.private,
187
+ givenUrls: state.givenUrls,
188
+ canaryGiven: state.canaryGiven,
189
+ ...(state.ownTools ? { ownTools: state.ownTools } : {}),
190
+ };
191
+ const shown = new StructuredDrafts(seen);
95
192
  try {
96
193
  for await (const event of yieldProviderEvents({
97
- profile: args.profile,
98
- generation: genForStep,
194
+ ...seen,
99
195
  request,
100
- privateSystem: system.private,
101
196
  provider,
102
197
  call,
103
198
  signal,
104
199
  control,
105
- givenUrls: state.givenUrls,
200
+ tools: state.tools,
106
201
  })) {
107
- captureInteractionId(event, state);
108
- if (observeCallEvent(usage, event)) {
202
+ if (observeCallEvent(usage, event))
203
+ continue;
204
+ if (event.type === 'reasoning') {
205
+ const { type: _type, ...part } = event;
206
+ tally.reasoning.push(part);
109
207
  continue;
110
- }
111
- if (event.type === 'guardrail') {
112
- call.guardrail(event.guardrail);
113
- }
114
- if (event.type === 'structured') {
115
- latestStructured = event.structured;
116
208
  }
117
209
  if (event.type === 'done') {
118
- stop = event.stop;
210
+ state.providerState = event.providerState;
211
+ tally.stop = event.stop;
119
212
  state.lastStop = event.stop;
120
213
  continue;
121
214
  }
122
- if (event.type === 'tool' && holdModelCall(calls, event.tool)) {
215
+ if (event.type === 'tool_draft') {
216
+ // why: A preview of the call that follows, which owns the arguments: not the turn's record. It streams
217
+ // as the reply's text does, through its own gate, and like that text is held only when delivery is buffered.
218
+ if (!buffer.holdVisible)
219
+ yield event;
123
220
  continue;
124
221
  }
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;
222
+ if (tallyCallEvent(event, tally, call))
130
223
  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
- }
224
+ if (!releasesNow(event, control, state, buffer))
225
+ continue;
226
+ yield* shown.show(event);
140
227
  }
141
228
  }
142
229
  catch (err) {
143
- call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop, thrown: err });
230
+ call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop: tally.stop, thrown: err });
144
231
  throw err;
145
232
  }
146
- state.canaryCarry = control.canaryCarry;
147
- state.thoughtCarry = control.thoughtCarry;
148
- if (control.promptLeaks) {
149
- state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
233
+ yield* shown.end();
234
+ keepStreamCarry(state, control);
235
+ const resume = resumeOf(args.mayResume, profile, tally);
236
+ if (!resume) {
237
+ for (const failure of tally.failures) {
238
+ recordStepEvent(failure, state);
239
+ if (!buffer.holdLate)
240
+ yield failure;
241
+ }
150
242
  }
151
- const tokens = await callTokensEvent(usage, generation, state.mediaFamily);
152
- call.end({ tokens: tokens?.tokens, stop });
243
+ const tokens = await callTokensEvent(usage, generation);
244
+ call.end({ tokens: tokens?.tokens, stop: tally.stop });
153
245
  if (tokens) {
154
246
  recordStepEvent(tokens, state);
155
247
  yield tokens;
156
248
  }
157
- return { calls, latestStructured };
249
+ return {
250
+ calls: tally.calls,
251
+ reasoning: tally.reasoning,
252
+ latestStructured: tally.latestStructured,
253
+ ...(resume ? { resume } : {}),
254
+ };
255
+ }
256
+ /**
257
+ * One step of a text turn. A model call that fails (`provider_error`,
258
+ * `stream_incomplete`) on a kind the profile's own `turnBehaviour.resumption.autoContinue`
259
+ * lists, having given no reply and no tool call, is sent again in the same turn
260
+ * after a pause, up to `maxContinues` times a turn (once when the profile sets
261
+ * none). The turn's history, its step count, and what it has read stay as they were.
262
+ */
263
+ async function* executeResumedStep(args, state, buffer) {
264
+ const limit = profileTurnResumption(args.profile)?.maxContinues ?? 1;
265
+ for (;;) {
266
+ const mayResume = args.profile.type === 'text' && state.resumes < limit;
267
+ const outcome = yield* executeAutonomousStep({ ...args, mayResume }, state, buffer);
268
+ if (!outcome.resume)
269
+ return outcome;
270
+ state.resumes += 1;
271
+ const detail = outcome.resume.failure?.errorInternal ?? outcome.resume.failure?.error;
272
+ state.trace.root.event('theorem.step.resume', {
273
+ step: state.stepCount,
274
+ resume: state.resumes,
275
+ stop: outcome.resume.stop.kind,
276
+ ...(detail ? { error: detail } : {}),
277
+ });
278
+ state.lastStop = undefined;
279
+ await waitDefault(AUTO_CONTINUE_DELAY_MS, args.signal);
280
+ }
158
281
  }
159
282
  function toolResultMessage(call, result) {
160
283
  return {
@@ -170,41 +293,9 @@ function toolResultMessage(call, result) {
170
293
  * Providers read a step's calls together, then their results: Google rejects
171
294
  * a call replayed after an earlier call's result (probe 25/09/2026).
172
295
  */
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);
296
+ /** Record the approved read-back in portable history. */
297
+ function recordToolModelResult(state, call, modelResult) {
298
+ state.currentHistory.push(toolResultMessage(call, modelResult));
208
299
  }
209
300
  async function* forwardToolEvents(exec, state) {
210
301
  let next = await exec.next();
@@ -222,7 +313,7 @@ function toolSpanOpener(state) {
222
313
  * Settle a call the provider handed over already failed (malformed arguments,
223
314
  * no function name): nothing runs, and the model reads the failure back.
224
315
  */
225
- function recordProviderToolFailure(state, call, failure, chainOn) {
316
+ function recordProviderToolFailure(state, call, failure) {
226
317
  const event = failureEvent(call, failure);
227
318
  state.allEmittedEvents.push(event);
228
319
  const modelResult = formatToolFailureForModel(failure);
@@ -236,10 +327,10 @@ function recordProviderToolFailure(state, call, failure, chainOn) {
236
327
  result: { text: formatToolResult(modelResult) },
237
328
  failure,
238
329
  });
239
- recordToolModelResult(state, call, modelResult, chainOn);
330
+ recordToolModelResult(state, call, modelResult);
240
331
  return event;
241
332
  }
242
- function* applyToolSettlement(settlement, state, call, chainOn) {
333
+ function* applyToolSettlement(settlement, state, call) {
243
334
  if (settlement.aborted) {
244
335
  state.lastStop = stageAbortStop(settlement.aborted);
245
336
  return 'stop_cancelled';
@@ -249,10 +340,14 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
249
340
  }
250
341
  if (settlement.modelResult?.provenance) {
251
342
  state.taint = recordTaint(state.taint, settlement.modelResult.provenance, settlement.modelResult.suspicious);
343
+ addResultDestinations(state.destinations, settlement.modelResult, settlement.modelResult.provenance);
252
344
  }
253
345
  if (!settlement.modelResult)
254
346
  return 'continue';
255
- recordToolModelResult(state, call, settlement.modelResult, chainOn);
347
+ if (!settlement.failure && 'outputRaw' in settlement) {
348
+ state.toolResults.push({ tool: call.name, output: settlement.outputRaw });
349
+ }
350
+ recordToolModelResult(state, call, settlement.modelResult);
256
351
  if (settlement.pendingInject) {
257
352
  yield* applyStageInjects(state, 'post_tool', settlement.pendingInject, {
258
353
  callId: call.callId,
@@ -262,68 +357,125 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
262
357
  return 'continue';
263
358
  }
264
359
  /**
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.
360
+ * Run the model's calls. Each reaches the host as its raw call first, all of them before
361
+ * any runs; their phases then arrive as each tool gives them. With `tools.parallel` they
362
+ * run side by side; otherwise one at a time, in the order the model made them. A call
363
+ * whose `pre_tool` answers `waitFor` starts its body once those calls settle
364
+ * (`step-order.ts`). A call the provider handed over already failed does not run. A call
365
+ * reads the turn's taint, destinations, and visible tools as they stood when the step
366
+ * began: the model chose every call in the step before any of their results came back.
367
+ *
368
+ * Results are recorded in the order the model made the calls, each followed by its
369
+ * `post_tool` inject. A call that gates waits for its own approval while the others run.
370
+ * After the step, any gate stops the turn. A call a stage cancelled stops the turn too,
371
+ * once every result that did come back is recorded.
268
372
  */
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));
373
+ async function* handleModelCalls({ calls: upstreamCalls, reasoning }, generation, profile, state, system, { onStage, signal, credentials, resolveHost } = {}) {
374
+ if (upstreamCalls.length > 0) {
375
+ state.currentHistory.push(historyToolCalls(upstreamCalls.map((call, index) => (index === 0 ? { ...call, reasoning } : call))));
273
376
  }
274
- // One id for every call this model response made.
275
377
  const stepId = crypto.randomUUID();
276
- const announce = (call) => {
277
- const request = toolCallRequestEvent(call, call.arguments, {
278
- thoughtSignature: call.thoughtSignature,
378
+ const leakScope = {
379
+ canary: generation.canary,
380
+ canaryGiven: state.canaryGiven,
381
+ privateSystem: system.private,
382
+ };
383
+ const calls = upstreamCalls.map((call) => ({
384
+ ...call,
385
+ operationId: crypto.randomUUID(),
386
+ // why: The host and every `pre_tool` see the call as its tool gets it; a failed call never reaches a tool.
387
+ shown: call.failure
388
+ ? call.arguments
389
+ : shownToolArguments({
390
+ tools: state.tools,
391
+ profile,
392
+ name: call.name,
393
+ input: call.arguments,
394
+ scope: leakScope,
395
+ }),
396
+ }));
397
+ for (const [index, call] of calls.entries()) {
398
+ const request = toolCallRequestEvent(call, call.shown, {
399
+ ...(index === 0 && reasoning.length ? { reasoning } : {}),
279
400
  stepId,
401
+ stepCallCount: calls.length,
280
402
  });
281
403
  state.allEmittedEvents.push(request);
282
- return request;
404
+ yield request;
405
+ }
406
+ const order = stepOrder(calls.map((call) => call.callId), profileToolsParallel(profile) === true, signal);
407
+ const stages = {
408
+ handlers: onStage ? [onStage] : [],
409
+ profile,
410
+ step: state.stepCount,
411
+ history: () => state.currentHistory,
412
+ injectAllowed: profileAllowsInject(profile),
413
+ injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
414
+ host: generation.host,
415
+ signal,
416
+ stepCalls: calls.map((call) => ({ callId: call.callId, tool: call.name, input: call.shown })),
417
+ wait: order.wait,
418
+ drafts: generation.stream !== false,
283
419
  };
284
- let gated = false;
420
+ const turn = {
421
+ step: state.stepCount,
422
+ taint: state.taint,
423
+ destinations: state.destinations,
424
+ visible: [...generation.tools.visible],
425
+ };
426
+ const execute = (call) => forwardToolEvents(executeRegisteredTool({
427
+ tools: state.tools,
428
+ execution: generation.execution,
429
+ invocation: {
430
+ model: generation.model,
431
+ input: generation.input,
432
+ history: generation.history,
433
+ },
434
+ ...(state.agents ? { agents: state.agents } : {}),
435
+ profile,
436
+ name: call.name,
437
+ input: call.arguments,
438
+ callId: call.callId,
439
+ ctx: {
440
+ operationId: call.operationId,
441
+ pageExecution: generation.pageExecution,
442
+ sessionPermissions: generation.sessionPermissions,
443
+ path: generation.tools.path,
444
+ turn,
445
+ credentials,
446
+ resolveHost,
447
+ host: generation.host,
448
+ resume: undefined,
449
+ signal,
450
+ },
451
+ snapshot: generation.tools,
452
+ stages,
453
+ scope: leakScope,
454
+ openSpan: toolSpanOpener(state),
455
+ }), state);
285
456
  for (const call of calls) {
286
- yield announce(call);
457
+ if (call.failure)
458
+ order.settle(call.callId);
459
+ }
460
+ const settlements = yield* runSideBySide(calls.map((call) => call.failure ? undefined : inStep(order, call.callId, () => execute(call))));
461
+ let gated = false;
462
+ let cancelled = false;
463
+ for (const [index, call] of calls.entries()) {
287
464
  if (call.failure) {
288
- yield recordProviderToolFailure(state, call, call.failure, chainOn);
465
+ yield recordProviderToolFailure(state, { ...call, activityFailed: failedActivity(call.name, profile.labels) }, call.failure);
289
466
  continue;
290
467
  }
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);
468
+ const settlement = settlements[index];
469
+ if (!settlement)
470
+ continue;
471
+ const outcome = yield* applyToolSettlement(settlement, state, call);
322
472
  if (outcome === 'stop_cancelled')
323
- return false;
473
+ cancelled = true;
324
474
  if (outcome === 'gated')
325
475
  gated = true;
326
476
  }
477
+ if (cancelled)
478
+ return false;
327
479
  if (gated) {
328
480
  state.lastStop = { kind: 'gate' };
329
481
  return false;
@@ -333,27 +485,34 @@ async function* handleModelCalls(calls, generation, profile, state, { onStage, s
333
485
  async function* executeAttempt(args) {
334
486
  const { profile, generation, system, provider, state } = args;
335
487
  let latestStructured;
336
- // Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
488
+ // why: Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
337
489
  // both hold non-visible events (structured) until the attempt gate, so a policy
338
490
  // 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
491
+ const validation = profileTurnOutputs(profile)?.validation;
492
+ const holdLate = validation !== undefined ||
493
+ replyIsJudged(resolveGuardrailPolicy(profile.guardrails), TURN_REPLY);
494
+ // why: Buffered delivery holds each attempt's text and media until it passes; streamed delivery shows them live.
495
+ const holdVisible = validation !== undefined && generation.stream === false;
496
+ // why: Ceiling is cumulative `state.stepCount` across before_end inject re-entries
342
497
  // within this attempt. Validation/egress repair resets stepCount at the start
343
498
  // of each attempt cycle.
344
499
  while (!isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
345
500
  throwIfAborted(args.safe.signal);
346
501
  state.stepCount++;
347
- // Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
502
+ // why: Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
348
503
  // outside this loop.
349
- const stepResult = yield* executeAutonomousStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate });
504
+ const stepResult = yield* executeResumedStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate, holdVisible });
350
505
  if (stepResult.latestStructured !== undefined) {
351
506
  latestStructured = stepResult.latestStructured;
352
507
  }
353
- const executed = yield* handleModelCalls(stepResult.calls, generation, profile, state, args.safe);
508
+ const executed = yield* handleModelCalls(stepResult, generation, profile, state, system, args.safe);
354
509
  if (!executed) {
355
510
  break;
356
511
  }
512
+ // why: The tools ran and no step is left to read them, so the turn has no answer.
513
+ if (isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
514
+ state.lastStop = { kind: 'step_limit' };
515
+ }
357
516
  }
358
517
  return { latestStructured };
359
518
  }