@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,82 @@
1
+ import { z } from 'zod';
2
+ import { TheoremError } from '../../guardrails/error.js';
3
+ import { asRecord, nonEmptyString } from '../../kernel/engine/record.js';
4
+ import { defineProtocol, } from '../../kernel/protocols/mod.js';
5
+ import { turnStopFromOpenAiFinishReason } from '../../kernel/stop.js';
6
+ import { imagesFromChatMessage, imagesFromImagesBody, OPENROUTER_IMAGE_TOOL } from './image.js';
7
+ import { buildChatMessages } from './openai/compat.js';
8
+ import { buildImagesPayload, extractPromptText, imageToolParameters, } from './openai/image-payload.js';
9
+ import { openAiUsageTokens } from './openai/usage.js';
10
+ function json(value) {
11
+ return JSON.parse(JSON.stringify(value));
12
+ }
13
+ function tokens(row) {
14
+ const counted = openAiUsageTokens(row.usage);
15
+ return counted ? [{ type: 'tokens', tokens: counted }] : [];
16
+ }
17
+ function noImage() {
18
+ return new TheoremError('bad_response', 'no image returned from image generation');
19
+ }
20
+ /** `/images`: the picture alone, answered whole. */
21
+ async function* images(context, request) {
22
+ const body = json(buildImagesPayload({ ...request, apiId: context.apiId }));
23
+ for await (const row of context.send(body, { stream: false })) {
24
+ const media = imagesFromImagesBody(row);
25
+ if (!media.length)
26
+ throw noImage();
27
+ for (const item of media)
28
+ yield { type: 'media', media: item };
29
+ yield* tokens(row);
30
+ // why: the endpoint answers whole or not at all: a body with images completed.
31
+ yield { type: 'done', stop: { kind: 'completed' } };
32
+ }
33
+ }
34
+ /** Text with the picture: Chat Completions with OpenRouter's image tool, on the chat path. */
35
+ async function* withText(context, request, image) {
36
+ const body = json({
37
+ model: context.apiId,
38
+ stream: false,
39
+ provider: { require_parameters: true },
40
+ messages: buildChatMessages(request),
41
+ temperature: request.temperature,
42
+ max_tokens: request.maxOutputTokens,
43
+ ...(request.thinking ? { reasoning: { effort: request.thinking } } : {}),
44
+ tools: [{ type: OPENROUTER_IMAGE_TOOL, parameters: imageToolParameters(image) }],
45
+ });
46
+ for await (const row of context.send(body, { stream: false, path: '/chat/completions' })) {
47
+ const choice = asRecord(Array.isArray(row.choices) ? row.choices[0] : undefined);
48
+ const message = asRecord(choice?.message);
49
+ const text = nonEmptyString(message?.content);
50
+ if (text)
51
+ yield { type: 'text', text };
52
+ const media = message ? imagesFromChatMessage(message) : [];
53
+ if (!media.length)
54
+ throw noImage();
55
+ for (const item of media)
56
+ yield { type: 'media', media: item };
57
+ yield* tokens(row);
58
+ const finish = typeof choice?.finish_reason === 'string' ? choice.finish_reason : undefined;
59
+ const native = typeof choice?.native_finish_reason === 'string' ? choice.native_finish_reason : undefined;
60
+ yield { type: 'done', stop: turnStopFromOpenAiFinishReason(finish, native) };
61
+ }
62
+ }
63
+ /** OpenRouter's image generation: `/images`, or the chat path with its image tool when text is wanted too. */
64
+ export const openRouterImages = defineProtocol({
65
+ id: 'openRouterImages',
66
+ name: 'OpenRouter Images',
67
+ description: "OpenRouter's image generation, with or without text beside the picture.", // labels-exempt: builder field description, read by the studio and docs
68
+ endpoints: { image: '/images' },
69
+ options: z.strictObject({}),
70
+ create(context) {
71
+ return {
72
+ complete(request) {
73
+ const image = request.image;
74
+ if (!image)
75
+ throw new TheoremError('request', 'missing image response format');
76
+ if (!extractPromptText(request.input))
77
+ throw new TheoremError('request', 'empty text for image generation');
78
+ return image.includeText ? withText(context, request, image) : images(context, request);
79
+ },
80
+ };
81
+ },
82
+ });
@@ -0,0 +1,19 @@
1
+ import { type ProducedError } from '../../../guardrails/error.js';
2
+ import type { InteractionPart, ModelRequest, 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: Pick<ModelRequest, 'system' | 'history' | 'input'>, 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 { withCarriedToolFiles } from '../../shared/carried-tool-files.js';
5
+ import { historyToolIdentity } from '../../shared/tool-args.js';
6
+ /** The detail is the body's `error.message` (or raw text), so the upstream reason reaches traces. */
7
+ async function httpErrorEvent(res, label) {
8
+ const text = (await res.text()).trim();
9
+ let detail = text;
10
+ try {
11
+ const message = asRecord(asRecord(JSON.parse(text))?.error)?.message;
12
+ if (typeof message === 'string' && message)
13
+ detail = message;
14
+ }
15
+ catch {
16
+ // why: Not JSON: the raw body is the detail.
17
+ }
18
+ const head = `${label} HTTP ${String(res.status)}`;
19
+ return toErrorEvent(new TheoremError(kindOfHttpStatus(res.status), detail ? `${head}: ${detail}` : head));
20
+ }
21
+ function rejectMediaRef(part) {
22
+ if (isMediaRefPart(part)) {
23
+ throw new TheoremError('unsupported', 'media references are not supported on openAi');
24
+ }
25
+ }
26
+ function wireAudioPart(part) {
27
+ let format = 'mp3';
28
+ if (part.mimeType.includes('wav')) {
29
+ format = 'wav';
30
+ }
31
+ return {
32
+ type: 'input_audio',
33
+ input_audio: {
34
+ data: part.data,
35
+ format,
36
+ },
37
+ };
38
+ }
39
+ /** Text-only input collapses to one string; mixed input is a content-part array. */
40
+ export function wireMessageContent(parts) {
41
+ const isAllText = parts.every((p) => p.type === 'text');
42
+ if (isAllText) {
43
+ return parts
44
+ .map((p) => {
45
+ if (p.type === 'text') {
46
+ return p.text;
47
+ }
48
+ return '';
49
+ })
50
+ .filter(Boolean)
51
+ .join('\n');
52
+ }
53
+ return parts.map((part) => {
54
+ if (part.type === 'text') {
55
+ return { type: 'text', text: part.text };
56
+ }
57
+ rejectMediaRef(part);
58
+ if (part.type === 'image') {
59
+ return {
60
+ type: 'image_url',
61
+ image_url: { url: `data:${part.mimeType};base64,${part.data}` },
62
+ };
63
+ }
64
+ if (part.type === 'audio') {
65
+ return wireAudioPart(part);
66
+ }
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
+ // why: A PDF inside a `role: 'tool'` message was accepted and never read, and was read from the user message after it; a photo inside one was read (live, 13/10/2026, google/gemini-3.5-flash-lite).
103
+ const TOOL_MESSAGE_PART_TYPES = new Set(['text', 'image']);
104
+ /** `includeSystem: false` when the caller passes system text separately (AI SDK `instructions`). */
105
+ function buildChatMessages(req, options) {
106
+ const includeSystem = options?.includeSystem !== false;
107
+ const messages = [];
108
+ if (includeSystem && req.system) {
109
+ messages.push({ role: 'system', content: req.system });
110
+ }
111
+ for (const h of withCarriedToolFiles(req.history ?? [], TOOL_MESSAGE_PART_TYPES)) {
112
+ messages.push(wireHistoryMessage(h));
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, ModelRequest } 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: ModelRequest): 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,2 @@
1
+ import { type JsonObject } from '../../../kernel/json.js';
2
+ export declare function collectReasoning(row: Record<string, unknown>, details: Map<string, JsonObject>): string;
@@ -0,0 +1,31 @@
1
+ import { jsonObjectSchema } from '../../../kernel/json.js';
2
+ import { isRecord } from '../../../kernel/util/record.js';
3
+ export function collectReasoning(row, details) {
4
+ let content = '';
5
+ for (const choice of Array.isArray(row.choices) ? row.choices : []) {
6
+ if (!isRecord(choice))
7
+ continue;
8
+ const delta = isRecord(choice.delta)
9
+ ? choice.delta
10
+ : isRecord(choice.message)
11
+ ? choice.message
12
+ : undefined;
13
+ if (!delta)
14
+ continue;
15
+ if (typeof delta.reasoning === 'string')
16
+ content += delta.reasoning;
17
+ else if (typeof delta.reasoning_content === 'string')
18
+ content += delta.reasoning_content;
19
+ for (const raw of Array.isArray(delta.reasoning_details) ? delta.reasoning_details : []) {
20
+ const detail = jsonObjectSchema.parse(raw);
21
+ const key = JSON.stringify([detail.index ?? detail.id ?? details.size, detail.type]);
22
+ const previous = details.get(key);
23
+ const merged = { ...previous, ...detail };
24
+ for (const field of ['text', 'summary', 'data'])
25
+ if (previous && typeof previous[field] === 'string' && typeof detail[field] === 'string')
26
+ merged[field] = previous[field] + detail[field];
27
+ details.set(key, merged);
28
+ }
29
+ }
30
+ return content;
31
+ }
@@ -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,8 @@
1
+ import { type Protocol } from '../../kernel/protocols/mod.js';
2
+ import type { CacheSpec } from '../../kernel/types.js';
3
+ /** What an `openRouter` binding sets in `options`. */
4
+ export interface OpenRouterOptions {
5
+ cache?: CacheSpec;
6
+ }
7
+ /** Chat Completions with OpenRouter's caching, routing, web search, citations, and reasoning. */
8
+ export declare const openRouter: Protocol<OpenRouterOptions>;
@@ -0,0 +1,171 @@
1
+ import { z } from 'zod';
2
+ import { asRecord } from '../../kernel/engine/record.js';
3
+ import { jsonObjectSchema } from '../../kernel/json.js';
4
+ import { extendProtocol } from '../../kernel/protocols/mod.js';
5
+ import { CACHE_MODES, CACHE_TTLS } from '../../kernel/schema.js';
6
+ import { openAi } from '../open-ai/protocol.js';
7
+ import { collectReasoning } from './openai/reasoning-state.js';
8
+ // labels-exempt: builder field description, read by the studio and docs
9
+ const cache = z
10
+ .strictObject({
11
+ mode: z
12
+ .enum(CACHE_MODES)
13
+ .describe('What is cached: the whole request (`automatic`) or the system instruction only (`system`).'),
14
+ ttl: z
15
+ .enum(CACHE_TTLS)
16
+ .optional()
17
+ .describe('How long the cache is kept. Absent: the upstream default.'),
18
+ })
19
+ .describe('Prompt caching, for models that support it.');
20
+ /** What OpenRouter's reasoning comes back as, to be sent back word for word. */
21
+ const reasoning = z.strictObject({
22
+ details: z.array(jsonObjectSchema),
23
+ content: z.string().optional(),
24
+ });
25
+ function cacheControl(spec) {
26
+ return spec.ttl ? { type: 'ephemeral', ttl: spec.ttl } : { type: 'ephemeral' };
27
+ }
28
+ function callIds(message) {
29
+ const calls = asRecord(message)?.tool_calls;
30
+ return Array.isArray(calls) ? calls.map((call) => String(asRecord(call)?.id)) : [];
31
+ }
32
+ /** Puts the reasoning OpenRouter wrote back on the assistant message it came with, matched by its calls. */
33
+ function replay(messages, history) {
34
+ for (const message of messages) {
35
+ const ids = callIds(message);
36
+ if (message.role !== 'assistant' || !ids.length)
37
+ continue;
38
+ const source = history.find((item) => item.role === 'assistant' &&
39
+ JSON.stringify((item.tool_calls ?? []).map((call) => call.id)) === JSON.stringify(ids));
40
+ const data = (source?.reasoning ?? [])
41
+ .map((item) => reasoning.safeParse(item.data))
42
+ .find((parsed) => parsed.success);
43
+ if (!data?.success)
44
+ continue;
45
+ message.reasoning_details = data.data.details;
46
+ if (data.data.content)
47
+ message.reasoning = data.data.content;
48
+ }
49
+ }
50
+ function strings(value) {
51
+ return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
52
+ }
53
+ /** Where OpenRouter puts plain citation lists: the row, its metadata, and each choice. */
54
+ function citedUris(row) {
55
+ const meta = (record) => [
56
+ record?.citations,
57
+ asRecord(record?.providerMetadata)?.citations,
58
+ asRecord(record?.provider_metadata)?.citations,
59
+ ];
60
+ const openrouter = asRecord(row.openrouter);
61
+ const choices = Array.isArray(row.choices) ? row.choices.map(asRecord) : [];
62
+ return [
63
+ ...meta(row),
64
+ ...meta(openrouter),
65
+ ...meta(asRecord(openrouter?.providerMetadata)),
66
+ ...meta(asRecord(openrouter?.provider_metadata)),
67
+ ...choices.flatMap((choice) => [
68
+ ...meta(asRecord(choice?.message)),
69
+ ...meta(asRecord(choice?.delta)),
70
+ ]),
71
+ ].flatMap(strings);
72
+ }
73
+ /** Annotations other than URL citations (which the base reads), from the row and its choices. */
74
+ function otherAnnotations(row) {
75
+ const choices = Array.isArray(row.choices) ? row.choices.map(asRecord) : [];
76
+ const lists = [
77
+ row.annotations,
78
+ asRecord(row.openrouter)?.annotations,
79
+ ...choices.flatMap((choice) => [
80
+ asRecord(choice?.message)?.annotations,
81
+ asRecord(choice?.delta)?.annotations,
82
+ ]),
83
+ ];
84
+ return lists
85
+ .flatMap((list) => (Array.isArray(list) ? list : []))
86
+ .filter((item) => asRecord(item)?.type !== 'url_citation');
87
+ }
88
+ function thinking(row) {
89
+ const choices = Array.isArray(row.choices) ? row.choices : [];
90
+ return choices
91
+ .map((choice) => asRecord(asRecord(choice)?.delta)?.thinking)
92
+ .filter((text) => typeof text === 'string')
93
+ .join('');
94
+ }
95
+ /** Chat Completions with OpenRouter's caching, routing, web search, citations, and reasoning. */
96
+ export const openRouter = extendProtocol(openAi, {
97
+ id: 'openRouter',
98
+ name: 'OpenRouter Chat Completions',
99
+ description: "Chat Completions with OpenRouter's caching, routing, web search, citations and reasoning.", // labels-exempt: builder field description, read by the studio and docs
100
+ options: z.strictObject({ cache: cache.optional() }),
101
+ reasoning,
102
+ body(body, at) {
103
+ // why: its fields are Chat Completions ones; a speech request goes as openAi sends it.
104
+ if (at.profileType !== 'text')
105
+ return { body };
106
+ const out = { ...body, provider: { require_parameters: true } };
107
+ if (out.reasoning_effort !== undefined) {
108
+ out.reasoning = { effort: out.reasoning_effort };
109
+ delete out.reasoning_effort;
110
+ }
111
+ const messages = Array.isArray(out.messages) ? out.messages : [];
112
+ const spec = at.options.cache;
113
+ if (spec?.mode === 'automatic')
114
+ out.cache_control = cacheControl(spec);
115
+ if (spec?.mode === 'system' && messages[0]?.role === 'system')
116
+ messages[0] = {
117
+ ...messages[0],
118
+ content: [
119
+ { type: 'text', text: messages[0].content ?? '', cache_control: cacheControl(spec) },
120
+ ],
121
+ };
122
+ replay(messages, at.request?.history ?? []);
123
+ if (at.request?.sessionId)
124
+ out.session_id = at.request.sessionId;
125
+ const web = at.builtInTools.includes('webSearch');
126
+ if (web)
127
+ out.web_search_options = {};
128
+ return { body: { ...out, messages }, wroteTools: web ? ['webSearch'] : [] };
129
+ },
130
+ read(at) {
131
+ const details = new Map();
132
+ const cited = new Set();
133
+ const reported = new Set();
134
+ let content = '';
135
+ return {
136
+ row(row) {
137
+ content += collectReasoning(row, details);
138
+ const events = [];
139
+ const thought = thinking(row);
140
+ if (thought && at.request?.summaries !== 'none')
141
+ events.push({ type: 'thought', text: thought });
142
+ const sources = citedUris(row)
143
+ .filter((uri) => !cited.has(uri) && cited.add(uri))
144
+ .map((uri) => ({ title: uri, uri, type: 'web' }));
145
+ if (sources.length)
146
+ events.push({ type: 'citation', sources });
147
+ const annotations = otherAnnotations(row).filter((item) => {
148
+ const key = JSON.stringify(item);
149
+ return !reported.has(key) && reported.add(key);
150
+ });
151
+ if (annotations.length)
152
+ events.push({
153
+ type: 'evidence',
154
+ evidence: {
155
+ provider: 'openrouter',
156
+ kind: 'provider_step',
157
+ step: 'annotations',
158
+ raw: { annotations },
159
+ },
160
+ });
161
+ return { events };
162
+ },
163
+ finish() {
164
+ if (!details.size && !content)
165
+ return {};
166
+ const data = { details: [...details.values()], ...(content ? { content } : {}) };
167
+ return { events: [{ type: 'reasoning', data }] };
168
+ },
169
+ };
170
+ },
171
+ });