@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,150 @@
1
+ import { describeError, isAbortError, TheoremError } from '../../../guardrails/error.js';
2
+ import { fallbackKey, requireKey } from '../../shared/vault.js';
3
+ import { buildGeminiLiveWebSocketUrl } from './framing.js';
4
+ import { attachLiveSessionHandlers, createLiveQueue, performLiveSetup, sendInitialPayloads, sendLiveFrame, } from './stream.js';
5
+ function defaultOpenWebSocket(url) {
6
+ return Promise.resolve(new WebSocket(url));
7
+ }
8
+ function attachAbort(ws, liveQueue, signal) {
9
+ const onAbort = () => {
10
+ if (!liveQueue.isClosed()) {
11
+ liveQueue.close();
12
+ try {
13
+ ws.close(1000, 'aborted');
14
+ }
15
+ catch {
16
+ // Ignore
17
+ }
18
+ liveQueue.push({
19
+ type: 'error',
20
+ error: new DOMException('The operation was aborted.', 'AbortError'),
21
+ });
22
+ }
23
+ };
24
+ if (!signal) {
25
+ return () => { };
26
+ }
27
+ if (signal.aborted) {
28
+ onAbort();
29
+ return () => { };
30
+ }
31
+ signal.addEventListener('abort', onAbort, { once: true });
32
+ return () => signal.removeEventListener('abort', onAbort);
33
+ }
34
+ /** Tape row: setup on the pinned key was refused for quota, so the session opens on the fallback slot. */
35
+ export const LIVE_FALLBACK_ROW = 'ws_fallback';
36
+ async function openOnKey(req, apiKey, openWebSocket) {
37
+ let ws;
38
+ try {
39
+ ws = await openWebSocket(buildGeminiLiveWebSocketUrl(apiKey));
40
+ }
41
+ catch (err) {
42
+ throw err instanceof Error ? err : new Error(String(err));
43
+ }
44
+ const liveQueue = createLiveQueue();
45
+ const detachAbort = attachAbort(ws, liveQueue, req.signal);
46
+ if (req.signal?.aborted) {
47
+ detachAbort();
48
+ try {
49
+ ws.close();
50
+ }
51
+ catch {
52
+ // Ignore
53
+ }
54
+ throw new DOMException('The operation was aborted.', 'AbortError');
55
+ }
56
+ try {
57
+ return { ws, liveQueue, detachAbort, setup: await performLiveSetup(ws, req) };
58
+ }
59
+ catch (err) {
60
+ detachAbort();
61
+ try {
62
+ ws.close();
63
+ }
64
+ catch {
65
+ // Ignore
66
+ }
67
+ throw err;
68
+ }
69
+ }
70
+ /**
71
+ * Open on the pinned key; a quota refusal at setup reopens on the profile's
72
+ * fallback slot when it names one, as `fetchGemini` does for HTTP.
73
+ * The tape records the refusal (`ws_fallback`) before the retry.
74
+ */
75
+ async function openWithOverflow(req, transport, openWebSocket) {
76
+ if (!req.keySlot) {
77
+ throw new TheoremError('config', 'Request requires keySlot');
78
+ }
79
+ const primary = requireKey(transport.vault, req.keySlot);
80
+ try {
81
+ return await openOnKey(req, primary, openWebSocket);
82
+ }
83
+ catch (err) {
84
+ const fallback = fallbackKey(req.fallbackKeySlot, transport.vault, primary);
85
+ if (!fallback || !(err instanceof TheoremError) || err.kind !== 'rate_limit')
86
+ throw err;
87
+ req.tapUpstream?.({
88
+ eventType: LIVE_FALLBACK_ROW,
89
+ from: req.keySlot,
90
+ keySlot: fallback.slot,
91
+ errorKind: err.kind,
92
+ error: describeError(err),
93
+ });
94
+ return await openOnKey(req, fallback.key, openWebSocket);
95
+ }
96
+ }
97
+ /** @param openWebSocket Host override, e.g. for a Cloudflare fetch-upgrade. */
98
+ export async function openGoogleLiveSession(req, transport, openWebSocket = defaultOpenWebSocket) {
99
+ const { ws, liveQueue, detachAbort, setup } = await openWithOverflow(req, transport, openWebSocket);
100
+ attachLiveSessionHandlers(ws, liveQueue);
101
+ sendInitialPayloads(ws, req);
102
+ return {
103
+ setup,
104
+ send(payload) {
105
+ if (ws.readyState === WebSocket.OPEN) {
106
+ sendLiveFrame(ws, payload, req.tapUpstream);
107
+ }
108
+ },
109
+ async *batches() {
110
+ try {
111
+ while (true) {
112
+ const item = await liveQueue.next();
113
+ if (!item)
114
+ break;
115
+ if (item.type === 'error' && isAbortError(item.error)) {
116
+ throw item.error;
117
+ }
118
+ yield item;
119
+ if (item.type === 'closed' || item.type === 'error') {
120
+ break;
121
+ }
122
+ }
123
+ }
124
+ finally {
125
+ detachAbort();
126
+ liveQueue.close();
127
+ try {
128
+ if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
129
+ ws.close(1000, 'session-closed');
130
+ }
131
+ }
132
+ catch {
133
+ // Ignore
134
+ }
135
+ }
136
+ },
137
+ close(code = 1000, reason = 'session-closed') {
138
+ detachAbort();
139
+ liveQueue.close();
140
+ try {
141
+ if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
142
+ ws.close(code, reason);
143
+ }
144
+ }
145
+ catch {
146
+ // Ignore
147
+ }
148
+ },
149
+ };
150
+ }
@@ -0,0 +1,51 @@
1
+ import { TheoremError } from '../../../guardrails/error.js';
2
+ import type { ProviderCompleteRequest, ProviderEvent } from '../../../kernel/types.js';
3
+ export type LiveTurnPhase = 'streaming' | 'complete' | 'abort';
4
+ export declare function sendLiveFrame(ws: LiveSocketSender, payload: Record<string, unknown>, tap: ProviderCompleteRequest['tapUpstream']): void;
5
+ /** `row` is the parsed frame, so the kernel records it beside the events it produced. */
6
+ export type SessionQueueItem = {
7
+ type: 'batch';
8
+ events: ProviderEvent[];
9
+ turnPhase: LiveTurnPhase;
10
+ row: Record<string, unknown>;
11
+ } | {
12
+ type: 'row';
13
+ row: Record<string, unknown>;
14
+ } | {
15
+ type: 'error';
16
+ error: Error;
17
+ row?: Record<string, unknown>;
18
+ }
19
+ /** `error` is set when the close was not normal; `goAway` when the provider warned first. */
20
+ | {
21
+ type: 'closed';
22
+ code: number;
23
+ reason: string;
24
+ error?: TheoremError;
25
+ goAway?: GoAwayClose;
26
+ };
27
+ export interface GoAwayClose {
28
+ timeLeftMs?: number;
29
+ /** Milliseconds from the last `goAway` to the close. */
30
+ closedAfterMs: number;
31
+ }
32
+ export declare function readMessageData(data: unknown): Promise<string>;
33
+ export declare function performLiveSetup(ws: WebSocket, req: ProviderCompleteRequest): Promise<Record<string, unknown>>;
34
+ export type LiveSocketSender = {
35
+ send(data: string): void;
36
+ };
37
+ export declare function sendInitialPayloads(ws: LiveSocketSender, req: ProviderCompleteRequest): void;
38
+ export interface LiveQueue {
39
+ push: (item: SessionQueueItem) => void;
40
+ next: () => Promise<SessionQueueItem | undefined>;
41
+ close: () => void;
42
+ isClosed: () => boolean;
43
+ }
44
+ export declare function createLiveQueue(): LiveQueue;
45
+ /**
46
+ * `interactionStatus`, when sent, is authoritative: `IN_PROGRESS` keeps the cycle
47
+ * open across `turnComplete` (background reasoning or async tools may still
48
+ * produce output). Without it, `turnComplete` is the boundary.
49
+ */
50
+ export declare function turnPhaseFromMessage(message: Record<string, unknown>, events: ProviderEvent[]): LiveTurnPhase;
51
+ export declare function attachLiveSessionHandlers(ws: WebSocket, liveQueue: LiveQueue): void;
@@ -0,0 +1,263 @@
1
+ import { TheoremError } from '../../../guardrails/error.js';
2
+ import { asRecord } from '../../../kernel/engine/record.js';
3
+ import { findLast } from '../../../kernel/util/find-last.js';
4
+ import { readGeminiApiError } from '../api-error.js';
5
+ import { buildGeminiLiveClientContent, buildGeminiLiveRealtimeInput, buildGeminiLiveSetupMessage, foldGeminiLiveServerMessage, newLiveFold, parseGeminiLiveMessage, readLiveInteractionStatus, } from './framing.js';
6
+ const SETUP_TIMEOUT_MS = 20_000;
7
+ /** RFC 6455 §7.4.1 close codes; any other code is `unavailable`. */
8
+ const CLOSE_KINDS = {
9
+ 1006: 'network',
10
+ 1007: 'unsupported',
11
+ 1008: 'unsupported',
12
+ 1011: 'unavailable',
13
+ 1013: 'unavailable',
14
+ };
15
+ const NORMAL_CLOSE = 1000;
16
+ /**
17
+ * Google refuses an over-quota Live key with code 1011 (`unavailable`) and a reason
18
+ * ("You exceeded your current quota, …"); the reason is the only quota signal.
19
+ */
20
+ const QUOTA_CLOSE_RE = /\bquota\b/i;
21
+ /**
22
+ * A bad key closes setup with 1007 ("API key not valid. …"), which by code
23
+ * reads as `unsupported`; like quota, the reason is the only signal.
24
+ */
25
+ const AUTH_CLOSE_RE = /\bAPI key (?:not valid|expired)\b/i;
26
+ /** The kind a close's reason names, if any. */
27
+ function closeReasonKind(reason) {
28
+ if (QUOTA_CLOSE_RE.test(reason))
29
+ return 'rate_limit';
30
+ if (AUTH_CLOSE_RE.test(reason))
31
+ return 'auth';
32
+ return undefined;
33
+ }
34
+ function closeError(code, reason, during) {
35
+ return new TheoremError(closeReasonKind(reason) ?? CLOSE_KINDS[code] ?? 'unavailable', `Gemini Live WebSocket closed during ${during} (${code}: ${reason})`);
36
+ }
37
+ /** Received frames travel on the queue, not as tap rows. */
38
+ const LIVE_SEND_ROW = 'ws_send';
39
+ export function sendLiveFrame(ws, payload, tap) {
40
+ tap?.({ eventType: LIVE_SEND_ROW, body: payload });
41
+ ws.send(JSON.stringify(payload));
42
+ }
43
+ function goAwayIn(events) {
44
+ const warning = findLast(events, (ev) => ev.type === 'session' && ev.session.kind === 'closing_soon');
45
+ return warning?.session.kind === 'closing_soon'
46
+ ? { timeLeftMs: warning.session.timeLeftMs }
47
+ : undefined;
48
+ }
49
+ export async function readMessageData(data) {
50
+ if (typeof data === 'string')
51
+ return data;
52
+ if (data instanceof ArrayBuffer) {
53
+ return new TextDecoder().decode(data);
54
+ }
55
+ if (typeof Blob !== 'undefined' && data instanceof Blob) {
56
+ return await data.text();
57
+ }
58
+ return String(data);
59
+ }
60
+ export function performLiveSetup(ws, req) {
61
+ return new Promise((resolve, reject) => {
62
+ let setupResolved = false;
63
+ const timeout = setTimeout(() => {
64
+ if (!setupResolved) {
65
+ setupResolved = true;
66
+ reject(new TheoremError('timeout', `Gemini Live setup timed out after ${SETUP_TIMEOUT_MS}ms`));
67
+ }
68
+ }, SETUP_TIMEOUT_MS);
69
+ const sendSetup = () => {
70
+ try {
71
+ sendLiveFrame(ws, buildGeminiLiveSetupMessage(req), req.tapUpstream);
72
+ }
73
+ catch (err) {
74
+ clearTimeout(timeout);
75
+ setupResolved = true;
76
+ reject(err instanceof Error ? err : new Error(String(err)));
77
+ }
78
+ };
79
+ ws.onerror = () => {
80
+ clearTimeout(timeout);
81
+ if (!setupResolved) {
82
+ setupResolved = true;
83
+ reject(new TheoremError('network', 'Gemini Live WebSocket error during setup'));
84
+ }
85
+ };
86
+ ws.onclose = (evt) => {
87
+ clearTimeout(timeout);
88
+ if (!setupResolved) {
89
+ setupResolved = true;
90
+ reject(closeError(evt.code, evt.reason, 'setup'));
91
+ }
92
+ };
93
+ const initialMessageHandler = async (evt) => {
94
+ const rawText = await readMessageData(evt.data);
95
+ const parsed = parseGeminiLiveMessage(rawText);
96
+ if (!parsed.ok) {
97
+ if (parsed.reason === 'empty')
98
+ return;
99
+ clearTimeout(timeout);
100
+ setupResolved = true;
101
+ reject(new TheoremError('bad_response', 'malformed Gemini Live message during setup'));
102
+ return;
103
+ }
104
+ const apiError = readGeminiApiError(parsed.value);
105
+ if (apiError) {
106
+ clearTimeout(timeout);
107
+ setupResolved = true;
108
+ reject(apiError);
109
+ return;
110
+ }
111
+ if (parsed.value.setupComplete) {
112
+ clearTimeout(timeout);
113
+ setupResolved = true;
114
+ ws.removeEventListener('message', initialMessageHandler);
115
+ resolve(parsed.value);
116
+ }
117
+ };
118
+ ws.addEventListener('message', initialMessageHandler);
119
+ // A fetch-upgraded socket (Cloudflare `resp.webSocket.accept()`) is already
120
+ // open and never fires `open`.
121
+ if (ws.readyState === WebSocket.OPEN) {
122
+ sendSetup();
123
+ }
124
+ else {
125
+ ws.onopen = sendSetup;
126
+ }
127
+ });
128
+ }
129
+ export function sendInitialPayloads(ws, req) {
130
+ if (req.history && req.history.length > 0) {
131
+ const historyMsg = buildGeminiLiveClientContent(req.history);
132
+ if (historyMsg) {
133
+ sendLiveFrame(ws, historyMsg, req.tapUpstream);
134
+ }
135
+ }
136
+ for (const part of req.input ?? []) {
137
+ sendLiveFrame(ws, buildGeminiLiveRealtimeInput(part), req.tapUpstream);
138
+ }
139
+ }
140
+ export function createLiveQueue() {
141
+ const queue = [];
142
+ let notify = null;
143
+ let closed = false;
144
+ return {
145
+ push(item) {
146
+ queue.push(item);
147
+ if (notify) {
148
+ const fn = notify;
149
+ notify = null;
150
+ fn();
151
+ }
152
+ },
153
+ async next() {
154
+ while (queue.length === 0) {
155
+ if (closed)
156
+ return undefined;
157
+ await new Promise((resolve) => {
158
+ notify = resolve;
159
+ });
160
+ }
161
+ return queue.shift();
162
+ },
163
+ close() {
164
+ closed = true;
165
+ if (notify) {
166
+ const fn = notify;
167
+ notify = null;
168
+ fn();
169
+ }
170
+ },
171
+ isClosed() {
172
+ return closed;
173
+ },
174
+ };
175
+ }
176
+ /**
177
+ * `interactionStatus`, when sent, is authoritative: `IN_PROGRESS` keeps the cycle
178
+ * open across `turnComplete` (background reasoning or async tools may still
179
+ * produce output). Without it, `turnComplete` is the boundary.
180
+ */
181
+ export function turnPhaseFromMessage(message, events) {
182
+ const interrupted = events.some((ev) => ev.type === 'done' && ev.interrupted === true);
183
+ if (interrupted)
184
+ return 'abort';
185
+ const status = readLiveInteractionStatus(message);
186
+ if (status === 'IDLE')
187
+ return 'complete';
188
+ if (status === 'IN_PROGRESS')
189
+ return 'streaming';
190
+ if (asRecord(message.serverContent)?.turnComplete === true)
191
+ return 'complete';
192
+ return 'streaming';
193
+ }
194
+ export function attachLiveSessionHandlers(ws, liveQueue) {
195
+ const fold = newLiveFold();
196
+ /** The last `goAway`, and when it arrived (monotonic ms). */
197
+ let goAway;
198
+ ws.onmessage = async (evt) => {
199
+ try {
200
+ const rawText = await readMessageData(evt.data);
201
+ const parsed = parseGeminiLiveMessage(rawText);
202
+ if (!parsed.ok) {
203
+ if (parsed.reason === 'empty')
204
+ return;
205
+ liveQueue.push({
206
+ type: 'error',
207
+ error: new TheoremError('bad_response', 'malformed Gemini Live message'),
208
+ });
209
+ return;
210
+ }
211
+ if (parsed.value.setupComplete)
212
+ return;
213
+ const apiError = readGeminiApiError(parsed.value);
214
+ if (apiError) {
215
+ liveQueue.push({ type: 'error', error: apiError, row: parsed.value });
216
+ return;
217
+ }
218
+ const events = foldGeminiLiveServerMessage(parsed.value, fold);
219
+ const warning = goAwayIn(events);
220
+ if (warning)
221
+ goAway = { ...warning, atMs: performance.now() };
222
+ const turnPhase = turnPhaseFromMessage(parsed.value, events);
223
+ liveQueue.push(events.length > 0 || turnPhase !== 'streaming'
224
+ ? { type: 'batch', events, turnPhase, row: parsed.value }
225
+ : { type: 'row', row: parsed.value });
226
+ }
227
+ catch (err) {
228
+ liveQueue.push({
229
+ type: 'error',
230
+ error: err instanceof Error ? err : new Error(String(err)),
231
+ });
232
+ }
233
+ };
234
+ ws.onerror = () => {
235
+ if (!liveQueue.isClosed()) {
236
+ liveQueue.push({
237
+ type: 'error',
238
+ error: new TheoremError('network', 'Gemini Live WebSocket error'),
239
+ });
240
+ }
241
+ };
242
+ ws.onclose = (evt) => {
243
+ if (!liveQueue.isClosed()) {
244
+ liveQueue.push({
245
+ type: 'closed',
246
+ code: evt.code,
247
+ reason: evt.reason,
248
+ ...(evt.code === NORMAL_CLOSE
249
+ ? {}
250
+ : { error: closeError(evt.code, evt.reason, 'session') }),
251
+ ...(goAway
252
+ ? {
253
+ goAway: {
254
+ ...(goAway.timeLeftMs !== undefined ? { timeLeftMs: goAway.timeLeftMs } : {}),
255
+ closedAfterMs: Math.round(performance.now() - goAway.atMs),
256
+ },
257
+ }
258
+ : {}),
259
+ });
260
+ liveQueue.close();
261
+ }
262
+ };
263
+ }
@@ -0,0 +1,3 @@
1
+ import type { ThinkingLevel } from '../../kernel/schema.js';
2
+ /** Refuses a thinking level Gemini does not take, rather than sending it. */
3
+ export declare function assertGoogleThinkingLevel(level: ThinkingLevel | undefined): void;
@@ -0,0 +1,8 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { GOOGLE_THINKING_LEVELS } from '../../presets/google-limits.js';
3
+ /** Refuses a thinking level Gemini does not take, rather than sending it. */
4
+ export function assertGoogleThinkingLevel(level) {
5
+ if (level && !GOOGLE_THINKING_LEVELS.includes(level)) {
6
+ throw new TheoremError('unsupported', `Gemini does not take the '${level}' thinking level (${GOOGLE_THINKING_LEVELS.join(', ')})`);
7
+ }
8
+ }
@@ -0,0 +1,6 @@
1
+ declare const INTERACTIONS_URL = "https://generativelanguage.googleapis.com/v1beta/interactions?alt=sse";
2
+ declare const INTERACTIONS_JSON_URL = "https://generativelanguage.googleapis.com/v1beta/interactions";
3
+ /** The models a key's project can call; paged with `pageToken`. */
4
+ declare const GEMINI_MODELS_URL = "https://generativelanguage.googleapis.com/v1beta/models";
5
+ declare const GEMINI_LIVE_WS_URL = "wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent";
6
+ export { GEMINI_LIVE_WS_URL, GEMINI_MODELS_URL, INTERACTIONS_JSON_URL, INTERACTIONS_URL };
@@ -0,0 +1,6 @@
1
+ const INTERACTIONS_URL = 'https://generativelanguage.googleapis.com/v1beta/interactions?alt=sse';
2
+ const INTERACTIONS_JSON_URL = 'https://generativelanguage.googleapis.com/v1beta/interactions';
3
+ /** The models a key's project can call; paged with `pageToken`. */
4
+ const GEMINI_MODELS_URL = 'https://generativelanguage.googleapis.com/v1beta/models';
5
+ const GEMINI_LIVE_WS_URL = 'wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent';
6
+ export { GEMINI_LIVE_WS_URL, GEMINI_MODELS_URL, INTERACTIONS_JSON_URL, INTERACTIONS_URL };
@@ -0,0 +1,7 @@
1
+ import type { TurnGroundingCount } from '../../kernel/types.js';
2
+ export declare function modalityCounts(raw: unknown, countKey: 'tokens' | 'tokenCount'): Record<string, number> | undefined;
3
+ export declare function byModality(input: Record<string, number> | undefined, output: Record<string, number> | undefined): {
4
+ input?: Record<string, number>;
5
+ output?: Record<string, number>;
6
+ } | undefined;
7
+ export declare function groundingCounts(raw: unknown): TurnGroundingCount[] | undefined;
@@ -0,0 +1,49 @@
1
+ /*
2
+ * Google usage lists, in the spellings the wire sends (probed 23/09/2026):
3
+ *
4
+ * - Interactions: `input_tokens_by_modality` / `output_tokens_by_modality`,
5
+ * `[{ modality: 'text', tokens }]`; `grounding_tool_count`,
6
+ * `[{ type, count, search_query_count }]`.
7
+ * - Live: `promptTokensDetails` / `responseTokensDetails`,
8
+ * `[{ modality: 'TEXT', tokenCount }]`.
9
+ *
10
+ * Both list only some modalities (Live listed 126 text of 144 prompt tokens;
11
+ * an image reply listed 1,120 image of 1,378 output tokens), so the shares
12
+ * are kept as reported and never filled to the total.
13
+ */
14
+ import { asRecord } from '../../kernel/engine/record.js';
15
+ import { usageCount } from '../../kernel/engine/usage.js';
16
+ export function modalityCounts(raw, countKey) {
17
+ if (!Array.isArray(raw))
18
+ return undefined;
19
+ const counts = {};
20
+ for (const entry of raw) {
21
+ const rec = asRecord(entry);
22
+ const count = usageCount(rec?.[countKey]);
23
+ if (typeof rec?.modality === 'string' && count !== undefined) {
24
+ const modality = rec.modality.toLowerCase();
25
+ counts[modality] = (counts[modality] ?? 0) + count;
26
+ }
27
+ }
28
+ return Object.keys(counts).length > 0 ? counts : undefined;
29
+ }
30
+ export function byModality(input, output) {
31
+ if (!input && !output)
32
+ return undefined;
33
+ return { ...(input ? { input } : {}), ...(output ? { output } : {}) };
34
+ }
35
+ export function groundingCounts(raw) {
36
+ if (!Array.isArray(raw))
37
+ return undefined;
38
+ const counts = raw.flatMap((entry) => {
39
+ const rec = asRecord(entry);
40
+ const count = usageCount(rec?.count);
41
+ if (typeof rec?.type !== 'string' || count === undefined)
42
+ return [];
43
+ const queries = usageCount(rec.search_query_count);
44
+ return [
45
+ { type: rec.type, count, ...(queries === undefined ? {} : { searchQueryCount: queries }) },
46
+ ];
47
+ });
48
+ return counts.length > 0 ? counts : undefined;
49
+ }
@@ -0,0 +1,12 @@
1
+ import type { ModelProvider, ProviderEvent } from '../../kernel/types.js';
2
+ import { buildChatMessages, wireTools } from '../openrouter/openai/compat.js';
3
+ import type { LocalTransport } from '../types.js';
4
+ export type PendingToolCall = {
5
+ id: string;
6
+ name: string;
7
+ args: string;
8
+ };
9
+ export declare function resolveBaseUrl(config: LocalTransport): string;
10
+ export declare function flushPending(pending: Map<number, PendingToolCall>): ProviderEvent[];
11
+ declare function createLocalProvider(config: LocalTransport): ModelProvider;
12
+ export { buildChatMessages as historyToWire, createLocalProvider, wireTools as toolsToWire };