@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,9 +1,11 @@
1
1
  import type { GivenUrls } from '../../../guardrails/egress-urls.js';
2
+ import type { OwnTools } from '../../../guardrails/tool-leak.js';
2
3
  import type { GuardrailHit } from '../../../guardrails/types.js';
3
- import type { ModelProvider, Profile, ProviderCompleteRequest, ProviderEvent, ResolvedGeneration } from '../../types.js';
4
+ import type { ToolRegistry } from '../../tools/registry.js';
5
+ import type { ModelEvent, ModelRequest, Profile, ResolvedGeneration, TurnEvent, TurnModel } from '../../types.js';
4
6
  import type { CallTrace } from '../turn-trace.js';
5
7
  /** What the stream yields to the step runner: every provider event but `response`, which only the trace reads. */
6
- export type StreamEvent = Exclude<ProviderEvent, {
8
+ export type StreamEvent = Exclude<ModelEvent, {
7
9
  type: 'response';
8
10
  }>;
9
11
  interface OutboundStreamControl {
@@ -19,22 +21,51 @@ interface OutboundStreamControl {
19
21
  /** What the turn's thoughts so far ended on (`ThoughtGuard.carryOut`): read in front of this call's, and replaced. */
20
22
  thoughtCarry?: string;
21
23
  }
22
- declare function shouldSkipStreamEvent(event: ProviderEvent, profile: Profile): boolean;
24
+ declare function shouldSkipStreamEvent(event: ModelEvent, profile: Profile): boolean;
23
25
  /** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
24
- declare function isWithheldOnBlock(event: ProviderEvent): boolean;
25
- declare function yieldProviderEvents(args: {
26
+ declare function isWithheldOnBlock(event: ModelEvent): boolean;
27
+ /**
28
+ * An event as the host gets it, or nothing. The text of a call that asked for structured output is
29
+ * that output's JSON: under `sse` it goes out as `structured_draft`, and under `buffered` not at all,
30
+ * since the `structured` event is the reply whole. The turn keeps it as text, which its checks,
31
+ * repairs and history read.
32
+ */
33
+ declare function shownToHost(event: TurnEvent, generation: Pick<ResolvedGeneration, 'structured' | 'stream'>): TurnEvent | undefined;
34
+ /**
35
+ * A step's events as the host gets them (`shownToHost`), with a structured reply's drafts read
36
+ * first at `reply_structured`, where the whole is read. The reply's text has already passed the
37
+ * `reply` gate; a match at `reply_structured` stops the drafts, and the `structured` event still
38
+ * arrives as that check leaves it. The held tail is read and released when the step's stream ends.
39
+ */
40
+ declare class StructuredDrafts {
41
+ private readonly drafts;
42
+ private readonly generation;
43
+ /** Reads the stream's own checks off what the step knows of the turn. */
44
+ constructor(seen: Pick<StreamArgs, 'profile' | 'generation' | 'privateSystem' | 'givenUrls' | 'canaryGiven' | 'ownTools'>);
45
+ show(event: TurnEvent): AsyncGenerator<TurnEvent>;
46
+ /** The drafts' tail the gate still holds, once the step's stream has ended. */
47
+ end(): Generator<TurnEvent>;
48
+ }
49
+ interface StreamArgs {
26
50
  profile: Profile;
27
51
  generation: ResolvedGeneration;
28
- request: ProviderCompleteRequest;
52
+ request: ModelRequest;
29
53
  /** The private stretches of `request.system` (`BoundSystem.private`). */
30
54
  privateSystem: readonly string[];
31
- provider: ModelProvider;
55
+ provider: TurnModel;
32
56
  /** This call's recorder: sees every tap row and every provider event before any gate. */
33
- call: Pick<CallTrace, 'tap' | 'observe'> & Partial<Pick<CallTrace, 'guardTime'>>;
57
+ call: Pick<CallTrace, 'tap' | 'observe'> & Partial<Pick<CallTrace, 'guardTime' | 'guardrail'>>;
34
58
  signal?: AbortSignal;
35
59
  control?: OutboundStreamControl;
36
60
  /** Every URL the model has been given this turn. */
37
61
  givenUrls: GivenUrls;
38
- }): AsyncGenerator<StreamEvent>;
39
- export type { OutboundStreamControl };
40
- export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };
62
+ /** Whether the model has been given the canary this turn. */
63
+ canaryGiven?: boolean;
64
+ /** The names of the profile's tools and of their parameters. */
65
+ ownTools?: OwnTools;
66
+ /** The turn's tools: a draft is read at the boundary its tool's calls are. */
67
+ tools: ToolRegistry;
68
+ }
69
+ declare function yieldProviderEvents(args: StreamArgs): AsyncGenerator<StreamEvent>;
70
+ export type { OutboundStreamControl, StreamArgs };
71
+ export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
@@ -1,20 +1,31 @@
1
1
  import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
2
- import { CANARY_HIT, eventPromptLeakHits, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
2
+ import { detectEvent, leakScopeOf } from '../../../guardrails/detect-at.js';
3
+ import { eventLeak, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
3
4
  import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
4
- import { guardrailFromHits } from '../../../guardrails/events.js';
5
+ import { guardrailFromHits, guardrailTurnEvent } from '../../../guardrails/events.js';
5
6
  import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
6
- import { createOutboundProgressiveGate, } from '../../../guardrails/progressive-yield.js';
7
+ import { createDraftGate, createOutboundProgressiveGate, DraftReader, } from '../../../guardrails/progressive-yield.js';
8
+ import { EGRESS_RULES } from '../../../guardrails/rules.js';
7
9
  import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
8
10
  import { profileTurnOutputs } from '../../registry/profile-outputs.js';
11
+ import { toolArgumentsBoundary } from '../../tools/execute.js';
9
12
  function shouldSkipStreamEvent(event, profile) {
10
13
  return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
11
14
  }
12
- /** The offending text never reaches the host: redaction cannot cover a partial or encoded token. */
13
- function* yieldCanaryLeak(hits = [CANARY_HIT]) {
14
- yield* yieldDeltaBlock(hits);
15
+ /**
16
+ * A leak in an event that is not the reply's text ends the turn there: the
17
+ * event never reaches the host, and it has no text to replace.
18
+ */
19
+ function* yieldLeakStop(hits) {
20
+ if (hits.some((hit) => hit.rule === EGRESS_RULES.providerToolLeak)) {
21
+ yield* yieldDeltaBlock(hits);
22
+ }
23
+ else {
24
+ yield* yieldDetected('reply', { action: 'block', hits });
25
+ }
15
26
  const reason = promptLeakReason(hits);
16
27
  yield toErrorEvent(new TheoremError('safety', reason));
17
- // The turn ends because our guardrail blocked the output, not because the model finished.
28
+ // why: The turn ends because our guardrail blocked the output, not because the model finished.
18
29
  const native = reason === WITHHELD_REASON.canary
19
30
  ? 'canary'
20
31
  : reason === WITHHELD_REASON.promptEcho
@@ -28,8 +39,17 @@ function* yieldDeltaBlock(hits) {
28
39
  yield guardrail;
29
40
  }
30
41
  }
31
- /** What the guard released, after the event saying what it omitted from it. */
32
- function* yieldThought({ text, hits }, event) {
42
+ /** What `guardrails.detect` found at `boundary` in text released as it streamed. */
43
+ function* yieldDetected(boundary, found) {
44
+ const event = found && detectEvent(boundary, found, undefined, STREAMED_STAGE[boundary]);
45
+ if (event)
46
+ yield guardrailTurnEvent(event);
47
+ }
48
+ /** The stage a boundary reports under while its text streams, where that is not its own. */
49
+ const STREAMED_STAGE = { reply: 'output_delta' };
50
+ /** What the guard released, after the events saying what was found in it and omitted from it. */
51
+ function* yieldThought({ text, hits, found }, event) {
52
+ yield* yieldDetected('thought', found);
33
53
  const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
34
54
  if (guardrail)
35
55
  yield guardrail;
@@ -48,11 +68,139 @@ function* flushThoughts(thoughts, control) {
48
68
  function isWithheldOnBlock(event) {
49
69
  return event.type === 'text' || event.type === 'media';
50
70
  }
51
- function canaryOnlyImmediateStop(policy) {
52
- return !policy.egress?.enforce;
71
+ /**
72
+ * An event as the host gets it, or nothing. The text of a call that asked for structured output is
73
+ * that output's JSON: under `sse` it goes out as `structured_draft`, and under `buffered` not at all,
74
+ * since the `structured` event is the reply whole. The turn keeps it as text, which its checks,
75
+ * repairs and history read.
76
+ */
77
+ function shownToHost(event, generation) {
78
+ if (!generation.structured || event.type !== 'text')
79
+ return event;
80
+ return generation.stream === false ? undefined : { type: 'structured_draft', text: event.text };
81
+ }
82
+ /**
83
+ * A step's events as the host gets them (`shownToHost`), with a structured reply's drafts read
84
+ * first at `reply_structured`, where the whole is read. The reply's text has already passed the
85
+ * `reply` gate; a match at `reply_structured` stops the drafts, and the `structured` event still
86
+ * arrives as that check leaves it. The held tail is read and released when the step's stream ends.
87
+ */
88
+ class StructuredDrafts {
89
+ drafts;
90
+ generation;
91
+ /** Reads the stream's own checks off what the step knows of the turn. */
92
+ constructor(seen) {
93
+ const policy = resolveGuardrailPolicy(seen.profile.guardrails);
94
+ const context = streamContext(seen, policy);
95
+ this.drafts = new DraftReader(() => createDraftGate(policy, context, 'reply_structured'));
96
+ this.generation = seen.generation;
97
+ }
98
+ async *show(event) {
99
+ const shown = shownToHost(event, this.generation);
100
+ if (shown?.type !== 'structured_draft') {
101
+ if (shown)
102
+ yield shown;
103
+ return;
104
+ }
105
+ const text = await this.drafts.read(shown.text);
106
+ if (text)
107
+ yield { ...shown, text };
108
+ }
109
+ /** The drafts' tail the gate still holds, once the step's stream has ended. */
110
+ *end() {
111
+ const text = this.drafts.end();
112
+ if (text)
113
+ yield { type: 'structured_draft', text };
114
+ }
115
+ }
116
+ /**
117
+ * Events read at a boundary of their own, not with the reply's text: the
118
+ * model's tool call at its `tool_arguments` boundary, and the structured
119
+ * output at `reply_structured`.
120
+ */
121
+ function isReadElsewhere(event) {
122
+ return event.type === 'structured' || event.type === 'tool';
123
+ }
124
+ /**
125
+ * The tool calls the model is drafting, each through a gate of its own at the boundary its call is
126
+ * read at (`createDraftGate`). A draft is a preview: one its gate stops, or whose tool's name
127
+ * changes, shows nothing more, and the call itself is still read whole. A draft's gate closes when
128
+ * its call arrives; its held tail is not released, because the call shows all of it.
129
+ */
130
+ class ToolDrafts {
131
+ policy;
132
+ context;
133
+ tools;
134
+ drafts = new Map();
135
+ constructor(policy, context, tools) {
136
+ this.policy = policy;
137
+ this.context = context;
138
+ this.tools = tools;
139
+ }
140
+ /**
141
+ * Shows `event` when it is a draft and says whether it was; any other event closes its call's
142
+ * draft. Nothing shows while the reply is `withheld`.
143
+ */
144
+ async *take(event, withheld, timed) {
145
+ if (event.type !== 'tool_draft') {
146
+ this.close(event);
147
+ return false;
148
+ }
149
+ // why: A withheld reply is judged whole when its attempt ends; nothing more of it previews before then.
150
+ if (!withheld)
151
+ yield* this.release(event, timed);
152
+ return true;
153
+ }
154
+ async *release(event, timed) {
155
+ const draft = this.drafts.get(event.callId) ?? (await this.open(event));
156
+ if (draft === 'stopped')
157
+ return;
158
+ if (draft.name !== event.name) {
159
+ this.drafts.set(event.callId, 'stopped');
160
+ return;
161
+ }
162
+ if (!draft.gate) {
163
+ yield event;
164
+ return;
165
+ }
166
+ const { gate } = draft;
167
+ // why: What the gate finds is reported once, by the check on the whole call.
168
+ const result = await timed('tool_draft', () => gate.process(event.text));
169
+ if (result.blocked) {
170
+ this.drafts.set(event.callId, 'stopped');
171
+ return;
172
+ }
173
+ if (result.emit)
174
+ yield { ...event, text: result.emit };
175
+ }
176
+ close(event) {
177
+ if (event.type === 'tool')
178
+ this.drafts.delete(event.tool.callId);
179
+ }
180
+ async open(event) {
181
+ const boundary = toolArgumentsBoundary(this.tools, event.name);
182
+ const gate = boundary ? await createDraftGate(this.policy, this.context, boundary) : null;
183
+ const draft = { name: event.name, gate };
184
+ this.drafts.set(event.callId, draft);
185
+ return draft;
186
+ }
187
+ }
188
+ /** What the stream's checks know of the turn. */
189
+ function streamContext(args, policy) {
190
+ const { profile, privateSystem, canaryGiven } = args;
191
+ const { canary } = args.generation;
192
+ return {
193
+ stage: 'output_final',
194
+ trust: 'untrusted',
195
+ profileId: profile.id,
196
+ ...(profile.labels ? { labels: profile.labels } : {}),
197
+ ...leakScopeOf(policy.detect, { canary, canaryGiven, privateSystem }),
198
+ givenUrls: args.givenUrls,
199
+ ...(args.ownTools ? { ownTools: args.ownTools } : {}),
200
+ };
53
201
  }
54
202
  async function* yieldProviderEvents(args) {
55
- const { profile, generation, request, privateSystem, provider, call, signal, control, givenUrls, } = args;
203
+ const { profile, request, provider, call, signal, control } = args;
56
204
  /** Runs one stream check and adds the run to the call's record of that check. */
57
205
  async function timed(check, run) {
58
206
  const start = performance.now();
@@ -63,27 +211,18 @@ async function* yieldProviderEvents(args) {
63
211
  call.guardTime?.(check, performance.now() - start);
64
212
  }
65
213
  }
66
- const { canary } = generation;
67
214
  const policy = resolveGuardrailPolicy(profile.guardrails);
68
- const context = {
69
- stage: 'output_final',
70
- trust: 'untrusted',
71
- profileId: profile.id,
72
- ...(profile.lexicon ? { lexicon: profile.lexicon } : {}),
73
- ...(canary ? { canary } : {}),
74
- // The system prompt is guarded against echo alongside the canary that binds it.
75
- ...(canary && policy.promptEcho && privateSystem.length > 0 ? { privateSystem } : {}),
76
- givenUrls,
77
- };
215
+ const context = streamContext(args, policy);
78
216
  const { canaryCarry, thoughtCarry } = control ?? {};
79
- const gate = createOutboundProgressiveGate(policy, context, canaryCarry);
80
- const thoughts = thoughtGuardFor(policy.egress?.enforce, context, thoughtCarry);
217
+ const gate = await createOutboundProgressiveGate(policy, context, 'reply', canaryCarry);
218
+ const thoughts = await thoughtGuardFor(policy, context, thoughtCarry);
219
+ const drafts = new ToolDrafts(policy, context, args.tools);
81
220
  /** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
82
221
  let pendingStream = null;
83
222
  let withholdVisible = false;
84
223
  /**
85
- * Under a host policy a withheld system-prompt leak goes to the
86
- * end-of-attempt verdict, which it pins to block: no verdict may release it.
224
+ * A leak the gate stopped on goes to the end-of-attempt verdict, which reads
225
+ * the whole reply for it: one that reading misses still blocks.
87
226
  */
88
227
  function recordPromptLeak(hits) {
89
228
  const leaks = hits.filter(isPromptLeakHit);
@@ -100,7 +239,7 @@ async function* yieldProviderEvents(args) {
100
239
  }
101
240
  async function* drainBlockedDelta(hits, template) {
102
241
  yield* yieldDeltaBlock(hits);
103
- // Arm withhold before recording the unreleased tail so the step runner
242
+ // why: Arm withhold before recording the unreleased tail so the step runner
104
243
  // does not forward that text to the host.
105
244
  armWithhold();
106
245
  const tail = gate?.drainUnreleased();
@@ -117,19 +256,22 @@ async function* yieldProviderEvents(args) {
117
256
  return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
118
257
  }
119
258
  /**
120
- * Act on one gate step: release what it cleared, or block — stopping the turn
121
- * when no host policy decides later, otherwise withholding for its verdict.
259
+ * Act on one gate step: release what it cleared, or withhold the rest of the
260
+ * reply for the verdict on the whole of it.
122
261
  */
123
262
  async function* releaseOrBlock(result, template) {
124
263
  if (result.blocked) {
125
- if (canary && canaryOnlyImmediateStop(policy)) {
126
- yield* yieldCanaryLeak(result.hits);
127
- return 'stop';
128
- }
129
264
  recordPromptLeak(result.hits);
130
- yield* drainBlockedDelta(result.hits, template);
265
+ // why: A detector's stop is reported once, by the verdict on the whole reply. The trace
266
+ // still records that this check is the one that stopped it.
267
+ const stopped = result.boundary &&
268
+ detectEvent(result.boundary, { action: 'block', hits: result.hits }, undefined, 'output_delta');
269
+ if (stopped)
270
+ call.guardrail?.(stopped);
271
+ yield* drainBlockedDelta(result.boundary ? [] : result.hits, template);
131
272
  return 'go';
132
273
  }
274
+ yield* yieldDetected('reply', result.found);
133
275
  if (result.emit) {
134
276
  yield { ...template, text: result.emit };
135
277
  }
@@ -141,7 +283,7 @@ async function* yieldProviderEvents(args) {
141
283
  return 'continue';
142
284
  }
143
285
  if (withholding()) {
144
- // Keep recording ungated fragments for egress context; host will not see them.
286
+ // why: Keep recording ungated fragments for egress context; host will not see them.
145
287
  yield { ...event, text: event.text ?? '' };
146
288
  return 'continue';
147
289
  }
@@ -172,7 +314,12 @@ async function* yieldProviderEvents(args) {
172
314
  call.observe(event);
173
315
  throwIfAborted(signal);
174
316
  if (event.type === 'response') {
175
- // Identity is the trace's alone; the call span already recorded it.
317
+ // why: Identity is the trace's alone; the call span already recorded it.
318
+ continue;
319
+ }
320
+ if (event.type === 'reasoning') {
321
+ // why: Signed reasoning goes back to the model as it came; no one reads it in between.
322
+ yield event;
176
323
  continue;
177
324
  }
178
325
  if (yield* guardThought(event))
@@ -185,20 +332,24 @@ async function* yieldProviderEvents(args) {
185
332
  }
186
333
  continue;
187
334
  }
188
- // Release held reply text first so the host sees events in order.
335
+ // why: Release held reply text first so the host sees events in order.
189
336
  const flushed = yield* flushGate();
190
337
  if (flushed === 'stop') {
191
338
  return;
192
339
  }
193
- const leaks = canary
194
- ? await timed('stream_canary', () => eventPromptLeakHits(event, canary, context.privateSystem))
195
- : [];
196
- if (leaks.length > 0) {
197
- yield* yieldCanaryLeak(leaks);
340
+ if (yield* drafts.take(event, withholding(), timed))
341
+ continue;
342
+ const leak = isReadElsewhere(event)
343
+ ? undefined
344
+ : await timed('stream_canary', () => eventLeak(event, context, policy.detect, 'reply'));
345
+ if (leak?.stop) {
346
+ yield* yieldLeakStop(leak.hits);
198
347
  return;
199
348
  }
349
+ if (leak)
350
+ yield* yieldDetected('reply', { action: 'flag', hits: leak.hits });
200
351
  if (withholding() && isWithheldOnBlock(event)) {
201
- // Record for attempt egress / repair; step runner withholds from host.
352
+ // why: Record for attempt egress / repair; step runner withholds from host.
202
353
  yield event;
203
354
  continue;
204
355
  }
@@ -218,8 +369,8 @@ async function* yieldProviderEvents(args) {
218
369
  control.canaryCarry = gate.carryOut();
219
370
  }
220
371
  if (providerFailed) {
221
- // An error from the provider outranks any `done` it sent: the call's output is not whole.
372
+ // why: An error from the provider outranks any `done` it sent: the call's output is not whole.
222
373
  yield { type: 'done', stop: { kind: 'provider_error' } };
223
374
  }
224
375
  }
225
- export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };
376
+ export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
@@ -1,6 +1,6 @@
1
1
  import type { ToolCallRequest } from '../../tools/types.js';
2
- import type { InteractionPart, ProviderEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
3
- import { type MediaTokenFamily, type TokenCount } from '../token-estimate.js';
2
+ import type { InteractionPart, ModelEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
3
+ import { type TokenCount } from '../token-estimate.js';
4
4
  type CallConversation = {
5
5
  history: TurnHistoryMessage[];
6
6
  input: InteractionPart[];
@@ -29,17 +29,17 @@ declare function startCallUsage(system: string, conversation: CallConversation,
29
29
  * Record one provider event. Returns true for a `tokens` event, which the
30
30
  * runner holds instead of streaming; `callTokensEvent` emits it at call end.
31
31
  */
32
- declare function observeCallEvent(usage: CallUsage, event: ProviderEvent): boolean;
32
+ declare function observeCallEvent(usage: CallUsage, event: ModelEvent): boolean;
33
33
  /**
34
34
  * What the provider holds once `usage`'s call has ended: what it held before,
35
35
  * what was sent for the call, and the call's output (not thoughts), counted
36
36
  * as a continuation replays it.
37
37
  */
38
- declare function heldAfter(usage: CallUsage, family: MediaTokenFamily | undefined): Promise<TokenCount>;
38
+ declare function heldAfter(usage: CallUsage): Promise<TokenCount>;
39
39
  /**
40
40
  * `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
41
41
  * claim a completed read.
42
42
  */
43
- declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration, family: MediaTokenFamily | undefined): Promise<TurnEventOf<'tokens'> | undefined>;
43
+ declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration): Promise<TurnEventOf<'tokens'> | undefined>;
44
44
  export type { CallConversation, CallUsage };
45
45
  export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
@@ -23,7 +23,7 @@ function observeCallEvent(usage, event) {
23
23
  usage.failed = true;
24
24
  return false;
25
25
  case 'tool':
26
- // The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
26
+ // why: The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
27
27
  if (event.tool.phase === undefined)
28
28
  usage.output.push({ type: 'tool', tool: event.tool });
29
29
  return false;
@@ -80,17 +80,17 @@ async function countOutput(usage, thoughts) {
80
80
  }
81
81
  return count;
82
82
  }
83
- async function countConversation(usage, family) {
83
+ async function countConversation(usage) {
84
84
  const estimator = await loadTokenEstimator();
85
85
  const { conversation } = usage;
86
86
  if ('previous' in conversation) {
87
- const earlier = await countConversation(conversation.previous, family);
87
+ const earlier = await countConversation(conversation.previous);
88
88
  const replayed = await countOutput(conversation.previous, false);
89
- const continuation = await estimator.messages(conversation.continuation, family);
89
+ const continuation = estimator.messages(conversation.continuation);
90
90
  return addCounts(addCounts(earlier, replayed), continuation);
91
91
  }
92
- const history = await estimator.messages(conversation.history, family);
93
- const sent = addCounts(history, await estimator.parts(conversation.input, family));
92
+ const history = estimator.messages(conversation.history);
93
+ const sent = addCounts(history, estimator.parts(conversation.input));
94
94
  return usage.held ? addCounts(usage.held, sent) : sent;
95
95
  }
96
96
  /**
@@ -98,17 +98,17 @@ async function countConversation(usage, family) {
98
98
  * what was sent for the call, and the call's output (not thoughts), counted
99
99
  * as a continuation replays it.
100
100
  */
101
- async function heldAfter(usage, family) {
102
- return addCounts(await countConversation(usage, family), await countOutput(usage, false));
101
+ async function heldAfter(usage) {
102
+ return addCounts(await countConversation(usage), await countOutput(usage, false));
103
103
  }
104
- async function countPrompt(usage, generation, family) {
104
+ async function countPrompt(usage, generation) {
105
105
  const estimator = await loadTokenEstimator();
106
106
  const wire = generation.tools.wire;
107
107
  const tools = wire.length > 0 ? estimator.text(JSON.stringify(wire)) : 0;
108
108
  const schema = generation.structured
109
109
  ? estimator.text(JSON.stringify(generation.structured.jsonSchema))
110
110
  : 0;
111
- const conversation = await countConversation(usage, family);
111
+ const conversation = await countConversation(usage);
112
112
  return {
113
113
  tokens: estimator.text(usage.system) + tools + schema + conversation.tokens,
114
114
  unknownMedia: conversation.unknownMedia,
@@ -118,16 +118,14 @@ async function countPrompt(usage, generation, family) {
118
118
  * `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
119
119
  * claim a completed read.
120
120
  */
121
- async function callTokensEvent(usage, generation, family) {
121
+ async function callTokensEvent(usage, generation) {
122
122
  const reported = usage.reported;
123
123
  if (!reported && usage.failed)
124
124
  return undefined;
125
125
  const estimated = reported ? (reported.estimated ?? []) : ['input', 'output'];
126
126
  if (reported && estimated.length === 0)
127
127
  return { type: 'tokens', tokens: reported };
128
- const prompt = estimated.includes('input')
129
- ? await countPrompt(usage, generation, family)
130
- : undefined;
128
+ const prompt = estimated.includes('input') ? await countPrompt(usage, generation) : undefined;
131
129
  const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
132
130
  const input = prompt?.tokens ?? reported?.input ?? 0;
133
131
  const output = written?.tokens ?? reported?.output ?? 0;
@@ -1,14 +1,15 @@
1
1
  import type { TraceSink } from '../../../observability/trace-sink.js';
2
- import type { GeminiOptions } from '../../../providers/google/keys.js';
2
+ import type { ProviderHostOptions } from '../../protocols/runtime.js';
3
3
  import type { KernelRegistry } from '../../registry/kernel-registry.js';
4
+ import type { PageToolExecution, ToolExecutionCoordinator } from '../../tools/operation.js';
4
5
  import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
5
6
  export type { LiveSession, SessionRequest };
6
- export interface RunSessionOptions {
7
+ /** Options for opening a live session: the key vault, a provider's own settings, a WebSocket opener, how long a gated call waits for its decision, and the sign-in gate policy. */
8
+ export interface RunSessionOptions extends ProviderHostOptions {
9
+ execution?: ToolExecutionCoordinator;
10
+ pageExecution?: PageToolExecution;
7
11
  /** The host's keys by slot; the session uses the slots its profile names. */
8
- vault: KeyVault;
9
- gemini?: GeminiOptions;
10
- /** Override socket open (Cloudflare fetch-upgrade, tests). Default: `new WebSocket(url)`. */
11
- openWebSocket?: (url: string) => Promise<WebSocket>;
12
+ vault?: KeyVault;
12
13
  /**
13
14
  * Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
14
15
  * refused (`session.gate_expired`), and the model reads the call as abandoned.
@@ -23,6 +24,7 @@ export interface RunSessionOptions {
23
24
  */
24
25
  signInGate?: SignInGatePolicy;
25
26
  }
27
+ /** How a sign-in gate behaves in a live session: `hold` waits for the decision, `answer` tells the model the sign-in is pending and releases the call. */
26
28
  export type SignInGatePolicy = 'hold' | 'answer';
27
29
  /**
28
30
  * The session record is written however the session ends, including when opening fails. An unknown