@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,19 @@
1
+ import { type ProducedError } from '../../../guardrails/error.js';
2
+ import type { InteractionPart, ProviderCompleteRequest, ResolvedStructured, WireFunctionTool } from '../../../kernel/types.js';
3
+ /** The detail is the body's `error.message` (or raw text), so the upstream reason reaches traces. */
4
+ declare function httpErrorEvent(res: Response, label: string): Promise<ProducedError>;
5
+ interface GatewayHeaderConfig {
6
+ siteUrl?: string;
7
+ siteName?: string;
8
+ }
9
+ /** Text-only input collapses to one string; mixed input is a content-part array. */
10
+ export declare function wireMessageContent(parts: InteractionPart[]): unknown;
11
+ /** `includeSystem: false` when the caller passes system text separately (AI SDK `instructions`). */
12
+ declare function buildChatMessages(req: ProviderCompleteRequest, options?: {
13
+ includeSystem?: boolean;
14
+ }): Record<string, unknown>[];
15
+ declare function wireTools(wireTools?: WireFunctionTool[]): Record<string, unknown>[] | undefined;
16
+ declare function resolveResponseFormat(structured: ResolvedStructured | null): Record<string, unknown> | undefined;
17
+ declare function openAiGatewayHeaders(config: GatewayHeaderConfig): Record<string, string> | undefined;
18
+ export type { GatewayHeaderConfig };
19
+ export { buildChatMessages, httpErrorEvent, openAiGatewayHeaders, resolveResponseFormat, wireTools, };
@@ -0,0 +1,162 @@
1
+ import { kindOfHttpStatus, TheoremError, toErrorEvent, } from '../../../guardrails/error.js';
2
+ import { asRecord } from '../../../kernel/engine/record.js';
3
+ import { historyMessageParts, isMediaRefPart } from '../../../kernel/interaction-parts.js';
4
+ import { historyToolIdentity } from '../../shared/tool-args.js';
5
+ /** The detail is the body's `error.message` (or raw text), so the upstream reason reaches traces. */
6
+ async function httpErrorEvent(res, label) {
7
+ const text = (await res.text()).trim();
8
+ let detail = text;
9
+ try {
10
+ const message = asRecord(asRecord(JSON.parse(text))?.error)?.message;
11
+ if (typeof message === 'string' && message)
12
+ detail = message;
13
+ }
14
+ catch {
15
+ // Not JSON: the raw body is the detail.
16
+ }
17
+ const head = `${label} HTTP ${String(res.status)}`;
18
+ return toErrorEvent(new TheoremError(kindOfHttpStatus(res.status), detail ? `${head}: ${detail}` : head));
19
+ }
20
+ function rejectMediaRef(part) {
21
+ if (isMediaRefPart(part)) {
22
+ throw new TheoremError('unsupported', 'media references are not supported on openAi');
23
+ }
24
+ }
25
+ function wireAudioPart(part) {
26
+ let format = 'mp3';
27
+ if (part.mimeType.includes('wav')) {
28
+ format = 'wav';
29
+ }
30
+ return {
31
+ type: 'input_audio',
32
+ input_audio: {
33
+ data: part.data,
34
+ format,
35
+ },
36
+ };
37
+ }
38
+ /** Text-only input collapses to one string; mixed input is a content-part array. */
39
+ export function wireMessageContent(parts) {
40
+ const isAllText = parts.every((p) => p.type === 'text');
41
+ if (isAllText) {
42
+ return parts
43
+ .map((p) => {
44
+ if (p.type === 'text') {
45
+ return p.text;
46
+ }
47
+ return '';
48
+ })
49
+ .filter(Boolean)
50
+ .join('\n');
51
+ }
52
+ return parts.map((part) => {
53
+ if (part.type === 'text') {
54
+ return { type: 'text', text: part.text };
55
+ }
56
+ rejectMediaRef(part);
57
+ if (part.type === 'image') {
58
+ return {
59
+ type: 'image_url',
60
+ image_url: { url: `data:${part.mimeType};base64,${part.data}` },
61
+ };
62
+ }
63
+ if (part.type === 'audio') {
64
+ return wireAudioPart(part);
65
+ }
66
+ // video and document ride as a `file` part.
67
+ return {
68
+ type: 'file',
69
+ file: {
70
+ filename: part.type === 'video' ? 'clip.bin' : 'document.bin',
71
+ file_data: `data:${part.mimeType};base64,${part.data}`,
72
+ },
73
+ };
74
+ });
75
+ }
76
+ /** Assistant `tool_calls` are rebuilt to strip non-standard fields. */
77
+ function wireHistoryMessage(msg) {
78
+ const content = wireMessageContent(historyMessageParts(msg));
79
+ if (msg.role === 'tool') {
80
+ return {
81
+ role: 'tool',
82
+ ...historyToolIdentity({ tool_call_id: msg.tool_call_id, name: msg.name }),
83
+ content,
84
+ };
85
+ }
86
+ const wired = {
87
+ role: msg.role,
88
+ content,
89
+ };
90
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
91
+ wired.tool_calls = msg.tool_calls.map((tc) => ({
92
+ id: tc.id,
93
+ type: 'function',
94
+ function: { name: tc.function.name, arguments: tc.function.arguments },
95
+ }));
96
+ }
97
+ if (msg.name) {
98
+ wired.name = msg.name;
99
+ }
100
+ return wired;
101
+ }
102
+ /** `includeSystem: false` when the caller passes system text separately (AI SDK `instructions`). */
103
+ function buildChatMessages(req, options) {
104
+ const includeSystem = options?.includeSystem !== false;
105
+ const messages = [];
106
+ if (includeSystem && req.system) {
107
+ messages.push({ role: 'system', content: req.system });
108
+ }
109
+ if (req.history && req.history.length > 0) {
110
+ for (const h of req.history) {
111
+ messages.push(wireHistoryMessage(h));
112
+ }
113
+ }
114
+ if (req.input.length > 0) {
115
+ messages.push({
116
+ role: 'user',
117
+ content: wireMessageContent(req.input),
118
+ });
119
+ }
120
+ return messages;
121
+ }
122
+ function wireTools(wireTools) {
123
+ if (!wireTools || wireTools.length === 0) {
124
+ return undefined;
125
+ }
126
+ return wireTools.map((t) => ({
127
+ type: 'function',
128
+ function: {
129
+ name: t.name,
130
+ description: t.description,
131
+ parameters: t.parameters,
132
+ },
133
+ }));
134
+ }
135
+ /** OpenAI takes a schema name of at most 64 of `[A-Za-z0-9_-]` and refuses the call otherwise. */
136
+ function schemaName(id) {
137
+ return id.replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 64);
138
+ }
139
+ function resolveResponseFormat(structured) {
140
+ if (!structured) {
141
+ return undefined;
142
+ }
143
+ return {
144
+ type: 'json_schema',
145
+ json_schema: {
146
+ name: schemaName(structured.id),
147
+ strict: true,
148
+ schema: structured.jsonSchema,
149
+ },
150
+ };
151
+ }
152
+ function openAiGatewayHeaders(config) {
153
+ const headers = {};
154
+ if (config.siteUrl) {
155
+ headers['HTTP-Referer'] = config.siteUrl;
156
+ }
157
+ if (config.siteName) {
158
+ headers['X-Title'] = config.siteName;
159
+ }
160
+ return Object.keys(headers).length > 0 ? headers : undefined;
161
+ }
162
+ export { buildChatMessages, httpErrorEvent, openAiGatewayHeaders, resolveResponseFormat, wireTools, };
@@ -0,0 +1,9 @@
1
+ import type { ImageResponseFormat, InteractionMediaPart, InteractionMediaRefPart, InteractionPart, ProviderCompleteRequest } from '../../../kernel/types.js';
2
+ export declare function extractPromptText(input: InteractionPart[]): string;
3
+ export declare function outputFormatFromMime(mimeType: string): string;
4
+ export declare function wireInputReference(part: InteractionMediaPart | InteractionMediaRefPart): Record<string, unknown>;
5
+ /** Non-image media is refused, not dropped: a dropped file would leave the user believing the model saw it. */
6
+ export declare function wireInputReferences(input: InteractionPart[]): Record<string, unknown>[];
7
+ export declare function attachImagePins(payload: Record<string, unknown>, image: ImageResponseFormat): void;
8
+ export declare function buildImagesPayload(req: ProviderCompleteRequest): Record<string, unknown>;
9
+ export declare function imageToolParameters(image: ImageResponseFormat): Record<string, unknown>;
@@ -0,0 +1,115 @@
1
+ import { TheoremError } from '../../../guardrails/error.js';
2
+ import { isMediaRefPart } from '../../../kernel/interaction-parts.js';
3
+ export function extractPromptText(input) {
4
+ return input
5
+ .filter((part) => part.type === 'text')
6
+ .map((part) => (part.type === 'text' ? part.text : ''))
7
+ .join('\n')
8
+ .trim();
9
+ }
10
+ export function outputFormatFromMime(mimeType) {
11
+ const essence = mimeType.toLowerCase().replace(/^image\//, '');
12
+ if (essence === 'jpg') {
13
+ return 'jpeg';
14
+ }
15
+ if (essence === 'png' || essence === 'jpeg' || essence === 'webp') {
16
+ return essence;
17
+ }
18
+ return 'png';
19
+ }
20
+ const HTTP_URL = /^https?:\/\//i;
21
+ export function wireInputReference(part) {
22
+ const url = isMediaRefPart(part) ? part.uri : `data:${part.mimeType};base64,${part.data}`;
23
+ return { type: 'image_url', image_url: { url } };
24
+ }
25
+ /** Non-image media is refused, not dropped: a dropped file would leave the user believing the model saw it. */
26
+ export function wireInputReferences(input) {
27
+ const references = [];
28
+ for (const part of input) {
29
+ if (part.type === 'text') {
30
+ continue;
31
+ }
32
+ if (part.type !== 'image') {
33
+ throw new TheoremError('unsupported', `${part.mimeType} input is not supported on /images, which takes image references only`);
34
+ }
35
+ if (isMediaRefPart(part) && !HTTP_URL.test(part.uri)) {
36
+ throw new TheoremError('unsupported', 'only http(s) media references are supported on /images');
37
+ }
38
+ references.push(wireInputReference(part));
39
+ }
40
+ return references;
41
+ }
42
+ export function attachImagePins(payload, image) {
43
+ if (image.aspectRatio) {
44
+ payload.aspect_ratio = image.aspectRatio;
45
+ }
46
+ if (image.resolution) {
47
+ payload.resolution = image.resolution;
48
+ }
49
+ if (image.mimeType) {
50
+ payload.output_format = outputFormatFromMime(image.mimeType);
51
+ }
52
+ if (image.quality) {
53
+ payload.quality = image.quality;
54
+ }
55
+ if (image.background) {
56
+ payload.background = image.background;
57
+ }
58
+ if (image.n !== undefined) {
59
+ payload.n = image.n;
60
+ }
61
+ if (image.seed !== undefined) {
62
+ payload.seed = image.seed;
63
+ }
64
+ if (image.outputCompression !== undefined) {
65
+ payload.output_compression = image.outputCompression;
66
+ }
67
+ }
68
+ export function buildImagesPayload(req) {
69
+ if (!req.image) {
70
+ throw new Error('buildImagesPayload requires req.image');
71
+ }
72
+ const payload = {
73
+ model: req.apiId,
74
+ prompt: extractPromptText(req.input),
75
+ };
76
+ attachImagePins(payload, req.image);
77
+ const references = wireInputReferences(req.input);
78
+ if (references.length > 0) {
79
+ payload.input_references = references;
80
+ }
81
+ if (req.stream === false) {
82
+ payload.stream = false;
83
+ }
84
+ return payload;
85
+ }
86
+ export function imageToolParameters(image) {
87
+ const params = {};
88
+ if (image.mimeType) {
89
+ params.output_format = outputFormatFromMime(image.mimeType);
90
+ }
91
+ if (image.aspectRatio) {
92
+ params.aspect_ratio = image.aspectRatio;
93
+ }
94
+ if (image.resolution) {
95
+ params.resolution = image.resolution;
96
+ }
97
+ if (image.quality) {
98
+ params.quality = image.quality;
99
+ }
100
+ if (image.background) {
101
+ params.background = image.background;
102
+ }
103
+ if (image.outputCompression !== undefined) {
104
+ params.output_compression = image.outputCompression;
105
+ }
106
+ for (const [name, value] of [
107
+ ['n', image.n],
108
+ ['seed', image.seed],
109
+ ]) {
110
+ if (value !== undefined) {
111
+ throw new TheoremError('unsupported', `image.${name} is not supported with image.includeText`);
112
+ }
113
+ }
114
+ return params;
115
+ }
@@ -0,0 +1,10 @@
1
+ import type { ModelMessage } from 'ai';
2
+ import type { InteractionPart, ProviderCompleteRequest, TurnHistoryMessage } from '../../../kernel/types.js';
3
+ export declare function sdkPart(input: InteractionPart): Record<string, unknown>;
4
+ export declare function sdkContentFromParts(parts: InteractionPart[]): string | Array<Record<string, unknown>>;
5
+ export declare function toolResultMessage(msg: TurnHistoryMessage): ModelMessage;
6
+ export declare function assistantToolCallMessage(msg: TurnHistoryMessage): ModelMessage | null;
7
+ export declare function contentHistoryMessage(msg: TurnHistoryMessage): ModelMessage;
8
+ export declare function historyToSdk(msg: TurnHistoryMessage): ModelMessage | null;
9
+ /** Leaves `req.system` to the caller (`systemDelivery` in chat.ts). */
10
+ export declare function buildAiSdkMessages(req: ProviderCompleteRequest): ModelMessage[];
@@ -0,0 +1,99 @@
1
+ import { TheoremError } from '../../../guardrails/error.js';
2
+ import { historyMessageParts, isMediaRefPart } from '../../../kernel/interaction-parts.js';
3
+ import { historyToolArguments, historyToolIdentity } from '../../shared/tool-args.js';
4
+ function inlineMediaPart(part) {
5
+ if (isMediaRefPart(part)) {
6
+ throw new TheoremError('unsupported', 'media references are not supported on openAi');
7
+ }
8
+ return part;
9
+ }
10
+ export function sdkPart(input) {
11
+ if (input.type === 'text') {
12
+ return { type: 'text', text: input.text };
13
+ }
14
+ const part = inlineMediaPart(input);
15
+ return { type: 'file', mediaType: part.mimeType, data: part.data };
16
+ }
17
+ export function sdkContentFromParts(parts) {
18
+ if (parts.every((part) => part.type === 'text')) {
19
+ return parts
20
+ .map((part) => (part.type === 'text' ? part.text : ''))
21
+ .filter(Boolean)
22
+ .join('\n');
23
+ }
24
+ return parts.map(sdkPart);
25
+ }
26
+ export function toolResultMessage(msg) {
27
+ const parts = historyMessageParts(msg);
28
+ const content = sdkContentFromParts(parts);
29
+ const output = typeof content === 'string'
30
+ ? { type: 'text', value: content }
31
+ : {
32
+ type: 'content',
33
+ value: parts.map((input) => {
34
+ if (input.type === 'text') {
35
+ return { type: 'text', text: input.text };
36
+ }
37
+ const part = inlineMediaPart(input);
38
+ return {
39
+ type: 'file',
40
+ mediaType: part.mimeType,
41
+ data: { type: 'data', data: part.data },
42
+ };
43
+ }),
44
+ };
45
+ // AI SDK ToolModelMessage is a branded union; structural tool-result is correct at runtime.
46
+ return {
47
+ role: 'tool',
48
+ content: [
49
+ {
50
+ type: 'tool-result',
51
+ // The AI SDK rejects a missing id or name (`AI_InvalidPromptError`).
52
+ ...historyToolIdentity({ toolCallId: msg.tool_call_id, toolName: msg.name }),
53
+ output,
54
+ },
55
+ ],
56
+ };
57
+ }
58
+ export function assistantToolCallMessage(msg) {
59
+ if (!msg.tool_calls || msg.tool_calls.length === 0) {
60
+ return null;
61
+ }
62
+ const said = sdkContentFromParts(historyMessageParts(msg));
63
+ const lead = typeof said === 'string' ? (said ? [{ type: 'text', text: said }] : []) : said;
64
+ return {
65
+ role: 'assistant',
66
+ content: [
67
+ ...lead,
68
+ ...msg.tool_calls.map((call) => ({
69
+ type: 'tool-call',
70
+ toolCallId: call.id,
71
+ toolName: call.function.name,
72
+ input: historyToolArguments(call.function.arguments),
73
+ })),
74
+ ],
75
+ };
76
+ }
77
+ export function contentHistoryMessage(msg) {
78
+ return { role: msg.role, content: sdkContentFromParts(historyMessageParts(msg)) };
79
+ }
80
+ export function historyToSdk(msg) {
81
+ if (msg.role === 'tool') {
82
+ return toolResultMessage(msg);
83
+ }
84
+ return assistantToolCallMessage(msg) || contentHistoryMessage(msg);
85
+ }
86
+ /** Leaves `req.system` to the caller (`systemDelivery` in chat.ts). */
87
+ export function buildAiSdkMessages(req) {
88
+ const messages = [];
89
+ for (const msg of req.history ?? []) {
90
+ const wired = historyToSdk(msg);
91
+ if (wired) {
92
+ messages.push(wired);
93
+ }
94
+ }
95
+ if (req.input.length > 0) {
96
+ messages.push({ role: 'user', content: sdkContentFromParts(req.input) });
97
+ }
98
+ return messages;
99
+ }
@@ -0,0 +1,8 @@
1
+ import type { TurnResponse, TurnTokens } from '../../../kernel/types.js';
2
+ /**
3
+ * Chat Completions reports `prompt_tokens` / `completion_tokens`, the Images API
4
+ * `input_tokens` / `output_tokens`. Both already mean what OpenTelemetry means:
5
+ * completion includes reasoning and prompt includes cached tokens.
6
+ */
7
+ export declare function openAiUsageTokens(raw: unknown): TurnTokens | undefined;
8
+ export declare function openAiResponse(raw: Record<string, unknown>): TurnResponse | undefined;
@@ -0,0 +1,56 @@
1
+ import { asRecord, nonEmptyString } from '../../../kernel/engine/record.js';
2
+ import { reportedTokens, usageCount } from '../../../kernel/engine/usage.js';
3
+ function cost(usage) {
4
+ const usd = usageCount(usage.cost);
5
+ if (usd === undefined)
6
+ return undefined;
7
+ const upstreamUsd = usageCount(asRecord(usage.cost_details)?.upstream_inference_cost);
8
+ return { usd, ...(upstreamUsd === undefined ? {} : { upstreamUsd }) };
9
+ }
10
+ function detailCounts(details, keys) {
11
+ const counts = Object.entries(keys).flatMap(([key, modality]) => {
12
+ const count = usageCount(details?.[key]);
13
+ return count === undefined ? [] : [[modality, count]];
14
+ });
15
+ return counts.length > 0 ? Object.fromEntries(counts) : undefined;
16
+ }
17
+ /**
18
+ * OpenRouter's per-modality detail counts, as reported (probed 23/09/2026):
19
+ * prompt `audio_tokens` / `video_tokens` (no image count, even for an image
20
+ * input) and completion `image_tokens` / `audio_tokens`.
21
+ */
22
+ function modalityCounts(prompt, completion) {
23
+ const input = detailCounts(prompt, { audio_tokens: 'audio', video_tokens: 'video' });
24
+ const output = detailCounts(completion, { image_tokens: 'image', audio_tokens: 'audio' });
25
+ if (!input && !output)
26
+ return undefined;
27
+ return { ...(input ? { input } : {}), ...(output ? { output } : {}) };
28
+ }
29
+ /**
30
+ * Chat Completions reports `prompt_tokens` / `completion_tokens`, the Images API
31
+ * `input_tokens` / `output_tokens`. Both already mean what OpenTelemetry means:
32
+ * completion includes reasoning and prompt includes cached tokens.
33
+ */
34
+ export function openAiUsageTokens(raw) {
35
+ const usage = asRecord(raw);
36
+ if (!usage)
37
+ return undefined;
38
+ const prompt = asRecord(usage.prompt_tokens_details) ?? asRecord(usage.input_tokens_details);
39
+ const completion = asRecord(usage.completion_tokens_details);
40
+ return reportedTokens({
41
+ input: usageCount(usage.prompt_tokens) ?? usageCount(usage.input_tokens),
42
+ output: usageCount(usage.completion_tokens) ?? usageCount(usage.output_tokens),
43
+ thinking: usageCount(completion?.reasoning_tokens),
44
+ cached: usageCount(prompt?.cached_tokens),
45
+ cacheWrite: usageCount(prompt?.cache_write_tokens),
46
+ cost: cost(usage),
47
+ byModality: modalityCounts(prompt, completion),
48
+ });
49
+ }
50
+ export function openAiResponse(raw) {
51
+ const id = nonEmptyString(raw.id);
52
+ const model = nonEmptyString(raw.model);
53
+ if (!id && !model)
54
+ return undefined;
55
+ return { ...(id ? { id } : {}), ...(model ? { model } : {}) };
56
+ }
@@ -0,0 +1,3 @@
1
+ import type { KeySlot } from '../../kernel/types.js';
2
+ import type { OpenAiGatewayTransport } from '../types.js';
3
+ export declare function resolveOpenAiGatewayApiKey(config: OpenAiGatewayTransport, keySlot: KeySlot | undefined): string;
@@ -0,0 +1,8 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { requireKey } from '../shared/vault.js';
3
+ export function resolveOpenAiGatewayApiKey(config, keySlot) {
4
+ if (keySlot === undefined) {
5
+ throw new TheoremError('auth', 'an OpenRouter model must name a vault slot');
6
+ }
7
+ return requireKey(config.vault, keySlot);
8
+ }
@@ -0,0 +1,18 @@
1
+ import type { InteractionPart, ModelProvider, ProfileSpeechSpec, ProviderCompleteRequest, ProviderEvent } from '../../kernel/types.js';
2
+ import type { OpenAiGatewayTransport } from '../types.js';
3
+ export type SpeechProviderConfig = OpenAiGatewayTransport & {
4
+ /** Fallback when the profile does not pin `speech.voice`. */
5
+ voice?: string;
6
+ };
7
+ export declare function extractInputText(input: InteractionPart[]): string;
8
+ export declare function buildSpeechHeaders(apiKey: string, config: SpeechProviderConfig): Record<string, string>;
9
+ export declare function buildPayload(req: ProviderCompleteRequest, text: string, speech: ProfileSpeechSpec | undefined, configVoice?: string): Record<string, unknown>;
10
+ export declare function requestSpeech(apiKey: string, text: string, req: ProviderCompleteRequest, config: SpeechProviderConfig): Promise<Response>;
11
+ /**
12
+ * The response's `content-type` states the audio (probe 23/09/2026:
13
+ * `audio/pcm;rate=24000;channels=1` for `pcm`). Raw PCM with a stated rate is
14
+ * wrapped as WAV; anything else keeps its reported type.
15
+ */
16
+ export declare function yieldSpeechSuccess(rawBytes: Uint8Array, contentType: string | null): Generator<ProviderEvent>;
17
+ export declare function streamSpeech(req: ProviderCompleteRequest, config?: SpeechProviderConfig): AsyncGenerator<ProviderEvent>;
18
+ export declare function createSpeechProvider(config?: SpeechProviderConfig): ModelProvider;
@@ -0,0 +1,109 @@
1
+ import { TheoremError, toErrorEvent } from '../../guardrails/error.js';
2
+ import { bytesToBase64 } from '../../kernel/util/base64.js';
3
+ import { mimeEssence } from '../../kernel/util/mime.js';
4
+ import { pcmFormatFromMime, wrapPcmAsWav } from '../shared/pcm.js';
5
+ import { networkFetch } from '../shared/upstream-tap.js';
6
+ import { bearerFetch } from '../shared/vault.js';
7
+ import { httpErrorEvent, openAiGatewayHeaders } from './openai/compat.js';
8
+ import { resolveOpenAiGatewayApiKey } from './resolve-api-key.js';
9
+ const HTTP_OK = 200;
10
+ export function extractInputText(input) {
11
+ return input
12
+ .filter((p) => p.type === 'text')
13
+ .map((p) => (p.type === 'text' ? p.text : ''))
14
+ .join(' ')
15
+ .trim();
16
+ }
17
+ export function buildSpeechHeaders(apiKey, config) {
18
+ const headers = {
19
+ Authorization: `Bearer ${apiKey}`,
20
+ 'Content-Type': 'application/json',
21
+ };
22
+ const gateway = openAiGatewayHeaders(config);
23
+ if (gateway)
24
+ Object.assign(headers, gateway);
25
+ return headers;
26
+ }
27
+ export function buildPayload(req, text, speech, configVoice) {
28
+ const voice = speech?.voice ?? configVoice;
29
+ const payload = {
30
+ model: req.apiId,
31
+ input: text,
32
+ };
33
+ if (speech?.format) {
34
+ payload.response_format = speech.format;
35
+ }
36
+ if (voice) {
37
+ payload.voice = voice;
38
+ }
39
+ return payload;
40
+ }
41
+ export async function requestSpeech(apiKey, text, req, config) {
42
+ const fetchFn = bearerFetch(req, networkFetch(config.fetch ?? fetch), config.vault, apiKey);
43
+ const baseUrl = config.baseUrl?.replace(/\/+$/, '') ?? 'https://openrouter.ai/api/v1';
44
+ const url = `${baseUrl}/audio/speech`;
45
+ return await fetchFn(url, {
46
+ method: 'POST',
47
+ headers: buildSpeechHeaders(apiKey, config),
48
+ body: JSON.stringify(buildPayload(req, text, req.speech, config.voice)),
49
+ signal: req.signal,
50
+ });
51
+ }
52
+ /**
53
+ * The response's `content-type` states the audio (probe 23/09/2026:
54
+ * `audio/pcm;rate=24000;channels=1` for `pcm`). Raw PCM with a stated rate is
55
+ * wrapped as WAV; anything else keeps its reported type.
56
+ */
57
+ export function* yieldSpeechSuccess(rawBytes, contentType) {
58
+ const format = pcmFormatFromMime(contentType ?? '');
59
+ const media = format
60
+ ? { mimeType: 'audio/wav', data: bytesToBase64(wrapPcmAsWav(rawBytes, format)) }
61
+ : {
62
+ mimeType: mimeEssence(contentType ?? '') || 'application/octet-stream',
63
+ data: bytesToBase64(rawBytes),
64
+ };
65
+ yield { type: 'media', media };
66
+ // The endpoint answers whole or not at all: a body with audio completed.
67
+ yield { type: 'done', stop: { kind: 'completed' } };
68
+ }
69
+ export async function* streamSpeech(req, config = {}) {
70
+ let apiKey;
71
+ try {
72
+ apiKey = resolveOpenAiGatewayApiKey(config, req.keySlot);
73
+ }
74
+ catch (err) {
75
+ yield toErrorEvent(err);
76
+ return;
77
+ }
78
+ const text = extractInputText(req.input);
79
+ if (!text) {
80
+ yield toErrorEvent(new TheoremError('request', 'empty text for speech'));
81
+ return;
82
+ }
83
+ const res = await requestSpeech(apiKey, text, req, config);
84
+ if (res.status !== HTTP_OK) {
85
+ yield await httpErrorEvent(res, 'Speech');
86
+ return;
87
+ }
88
+ const arrayBuffer = await res.arrayBuffer();
89
+ const rawBytes = new Uint8Array(arrayBuffer);
90
+ const contentType = res.headers.get('content-type');
91
+ // The audio body as a tape row; the tape keeps its hash, not its bytes.
92
+ req.tapUpstream?.({
93
+ eventType: 'http_body',
94
+ mime_type: contentType ?? '',
95
+ data: bytesToBase64(rawBytes),
96
+ });
97
+ if (rawBytes.length === 0) {
98
+ yield toErrorEvent(new TheoremError('bad_response', 'no audio returned from speech'));
99
+ return;
100
+ }
101
+ for (const ev of yieldSpeechSuccess(rawBytes, contentType)) {
102
+ yield ev;
103
+ }
104
+ }
105
+ export function createSpeechProvider(config = {}) {
106
+ return {
107
+ complete: (req) => streamSpeech(req, config),
108
+ };
109
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * With `THEOREM_IMPORT_PROBE=1`, lets subprocess tests assert adapters stay unloaded
3
+ * until `complete` runs. Only `create-provider.ts` may call it.
4
+ */
5
+ export declare function markModuleLoad(label: string): void;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * With `THEOREM_IMPORT_PROBE=1`, lets subprocess tests assert adapters stay unloaded
3
+ * until `complete` runs. Only `create-provider.ts` may call it.
4
+ */
5
+ export function markModuleLoad(label) {
6
+ try {
7
+ const d = globalThis.Deno;
8
+ if (d?.env?.get('THEOREM_IMPORT_PROBE') === '1' && d.stdout?.writeSync) {
9
+ d.stdout.writeSync(new TextEncoder().encode(`LOADED:${label}\n`));
10
+ }
11
+ }
12
+ catch {
13
+ // Non-Deno runtime or missing --allow-env.
14
+ }
15
+ }
@@ -0,0 +1,4 @@
1
+ import type { BuiltinWire } from '../../kernel/tools/types.js';
2
+ import type { ProviderBuiltin } from '../../kernel/types.js';
3
+ declare function builtinWire(builtin: ProviderBuiltin, transport: keyof BuiltinWire): string;
4
+ export { builtinWire };
@@ -0,0 +1,9 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ function builtinWire(builtin, transport) {
3
+ const wire = builtin.wire[transport];
4
+ if (!wire) {
5
+ throw new TheoremError('config', `Builtin '${builtin.id}' has no wire.${transport}`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
6
+ }
7
+ return wire;
8
+ }
9
+ export { builtinWire };