@theoremjs/agents 0.3.0 → 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 (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +23 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +874 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +7 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +173 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +328 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +128 -87
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -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 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
+ });
@@ -0,0 +1,10 @@
1
+ import { type Provider } from '../../kernel/protocols/provider.js';
2
+ /** What registering `openRouterProvider` takes as `connection`. */
3
+ export interface OpenRouterConnection {
4
+ baseUrl?: string;
5
+ decisionUrl?: string;
6
+ siteUrl?: string;
7
+ siteName?: string;
8
+ }
9
+ /** OpenRouter: many labs' models behind one key. Chat, speech, images, and decisions. */
10
+ export declare const openRouterProvider: Provider<OpenRouterConnection, string>;
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ import { bearer, defineProvider, endpointUrlSchema, } from '../../kernel/protocols/provider.js';
3
+ import { systemOne } from '../system-one/protocol.js';
4
+ import { openRouterEmbedding } from './embedding-protocol.js';
5
+ import { openRouterImages } from './images-protocol.js';
6
+ import { openRouter } from './protocol.js';
7
+ const connection = z.strictObject({
8
+ baseUrl: endpointUrlSchema
9
+ .optional()
10
+ .describe('The API, by default https://openrouter.ai/api/v1.'), // labels-exempt: builder field description, read by the studio and docs
11
+ decisionUrl: endpointUrlSchema
12
+ .optional()
13
+ .describe('The decision API, by default https://openrouter.ai/api/alpha/decisions.'), // labels-exempt: builder field description, read by the studio and docs
14
+ siteUrl: z
15
+ .string()
16
+ .trim()
17
+ .min(1)
18
+ .optional()
19
+ .describe('Sent as HTTP-Referer, for OpenRouter rankings.'), // labels-exempt: builder field description, read by the studio and docs
20
+ siteName: z
21
+ .string()
22
+ .trim()
23
+ .min(1)
24
+ .optional()
25
+ .describe('Sent as X-Title, for OpenRouter rankings.'), // labels-exempt: builder field description, read by the studio and docs
26
+ });
27
+ /** OpenRouter: many labs' models behind one key. Chat, speech, images, and decisions. */
28
+ export const openRouterProvider = defineProvider({
29
+ id: 'openrouter',
30
+ name: 'OpenRouter',
31
+ description: "Many labs' models behind one key.", // labels-exempt: builder field description, read by the studio and docs
32
+ connection: connection.default({}),
33
+ key: z.string().trim().min(1),
34
+ authorize: bearer(),
35
+ serves(at) {
36
+ const baseUrl = at.baseUrl ?? 'https://openrouter.ai/api/v1';
37
+ const headers = {};
38
+ if (at.siteUrl)
39
+ headers['HTTP-Referer'] = at.siteUrl;
40
+ if (at.siteName)
41
+ headers['X-Title'] = at.siteName;
42
+ const decisionUrl = at.decisionUrl ?? 'https://openrouter.ai/api/alpha/decisions';
43
+ return [
44
+ { protocol: openRouter, baseUrl, headers },
45
+ { protocol: openRouterEmbedding, baseUrl, headers },
46
+ { protocol: openRouterImages, baseUrl, headers },
47
+ { protocol: systemOne, baseUrl: decisionUrl, url: () => decisionUrl, headers },
48
+ ];
49
+ },
50
+ });
@@ -0,0 +1,7 @@
1
+ import type { InteractionPart, TurnHistoryMessage } from '../../kernel/types.js';
2
+ /**
3
+ * History for a wire whose tool result holds only the `holds` part types. Every
4
+ * other file leaves a marker in its place and follows the run of tool results in
5
+ * one user message, so the results of a parallel call stay together.
6
+ */
7
+ export declare function withCarriedToolFiles(messages: readonly TurnHistoryMessage[], holds: ReadonlySet<InteractionPart['type']>): TurnHistoryMessage[];
@@ -0,0 +1,43 @@
1
+ /** What stands in a tool result where a file it cannot hold was. */
2
+ function carriedFileMarker(part) {
3
+ return { type: 'text', text: `[${part.type}: sent in the next message]` };
4
+ }
5
+ /** What leads the files of one tool result in the user message that carries them. */
6
+ function carriedFilesLead(msg) {
7
+ const from = msg.name ? `the ${msg.name} result` : 'a tool result';
8
+ return { type: 'text', text: `Files from ${from}:` };
9
+ }
10
+ /**
11
+ * History for a wire whose tool result holds only the `holds` part types. Every
12
+ * other file leaves a marker in its place and follows the run of tool results in
13
+ * one user message, so the results of a parallel call stay together.
14
+ */
15
+ export function withCarriedToolFiles(messages, holds) {
16
+ const out = [];
17
+ let carried = [];
18
+ const flush = () => {
19
+ if (carried.length === 0)
20
+ return;
21
+ out.push({ role: 'user', parts: carried });
22
+ carried = [];
23
+ };
24
+ for (const msg of messages) {
25
+ if (msg.role !== 'tool') {
26
+ flush();
27
+ out.push(msg);
28
+ continue;
29
+ }
30
+ const files = (msg.parts ?? []).filter((part) => !holds.has(part.type));
31
+ if (files.length === 0) {
32
+ out.push(msg);
33
+ continue;
34
+ }
35
+ out.push({
36
+ ...msg,
37
+ parts: (msg.parts ?? []).map((part) => holds.has(part.type) ? part : carriedFileMarker(part)),
38
+ });
39
+ carried.push(carriedFilesLead(msg), ...files);
40
+ }
41
+ flush();
42
+ return out;
43
+ }
@@ -1,4 +1,4 @@
1
- /*
1
+ /*probed 2026-09-23:
2
2
  * Each transport states the PCM format on the wire (probes 23/09/2026):
3
3
  * - Gemini Live: `audio/pcm;rate=24000`
4
4
  * - Interactions: `audio/l16; rate=24000; channels=1` (buffered), or
@@ -58,7 +58,7 @@ export function wrapPcmAsWav(pcm, format) {
58
58
  writeAscii(view, 8, 'WAVE');
59
59
  writeAscii(view, 12, 'fmt ');
60
60
  view.setUint32(16, 16, true);
61
- view.setUint16(20, 1, true); // PCM
61
+ view.setUint16(20, 1, true);
62
62
  view.setUint16(22, channels, true);
63
63
  view.setUint32(24, sampleRate, true);
64
64
  view.setUint32(28, byteRate, true);
@@ -0,0 +1,8 @@
1
+ import type { ProtocolEvent } from '../../kernel/protocols/mod.js';
2
+ import type { ModelEvent } from '../../kernel/types.js';
3
+ /**
4
+ * One event from the shared Gemini and Chat Completions readers, as a protocol event: a finished
5
+ * call is a `tool_call`, a cancelled one a `tool_cancel`, and a broken one an error. A `done` keeps
6
+ * only its stop; the protocol adds its own state.
7
+ */
8
+ export declare function asProtocolEvent<S>(event: ModelEvent): ProtocolEvent<S> | undefined;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * One event from the shared Gemini and Chat Completions readers, as a protocol event: a finished
3
+ * call is a `tool_call`, a cancelled one a `tool_cancel`, and a broken one an error. A `done` keeps
4
+ * only its stop; the protocol adds its own state.
5
+ */
6
+ export function asProtocolEvent(event) {
7
+ if (event.type === 'done')
8
+ return {
9
+ type: 'done',
10
+ stop: event.stop,
11
+ ...(event.interrupted === undefined ? {} : { interrupted: event.interrupted }),
12
+ };
13
+ if (event.type !== 'tool')
14
+ return event;
15
+ if (event.tool.phase === undefined)
16
+ return { type: 'tool_call', call: event.tool };
17
+ if (event.tool.phase === 'cancel')
18
+ return { type: 'tool_cancel', callId: event.tool.callId };
19
+ return event.tool.phase === 'error' ? { type: 'error', errorKind: 'bad_response' } : undefined;
20
+ }
@@ -1,11 +1,11 @@
1
- import type { ProviderEvent, TurnResponse } from '../../kernel/types.js';
1
+ import type { ModelEvent, TurnResponse } from '../../kernel/types.js';
2
2
  /**
3
3
  * Emits as soon as the wire names the response and again whenever that changes, so a
4
4
  * call that fails or is cut by a guardrail still records which model served it.
5
5
  */
6
6
  export declare function foldResponse(known: TurnResponse | undefined, seen: TurnResponse | undefined): {
7
7
  known: TurnResponse | undefined;
8
- event?: Extract<ProviderEvent, {
8
+ event?: Extract<ModelEvent, {
9
9
  type: 'response';
10
10
  }>;
11
11
  };
@@ -0,0 +1,17 @@
1
+ /** How a retry waits; a host or test may pass its own. The signal ends the wait early. */
2
+ export type Wait = (ms: number, signal?: AbortSignal | null) => Promise<void>;
3
+ /** All the waiting one call may do between tries; a wait that would pass it sends the last answer back. */
4
+ export declare const WAIT_BUDGET_MS = 5000;
5
+ export declare const waitDefault: Wait;
6
+ export declare function isTransientHttp(status: number): boolean;
7
+ export declare function isTransientThrown(err: unknown): boolean;
8
+ export declare function backoffMs(attempt: number): number;
9
+ /** `retry-after-ms`, else `Retry-After` in seconds or as a date; undefined when absent or unreadable. */
10
+ export declare function retryAfterMs(headers: Headers, now?: number): number | undefined;
11
+ /**
12
+ * Retries a transient status (408, 429, 5xx gateway) or a network failure while the waits stay
13
+ * within five seconds in all, at most four times. Each wait is the response's `Retry-After` when it gives one, else
14
+ * 1s, 2s, 4s then 8s; a wait that would pass the five seconds, or the call's own time left, is not
15
+ * taken, and the last answer or error goes back as it came. An abort ends the wait.
16
+ */
17
+ export declare function retryTransient(send: typeof fetch, wait?: Wait, timeLeft?: () => number): typeof fetch;
@@ -0,0 +1,90 @@
1
+ import { isAbortError, isTimeoutError } from '../../guardrails/error.js';
2
+ const BACKOFF_MS = [1000, 2000, 4000, 8000];
3
+ /** All the waiting one call may do between tries; a wait that would pass it sends the last answer back. */
4
+ export const WAIT_BUDGET_MS = 5000;
5
+ /** The most tries after the first: a `Retry-After: 0` costs no wait, so the budget alone never ends it. */
6
+ const MAX_RETRIES = BACKOFF_MS.length;
7
+ const MS_PER_SECOND = 1000;
8
+ const TRANSIENT_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
9
+ const TRANSIENT_THROWN_RE = /name resolution|dns|econnreset|econnrefused|etimedout|connection (?:refused|reset)|error sending request|network|fetch failed|temporarily unavailable|socket|503|502|504/i;
10
+ export const waitDefault = (ms, signal) => new Promise((resolve, reject) => {
11
+ if (signal?.aborted) {
12
+ reject(abortReason(signal));
13
+ return;
14
+ }
15
+ const timer = setTimeout(() => {
16
+ signal?.removeEventListener('abort', onAbort);
17
+ resolve();
18
+ }, ms);
19
+ function onAbort() {
20
+ clearTimeout(timer);
21
+ reject(abortReason(signal));
22
+ }
23
+ signal?.addEventListener('abort', onAbort, { once: true });
24
+ });
25
+ function abortReason(signal) {
26
+ return signal.reason ?? new DOMException('The operation was aborted.', 'AbortError');
27
+ }
28
+ export function isTransientHttp(status) {
29
+ return TRANSIENT_STATUSES.has(status);
30
+ }
31
+ export function isTransientThrown(err) {
32
+ if (isAbortError(err) || isTimeoutError(err)) {
33
+ return false;
34
+ }
35
+ return TRANSIENT_THROWN_RE.test(String(err));
36
+ }
37
+ export function backoffMs(attempt) {
38
+ return BACKOFF_MS[Math.min(attempt, BACKOFF_MS.length - 1)];
39
+ }
40
+ /** `retry-after-ms`, else `Retry-After` in seconds or as a date; undefined when absent or unreadable. */
41
+ export function retryAfterMs(headers, now = Date.now()) {
42
+ const ms = headers.get('retry-after-ms');
43
+ const after = headers.get('retry-after');
44
+ let delay;
45
+ if (ms !== null && ms.trim() !== '' && Number.isFinite(Number(ms))) {
46
+ delay = Number(ms);
47
+ }
48
+ else if (after !== null && after.trim() !== '') {
49
+ const seconds = Number(after);
50
+ delay = Number.isFinite(seconds) ? seconds * MS_PER_SECOND : Date.parse(after) - now;
51
+ }
52
+ if (delay === undefined || Number.isNaN(delay) || delay < 0) {
53
+ return undefined;
54
+ }
55
+ return delay;
56
+ }
57
+ /**
58
+ * Retries a transient status (408, 429, 5xx gateway) or a network failure while the waits stay
59
+ * within five seconds in all, at most four times. Each wait is the response's `Retry-After` when it gives one, else
60
+ * 1s, 2s, 4s then 8s; a wait that would pass the five seconds, or the call's own time left, is not
61
+ * taken, and the last answer or error goes back as it came. An abort ends the wait.
62
+ */
63
+ export function retryTransient(send, wait = waitDefault, timeLeft = () => Number.POSITIVE_INFINITY) {
64
+ return async (url, init) => {
65
+ let waited = 0;
66
+ for (let attempt = 0;; attempt++) {
67
+ const left = Math.min(WAIT_BUDGET_MS - waited, timeLeft());
68
+ let delay;
69
+ try {
70
+ const res = await send(url, init);
71
+ if (!isTransientHttp(res.status)) {
72
+ return res;
73
+ }
74
+ delay = retryAfterMs(res.headers) ?? backoffMs(attempt);
75
+ if (delay > left || attempt >= MAX_RETRIES) {
76
+ return res;
77
+ }
78
+ await res.body?.cancel();
79
+ }
80
+ catch (err) {
81
+ delay = backoffMs(attempt);
82
+ if (!isTransientThrown(err) || delay > left || attempt >= MAX_RETRIES) {
83
+ throw err;
84
+ }
85
+ }
86
+ await wait(delay, init?.signal);
87
+ waited += delay;
88
+ }
89
+ };
90
+ }
@@ -1,10 +1,6 @@
1
- export declare function asObject(parsed: unknown): Record<string, unknown> | undefined;
2
- export declare function dataRecord(raw: string, sseEvent: string): Record<string, unknown>;
3
1
  export declare function takeSsePayloads(buffer: string, pendingEvent?: string): {
4
2
  rest: string;
5
3
  payloads: Record<string, unknown>[];
6
4
  pendingEvent: string;
7
5
  };
8
6
  export declare function readSseChunks(body: ReadableStream<Uint8Array>): AsyncGenerator<Record<string, unknown>>;
9
- /** Silently skips malformed payloads, unlike `readSseChunks`. */
10
- export declare function parseSseStream(body: ReadableStream<Uint8Array>): AsyncGenerator<Record<string, unknown>>;
@@ -1,19 +1,17 @@
1
- const DATA_PREFIX = 'data: ';
2
- const EVENT_PREFIX = 'event: ';
3
1
  const DONE = '[DONE]';
4
- export function asObject(parsed) {
2
+ function asObject(parsed) {
5
3
  if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
6
4
  return parsed;
7
5
  }
8
6
  return undefined;
9
7
  }
10
- export function dataRecord(raw, sseEvent) {
11
- const data = raw.slice(DATA_PREFIX.length).trim();
8
+ function dataRecord(raw, sseEvent) {
9
+ const data = raw.startsWith('data:') ? raw.slice(5).replace(/^ /, '') : raw;
12
10
  const row = {};
13
11
  if (sseEvent) {
14
12
  row.sseEvent = sseEvent;
15
13
  }
16
- if (!data || data === DONE) {
14
+ if (data === DONE) {
17
15
  row.eventType = 'sse_done';
18
16
  return row;
19
17
  }
@@ -35,45 +33,61 @@ export function dataRecord(raw, sseEvent) {
35
33
  }
36
34
  export function takeSsePayloads(buffer, pendingEvent = '') {
37
35
  const payloads = [];
38
- const chunks = buffer.split('\n');
39
- const rest = chunks.pop() ?? '';
40
- let sseEvent = pendingEvent;
41
- for (const line of chunks) {
42
- if (line.startsWith(EVENT_PREFIX)) {
43
- sseEvent = line.slice(EVENT_PREFIX.length).trim();
36
+ let event = pendingEvent;
37
+ let data = [];
38
+ let hasData = false;
39
+ let consumed = 0;
40
+ const lineEnds = /\r\n|\r|\n/g;
41
+ let start = 0;
42
+ for (let match = lineEnds.exec(buffer); match; match = lineEnds.exec(buffer)) {
43
+ if (match[0] === '\r' && match.index === buffer.length - 1)
44
+ break;
45
+ const line = buffer.slice(start, match.index);
46
+ start = match.index + match[0].length;
47
+ if (!line) {
48
+ if (hasData)
49
+ payloads.push(dataRecord(data.join('\n'), event));
50
+ event = '';
51
+ data = [];
52
+ hasData = false;
53
+ consumed = start;
44
54
  }
45
- else if (line.startsWith(DATA_PREFIX)) {
46
- payloads.push(dataRecord(line, sseEvent));
47
- sseEvent = '';
55
+ else if (!line.startsWith(':')) {
56
+ const colon = line.indexOf(':');
57
+ const field = colon < 0 ? line : line.slice(0, colon);
58
+ const value = colon < 0 ? '' : line.slice(colon + 1).replace(/^ /, '');
59
+ if (field === 'event')
60
+ event = value;
61
+ if (field === 'data') {
62
+ data.push(value);
63
+ hasData = true;
64
+ }
48
65
  }
49
66
  }
50
- return { rest, payloads, pendingEvent: sseEvent };
67
+ return { rest: buffer.slice(consumed), payloads, pendingEvent: '' };
51
68
  }
52
69
  export async function* readSseChunks(body) {
53
70
  const reader = body.getReader();
54
71
  const decoder = new TextDecoder();
55
72
  let buffer = '';
56
- let pendingEvent = '';
57
- for (;;) {
58
- const { done, value } = await reader.read();
59
- if (done)
60
- break;
61
- buffer += decoder.decode(value, { stream: true });
62
- const result = takeSsePayloads(buffer, pendingEvent);
63
- buffer = result.rest;
64
- pendingEvent = result.pendingEvent;
65
- for (const payload of result.payloads) {
66
- yield payload;
73
+ let ended = false;
74
+ try {
75
+ for (;;) {
76
+ const { done, value } = await reader.read();
77
+ if (done) {
78
+ ended = true;
79
+ break;
80
+ }
81
+ buffer += decoder.decode(value, { stream: true });
82
+ const result = takeSsePayloads(buffer);
83
+ buffer = result.rest;
84
+ for (const payload of result.payloads)
85
+ yield payload;
67
86
  }
68
87
  }
69
- }
70
- /** Silently skips malformed payloads, unlike `readSseChunks`. */
71
- export async function* parseSseStream(body) {
72
- for await (const payload of readSseChunks(body)) {
73
- if (payload.eventType === 'sse_done')
74
- return;
75
- if (payload.eventType === 'sse_unparsed')
76
- continue;
77
- yield payload;
88
+ finally {
89
+ if (!ended)
90
+ void reader.cancel().catch(() => undefined);
91
+ reader.releaseLock();
78
92
  }
79
93
  }
@@ -1,5 +1,6 @@
1
1
  import { type ToolCallBase } from '../../kernel/tools/events.js';
2
- import type { ProviderEvent } from '../../kernel/types.js';
2
+ import type { ToolCallRequest } from '../../kernel/tools/types.js';
3
+ import type { ModelEvent } from '../../kernel/types.js';
3
4
  /**
4
5
  * Adapters never invent a history call id or name: a provider that needs a
5
6
  * missing one rejects the request, and that error is the answer.
@@ -16,10 +17,8 @@ export type ParsedToolArguments = {
16
17
  export declare function parseToolArgumentsObject(raw: unknown): ParsedToolArguments;
17
18
  export declare function historyToolArguments(raw: unknown): Record<string, unknown>;
18
19
  /** A call sent without an id gets one, so its request and failure events join. */
19
- export declare function toolCallEvents(call: {
20
+ export declare function toolCallEvents(call: Pick<ToolCallRequest, 'name' | 'stepId' | 'stepCallCount'> & {
20
21
  id?: string;
21
- name: string;
22
- thoughtSignature?: string;
23
- }, rawArguments: unknown): ProviderEvent[];
24
- /** Keeps the thought signature: the model still reads the failed call's result back. */
25
- export declare function malformedToolCall(base: ToolCallBase, message: string, raw: unknown, thoughtSignature?: string): ProviderEvent[];
22
+ }, rawArguments: unknown): ModelEvent[];
23
+ /** The model still reads the failed call's result back. */
24
+ export declare function malformedToolCall(base: ToolCallBase, message: string, raw: unknown, request?: Pick<ToolCallRequest, 'stepId' | 'stepCallCount'>): ModelEvent[];