@theoremjs/agents 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +202 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +25 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +72 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,225 @@
1
+ import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
2
+ import { CANARY_HIT, eventPromptLeakHits, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
3
+ import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
4
+ import { guardrailFromHits } from '../../../guardrails/events.js';
5
+ import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
6
+ import { createOutboundProgressiveGate, } from '../../../guardrails/progressive-yield.js';
7
+ import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
8
+ import { profileTurnOutputs } from '../../registry/profile-outputs.js';
9
+ function shouldSkipStreamEvent(event, profile) {
10
+ return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
11
+ }
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
+ const reason = promptLeakReason(hits);
16
+ yield toErrorEvent(new TheoremError('safety', reason));
17
+ // The turn ends because our guardrail blocked the output, not because the model finished.
18
+ const native = reason === WITHHELD_REASON.canary
19
+ ? 'canary'
20
+ : reason === WITHHELD_REASON.promptEcho
21
+ ? 'prompt_echo'
22
+ : 'provider_tool_leak';
23
+ yield { type: 'done', stop: { kind: 'filtered', native } };
24
+ }
25
+ function* yieldDeltaBlock(hits) {
26
+ const guardrail = guardrailFromHits('output_delta', 'untrusted', hits, 'block');
27
+ if (guardrail) {
28
+ yield guardrail;
29
+ }
30
+ }
31
+ /** What the guard released, after the event saying what it omitted from it. */
32
+ function* yieldThought({ text, hits }, event) {
33
+ const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
34
+ if (guardrail)
35
+ yield guardrail;
36
+ if (text)
37
+ yield { ...event, text };
38
+ }
39
+ /** The thought held at the end of a call, and what the next call's thoughts read on from. */
40
+ function* flushThoughts(thoughts, control) {
41
+ if (!thoughts)
42
+ return;
43
+ yield* yieldThought(thoughts.flush(), { type: 'thought', text: '' });
44
+ if (control)
45
+ control.thoughtCarry = thoughts.carryOut();
46
+ }
47
+ /** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
48
+ function isWithheldOnBlock(event) {
49
+ return event.type === 'text' || event.type === 'media';
50
+ }
51
+ function canaryOnlyImmediateStop(policy) {
52
+ return !policy.egress?.enforce;
53
+ }
54
+ async function* yieldProviderEvents(args) {
55
+ const { profile, generation, request, privateSystem, provider, call, signal, control, givenUrls, } = args;
56
+ /** Runs one stream check and adds the run to the call's record of that check. */
57
+ async function timed(check, run) {
58
+ const start = performance.now();
59
+ try {
60
+ return await run();
61
+ }
62
+ finally {
63
+ call.guardTime?.(check, performance.now() - start);
64
+ }
65
+ }
66
+ const { canary } = generation;
67
+ 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
+ };
78
+ const { canaryCarry, thoughtCarry } = control ?? {};
79
+ const gate = createOutboundProgressiveGate(policy, context, canaryCarry);
80
+ const thoughts = thoughtGuardFor(policy.egress?.enforce, context, thoughtCarry);
81
+ /** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
82
+ let pendingStream = null;
83
+ let withholdVisible = false;
84
+ /**
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.
87
+ */
88
+ function recordPromptLeak(hits) {
89
+ const leaks = hits.filter(isPromptLeakHit);
90
+ if (control && leaks.length > 0)
91
+ control.promptLeaks = leaks;
92
+ }
93
+ function armWithhold() {
94
+ withholdVisible = true;
95
+ if (control)
96
+ control.withholdVisible = true;
97
+ }
98
+ function withholding() {
99
+ return withholdVisible;
100
+ }
101
+ async function* drainBlockedDelta(hits, template) {
102
+ yield* yieldDeltaBlock(hits);
103
+ // Arm withhold before recording the unreleased tail so the step runner
104
+ // does not forward that text to the host.
105
+ armWithhold();
106
+ const tail = gate?.drainUnreleased();
107
+ if (tail)
108
+ yield { ...template, text: tail };
109
+ }
110
+ async function* flushGate() {
111
+ if (!(gate && pendingStream)) {
112
+ return 'pass';
113
+ }
114
+ const template = pendingStream;
115
+ const result = await timed('output_stream', () => gate.flush());
116
+ pendingStream = null;
117
+ return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
118
+ }
119
+ /**
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.
122
+ */
123
+ async function* releaseOrBlock(result, template) {
124
+ if (result.blocked) {
125
+ if (canary && canaryOnlyImmediateStop(policy)) {
126
+ yield* yieldCanaryLeak(result.hits);
127
+ return 'stop';
128
+ }
129
+ recordPromptLeak(result.hits);
130
+ yield* drainBlockedDelta(result.hits, template);
131
+ return 'go';
132
+ }
133
+ if (result.emit) {
134
+ yield { ...template, text: result.emit };
135
+ }
136
+ return 'go';
137
+ }
138
+ async function* gateStreamEvent(event) {
139
+ if (!gate) {
140
+ yield event;
141
+ return 'continue';
142
+ }
143
+ if (withholding()) {
144
+ // Keep recording ungated fragments for egress context; host will not see them.
145
+ yield { ...event, text: event.text ?? '' };
146
+ return 'continue';
147
+ }
148
+ pendingStream = event;
149
+ const result = await timed('output_stream', () => gate.process(event.text ?? ''));
150
+ return (yield* releaseOrBlock(result, event)) === 'stop' ? 'stop' : 'continue';
151
+ }
152
+ /** Whether a thought has streamed since the guard last flushed. */
153
+ let thinking = false;
154
+ /** A thought, through the guard when there is one; false for any other event. */
155
+ function* guardThought(event) {
156
+ if (event.type !== 'thought' || !thoughts)
157
+ return false;
158
+ thinking = true;
159
+ yield* yieldThought(thoughts.push(event.text), event);
160
+ return true;
161
+ }
162
+ /** The reply ends the thought: release its hold, as a call's end does, reading on from the carry. */
163
+ function* endThought() {
164
+ if (!thinking)
165
+ return;
166
+ thinking = false;
167
+ yield* flushThoughts(thoughts, control);
168
+ }
169
+ throwIfAborted(signal);
170
+ let providerFailed = false;
171
+ for await (const event of provider.complete({ ...request, signal, tapUpstream: call.tap })) {
172
+ call.observe(event);
173
+ throwIfAborted(signal);
174
+ if (event.type === 'response') {
175
+ // Identity is the trace's alone; the call span already recorded it.
176
+ continue;
177
+ }
178
+ if (yield* guardThought(event))
179
+ continue;
180
+ if (isStreamedCanaryEvent(event)) {
181
+ yield* endThought();
182
+ const status = yield* gateStreamEvent(event);
183
+ if (status === 'stop') {
184
+ return;
185
+ }
186
+ continue;
187
+ }
188
+ // Release held reply text first so the host sees events in order.
189
+ const flushed = yield* flushGate();
190
+ if (flushed === 'stop') {
191
+ return;
192
+ }
193
+ const leaks = canary
194
+ ? await timed('stream_canary', () => eventPromptLeakHits(event, canary, context.privateSystem))
195
+ : [];
196
+ if (leaks.length > 0) {
197
+ yield* yieldCanaryLeak(leaks);
198
+ return;
199
+ }
200
+ if (withholding() && isWithheldOnBlock(event)) {
201
+ // Record for attempt egress / repair; step runner withholds from host.
202
+ yield event;
203
+ continue;
204
+ }
205
+ if (event.type === 'error') {
206
+ providerFailed = true;
207
+ }
208
+ if (event.type === 'done')
209
+ yield* flushThoughts(thoughts, control);
210
+ yield event;
211
+ }
212
+ yield* flushThoughts(thoughts, control);
213
+ const flushed = yield* flushGate();
214
+ if (flushed === 'stop') {
215
+ return;
216
+ }
217
+ if (control && gate) {
218
+ control.canaryCarry = gate.carryOut();
219
+ }
220
+ if (providerFailed) {
221
+ // An error from the provider outranks any `done` it sent: the call's output is not whole.
222
+ yield { type: 'done', stop: { kind: 'provider_error' } };
223
+ }
224
+ }
225
+ export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };
@@ -0,0 +1,45 @@
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';
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: ProviderEvent): 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, family: MediaTokenFamily | undefined): 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, family: MediaTokenFamily | undefined): Promise<TurnEventOf<'tokens'> | undefined>;
44
+ export type { CallConversation, CallUsage };
45
+ export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
@@ -0,0 +1,150 @@
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
+ // 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, family) {
84
+ const estimator = await loadTokenEstimator();
85
+ const { conversation } = usage;
86
+ if ('previous' in conversation) {
87
+ const earlier = await countConversation(conversation.previous, family);
88
+ const replayed = await countOutput(conversation.previous, false);
89
+ const continuation = await estimator.messages(conversation.continuation, family);
90
+ return addCounts(addCounts(earlier, replayed), continuation);
91
+ }
92
+ const history = await estimator.messages(conversation.history, family);
93
+ const sent = addCounts(history, await estimator.parts(conversation.input, family));
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, family) {
102
+ return addCounts(await countConversation(usage, family), await countOutput(usage, false));
103
+ }
104
+ async function countPrompt(usage, generation, family) {
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, family);
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, family) {
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')
129
+ ? await countPrompt(usage, generation, family)
130
+ : undefined;
131
+ const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
132
+ const input = prompt?.tokens ?? reported?.input ?? 0;
133
+ const output = written?.tokens ?? reported?.output ?? 0;
134
+ const unknownMedia = {
135
+ ...(prompt?.unknownMedia ? { input: prompt.unknownMedia } : {}),
136
+ ...(written?.unknownMedia ? { output: written.unknownMedia } : {}),
137
+ };
138
+ return {
139
+ type: 'tokens',
140
+ tokens: {
141
+ ...reported,
142
+ input,
143
+ output,
144
+ total: input + output,
145
+ estimated: [...estimated],
146
+ ...(Object.keys(unknownMedia).length > 0 ? { unknownMedia } : {}),
147
+ },
148
+ };
149
+ }
150
+ export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
@@ -0,0 +1,31 @@
1
+ import type { TraceSink } from '../../../observability/trace-sink.js';
2
+ import type { GeminiOptions } from '../../../providers/google/keys.js';
3
+ import type { KernelRegistry } from '../../registry/kernel-registry.js';
4
+ import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
5
+ export type { LiveSession, SessionRequest };
6
+ export interface RunSessionOptions {
7
+ /** 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
+ /**
13
+ * Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
14
+ * refused (`session.gate_expired`), and the model reads the call as abandoned.
15
+ */
16
+ gateTtlMs?: number;
17
+ /**
18
+ * `hold` (default): a sign-in gate waits for its decision, as any gate does. `answer`: the
19
+ * model reads the gate's pending note at once and the call is released, for a host whose
20
+ * sign-in finishes outside the session. A released call still takes its outcome for
21
+ * `gateTtlMs` (`executeTool` with a decision, or `answerToolCall`), which the model reads as
22
+ * the call's next result; unanswered by then, the model reads that the sign-in expired.
23
+ */
24
+ signInGate?: SignInGatePolicy;
25
+ }
26
+ export type SignInGatePolicy = 'hold' | 'answer';
27
+ /**
28
+ * The session record is written however the session ends, including when opening fails. An unknown
29
+ * profile fails to open and is recorded under the standard observability policy.
30
+ */
31
+ export declare function runSessionInRegistry(registry: KernelRegistry, req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;