@theoremjs/agents 0.3.0 → 0.3.2

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 (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  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 +25 -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 +881 -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 +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  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 +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  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 +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  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 +8 -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 +174 -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 +329 -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 +130 -88
  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 +102 -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/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. 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,203 @@ 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
+ 'busy',
139
+ 'unavailable',
140
+ 'bad_response',
141
+ 'network',
142
+ 'timeout',
143
+ 'rate_limit',
144
+ ]);
145
+ /**
146
+ * The re-send a finished call is due, if any.
147
+ *
148
+ * A failure the same call would meet again is not sent again (`PASSING_ERROR_KINDS`).
149
+ *
150
+ * why: A failed call that gave no reply and no tool call left nothing behind, so sending it again repeats
151
+ * nothing. A reply cut at `length` is not a failure: the same call would be cut at the same place.
152
+ */
153
+ function resumeOf(mayResume, profile, tally) {
154
+ const { stop } = tally;
155
+ if (!mayResume || tally.replied || tally.calls.length > 0 || !stop)
156
+ return undefined;
157
+ if (!isFailedStopKind(stop.kind) || !resendsFailedCall(profile, stop))
158
+ return undefined;
159
+ const failure = tally.failures[0];
160
+ if (failure?.errorKind && !PASSING_ERROR_KINDS.has(failure.errorKind))
161
+ return undefined;
162
+ return { stop, failure };
163
+ }
164
+ /** Carries what the call's stream guards still hold into the turn's next call. */
165
+ function keepStreamCarry(state, control) {
166
+ state.canaryCarry = control.canaryCarry;
167
+ state.thoughtCarry = control.thoughtCarry;
168
+ if (control.promptLeaks) {
169
+ state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
170
+ }
171
+ }
172
+ async function* executeAutonomousStep(args, state, buffer = {
173
+ holdLate: false,
174
+ holdVisible: false,
175
+ }) {
176
+ const { profile, generation, system, provider, signal } = args;
177
+ const { usage, genForStep, request, call } = startProviderCall(generation, system, state, isAnswerOnlyStep(profile, generation, state.stepCount));
178
+ const tally = { calls: [], reasoning: [], failures: [], replied: false };
90
179
  const control = {
91
180
  withholdVisible: false,
92
181
  ...(state.canaryCarry ? { canaryCarry: state.canaryCarry } : {}),
93
182
  ...(state.thoughtCarry ? { thoughtCarry: state.thoughtCarry } : {}),
94
183
  };
184
+ const seen = {
185
+ profile: args.profile,
186
+ generation: genForStep,
187
+ privateSystem: system.private,
188
+ givenUrls: state.givenUrls,
189
+ canaryGiven: state.canaryGiven,
190
+ ...(state.ownTools ? { ownTools: state.ownTools } : {}),
191
+ };
192
+ const shown = new StructuredDrafts(seen);
95
193
  try {
96
194
  for await (const event of yieldProviderEvents({
97
- profile: args.profile,
98
- generation: genForStep,
195
+ ...seen,
99
196
  request,
100
- privateSystem: system.private,
101
197
  provider,
102
198
  call,
103
199
  signal,
104
200
  control,
105
- givenUrls: state.givenUrls,
201
+ tools: state.tools,
106
202
  })) {
107
- captureInteractionId(event, state);
108
- if (observeCallEvent(usage, event)) {
203
+ if (observeCallEvent(usage, event))
204
+ continue;
205
+ if (event.type === 'reasoning') {
206
+ const { type: _type, ...part } = event;
207
+ tally.reasoning.push(part);
109
208
  continue;
110
- }
111
- if (event.type === 'guardrail') {
112
- call.guardrail(event.guardrail);
113
- }
114
- if (event.type === 'structured') {
115
- latestStructured = event.structured;
116
209
  }
117
210
  if (event.type === 'done') {
118
- stop = event.stop;
211
+ state.providerState = event.providerState;
212
+ tally.stop = event.stop;
119
213
  state.lastStop = event.stop;
120
214
  continue;
121
215
  }
122
- if (event.type === 'tool' && holdModelCall(calls, event.tool)) {
216
+ if (event.type === 'tool_draft') {
217
+ // why: A preview of the call that follows, which owns the arguments: not the turn's record. It streams
218
+ // as the reply's text does, through its own gate, and like that text is held only when delivery is buffered.
219
+ if (!buffer.holdVisible)
220
+ yield event;
123
221
  continue;
124
222
  }
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;
223
+ if (tallyCallEvent(event, tally, call))
130
224
  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
- }
225
+ if (!releasesNow(event, control, state, buffer))
226
+ continue;
227
+ yield* shown.show(event);
140
228
  }
141
229
  }
142
230
  catch (err) {
143
- call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop, thrown: err });
231
+ call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop: tally.stop, thrown: err });
144
232
  throw err;
145
233
  }
146
- state.canaryCarry = control.canaryCarry;
147
- state.thoughtCarry = control.thoughtCarry;
148
- if (control.promptLeaks) {
149
- state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
234
+ yield* shown.end();
235
+ keepStreamCarry(state, control);
236
+ const resume = resumeOf(args.mayResume, profile, tally);
237
+ if (!resume) {
238
+ for (const failure of tally.failures) {
239
+ recordStepEvent(failure, state);
240
+ if (!buffer.holdLate)
241
+ yield failure;
242
+ }
150
243
  }
151
- const tokens = await callTokensEvent(usage, generation, state.mediaFamily);
152
- call.end({ tokens: tokens?.tokens, stop });
244
+ const tokens = await callTokensEvent(usage, generation);
245
+ call.end({ tokens: tokens?.tokens, stop: tally.stop });
153
246
  if (tokens) {
154
247
  recordStepEvent(tokens, state);
155
248
  yield tokens;
156
249
  }
157
- return { calls, latestStructured };
250
+ return {
251
+ calls: tally.calls,
252
+ reasoning: tally.reasoning,
253
+ latestStructured: tally.latestStructured,
254
+ ...(resume ? { resume } : {}),
255
+ };
256
+ }
257
+ /**
258
+ * One step of a text turn. A model call that fails (`provider_error`,
259
+ * `stream_incomplete`) on a kind the profile's own `turnBehaviour.resumption.autoContinue`
260
+ * lists, having given no reply and no tool call, is sent again in the same turn
261
+ * after a pause, up to `maxContinues` times a turn (once when the profile sets
262
+ * none). The turn's history, its step count, and what it has read stay as they were.
263
+ */
264
+ async function* executeResumedStep(args, state, buffer) {
265
+ const limit = profileTurnResumption(args.profile)?.maxContinues ?? 1;
266
+ for (;;) {
267
+ const mayResume = args.profile.type === 'text' && state.resumes < limit;
268
+ const outcome = yield* executeAutonomousStep({ ...args, mayResume }, state, buffer);
269
+ if (!outcome.resume)
270
+ return outcome;
271
+ state.resumes += 1;
272
+ const detail = outcome.resume.failure?.errorInternal ?? outcome.resume.failure?.error;
273
+ state.trace.root.event('theorem.step.resume', {
274
+ step: state.stepCount,
275
+ resume: state.resumes,
276
+ stop: outcome.resume.stop.kind,
277
+ ...(detail ? { error: detail } : {}),
278
+ });
279
+ state.lastStop = undefined;
280
+ await waitDefault(AUTO_CONTINUE_DELAY_MS, args.signal);
281
+ }
158
282
  }
159
283
  function toolResultMessage(call, result) {
160
284
  return {
@@ -170,41 +294,9 @@ function toolResultMessage(call, result) {
170
294
  * Providers read a step's calls together, then their results: Google rejects
171
295
  * a call replayed after an earlier call's result (probe 25/09/2026).
172
296
  */
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);
297
+ /** Record the approved read-back in portable history. */
298
+ function recordToolModelResult(state, call, modelResult) {
299
+ state.currentHistory.push(toolResultMessage(call, modelResult));
208
300
  }
209
301
  async function* forwardToolEvents(exec, state) {
210
302
  let next = await exec.next();
@@ -222,7 +314,7 @@ function toolSpanOpener(state) {
222
314
  * Settle a call the provider handed over already failed (malformed arguments,
223
315
  * no function name): nothing runs, and the model reads the failure back.
224
316
  */
225
- function recordProviderToolFailure(state, call, failure, chainOn) {
317
+ function recordProviderToolFailure(state, call, failure) {
226
318
  const event = failureEvent(call, failure);
227
319
  state.allEmittedEvents.push(event);
228
320
  const modelResult = formatToolFailureForModel(failure);
@@ -236,10 +328,10 @@ function recordProviderToolFailure(state, call, failure, chainOn) {
236
328
  result: { text: formatToolResult(modelResult) },
237
329
  failure,
238
330
  });
239
- recordToolModelResult(state, call, modelResult, chainOn);
331
+ recordToolModelResult(state, call, modelResult);
240
332
  return event;
241
333
  }
242
- function* applyToolSettlement(settlement, state, call, chainOn) {
334
+ function* applyToolSettlement(settlement, state, call) {
243
335
  if (settlement.aborted) {
244
336
  state.lastStop = stageAbortStop(settlement.aborted);
245
337
  return 'stop_cancelled';
@@ -249,10 +341,14 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
249
341
  }
250
342
  if (settlement.modelResult?.provenance) {
251
343
  state.taint = recordTaint(state.taint, settlement.modelResult.provenance, settlement.modelResult.suspicious);
344
+ addResultDestinations(state.destinations, settlement.modelResult, settlement.modelResult.provenance);
252
345
  }
253
346
  if (!settlement.modelResult)
254
347
  return 'continue';
255
- recordToolModelResult(state, call, settlement.modelResult, chainOn);
348
+ if (!settlement.failure && 'outputRaw' in settlement) {
349
+ state.toolResults.push({ tool: call.name, output: settlement.outputRaw });
350
+ }
351
+ recordToolModelResult(state, call, settlement.modelResult);
256
352
  if (settlement.pendingInject) {
257
353
  yield* applyStageInjects(state, 'post_tool', settlement.pendingInject, {
258
354
  callId: call.callId,
@@ -262,68 +358,125 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
262
358
  return 'continue';
263
359
  }
264
360
  /**
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.
361
+ * Run the model's calls. Each reaches the host as its raw call first, all of them before
362
+ * any runs; their phases then arrive as each tool gives them. With `tools.parallel` they
363
+ * run side by side; otherwise one at a time, in the order the model made them. A call
364
+ * whose `pre_tool` answers `waitFor` starts its body once those calls settle
365
+ * (`step-order.ts`). A call the provider handed over already failed does not run. A call
366
+ * reads the turn's taint, destinations, and visible tools as they stood when the step
367
+ * began: the model chose every call in the step before any of their results came back.
368
+ *
369
+ * Results are recorded in the order the model made the calls, each followed by its
370
+ * `post_tool` inject. A call that gates waits for its own approval while the others run.
371
+ * After the step, any gate stops the turn. A call a stage cancelled stops the turn too,
372
+ * once every result that did come back is recorded.
268
373
  */
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));
374
+ async function* handleModelCalls({ calls: upstreamCalls, reasoning }, generation, profile, state, system, { onStage, signal, credentials, resolveHost } = {}) {
375
+ if (upstreamCalls.length > 0) {
376
+ state.currentHistory.push(historyToolCalls(upstreamCalls.map((call, index) => (index === 0 ? { ...call, reasoning } : call))));
273
377
  }
274
- // One id for every call this model response made.
275
378
  const stepId = crypto.randomUUID();
276
- const announce = (call) => {
277
- const request = toolCallRequestEvent(call, call.arguments, {
278
- thoughtSignature: call.thoughtSignature,
379
+ const leakScope = {
380
+ canary: generation.canary,
381
+ canaryGiven: state.canaryGiven,
382
+ privateSystem: system.private,
383
+ };
384
+ const calls = upstreamCalls.map((call) => ({
385
+ ...call,
386
+ operationId: crypto.randomUUID(),
387
+ // why: The host and every `pre_tool` see the call as its tool gets it; a failed call never reaches a tool.
388
+ shown: call.failure
389
+ ? call.arguments
390
+ : shownToolArguments({
391
+ tools: state.tools,
392
+ profile,
393
+ name: call.name,
394
+ input: call.arguments,
395
+ scope: leakScope,
396
+ }),
397
+ }));
398
+ for (const [index, call] of calls.entries()) {
399
+ const request = toolCallRequestEvent(call, call.shown, {
400
+ ...(index === 0 && reasoning.length ? { reasoning } : {}),
279
401
  stepId,
402
+ stepCallCount: calls.length,
280
403
  });
281
404
  state.allEmittedEvents.push(request);
282
- return request;
405
+ yield request;
406
+ }
407
+ const order = stepOrder(calls.map((call) => call.callId), profileToolsParallel(profile) === true, signal);
408
+ const stages = {
409
+ handlers: onStage ? [onStage] : [],
410
+ profile,
411
+ step: state.stepCount,
412
+ history: () => state.currentHistory,
413
+ injectAllowed: profileAllowsInject(profile),
414
+ injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
415
+ host: generation.host,
416
+ signal,
417
+ stepCalls: calls.map((call) => ({ callId: call.callId, tool: call.name, input: call.shown })),
418
+ wait: order.wait,
419
+ drafts: generation.stream !== false,
283
420
  };
284
- let gated = false;
421
+ const turn = {
422
+ step: state.stepCount,
423
+ taint: state.taint,
424
+ destinations: state.destinations,
425
+ visible: [...generation.tools.visible],
426
+ };
427
+ const execute = (call) => forwardToolEvents(executeRegisteredTool({
428
+ tools: state.tools,
429
+ execution: generation.execution,
430
+ invocation: {
431
+ model: generation.model,
432
+ input: generation.input,
433
+ history: generation.history,
434
+ },
435
+ ...(state.agents ? { agents: state.agents } : {}),
436
+ profile,
437
+ name: call.name,
438
+ input: call.arguments,
439
+ callId: call.callId,
440
+ ctx: {
441
+ operationId: call.operationId,
442
+ pageExecution: generation.pageExecution,
443
+ sessionPermissions: generation.sessionPermissions,
444
+ path: generation.tools.path,
445
+ turn,
446
+ credentials,
447
+ resolveHost,
448
+ host: generation.host,
449
+ resume: undefined,
450
+ signal,
451
+ },
452
+ snapshot: generation.tools,
453
+ stages,
454
+ scope: leakScope,
455
+ openSpan: toolSpanOpener(state),
456
+ }), state);
285
457
  for (const call of calls) {
286
- yield announce(call);
458
+ if (call.failure)
459
+ order.settle(call.callId);
460
+ }
461
+ const settlements = yield* runSideBySide(calls.map((call) => call.failure ? undefined : inStep(order, call.callId, () => execute(call))));
462
+ let gated = false;
463
+ let cancelled = false;
464
+ for (const [index, call] of calls.entries()) {
287
465
  if (call.failure) {
288
- yield recordProviderToolFailure(state, call, call.failure, chainOn);
466
+ yield recordProviderToolFailure(state, { ...call, activityFailed: failedActivity(call.name, profile.labels) }, call.failure);
289
467
  continue;
290
468
  }
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);
469
+ const settlement = settlements[index];
470
+ if (!settlement)
471
+ continue;
472
+ const outcome = yield* applyToolSettlement(settlement, state, call);
322
473
  if (outcome === 'stop_cancelled')
323
- return false;
474
+ cancelled = true;
324
475
  if (outcome === 'gated')
325
476
  gated = true;
326
477
  }
478
+ if (cancelled)
479
+ return false;
327
480
  if (gated) {
328
481
  state.lastStop = { kind: 'gate' };
329
482
  return false;
@@ -333,27 +486,34 @@ async function* handleModelCalls(calls, generation, profile, state, { onStage, s
333
486
  async function* executeAttempt(args) {
334
487
  const { profile, generation, system, provider, state } = args;
335
488
  let latestStructured;
336
- // Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
489
+ // why: Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
337
490
  // both hold non-visible events (structured) until the attempt gate, so a policy
338
491
  // 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
492
+ const validation = profileTurnOutputs(profile)?.validation;
493
+ const holdLate = validation !== undefined ||
494
+ replyIsJudged(resolveGuardrailPolicy(profile.guardrails), TURN_REPLY);
495
+ // why: Buffered delivery holds each attempt's text and media until it passes; streamed delivery shows them live.
496
+ const holdVisible = validation !== undefined && generation.stream === false;
497
+ // why: Ceiling is cumulative `state.stepCount` across before_end inject re-entries
342
498
  // within this attempt. Validation/egress repair resets stepCount at the start
343
499
  // of each attempt cycle.
344
500
  while (!isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
345
501
  throwIfAborted(args.safe.signal);
346
502
  state.stepCount++;
347
- // Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
503
+ // why: Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
348
504
  // outside this loop.
349
- const stepResult = yield* executeAutonomousStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate });
505
+ const stepResult = yield* executeResumedStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate, holdVisible });
350
506
  if (stepResult.latestStructured !== undefined) {
351
507
  latestStructured = stepResult.latestStructured;
352
508
  }
353
- const executed = yield* handleModelCalls(stepResult.calls, generation, profile, state, args.safe);
509
+ const executed = yield* handleModelCalls(stepResult, generation, profile, state, system, args.safe);
354
510
  if (!executed) {
355
511
  break;
356
512
  }
513
+ // why: The tools ran and no step is left to read them, so the turn has no answer.
514
+ if (isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
515
+ state.lastStop = { kind: 'step_limit' };
516
+ }
357
517
  }
358
518
  return { latestStructured };
359
519
  }