@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Google / Gemini convenience preset.
3
+ *
4
+ * @module
5
+ */
6
+ import "../../_dnt.polyfills.js";
7
+ import { registerTools } from '../kernel/default-scope.js';
8
+ import { GOOGLE_SPEECH_VOICES } from './google/speech-voices.js';
9
+ import { GOOGLE_SPEECH_FORMATS, GOOGLE_THINKING_LEVELS, googleEfforts, } from './google-limits.js';
10
+ /** The image MIME types a Gemini profile can take as input. */
11
+ const GOOGLE_IMAGE_INPUT_MIMES = [
12
+ 'image/png',
13
+ 'image/jpeg',
14
+ 'image/webp',
15
+ 'image/heic',
16
+ 'image/heif',
17
+ ];
18
+ /** The audio MIME types a Gemini profile can take as voice input. */
19
+ const GOOGLE_VOICE_INPUT_MIMES = ['audio/webm', 'audio/wav', 'audio/mpeg', 'audio/mp4'];
20
+ /**
21
+ * TTS models that reject any history with a model turn, so compaction's summary fails them
22
+ * (live, 29/09/2026).
23
+ */
24
+ const GOOGLE_SINGLE_TURN_API_IDS = [
25
+ 'gemini-2.5-flash-preview-tts',
26
+ 'gemini-3.1-flash-tts-preview',
27
+ 'gemini-3.8-flash-tts',
28
+ 'gemini-3.8-flash-lite-tts',
29
+ ];
30
+ /**
31
+ * Models that reject any thinking setting, `summaries: false` included: leave
32
+ * `efforts` and `summaries` unset (live, 30/09/2026).
33
+ */
34
+ const GOOGLE_NO_THINKING_API_IDS = [
35
+ 'gemini-2.5-flash-image',
36
+ 'antigravity-preview-05-2026',
37
+ 'antigravity-preview-09-2026',
38
+ 'antigravity-preview-latest',
39
+ ];
40
+ /**
41
+ * Models that refuse a thinking level and take `summaries`: leave `efforts` unset
42
+ * (live, 01/10/2026: Live closes 1007 "Thinking level is not supported for this model";
43
+ * 04/10/2026: setup takes `includeThoughts` either way).
44
+ */
45
+ const GOOGLE_NO_EFFORT_API_IDS = ['gemini-3.8-live'];
46
+ /**
47
+ * Models that refuse a session without a thinking level: pin `efforts`
48
+ * (live, 01/10/2026: Live closes 1007 "Thinking level must be specified for this model").
49
+ */
50
+ const GOOGLE_THINKING_REQUIRED_API_IDS = ['gemini-3.8-live-extended-thinking'];
51
+ const grounding = (googleSearch, googleMaps) => ({
52
+ googleSearch,
53
+ googleMaps,
54
+ });
55
+ /**
56
+ * Models with a non-zero free-tier quota, and the grounding each allows (AI Studio, Sep 2026).
57
+ * No model keeps free Maps quota: 3.5 Flash-Lite turns with Maps are refused as over quota
58
+ * (live, 13/10/2026).
59
+ * A builtin with no quota is refused as if over quota: on Live, a close 1011 "You exceeded your
60
+ * current quota" at setup, whatever the key's usage (live, 01/10/2026).
61
+ */
62
+ const GOOGLE_FREE_TIER_GROUNDING = {
63
+ 'gemini-2.5-flash-lite': grounding(true, false),
64
+ 'gemini-2.5-flash': grounding(true, false),
65
+ 'gemini-2.5-flash-preview-tts': grounding(true, false),
66
+ 'gemini-3-flash-preview': grounding(false, false),
67
+ 'gemini-3.1-flash-lite': grounding(false, false),
68
+ 'gemini-3.1-flash-lite-image': grounding(false, false),
69
+ 'gemini-3.1-flash-tts-preview': grounding(false, false),
70
+ 'gemini-3.5-flash-lite': grounding(false, false),
71
+ 'gemini-3.5-flash': grounding(false, false),
72
+ 'gemini-3.6-flash': grounding(false, false),
73
+ 'gemini-3.7-flash': grounding(false, false),
74
+ 'gemini-3.8-flash-tts': grounding(false, false),
75
+ 'gemini-3.8-flash-lite-tts': grounding(false, false),
76
+ 'gemma-4-26b-a4b-it': grounding(false, false),
77
+ 'gemma-4-31b-it': grounding(false, false),
78
+ 'gemini-3.1-flash-live-preview': grounding(false, false),
79
+ 'gemini-3.8-live': grounding(false, false),
80
+ 'gemini-3.8-live-extended-thinking': grounding(false, false),
81
+ };
82
+ /** Grounding builtins the free tier allows on `apiId`; none for a model with no free quota. */
83
+ function googleFreeTierBuiltins(apiId) {
84
+ const allowed = GOOGLE_FREE_TIER_GROUNDING[apiId.trim()];
85
+ if (!allowed)
86
+ return [];
87
+ return ['googleSearch', 'googleMaps'].filter((id) => allowed[id]);
88
+ }
89
+ function pinsEffort(binding) {
90
+ return Object.keys(binding.efforts ?? {}).length > 0;
91
+ }
92
+ /**
93
+ * The first setting Google would refuse on this binding, or `undefined`. With `freeTier`, it
94
+ * also holds the binding to the free-tier table: a listed model, and only the grounding its
95
+ * quota allows.
96
+ */
97
+ function googleBindingViolation(binding, options = {}) {
98
+ const apiId = binding.apiId.trim();
99
+ const noThinking = GOOGLE_NO_THINKING_API_IDS;
100
+ const noEffort = GOOGLE_NO_EFFORT_API_IDS;
101
+ const thinkingRequired = GOOGLE_THINKING_REQUIRED_API_IDS;
102
+ if ((noThinking.includes(apiId) || noEffort.includes(apiId)) && pinsEffort(binding)) {
103
+ return {
104
+ field: 'efforts',
105
+ message: `${apiId} takes no thinking level; leave efforts unset.`,
106
+ };
107
+ }
108
+ if (noThinking.includes(apiId) && binding.summaries !== undefined) {
109
+ return {
110
+ field: 'summaries',
111
+ message: `${apiId} takes no thinking setting; leave summaries unset.`,
112
+ };
113
+ }
114
+ if (thinkingRequired.includes(apiId) && !pinsEffort(binding)) {
115
+ return { field: 'efforts', message: `${apiId} needs a thinking level; pin efforts.` };
116
+ }
117
+ if (!options.freeTier)
118
+ return undefined;
119
+ if (!GOOGLE_FREE_TIER_GROUNDING[apiId]) {
120
+ return { field: 'apiId', message: `${apiId} has no free-tier quota.` };
121
+ }
122
+ const allowed = googleFreeTierBuiltins(apiId);
123
+ for (const builtin of binding.builtInTools ?? []) {
124
+ if ((builtin === 'googleSearch' || builtin === 'googleMaps') && !allowed.includes(builtin)) {
125
+ return { field: 'builtInTools', message: `${apiId} has no free-tier quota for ${builtin}.` };
126
+ }
127
+ }
128
+ return undefined;
129
+ }
130
+ /** The aspect ratios a Gemini image model can return. */
131
+ const GOOGLE_IMAGE_ASPECT_RATIOS = [
132
+ '1:1',
133
+ '3:2',
134
+ '2:3',
135
+ '3:4',
136
+ '4:3',
137
+ '4:5',
138
+ '5:4',
139
+ '9:16',
140
+ '16:9',
141
+ '21:9',
142
+ ];
143
+ /** The resolutions a Gemini image model can return. */
144
+ const GOOGLE_IMAGE_RESOLUTIONS = ['1K', '2K', '4K'];
145
+ /** What a Gemini image model can be asked to return. */
146
+ const GOOGLE_IMAGE_OUTPUT_MIMES = ['image/png', 'image/jpeg'];
147
+ /** The tools Gemini runs itself, as `builtin` tool definitions. */
148
+ const GOOGLE_BUILTIN_TOOLS = [
149
+ {
150
+ type: 'builtin',
151
+ name: 'googleSearch',
152
+ description: 'Google Search grounding',
153
+ category: 'grounding',
154
+ access: 'read-only',
155
+ paths: ['*'],
156
+ loadTier: 'T0',
157
+ permission: 'auto',
158
+ },
159
+ {
160
+ type: 'builtin',
161
+ name: 'googleMaps',
162
+ description: 'Google Maps grounding',
163
+ category: 'grounding',
164
+ access: 'read-only',
165
+ paths: ['*'],
166
+ loadTier: 'T0',
167
+ permission: 'auto',
168
+ // why: Google refuses a request that carries Maps with Search or URL context.
169
+ conflictsWith: ['googleSearch', 'urlContext'],
170
+ },
171
+ {
172
+ type: 'builtin',
173
+ name: 'urlContext',
174
+ description: 'Fetch URL context',
175
+ category: 'grounding',
176
+ access: 'read-only',
177
+ paths: ['*'],
178
+ loadTier: 'T0',
179
+ permission: 'auto',
180
+ },
181
+ {
182
+ type: 'builtin',
183
+ name: 'codeExecution',
184
+ description: 'Google code execution',
185
+ category: 'grounding',
186
+ access: 'read-only',
187
+ paths: ['*'],
188
+ loadTier: 'T0',
189
+ permission: 'auto',
190
+ },
191
+ ];
192
+ /** Registers into the default scope; a scope of its own takes `GOOGLE_BUILTIN_TOOLS`. */
193
+ function registerGooglePreset() {
194
+ registerTools(GOOGLE_BUILTIN_TOOLS);
195
+ }
196
+ export { GEMINI_MODELS_URL } from '../providers/google/urls.js';
197
+ export { GOOGLE_BUILTIN_TOOLS, GOOGLE_FREE_TIER_GROUNDING, GOOGLE_IMAGE_ASPECT_RATIOS, GOOGLE_IMAGE_INPUT_MIMES, GOOGLE_IMAGE_OUTPUT_MIMES, GOOGLE_IMAGE_RESOLUTIONS, GOOGLE_NO_EFFORT_API_IDS, GOOGLE_NO_THINKING_API_IDS, GOOGLE_SINGLE_TURN_API_IDS, GOOGLE_SPEECH_FORMATS, GOOGLE_SPEECH_VOICES, GOOGLE_THINKING_LEVELS, GOOGLE_THINKING_REQUIRED_API_IDS, GOOGLE_VOICE_INPUT_MIMES, googleBindingViolation, googleEfforts, googleFreeTierBuiltins, registerGooglePreset, };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Local model convenience preset.
3
+ *
4
+ * @module
5
+ */
6
+ import type { ModelBinding } from '../kernel/types.js';
7
+ /**
8
+ * Whether an Ollama model thinks, read from the server's `POST /api/show` reply for it:
9
+ * `capabilities` lists `thinking` (Ollama 0.34.0, 04/10/2026). The host fetches the reply.
10
+ */
11
+ declare function ollamaModelThinks(show: unknown): boolean;
12
+ /** A local binding field its model would refuse, and what is wrong with it. */
13
+ interface LocalBindingViolation {
14
+ field: 'efforts';
15
+ message: string;
16
+ }
17
+ /**
18
+ * The first setting a local server would refuse on this binding, or `undefined`. A thinking
19
+ * level goes to the server as `reasoning_effort`; Ollama answers HTTP 400 "does not support
20
+ * thinking" for a model that does not think (04/10/2026).
21
+ */
22
+ declare function localBindingViolation(binding: Pick<ModelBinding, 'apiId' | 'efforts'>, model: {
23
+ thinks: boolean;
24
+ }): LocalBindingViolation | undefined;
25
+ export type { LocalBindingViolation };
26
+ export { localBindingViolation, ollamaModelThinks };
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Local model convenience preset.
3
+ *
4
+ * @module
5
+ */
6
+ /**
7
+ * Whether an Ollama model thinks, read from the server's `POST /api/show` reply for it:
8
+ * `capabilities` lists `thinking` (Ollama 0.34.0, 04/10/2026). The host fetches the reply.
9
+ */
10
+ function ollamaModelThinks(show) {
11
+ if (!show || typeof show !== 'object')
12
+ return false;
13
+ const { capabilities } = show;
14
+ return Array.isArray(capabilities) && capabilities.includes('thinking');
15
+ }
16
+ /**
17
+ * The first setting a local server would refuse on this binding, or `undefined`. A thinking
18
+ * level goes to the server as `reasoning_effort`; Ollama answers HTTP 400 "does not support
19
+ * thinking" for a model that does not think (04/10/2026).
20
+ */
21
+ function localBindingViolation(binding, model) {
22
+ if (!model.thinks && Object.keys(binding.efforts ?? {}).length > 0) {
23
+ return {
24
+ field: 'efforts',
25
+ message: `${binding.apiId.trim()} does not think; leave efforts unset.`,
26
+ };
27
+ }
28
+ return undefined;
29
+ }
30
+ export { localBindingViolation, ollamaModelThinks };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Host-convenience catalogs for first-party providers: provider builtins and media vocabularies.
3
+ *
4
+ * @module
5
+ */
6
+ import "../../_dnt.polyfills.js";
7
+ export type { GoogleBindingViolation, GoogleFreeTierGrounding, GoogleImageAspectRatio, GoogleImageInputMime, GoogleImageOutputMime, GoogleImagePins, GoogleImageResolution, GoogleSpeechVoice, GoogleThinkingLevel, GoogleVoiceInputMime, } from './google.js';
8
+ export { GOOGLE_BUILTIN_TOOLS, GOOGLE_FREE_TIER_GROUNDING, GOOGLE_IMAGE_ASPECT_RATIOS, GOOGLE_IMAGE_INPUT_MIMES, GOOGLE_IMAGE_OUTPUT_MIMES, GOOGLE_IMAGE_RESOLUTIONS, GOOGLE_NO_EFFORT_API_IDS, GOOGLE_NO_THINKING_API_IDS, GOOGLE_SINGLE_TURN_API_IDS, GOOGLE_SPEECH_FORMATS, GOOGLE_SPEECH_VOICES, GOOGLE_THINKING_LEVELS, GOOGLE_THINKING_REQUIRED_API_IDS, GOOGLE_VOICE_INPUT_MIMES, googleBindingViolation, googleEfforts, googleFreeTierBuiltins, registerGooglePreset, } from './google.js';
9
+ export type { LocalBindingViolation } from './local.js';
10
+ export { localBindingViolation, ollamaModelThinks } from './local.js';
11
+ export { OPENROUTER_BUILTIN_TOOLS, OPENROUTER_IMAGES_IGNORED_INPUTS, OPENROUTER_IMAGES_INPUT_MIMES, registerOpenRouterPreset, } from './openrouter.js';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Host-convenience catalogs for first-party providers: provider builtins and media vocabularies.
3
+ *
4
+ * @module
5
+ */
6
+ import "../../_dnt.polyfills.js";
7
+ export { GOOGLE_BUILTIN_TOOLS, GOOGLE_FREE_TIER_GROUNDING, GOOGLE_IMAGE_ASPECT_RATIOS, GOOGLE_IMAGE_INPUT_MIMES, GOOGLE_IMAGE_OUTPUT_MIMES, GOOGLE_IMAGE_RESOLUTIONS, GOOGLE_NO_EFFORT_API_IDS, GOOGLE_NO_THINKING_API_IDS, GOOGLE_SINGLE_TURN_API_IDS, GOOGLE_SPEECH_FORMATS, GOOGLE_SPEECH_VOICES, GOOGLE_THINKING_LEVELS, GOOGLE_THINKING_REQUIRED_API_IDS, GOOGLE_VOICE_INPUT_MIMES, googleBindingViolation, googleEfforts, googleFreeTierBuiltins, registerGooglePreset, } from './google.js';
8
+ export { localBindingViolation, ollamaModelThinks } from './local.js';
9
+ export { OPENROUTER_BUILTIN_TOOLS, OPENROUTER_IMAGES_IGNORED_INPUTS, OPENROUTER_IMAGES_INPUT_MIMES, registerOpenRouterPreset, } from './openrouter.js';
@@ -0,0 +1,26 @@
1
+ /**
2
+ * OpenRouter convenience preset.
3
+ *
4
+ * @module
5
+ */
6
+ /** `/images` takes image references only; a profile on it lists nothing wider in `inputs.attachments.accept`. */
7
+ declare const OPENROUTER_IMAGES_INPUT_MIMES: readonly ["image/*"];
8
+ /**
9
+ * What `/images` never sends the model: it reads the prompt text and the reference images
10
+ * only. The chat path (`image.includeText`) sends the system prompt and history.
11
+ */
12
+ declare const OPENROUTER_IMAGES_IGNORED_INPUTS: readonly ["system", "history"];
13
+ /** The tools OpenRouter runs itself, as `builtin` tool definitions. */
14
+ declare const OPENROUTER_BUILTIN_TOOLS: {
15
+ type: "builtin";
16
+ name: string;
17
+ description: string;
18
+ category: string;
19
+ access: "read-only";
20
+ paths: string[];
21
+ loadTier: "T0";
22
+ permission: "auto";
23
+ }[];
24
+ /** Registers into the default scope; a scope of its own takes `OPENROUTER_BUILTIN_TOOLS`. */
25
+ declare function registerOpenRouterPreset(): void;
26
+ export { OPENROUTER_BUILTIN_TOOLS, OPENROUTER_IMAGES_IGNORED_INPUTS, OPENROUTER_IMAGES_INPUT_MIMES, registerOpenRouterPreset, };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * OpenRouter convenience preset.
3
+ *
4
+ * @module
5
+ */
6
+ import { registerTools } from '../kernel/default-scope.js';
7
+ /** `/images` takes image references only; a profile on it lists nothing wider in `inputs.attachments.accept`. */
8
+ const OPENROUTER_IMAGES_INPUT_MIMES = ['image/*'];
9
+ /**
10
+ * What `/images` never sends the model: it reads the prompt text and the reference images
11
+ * only. The chat path (`image.includeText`) sends the system prompt and history.
12
+ */
13
+ const OPENROUTER_IMAGES_IGNORED_INPUTS = ['system', 'history'];
14
+ /** The tools OpenRouter runs itself, as `builtin` tool definitions. */
15
+ const OPENROUTER_BUILTIN_TOOLS = [
16
+ {
17
+ type: 'builtin',
18
+ name: 'webSearch',
19
+ description: 'OpenRouter web search',
20
+ category: 'grounding',
21
+ access: 'read-only',
22
+ paths: ['*'],
23
+ loadTier: 'T0',
24
+ permission: 'auto',
25
+ },
26
+ ];
27
+ /** Registers into the default scope; a scope of its own takes `OPENROUTER_BUILTIN_TOOLS`. */
28
+ function registerOpenRouterPreset() {
29
+ registerTools(OPENROUTER_BUILTIN_TOOLS);
30
+ }
31
+ export { OPENROUTER_BUILTIN_TOOLS, OPENROUTER_IMAGES_IGNORED_INPUTS, OPENROUTER_IMAGES_INPUT_MIMES, registerOpenRouterPreset, };
@@ -0,0 +1,7 @@
1
+ import type { ModelBinding } from '../kernel/protocols/binding.js';
2
+ import type { EmbeddingModelLimits, Protocol } from '../kernel/protocols/protocol.js';
3
+ /**
4
+ * What a binding's embedding model takes, read from its protocol: one Theorem ships, or one of
5
+ * `protocols`. Undefined when neither has it, and the kernel then holds requests to the profile alone.
6
+ */
7
+ export declare function embeddingModelLimits(binding: Pick<ModelBinding, 'protocol' | 'apiId'>, protocols?: readonly Protocol[]): EmbeddingModelLimits | undefined;
@@ -0,0 +1,12 @@
1
+ import { geminiEmbedding } from './gemini/embedding-protocol.js';
2
+ import { ollamaEmbedding } from './local/embedding-protocol.js';
3
+ import { openRouterEmbedding } from './openrouter/embedding-protocol.js';
4
+ const SHIPPED = [geminiEmbedding, openRouterEmbedding, ollamaEmbedding];
5
+ /**
6
+ * What a binding's embedding model takes, read from its protocol: one Theorem ships, or one of
7
+ * `protocols`. Undefined when neither has it, and the kernel then holds requests to the profile alone.
8
+ */
9
+ export function embeddingModelLimits(binding, protocols = []) {
10
+ const protocol = [...protocols, ...SHIPPED].find((entry) => entry.id === binding.protocol);
11
+ return protocol?.embeddingLimits?.(binding.apiId);
12
+ }
@@ -0,0 +1,8 @@
1
+ import type { Protocol } from '../../kernel/protocols/protocol.js';
2
+ /** What a `geminiEmbedding` binding sets in `options`. */
3
+ export interface GeminiEmbeddingOptions {
4
+ /** For `gemini-embedding-001`; Gemini Embedding 2 refuses it and reads the request's `task` from the text. */
5
+ taskType?: 'RETRIEVAL_QUERY' | 'RETRIEVAL_DOCUMENT' | 'SEMANTIC_SIMILARITY' | 'CLASSIFICATION' | 'CLUSTERING' | 'QUESTION_ANSWERING' | 'FACT_VERIFICATION' | 'CODE_RETRIEVAL_QUERY';
6
+ outputDimensionality?: 768 | 1536 | 3072;
7
+ }
8
+ export declare const geminiEmbedding: Protocol<GeminiEmbeddingOptions>;
@@ -0,0 +1,125 @@
1
+ import { z } from 'zod';
2
+ import { defineProtocol, modelOptions } from '../../kernel/protocols/mod.js';
3
+ function task(value, title, description) {
4
+ return z.literal(value).meta({ title, description });
5
+ }
6
+ const options = z.strictObject({
7
+ // why: Labels and descriptions are Google's own task-type table (ai.google.dev/gemini-api/docs/embeddings), so a studio can show them.
8
+ taskType: z
9
+ .union([
10
+ task('RETRIEVAL_QUERY', 'Retrieval query', 'Embeddings optimized for general search queries. Pair with Retrieval document for the documents searched.'),
11
+ task('RETRIEVAL_DOCUMENT', 'Retrieval document', 'Embeddings optimized for document search, such as indexing articles, books or web pages.'),
12
+ task('SEMANTIC_SIMILARITY', 'Semantic similarity', 'Embeddings optimized to assess text similarity, such as for recommendations or duplicate detection.'),
13
+ task('CLASSIFICATION', 'Classification', 'Embeddings optimized to classify texts according to preset labels, such as sentiment or spam.'),
14
+ task('CLUSTERING', 'Clustering', 'Embeddings optimized to cluster texts based on their similarities.'),
15
+ task('QUESTION_ANSWERING', 'Question answering', 'Embeddings for questions, optimized for finding documents that answer them. Pair with Retrieval document.'),
16
+ task('FACT_VERIFICATION', 'Fact verification', 'Embeddings for statements to verify, optimized for retrieving evidence that supports or refutes them. Pair with Retrieval document.'),
17
+ task('CODE_RETRIEVAL_QUERY', 'Code retrieval query', 'Embeddings optimized for finding code blocks from natural language queries. Pair with Retrieval document for the code.'),
18
+ ])
19
+ .optional()
20
+ .describe("What the vectors will be used for, so Google tunes them to it. Only gemini-embedding-001 takes it; later models read the request's task from the text. Absent: no tuning."),
21
+ outputDimensionality: z
22
+ .union([z.literal(768), z.literal(1536), z.literal(3072)])
23
+ .optional()
24
+ .describe('How many numbers each vector holds. A shorter vector is cheaper to store and compare and a little less precise. Absent: the 3072 the model returns.'),
25
+ });
26
+ /** Models that take the task as `taskType`. Later ones (Gemini Embedding 2 on) refuse the field and read the task from the text. */
27
+ const TASK_FIELD_MODELS = /^(gemini-embedding-001|text-embedding-|embedding-)/;
28
+ // why: ai.google.dev/gemini-api/docs/embeddings gives 6 images and 1 PDF per input, and duration caps (not counts) for audio and video; a batch of 101 inputs is refused (checked 2026-10-19).
29
+ const MULTIMODAL = {
30
+ maxInputs: 100,
31
+ media: [
32
+ { accept: ['image/png', 'image/jpeg'], maxPerInput: 6 },
33
+ { accept: ['application/pdf'], maxPerInput: 1 },
34
+ { accept: ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/x-wav'] },
35
+ { accept: ['video/mp4', 'video/quicktime'] },
36
+ ],
37
+ };
38
+ const TEXT_ONLY = { maxInputs: 100, media: [] };
39
+ const TASK_TYPES = {
40
+ query: 'RETRIEVAL_QUERY',
41
+ document: 'RETRIEVAL_DOCUMENT',
42
+ };
43
+ // why: The formats Google gives for Gemini Embedding 2 search (ai.google.dev/gemini-api/docs/embeddings); it advises leaving input with media unprefixed.
44
+ function withTask(text, task) {
45
+ return task === 'query' ? `task: search result | query: ${text}` : `title: none | text: ${text}`;
46
+ }
47
+ function parts(input, task) {
48
+ const list = typeof input === 'string' ? [{ type: 'text', text: input }] : input.parts;
49
+ const textOnly = list.every((part) => part.type === 'text');
50
+ return list.map((part, at) => {
51
+ if (part.type === 'text')
52
+ return { text: task && textOnly && at === 0 ? withTask(part.text, task) : part.text };
53
+ if (part.type === 'media') {
54
+ return { inlineData: { mimeType: part.mimeType, data: part.data } };
55
+ }
56
+ return { fileData: { mimeType: part.mimeType, fileUri: part.uri } };
57
+ });
58
+ }
59
+ function values(row) {
60
+ const embedding = row.embedding;
61
+ const values = embedding && typeof embedding === 'object'
62
+ ? embedding.values
63
+ : undefined;
64
+ return Array.isArray(values)
65
+ ? values.filter((value) => typeof value === 'number')
66
+ : [];
67
+ }
68
+ function requestBody(input, parsed, shape) {
69
+ const body = {
70
+ content: { parts: parts(input, shape.taskField ? undefined : shape.task) },
71
+ };
72
+ const taskType = shape.taskField && shape.task ? TASK_TYPES[shape.task] : parsed.taskType;
73
+ if (taskType)
74
+ body.taskType = taskType;
75
+ if (parsed.outputDimensionality)
76
+ body.outputDimensionality = parsed.outputDimensionality;
77
+ return body;
78
+ }
79
+ export const geminiEmbedding = defineProtocol({
80
+ id: 'geminiEmbedding',
81
+ name: 'Gemini Embeddings',
82
+ description: "Google's embedding API for text and supported media.",
83
+ endpoints: { embedding: '/models/{apiId}:embedContent' },
84
+ options,
85
+ embeddingLimits: (apiId) => (TASK_FIELD_MODELS.test(apiId) ? TEXT_ONLY : MULTIMODAL),
86
+ // why: Gemini Embedding 2 reads the task from the text and refuses the field; the request's `task` says it.
87
+ refusedOptions: (apiId) => (TASK_FIELD_MODELS.test(apiId) ? [] : ['taskType']),
88
+ create(context) {
89
+ return {
90
+ async embed(request) {
91
+ const parsed = modelOptions(geminiEmbedding, context.apiId, request.options);
92
+ const taskField = TASK_FIELD_MODELS.test(context.apiId);
93
+ const shape = { taskField, ...(request.task ? { task: request.task } : {}) };
94
+ const inputs = Array.isArray(request.input) ? request.input : [request.input];
95
+ const body = inputs.length === 1
96
+ ? requestBody(inputs[0], parsed, shape)
97
+ : {
98
+ requests: inputs.map((input) => ({
99
+ model: `models/${context.apiId}`,
100
+ ...requestBody(input, parsed, shape),
101
+ })),
102
+ };
103
+ const path = inputs.length === 1
104
+ ? `/models/${encodeURIComponent(context.apiId)}:embedContent`
105
+ : `/models/${encodeURIComponent(context.apiId)}:batchEmbedContents`;
106
+ let row;
107
+ for await (const current of context.send(body, { stream: false, path }))
108
+ row = current;
109
+ const raw = Array.isArray(row?.embeddings)
110
+ ? row.embeddings
111
+ : row?.embedding
112
+ ? [row.embedding]
113
+ : [];
114
+ return {
115
+ model: context.apiId,
116
+ embeddings: raw.map((item, index) => ({
117
+ index,
118
+ values: item && typeof item === 'object' ? values({ embedding: item }) : [],
119
+ dimensions: item && typeof item === 'object' ? values({ embedding: item }).length : 0,
120
+ })),
121
+ };
122
+ },
123
+ };
124
+ },
125
+ });
@@ -0,0 +1,8 @@
1
+ import { type Protocol } from '../../kernel/protocols/mod.js';
2
+ /** What a `geminiInteractions` binding sets in `options`. */
3
+ export interface GeminiInteractionsOptions {
4
+ store?: boolean;
5
+ persistViaInteractionId?: boolean;
6
+ }
7
+ /** Gemini's Interactions API: text, images, and speech, all at `/interactions`. */
8
+ export declare const geminiInteractions: Protocol<GeminiInteractionsOptions>;
@@ -0,0 +1,105 @@
1
+ import { z } from 'zod';
2
+ import { kindOfHttpStatus, TheoremError } from '../../guardrails/error.js';
3
+ import { asRecord } from '../../kernel/engine/record.js';
4
+ import { jsonObjectSchema } from '../../kernel/json.js';
5
+ import { defineProtocol, } from '../../kernel/protocols/mod.js';
6
+ import { readGeminiApiError } from '../google/api-error.js';
7
+ import { googleBuiltins } from '../google/builtins.js';
8
+ import { thoughtSignature, toInteractionsBody, } from '../google/interactions/framing.js';
9
+ import { finalizeStructured, foldBody, foldPayload, missingMediaError, newStreamFold, openStepEvents, } from '../google/interactions/stream.js';
10
+ import { asProtocolEvent } from '../shared/protocol-events.js';
11
+ const state = z.strictObject({ interactionId: z.string().min(1) });
12
+ const options = z
13
+ .strictObject({
14
+ store: z
15
+ .boolean()
16
+ .optional()
17
+ .describe('Whether Google keeps the interaction. Off, nothing is stored server-side.'), // labels-exempt: builder field description, read by the studio and docs
18
+ persistViaInteractionId: z.boolean().optional().describe('Continue from the stored interaction instead of sending the conversation again. Needs store.'),
19
+ })
20
+ .refine((value) => !value.persistViaInteractionId || value.store !== false, 'persistViaInteractionId needs store');
21
+ function wireRequest(context, request) {
22
+ const history = request.history ?? [];
23
+ const previous = context.options.persistViaInteractionId
24
+ ? request.state?.interactionId
25
+ : undefined;
26
+ const builtins = googleBuiltins(request.builtins);
27
+ const wire = {
28
+ ...request,
29
+ apiId: context.apiId,
30
+ history,
31
+ builtins,
32
+ state: undefined,
33
+ tapUpstream: undefined,
34
+ store: context.options.store,
35
+ previousInteractionId: previous,
36
+ continuation: previous
37
+ ? [
38
+ ...history.slice(request.stateHistoryLength ?? 0),
39
+ ...request.input.map((part) => ({ role: 'user', parts: [part] })),
40
+ ]
41
+ : undefined,
42
+ };
43
+ const body = jsonObjectSchema.parse(JSON.parse(JSON.stringify(toInteractionsBody(wire))));
44
+ return { wire, body, wroteTools: builtins.map((builtin) => builtin.id) };
45
+ }
46
+ /** The shared reader's events as protocol events; the `done` waits for the end, with the state to keep. */
47
+ function asProtocolEvents(events, reply, persist) {
48
+ return events.flatMap((event) => {
49
+ if (event.type !== 'done') {
50
+ const converted = asProtocolEvent(event);
51
+ return converted ? [converted] : [];
52
+ }
53
+ const { interactionId, ...done } = event;
54
+ reply.done = {
55
+ ...done,
56
+ ...(persist && interactionId ? { state: { interactionId } } : {}),
57
+ };
58
+ return [];
59
+ });
60
+ }
61
+ /** Gemini's Interactions API: text, images, and speech, all at `/interactions`. */
62
+ export const geminiInteractions = defineProtocol({
63
+ id: 'geminiInteractions',
64
+ name: 'Gemini Interactions',
65
+ description: "Google's Interactions API for Gemini: text, images and speech at one endpoint.", // labels-exempt: builder field description, read by the studio and docs
66
+ endpoints: { text: '/interactions', image: '/interactions', speech: '/interactions' },
67
+ options,
68
+ continuation: { version: 1, schema: state, keyOptions: ['store', 'persistViaInteractionId'] },
69
+ reasoning: thoughtSignature,
70
+ error(failure) {
71
+ const kind = kindOfHttpStatus(failure.status);
72
+ const record = asRecord(failure.body);
73
+ const stated = record ? readGeminiApiError(record) : null;
74
+ return new TheoremError(stated?.kind === 'auth' ? 'auth' : kind, stated?.message ?? `Gemini HTTP ${failure.status}`);
75
+ },
76
+ create(context) {
77
+ return {
78
+ async *complete(request) {
79
+ const { wire, body, wroteTools } = wireRequest(context, request);
80
+ const stream = request.stream !== false;
81
+ const persist = Boolean(context.options.persistViaInteractionId);
82
+ const reply = { fold: newStreamFold() };
83
+ const init = { stream, wroteTools, ...(stream ? { path: '/interactions?alt=sse' } : {}) };
84
+ for await (const row of context.send(body, init)) {
85
+ // why: an error row before any output is thrown, so the kernel can fall back to the other key.
86
+ const failed = readGeminiApiError(row);
87
+ if (failed)
88
+ throw failed;
89
+ const events = stream ? foldPayload(row, reply.fold) : foldBody(row, reply.fold);
90
+ yield* asProtocolEvents(events, reply, persist);
91
+ if (events.some((event) => event.type === 'error')) {
92
+ yield* asProtocolEvents(openStepEvents(reply.fold), reply, persist);
93
+ return;
94
+ }
95
+ }
96
+ yield* asProtocolEvents(openStepEvents(reply.fold), reply, persist);
97
+ yield* asProtocolEvents([...finalizeStructured(wire, reply.fold)], reply, persist);
98
+ const missing = missingMediaError(wire, reply.fold);
99
+ if (missing)
100
+ yield* asProtocolEvents([missing], reply, persist);
101
+ yield reply.done ?? { type: 'done', stop: { kind: 'stream_incomplete' } };
102
+ },
103
+ };
104
+ },
105
+ });
@@ -0,0 +1,3 @@
1
+ import { type Protocol } from '../../kernel/protocols/mod.js';
2
+ /** Gemini Live: a spoken session over one WebSocket. */
3
+ export declare const geminiLive: Protocol<Record<string, never>>;