@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,297 @@
1
+ import { isAbortError, TheoremError, toErrorEvent } from '../../../guardrails/error.js';
2
+ import { asRecord } from '../../../kernel/engine/record.js';
3
+ import { pcmMediaAsWav } from '../../shared/pcm.js';
4
+ import { foldResponse } from '../../shared/response-identity.js';
5
+ import { readSseChunks } from '../../shared/sse.js';
6
+ import { structuredEvent } from '../../shared/structured-output.js';
7
+ import { toolCallEvents } from '../../shared/tool-args.js';
8
+ import { readGeminiApiError, readNonOkError } from '../api-error.js';
9
+ import { groundingFromDelta } from '../grounding.js';
10
+ import { fetchGemini } from '../keys.js';
11
+ import { INTERACTIONS_JSON_URL, INTERACTIONS_URL } from '../urls.js';
12
+ import { toInteractionsBody } from './framing.js';
13
+ import { codeExecutionEvidence, eventsFromDelta, eventsFromInteractionEnd, eventsFromModelOutputStep, eventsFromThoughtStep, interactionResponse, isCodeExecutionType, isGoogleBuiltinStepType, rawStepEvidence, } from './steps.js';
14
+ const HTTP_OK = 200;
15
+ export function newStreamFold() {
16
+ return { text: '', steps: new Map(), sawMedia: false, sawDone: false };
17
+ }
18
+ function isMergedStepType(type) {
19
+ return type === 'function_call' || isCodeExecutionType(type) || isGoogleBuiltinStepType(type);
20
+ }
21
+ function nonEmptyString(value) {
22
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
23
+ }
24
+ /**
25
+ * Hold a thought's signature for the call that follows it. The model thinks
26
+ * once before a step's calls, so the signature arrives on a `thought` step:
27
+ * whole when buffered, as a `thought_signature` delta when streamed (probe
28
+ * 25/09/2026, gemini-3.1-flash-lite). Calls carried an empty `signature`.
29
+ */
30
+ function holdThoughtSignature(signature, fold) {
31
+ const held = nonEmptyString(signature);
32
+ if (held)
33
+ fold.thoughtSignature = held;
34
+ }
35
+ /**
36
+ * The signature a `function_call` replays with: its own when it carries a
37
+ * non-empty one, else the held thought's. The first call takes the held one;
38
+ * its siblings share that thought and carry none.
39
+ */
40
+ function takeThoughtSignature(step, fold) {
41
+ const signature = nonEmptyString(step.signature) ?? fold.thoughtSignature;
42
+ fold.thoughtSignature = undefined;
43
+ return signature;
44
+ }
45
+ export function eventsFromStep(step, fold) {
46
+ const type = String(step.type ?? '');
47
+ if (type === 'function_call') {
48
+ const id = typeof step.id === 'string' ? step.id : undefined;
49
+ const name = typeof step.name === 'string' ? step.name : '';
50
+ const thoughtSignature = takeThoughtSignature(step, fold);
51
+ return toolCallEvents({ id, name, thoughtSignature }, step.arguments);
52
+ }
53
+ if (isCodeExecutionType(type)) {
54
+ return [codeExecutionEvidence(step)];
55
+ }
56
+ if (isGoogleBuiltinStepType(type)) {
57
+ return [rawStepEvidence(step)];
58
+ }
59
+ if (type === 'thought') {
60
+ holdThoughtSignature(step.signature, fold);
61
+ return eventsFromThoughtStep(step);
62
+ }
63
+ if (type === 'model_output') {
64
+ return eventsFromModelOutputStep(step);
65
+ }
66
+ return [];
67
+ }
68
+ function stepIndex(payload) {
69
+ return typeof payload.index === 'number' ? payload.index : 0;
70
+ }
71
+ function foldStepStart(payload, fold) {
72
+ const step = asRecord(payload.step);
73
+ if (!step)
74
+ return;
75
+ const type = String(step.type ?? '');
76
+ if (type === 'thought') {
77
+ holdThoughtSignature(step.signature, fold);
78
+ }
79
+ if (isMergedStepType(type)) {
80
+ fold.steps.set(stepIndex(payload), { ...step });
81
+ }
82
+ }
83
+ function foldStepDelta(payload, fold) {
84
+ const delta = asRecord(payload.delta);
85
+ if (!delta) {
86
+ return [];
87
+ }
88
+ const open = fold.steps.get(stepIndex(payload));
89
+ if (!open) {
90
+ if (delta.type === 'thought_signature') {
91
+ holdThoughtSignature(delta.signature, fold);
92
+ }
93
+ return eventsFromDelta(delta);
94
+ }
95
+ if (delta.type === 'arguments_delta') {
96
+ // Replaces the `arguments: {}` placeholder from `step.start` with the streamed JSON string.
97
+ const sofar = typeof open.arguments === 'string' ? open.arguments : '';
98
+ open.arguments = sofar + (typeof delta.arguments === 'string' ? delta.arguments : '');
99
+ return [];
100
+ }
101
+ Object.assign(open, delta);
102
+ return [];
103
+ }
104
+ function foldStepStop(payload, fold) {
105
+ const index = stepIndex(payload);
106
+ const step = fold.steps.get(index);
107
+ if (!step) {
108
+ return [];
109
+ }
110
+ fold.steps.delete(index);
111
+ return eventsFromStep(step, fold);
112
+ }
113
+ function partialStepEvidence(step) {
114
+ const event = isCodeExecutionType(String(step.type ?? ''))
115
+ ? codeExecutionEvidence(step)
116
+ : rawStepEvidence(step);
117
+ return { ...event, evidence: { ...event.evidence, partial: true } };
118
+ }
119
+ export function openStepEvents(fold) {
120
+ const events = [...fold.steps.values()].map(partialStepEvidence);
121
+ fold.steps.clear();
122
+ return events;
123
+ }
124
+ function delivered(events, fold) {
125
+ return events.map((ev) => {
126
+ if (ev.type === 'done') {
127
+ fold.sawDone = true;
128
+ }
129
+ if (ev.type === 'text' && ev.text) {
130
+ fold.text += ev.text;
131
+ }
132
+ if (ev.type !== 'media' || !ev.media) {
133
+ return ev;
134
+ }
135
+ fold.sawMedia = true;
136
+ return { ...ev, media: pcmMediaAsWav(ev.media) };
137
+ });
138
+ }
139
+ function eventsFromStreamRow(payload, fold) {
140
+ if (payload.eventType === 'sse_unparsed') {
141
+ // Every observed Interactions row is a JSON object; anything else is a wire change.
142
+ return [
143
+ toErrorEvent(new TheoremError('bad_response', 'Interactions stream row was not a JSON object')),
144
+ ];
145
+ }
146
+ const apiError = readGeminiApiError(payload);
147
+ if (apiError) {
148
+ return [toErrorEvent(apiError)];
149
+ }
150
+ const events = groundingFromDelta(payload);
151
+ switch (payload.event_type) {
152
+ case 'step.start':
153
+ foldStepStart(payload, fold);
154
+ break;
155
+ case 'step.delta':
156
+ events.push(...foldStepDelta(payload, fold));
157
+ break;
158
+ case 'step.stop':
159
+ events.push(...foldStepStop(payload, fold));
160
+ break;
161
+ case 'interaction.created': {
162
+ const interaction = asRecord(payload.interaction);
163
+ if (interaction)
164
+ events.push(...identityEvents(interaction, fold));
165
+ break;
166
+ }
167
+ case 'interaction.completed': {
168
+ const interaction = asRecord(payload.interaction);
169
+ if (interaction) {
170
+ events.push(...identityEvents(interaction, fold), ...eventsFromInteractionEnd(interaction));
171
+ }
172
+ break;
173
+ }
174
+ }
175
+ return events;
176
+ }
177
+ function identityEvents(interaction, fold) {
178
+ const identity = foldResponse(fold.response, interactionResponse(interaction));
179
+ fold.response = identity.known;
180
+ return identity.event ? [identity.event] : [];
181
+ }
182
+ export function foldPayload(payload, fold) {
183
+ return delivered(eventsFromStreamRow(payload, fold), fold);
184
+ }
185
+ export function foldBody(body, fold) {
186
+ const steps = Array.isArray(body.steps) ? body.steps : [];
187
+ const fromSteps = steps.flatMap((value) => {
188
+ const step = asRecord(value);
189
+ return step ? eventsFromStep(step, fold) : [];
190
+ });
191
+ return delivered([...identityEvents(body, fold), ...fromSteps, ...eventsFromInteractionEnd(body)], fold);
192
+ }
193
+ export function* finalizeStructured(req, fold) {
194
+ if (!req.structured || !fold.text) {
195
+ return;
196
+ }
197
+ yield structuredEvent(fold.text);
198
+ }
199
+ export function isVoiceProfile(req) {
200
+ return Boolean(req.speech?.voice);
201
+ }
202
+ /** What the profile asked for and the model did not return; even an empty turn fails. */
203
+ export function missingMediaError(req, fold) {
204
+ if (fold.sawMedia)
205
+ return undefined;
206
+ if (isVoiceProfile(req)) {
207
+ return toErrorEvent(new TheoremError('bad_response', 'speech audio was not returned by the model'));
208
+ }
209
+ if (req.image) {
210
+ return toErrorEvent(new TheoremError('bad_response', 'no image returned from image generation'));
211
+ }
212
+ return undefined;
213
+ }
214
+ async function* parseInteractionsSse(response, req) {
215
+ if (!response.body) {
216
+ yield toErrorEvent(new TheoremError('bad_response', 'empty response body'));
217
+ return;
218
+ }
219
+ const fold = newStreamFold();
220
+ for await (const row of readSseChunks(response.body)) {
221
+ req.tapUpstream?.(row);
222
+ if (row.eventType === 'sse_done') {
223
+ break;
224
+ }
225
+ const events = foldPayload(row, fold);
226
+ yield* events;
227
+ if (events.some((ev) => ev.type === 'error')) {
228
+ yield* openStepEvents(fold);
229
+ return;
230
+ }
231
+ }
232
+ yield* openStepEvents(fold);
233
+ yield* finalizeStructured(req, fold);
234
+ const missing = missingMediaError(req, fold);
235
+ if (missing)
236
+ yield missing;
237
+ if (!fold.sawDone) {
238
+ // The stream ended before the interaction reported a status: it did not complete.
239
+ yield { type: 'done', stop: { kind: 'stream_incomplete' } };
240
+ }
241
+ }
242
+ async function postInteractions(url, req, transport) {
243
+ if (!req.keySlot) {
244
+ throw new TheoremError('config', 'Request requires keySlot');
245
+ }
246
+ const init = {
247
+ method: 'POST',
248
+ headers: { 'content-type': 'application/json' },
249
+ body: JSON.stringify(toInteractionsBody(req)),
250
+ signal: req.signal,
251
+ };
252
+ const response = await fetchGemini(url, init, req.keySlot, transport, req.tapUpstream, req.fallbackKeySlot);
253
+ if (response.status !== HTTP_OK) {
254
+ throw await readNonOkError(response);
255
+ }
256
+ return response;
257
+ }
258
+ async function* fetchInteractionsOnce(req, transport) {
259
+ const response = await postInteractions(INTERACTIONS_JSON_URL, req, transport);
260
+ const text = await response.text();
261
+ const parsed = JSON.parse(text);
262
+ const apiError = readGeminiApiError(parsed);
263
+ if (apiError) {
264
+ throw apiError;
265
+ }
266
+ req.tapUpstream?.(parsed);
267
+ const fold = newStreamFold();
268
+ yield* foldBody(parsed, fold);
269
+ yield* finalizeStructured(req, fold);
270
+ const missing = missingMediaError(req, fold);
271
+ if (missing)
272
+ yield missing;
273
+ }
274
+ async function* streamInteractions(req, transport) {
275
+ const response = await postInteractions(INTERACTIONS_URL, req, transport);
276
+ yield* parseInteractionsSse(response, req);
277
+ }
278
+ export function createInteractionsProvider(transport) {
279
+ return {
280
+ async *complete(req) {
281
+ try {
282
+ if (req.stream === false) {
283
+ yield* fetchInteractionsOnce(req, transport);
284
+ }
285
+ else {
286
+ yield* streamInteractions(req, transport);
287
+ }
288
+ }
289
+ catch (err) {
290
+ if (isAbortError(err)) {
291
+ throw err;
292
+ }
293
+ yield toErrorEvent(err);
294
+ }
295
+ },
296
+ };
297
+ }
@@ -0,0 +1,20 @@
1
+ import type { KeySlot, KeyVault, ProviderCompleteRequest } from '../../kernel/types.js';
2
+ /** A host's Gemini settings; keys come from the one vault. */
3
+ interface GeminiOptions {
4
+ wait?: (ms: number) => Promise<void>;
5
+ fetch?: typeof fetch;
6
+ }
7
+ interface GeminiTransport extends GeminiOptions {
8
+ vault: KeyVault;
9
+ }
10
+ export declare function waitDefault(ms: number): Promise<void>;
11
+ export declare function isTransientHttp(status: number): boolean;
12
+ export declare function isTransientThrown(err: unknown): boolean;
13
+ export declare function backoffMs(attempt: number): number;
14
+ export declare function withApiKey(init: RequestInit, apiKey: string): RequestInit;
15
+ /**
16
+ * Backs off on transient failures. A quota refusal retries once on the profile's fallback slot,
17
+ * when it names one; each try's slot is on the tape, so the trace shows the switch.
18
+ */
19
+ export declare function fetchGemini(url: string, init: RequestInit, slot: KeySlot, transport: GeminiTransport, tap?: ProviderCompleteRequest['tapUpstream'], fallbackSlot?: KeySlot): Promise<Response>;
20
+ export type { GeminiOptions, GeminiTransport };
@@ -0,0 +1,87 @@
1
+ import { isAbortError } from '../../guardrails/error.js';
2
+ import { networkError, tapFetch } from '../shared/upstream-tap.js';
3
+ import { fallbackKey, requireKey } from '../shared/vault.js';
4
+ const ATTEMPTS = 3;
5
+ const LAST_ATTEMPT = ATTEMPTS - 1;
6
+ const BACKOFF_FIRST_MS = 1000;
7
+ const BACKOFF_SECOND_MS = 2000;
8
+ const BACKOFF_THIRD_MS = 4000;
9
+ const BACKOFF_MS = [BACKOFF_FIRST_MS, BACKOFF_SECOND_MS, BACKOFF_THIRD_MS];
10
+ const HTTP_TIMEOUT = 408;
11
+ const HTTP_QUOTA = 429;
12
+ const HTTP_SERVER = 500;
13
+ const HTTP_BAD_GATEWAY = 502;
14
+ const HTTP_UNAVAILABLE = 503;
15
+ const HTTP_GATEWAY_TIMEOUT = 504;
16
+ const TRANSIENT_THROWN_RE = /name resolution|dns|econnreset|econnrefused|etimedout|network|fetch failed|temporarily unavailable|socket|503|502|504/i;
17
+ export function waitDefault(ms) {
18
+ return new Promise((resolve) => {
19
+ setTimeout(resolve, ms);
20
+ });
21
+ }
22
+ export function isTransientHttp(status) {
23
+ return (status === HTTP_TIMEOUT ||
24
+ status === HTTP_QUOTA ||
25
+ status === HTTP_SERVER ||
26
+ status === HTTP_BAD_GATEWAY ||
27
+ status === HTTP_UNAVAILABLE ||
28
+ status === HTTP_GATEWAY_TIMEOUT);
29
+ }
30
+ export function isTransientThrown(err) {
31
+ if (isAbortError(err)) {
32
+ return false;
33
+ }
34
+ return TRANSIENT_THROWN_RE.test(String(err));
35
+ }
36
+ export function backoffMs(attempt) {
37
+ return BACKOFF_MS[attempt] ?? BACKOFF_SECOND_MS;
38
+ }
39
+ export function withApiKey(init, apiKey) {
40
+ const headers = new Headers(init.headers);
41
+ headers.set('x-goog-api-key', apiKey);
42
+ if (!headers.has('Content-Type') && (init.method || 'GET').toUpperCase() !== 'GET') {
43
+ headers.set('Content-Type', 'application/json');
44
+ }
45
+ return { ...init, headers };
46
+ }
47
+ async function fetchWithBackoff(args) {
48
+ const wait = args.transport.wait ?? waitDefault;
49
+ const send = tapFetch(args.tap, args.transport.fetch ?? fetch, args.slot);
50
+ try {
51
+ const last = await send(args.href, withApiKey(args.init, args.apiKey));
52
+ if (!isTransientHttp(last.status) || args.attempt === LAST_ATTEMPT) {
53
+ return last;
54
+ }
55
+ if (args.init.signal?.aborted) {
56
+ throw args.init.signal.reason instanceof Error
57
+ ? args.init.signal.reason
58
+ : new DOMException('The operation was aborted.', 'AbortError');
59
+ }
60
+ await wait(backoffMs(args.attempt));
61
+ return fetchWithBackoff({ ...args, attempt: args.attempt + 1 });
62
+ }
63
+ catch (err) {
64
+ if (isAbortError(err) || !isTransientThrown(err) || args.attempt === LAST_ATTEMPT) {
65
+ throw networkError(err);
66
+ }
67
+ await wait(backoffMs(args.attempt));
68
+ return fetchWithBackoff({ ...args, attempt: args.attempt + 1 });
69
+ }
70
+ }
71
+ /**
72
+ * Backs off on transient failures. A quota refusal retries once on the profile's fallback slot,
73
+ * when it names one; each try's slot is on the tape, so the trace shows the switch.
74
+ */
75
+ export async function fetchGemini(url, init, slot, transport, tap, fallbackSlot) {
76
+ const parsed = new URL(url);
77
+ parsed.searchParams.delete('key');
78
+ const href = parsed.toString();
79
+ const primary = requireKey(transport.vault, slot);
80
+ const first = { href, init, transport, tap, attempt: 0 };
81
+ let last = await fetchWithBackoff({ ...first, apiKey: primary, slot });
82
+ const fallback = fallbackKey(fallbackSlot, transport.vault, primary);
83
+ if (last.status === HTTP_QUOTA && fallback) {
84
+ last = await fetchWithBackoff({ ...first, apiKey: fallback.key, slot: fallback.slot });
85
+ }
86
+ return last;
87
+ }
@@ -0,0 +1,51 @@
1
+ import type { InteractionPart, ProviderCompleteRequest, ProviderEvent, TurnHistoryMessage, TurnTokens, WireFunctionTool } from '../../../kernel/types.js';
2
+ export declare function buildGeminiLiveWebSocketUrl(apiKey: string): string;
3
+ export declare function wireFunctionDeclaration(decl: WireFunctionTool): Record<string, unknown>;
4
+ export declare function buildGeminiLiveSetupMessage(req: ProviderCompleteRequest): Record<string, unknown>;
5
+ export declare function buildGeminiLiveClientContent(history: TurnHistoryMessage[]): Record<string, unknown> | null;
6
+ export declare function buildGeminiLiveContext(text: string): Record<string, unknown>;
7
+ export declare function buildGeminiLiveRealtimeInput(input: InteractionPart): Record<string, unknown>;
8
+ export declare function liveFunctionResponsePayload(output: unknown): Record<string, unknown>;
9
+ export declare function buildGeminiLiveToolResponse(id: string, name: string, output: unknown): Record<string, unknown>;
10
+ export declare function buildGeminiLiveToolResponses(responses: Array<{
11
+ id: string;
12
+ name: string;
13
+ output: unknown;
14
+ }>): Record<string, unknown>;
15
+ /** What one outbound frame gives the model to read; setup and control frames give none. */
16
+ export declare function liveFrameInput(frame: Record<string, unknown>): TurnHistoryMessage[];
17
+ export type ParsedLiveMessage = {
18
+ ok: true;
19
+ value: Record<string, unknown>;
20
+ } | {
21
+ ok: false;
22
+ reason: 'empty' | 'malformed';
23
+ };
24
+ export declare function parseGeminiLiveMessage(raw: unknown): ParsedLiveMessage;
25
+ /**
26
+ * Live sends one usage row per model response, at its `turnComplete`, covering that
27
+ * response alone; the prompt count grows because each response re-reads the session.
28
+ * Probe (gemini-3.1-flash-live-preview, 22/09/2026): `thoughtsTokenCount` sits outside
29
+ * `responseTokenCount` and `totalTokenCount`, so it is added to output.
30
+ * `toolUsePromptTokenCount` (not seen in that probe) is added to input, as on Interactions.
31
+ */
32
+ export declare function extractLiveUsageTokens(metadata: Record<string, unknown>): TurnTokens | undefined;
33
+ export interface LiveFold {
34
+ /** Tool call names by id, for the cancel that names only ids. */
35
+ calls: Map<string, string>;
36
+ }
37
+ export declare function newLiveFold(): LiveFold;
38
+ /**
39
+ * `goAway.timeLeft` → milliseconds. It is a protobuf Duration, which JSON
40
+ * encodes as seconds with an `s` suffix (`"10s"`, `"1.5s"`).
41
+ */
42
+ export declare function parseGoAwayTimeLeftMs(timeLeft: unknown): number | undefined;
43
+ export type LiveInteractionStatus = 'IN_PROGRESS' | 'IDLE';
44
+ /**
45
+ * `serverContent.interactionStatus`, sent beside `turnComplete` by models that
46
+ * keep working after a turn (gemini-3.8-live-extended-thinking, probe
47
+ * 23/09/2026: `IN_PROGRESS` on each intermediate `turnComplete` of a tool
48
+ * flow, `IDLE` on the last).
49
+ */
50
+ export declare function readLiveInteractionStatus(message: Record<string, unknown>): LiveInteractionStatus | undefined;
51
+ export declare function foldGeminiLiveServerMessage(message: Record<string, unknown> | null | undefined, fold: LiveFold): ProviderEvent[];