@theoremjs/agents 0.0.0-stage → 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 (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,376 @@
1
+ import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
2
+ import { detectEvent, leakScopeOf } from '../../../guardrails/detect-at.js';
3
+ import { eventLeak, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
4
+ import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
5
+ import { guardrailFromHits, guardrailTurnEvent } from '../../../guardrails/events.js';
6
+ import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
7
+ import { createDraftGate, createOutboundProgressiveGate, DraftReader, } from '../../../guardrails/progressive-yield.js';
8
+ import { EGRESS_RULES } from '../../../guardrails/rules.js';
9
+ import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
10
+ import { profileTurnOutputs } from '../../registry/profile-outputs.js';
11
+ import { toolArgumentsBoundary } from '../../tools/execute.js';
12
+ function shouldSkipStreamEvent(event, profile) {
13
+ return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
14
+ }
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
+ }
26
+ const reason = promptLeakReason(hits);
27
+ yield toErrorEvent(new TheoremError('safety', reason));
28
+ // why: The turn ends because our guardrail blocked the output, not because the model finished.
29
+ const native = reason === WITHHELD_REASON.canary
30
+ ? 'canary'
31
+ : reason === WITHHELD_REASON.promptEcho
32
+ ? 'prompt_echo'
33
+ : 'provider_tool_leak';
34
+ yield { type: 'done', stop: { kind: 'filtered', native } };
35
+ }
36
+ function* yieldDeltaBlock(hits) {
37
+ const guardrail = guardrailFromHits('output_delta', 'untrusted', hits, 'block');
38
+ if (guardrail) {
39
+ yield guardrail;
40
+ }
41
+ }
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);
53
+ const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
54
+ if (guardrail)
55
+ yield guardrail;
56
+ if (text)
57
+ yield { ...event, text };
58
+ }
59
+ /** The thought held at the end of a call, and what the next call's thoughts read on from. */
60
+ function* flushThoughts(thoughts, control) {
61
+ if (!thoughts)
62
+ return;
63
+ yield* yieldThought(thoughts.flush(), { type: 'thought', text: '' });
64
+ if (control)
65
+ control.thoughtCarry = thoughts.carryOut();
66
+ }
67
+ /** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
68
+ function isWithheldOnBlock(event) {
69
+ return event.type === 'text' || event.type === 'media';
70
+ }
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
+ };
201
+ }
202
+ async function* yieldProviderEvents(args) {
203
+ const { profile, request, provider, call, signal, control } = args;
204
+ /** Runs one stream check and adds the run to the call's record of that check. */
205
+ async function timed(check, run) {
206
+ const start = performance.now();
207
+ try {
208
+ return await run();
209
+ }
210
+ finally {
211
+ call.guardTime?.(check, performance.now() - start);
212
+ }
213
+ }
214
+ const policy = resolveGuardrailPolicy(profile.guardrails);
215
+ const context = streamContext(args, policy);
216
+ const { canaryCarry, thoughtCarry } = control ?? {};
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);
220
+ /** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
221
+ let pendingStream = null;
222
+ let withholdVisible = false;
223
+ /**
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.
226
+ */
227
+ function recordPromptLeak(hits) {
228
+ const leaks = hits.filter(isPromptLeakHit);
229
+ if (control && leaks.length > 0)
230
+ control.promptLeaks = leaks;
231
+ }
232
+ function armWithhold() {
233
+ withholdVisible = true;
234
+ if (control)
235
+ control.withholdVisible = true;
236
+ }
237
+ function withholding() {
238
+ return withholdVisible;
239
+ }
240
+ async function* drainBlockedDelta(hits, template) {
241
+ yield* yieldDeltaBlock(hits);
242
+ // why: Arm withhold before recording the unreleased tail so the step runner
243
+ // does not forward that text to the host.
244
+ armWithhold();
245
+ const tail = gate?.drainUnreleased();
246
+ if (tail)
247
+ yield { ...template, text: tail };
248
+ }
249
+ async function* flushGate() {
250
+ if (!(gate && pendingStream)) {
251
+ return 'pass';
252
+ }
253
+ const template = pendingStream;
254
+ const result = await timed('output_stream', () => gate.flush());
255
+ pendingStream = null;
256
+ return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
257
+ }
258
+ /**
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.
261
+ */
262
+ async function* releaseOrBlock(result, template) {
263
+ if (result.blocked) {
264
+ recordPromptLeak(result.hits);
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);
272
+ return 'go';
273
+ }
274
+ yield* yieldDetected('reply', result.found);
275
+ if (result.emit) {
276
+ yield { ...template, text: result.emit };
277
+ }
278
+ return 'go';
279
+ }
280
+ async function* gateStreamEvent(event) {
281
+ if (!gate) {
282
+ yield event;
283
+ return 'continue';
284
+ }
285
+ if (withholding()) {
286
+ // why: Keep recording ungated fragments for egress context; host will not see them.
287
+ yield { ...event, text: event.text ?? '' };
288
+ return 'continue';
289
+ }
290
+ pendingStream = event;
291
+ const result = await timed('output_stream', () => gate.process(event.text ?? ''));
292
+ return (yield* releaseOrBlock(result, event)) === 'stop' ? 'stop' : 'continue';
293
+ }
294
+ /** Whether a thought has streamed since the guard last flushed. */
295
+ let thinking = false;
296
+ /** A thought, through the guard when there is one; false for any other event. */
297
+ function* guardThought(event) {
298
+ if (event.type !== 'thought' || !thoughts)
299
+ return false;
300
+ thinking = true;
301
+ yield* yieldThought(thoughts.push(event.text), event);
302
+ return true;
303
+ }
304
+ /** The reply ends the thought: release its hold, as a call's end does, reading on from the carry. */
305
+ function* endThought() {
306
+ if (!thinking)
307
+ return;
308
+ thinking = false;
309
+ yield* flushThoughts(thoughts, control);
310
+ }
311
+ throwIfAborted(signal);
312
+ let providerFailed = false;
313
+ for await (const event of provider.complete({ ...request, signal, tapUpstream: call.tap })) {
314
+ call.observe(event);
315
+ throwIfAborted(signal);
316
+ if (event.type === 'response') {
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;
323
+ continue;
324
+ }
325
+ if (yield* guardThought(event))
326
+ continue;
327
+ if (isStreamedCanaryEvent(event)) {
328
+ yield* endThought();
329
+ const status = yield* gateStreamEvent(event);
330
+ if (status === 'stop') {
331
+ return;
332
+ }
333
+ continue;
334
+ }
335
+ // why: Release held reply text first so the host sees events in order.
336
+ const flushed = yield* flushGate();
337
+ if (flushed === 'stop') {
338
+ return;
339
+ }
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);
347
+ return;
348
+ }
349
+ if (leak)
350
+ yield* yieldDetected('reply', { action: 'flag', hits: leak.hits });
351
+ if (withholding() && isWithheldOnBlock(event)) {
352
+ // why: Record for attempt egress / repair; step runner withholds from host.
353
+ yield event;
354
+ continue;
355
+ }
356
+ if (event.type === 'error') {
357
+ providerFailed = true;
358
+ }
359
+ if (event.type === 'done')
360
+ yield* flushThoughts(thoughts, control);
361
+ yield event;
362
+ }
363
+ yield* flushThoughts(thoughts, control);
364
+ const flushed = yield* flushGate();
365
+ if (flushed === 'stop') {
366
+ return;
367
+ }
368
+ if (control && gate) {
369
+ control.canaryCarry = gate.carryOut();
370
+ }
371
+ if (providerFailed) {
372
+ // why: An error from the provider outranks any `done` it sent: the call's output is not whole.
373
+ yield { type: 'done', stop: { kind: 'provider_error' } };
374
+ }
375
+ }
376
+ export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
@@ -0,0 +1,45 @@
1
+ import type { ToolCallRequest } from '../../tools/types.js';
2
+ import type { InteractionPart, ModelEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
3
+ import { type TokenCount } from '../token-estimate.js';
4
+ type CallConversation = {
5
+ history: TurnHistoryMessage[];
6
+ input: InteractionPart[];
7
+ } | {
8
+ previous: CallUsage;
9
+ continuation: TurnHistoryMessage[];
10
+ };
11
+ /** What a call wrote that the output estimate counts: text, thoughts, media, and its tool calls. */
12
+ export type CallOutput = TurnEventOf<'text' | 'thought' | 'media'> | {
13
+ type: 'tool';
14
+ tool: ToolCallRequest;
15
+ };
16
+ interface CallUsage {
17
+ system: string;
18
+ /** Copied before the stream: the runner mutates history as tools run. */
19
+ conversation: CallConversation;
20
+ /** Context the provider already holds from earlier calls (a Live session). */
21
+ held?: TokenCount;
22
+ /** Last usage the provider reported for this call. */
23
+ reported?: TurnTokens;
24
+ output: CallOutput[];
25
+ failed: boolean;
26
+ }
27
+ declare function startCallUsage(system: string, conversation: CallConversation, held?: TokenCount): CallUsage;
28
+ /**
29
+ * Record one provider event. Returns true for a `tokens` event, which the
30
+ * runner holds instead of streaming; `callTokensEvent` emits it at call end.
31
+ */
32
+ declare function observeCallEvent(usage: CallUsage, event: ModelEvent): boolean;
33
+ /**
34
+ * What the provider holds once `usage`'s call has ended: what it held before,
35
+ * what was sent for the call, and the call's output (not thoughts), counted
36
+ * as a continuation replays it.
37
+ */
38
+ declare function heldAfter(usage: CallUsage): Promise<TokenCount>;
39
+ /**
40
+ * `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
41
+ * claim a completed read.
42
+ */
43
+ declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration): Promise<TurnEventOf<'tokens'> | undefined>;
44
+ export type { CallConversation, CallUsage };
45
+ export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
@@ -0,0 +1,148 @@
1
+ import { loadTokenEstimator } from '../token-estimate.js';
2
+ function startCallUsage(system, conversation, held) {
3
+ return {
4
+ system,
5
+ ...(held ? { held } : {}),
6
+ conversation: 'previous' in conversation
7
+ ? { previous: conversation.previous, continuation: [...conversation.continuation] }
8
+ : { history: [...conversation.history], input: [...conversation.input] },
9
+ output: [],
10
+ failed: false,
11
+ };
12
+ }
13
+ /**
14
+ * Record one provider event. Returns true for a `tokens` event, which the
15
+ * runner holds instead of streaming; `callTokensEvent` emits it at call end.
16
+ */
17
+ function observeCallEvent(usage, event) {
18
+ switch (event.type) {
19
+ case 'tokens':
20
+ usage.reported = event.tokens;
21
+ return true;
22
+ case 'error':
23
+ usage.failed = true;
24
+ return false;
25
+ case 'tool':
26
+ // why: The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
27
+ if (event.tool.phase === undefined)
28
+ usage.output.push({ type: 'tool', tool: event.tool });
29
+ return false;
30
+ case 'text':
31
+ case 'thought':
32
+ case 'media':
33
+ usage.output.push(event);
34
+ return false;
35
+ default:
36
+ return false;
37
+ }
38
+ }
39
+ function addCounts(a, b) {
40
+ return { tokens: a.tokens + b.tokens, unknownMedia: a.unknownMedia + b.unknownMedia };
41
+ }
42
+ /**
43
+ * The output's streamed text as the model wrote it: consecutive chunks of one
44
+ * kind joined, so the estimate does not depend on how the stream was split.
45
+ */
46
+ function textRuns(output, thoughts) {
47
+ const runs = [];
48
+ let kind;
49
+ for (const event of output) {
50
+ if (event.type === 'tool' || event.type === 'media') {
51
+ kind = undefined;
52
+ }
53
+ else if (event.text && (thoughts || event.type !== 'thought')) {
54
+ if (event.type === kind) {
55
+ runs.push(`${runs.pop() ?? ''}${event.text}`);
56
+ }
57
+ else {
58
+ runs.push(event.text);
59
+ kind = event.type;
60
+ }
61
+ }
62
+ }
63
+ return runs;
64
+ }
65
+ /** Output events counted; thoughts only when counting what the model wrote. */
66
+ async function countOutput(usage, thoughts) {
67
+ const estimator = await loadTokenEstimator();
68
+ const count = { tokens: 0, unknownMedia: 0 };
69
+ for (const event of usage.output) {
70
+ if (event.type === 'media') {
71
+ count.unknownMedia += 1;
72
+ }
73
+ else if (event.type === 'tool') {
74
+ count.tokens +=
75
+ estimator.text(event.tool.name) + estimator.text(JSON.stringify(event.tool.arguments));
76
+ }
77
+ }
78
+ for (const run of textRuns(usage.output, thoughts)) {
79
+ count.tokens += estimator.text(run);
80
+ }
81
+ return count;
82
+ }
83
+ async function countConversation(usage) {
84
+ const estimator = await loadTokenEstimator();
85
+ const { conversation } = usage;
86
+ if ('previous' in conversation) {
87
+ const earlier = await countConversation(conversation.previous);
88
+ const replayed = await countOutput(conversation.previous, false);
89
+ const continuation = estimator.messages(conversation.continuation);
90
+ return addCounts(addCounts(earlier, replayed), continuation);
91
+ }
92
+ const history = estimator.messages(conversation.history);
93
+ const sent = addCounts(history, estimator.parts(conversation.input));
94
+ return usage.held ? addCounts(usage.held, sent) : sent;
95
+ }
96
+ /**
97
+ * What the provider holds once `usage`'s call has ended: what it held before,
98
+ * what was sent for the call, and the call's output (not thoughts), counted
99
+ * as a continuation replays it.
100
+ */
101
+ async function heldAfter(usage) {
102
+ return addCounts(await countConversation(usage), await countOutput(usage, false));
103
+ }
104
+ async function countPrompt(usage, generation) {
105
+ const estimator = await loadTokenEstimator();
106
+ const wire = generation.tools.wire;
107
+ const tools = wire.length > 0 ? estimator.text(JSON.stringify(wire)) : 0;
108
+ const schema = generation.structured
109
+ ? estimator.text(JSON.stringify(generation.structured.jsonSchema))
110
+ : 0;
111
+ const conversation = await countConversation(usage);
112
+ return {
113
+ tokens: estimator.text(usage.system) + tools + schema + conversation.tokens,
114
+ unknownMedia: conversation.unknownMedia,
115
+ };
116
+ }
117
+ /**
118
+ * `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
119
+ * claim a completed read.
120
+ */
121
+ async function callTokensEvent(usage, generation) {
122
+ const reported = usage.reported;
123
+ if (!reported && usage.failed)
124
+ return undefined;
125
+ const estimated = reported ? (reported.estimated ?? []) : ['input', 'output'];
126
+ if (reported && estimated.length === 0)
127
+ return { type: 'tokens', tokens: reported };
128
+ const prompt = estimated.includes('input') ? await countPrompt(usage, generation) : undefined;
129
+ const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
130
+ const input = prompt?.tokens ?? reported?.input ?? 0;
131
+ const output = written?.tokens ?? reported?.output ?? 0;
132
+ const unknownMedia = {
133
+ ...(prompt?.unknownMedia ? { input: prompt.unknownMedia } : {}),
134
+ ...(written?.unknownMedia ? { output: written.unknownMedia } : {}),
135
+ };
136
+ return {
137
+ type: 'tokens',
138
+ tokens: {
139
+ ...reported,
140
+ input,
141
+ output,
142
+ total: input + output,
143
+ estimated: [...estimated],
144
+ ...(Object.keys(unknownMedia).length > 0 ? { unknownMedia } : {}),
145
+ },
146
+ };
147
+ }
148
+ export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
@@ -0,0 +1,33 @@
1
+ import type { TraceSink } from '../../../observability/trace-sink.js';
2
+ import type { ProviderHostOptions } from '../../protocols/runtime.js';
3
+ import type { KernelRegistry } from '../../registry/kernel-registry.js';
4
+ import type { PageToolExecution, ToolExecutionCoordinator } from '../../tools/operation.js';
5
+ import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
6
+ export type { LiveSession, SessionRequest };
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;
11
+ /** The host's keys by slot; the session uses the slots its profile names. */
12
+ vault?: KeyVault;
13
+ /**
14
+ * Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
15
+ * refused (`session.gate_expired`), and the model reads the call as abandoned.
16
+ */
17
+ gateTtlMs?: number;
18
+ /**
19
+ * `hold` (default): a sign-in gate waits for its decision, as any gate does. `answer`: the
20
+ * model reads the gate's pending note at once and the call is released, for a host whose
21
+ * sign-in finishes outside the session. A released call still takes its outcome for
22
+ * `gateTtlMs` (`executeTool` with a decision, or `answerToolCall`), which the model reads as
23
+ * the call's next result; unanswered by then, the model reads that the sign-in expired.
24
+ */
25
+ signInGate?: SignInGatePolicy;
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. */
28
+ export type SignInGatePolicy = 'hold' | 'answer';
29
+ /**
30
+ * The session record is written however the session ends, including when opening fails. An unknown
31
+ * profile fails to open and is recorded under the standard observability policy.
32
+ */
33
+ export declare function runSessionInRegistry(registry: KernelRegistry, req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;