@theoremjs/agents 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +202 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +25 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +72 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,14 @@
1
+ export interface PcmFormat {
2
+ sampleRate: number;
3
+ channels: number;
4
+ }
5
+ export declare function writeAscii(view: DataView, offset: number, str: string): void;
6
+ export declare function pcmFormatFromMime(mime: string): PcmFormat | undefined;
7
+ export declare function wrapPcmAsWav(pcm: Uint8Array, format: PcmFormat): Uint8Array;
8
+ export declare function pcmMediaAsWav(media: {
9
+ mimeType: string;
10
+ data: string;
11
+ }): {
12
+ mimeType: string;
13
+ data: string;
14
+ };
@@ -0,0 +1,78 @@
1
+ /*
2
+ * Each transport states the PCM format on the wire (probes 23/09/2026):
3
+ * - Gemini Live: `audio/pcm;rate=24000`
4
+ * - Interactions: `audio/l16; rate=24000; channels=1` (buffered), or
5
+ * `audio/l16` with `sample_rate` / `channels` fields (stream deltas)
6
+ * - OpenRouter speech: `content-type: audio/pcm;rate=24000;channels=1`
7
+ *
8
+ * Samples are 16-bit little-endian on all three (measured), although RFC 2586
9
+ * defines `audio/L16` as big-endian. A mime without `rate=` has no known
10
+ * format, so its bytes pass through unchanged rather than being wrapped at a
11
+ * guessed rate. `channels=` absent means one channel (the RFC 2586 default;
12
+ * Live documents mono output).
13
+ */
14
+ import { base64ToBytes, bytesToBase64 } from '../../kernel/util/base64.js';
15
+ const BITS_PER_SAMPLE = 16;
16
+ const RAW_PCM_ESSENCES = new Set(['audio/pcm', 'audio/l16']);
17
+ export function writeAscii(view, offset, str) {
18
+ for (let i = 0; i < str.length; i++)
19
+ view.setUint8(offset + i, str.charCodeAt(i));
20
+ }
21
+ function positiveInt(value) {
22
+ if (value === undefined || !/^\d+$/.test(value))
23
+ return undefined;
24
+ const n = Number(value);
25
+ return n > 0 ? n : undefined;
26
+ }
27
+ function parseMime(mime) {
28
+ const [essence = '', ...rest] = mime.split(';');
29
+ const params = new Map();
30
+ for (const param of rest) {
31
+ const eq = param.indexOf('=');
32
+ if (eq > 0)
33
+ params.set(param.slice(0, eq).trim().toLowerCase(), param.slice(eq + 1).trim());
34
+ }
35
+ return { essence: essence.trim().toLowerCase(), params };
36
+ }
37
+ export function pcmFormatFromMime(mime) {
38
+ const { essence, params } = parseMime(mime);
39
+ if (!RAW_PCM_ESSENCES.has(essence))
40
+ return undefined;
41
+ const sampleRate = positiveInt(params.get('rate'));
42
+ if (sampleRate === undefined)
43
+ return undefined;
44
+ const channels = params.has('channels') ? positiveInt(params.get('channels')) : 1;
45
+ if (channels === undefined)
46
+ return undefined;
47
+ return { sampleRate, channels };
48
+ }
49
+ export function wrapPcmAsWav(pcm, format) {
50
+ const { sampleRate, channels } = format;
51
+ const blockAlign = (channels * BITS_PER_SAMPLE) / 8;
52
+ const byteRate = sampleRate * blockAlign;
53
+ const dataSize = pcm.length;
54
+ const buf = new ArrayBuffer(44 + dataSize);
55
+ const view = new DataView(buf);
56
+ writeAscii(view, 0, 'RIFF');
57
+ view.setUint32(4, 36 + dataSize, true);
58
+ writeAscii(view, 8, 'WAVE');
59
+ writeAscii(view, 12, 'fmt ');
60
+ view.setUint32(16, 16, true);
61
+ view.setUint16(20, 1, true); // PCM
62
+ view.setUint16(22, channels, true);
63
+ view.setUint32(24, sampleRate, true);
64
+ view.setUint32(28, byteRate, true);
65
+ view.setUint16(32, blockAlign, true);
66
+ view.setUint16(34, BITS_PER_SAMPLE, true);
67
+ writeAscii(view, 36, 'data');
68
+ view.setUint32(40, dataSize, true);
69
+ new Uint8Array(buf, 44).set(pcm);
70
+ return new Uint8Array(buf);
71
+ }
72
+ export function pcmMediaAsWav(media) {
73
+ const format = pcmFormatFromMime(media.mimeType);
74
+ if (!format)
75
+ return media;
76
+ const wav = wrapPcmAsWav(base64ToBytes(media.data), format);
77
+ return { mimeType: 'audio/wav', data: bytesToBase64(wav) };
78
+ }
@@ -0,0 +1,11 @@
1
+ import type { ProviderEvent, TurnResponse } from '../../kernel/types.js';
2
+ /**
3
+ * Emits as soon as the wire names the response and again whenever that changes, so a
4
+ * call that fails or is cut by a guardrail still records which model served it.
5
+ */
6
+ export declare function foldResponse(known: TurnResponse | undefined, seen: TurnResponse | undefined): {
7
+ known: TurnResponse | undefined;
8
+ event?: Extract<ProviderEvent, {
9
+ type: 'response';
10
+ }>;
11
+ };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Emits as soon as the wire names the response and again whenever that changes, so a
3
+ * call that fails or is cut by a guardrail still records which model served it.
4
+ */
5
+ export function foldResponse(known, seen) {
6
+ if (!seen)
7
+ return { known };
8
+ const next = { ...known, ...seen };
9
+ if (next.id === known?.id && next.model === known?.model)
10
+ return { known };
11
+ return { known: next, event: { type: 'response', response: next } };
12
+ }
@@ -0,0 +1,10 @@
1
+ export declare function asObject(parsed: unknown): Record<string, unknown> | undefined;
2
+ export declare function dataRecord(raw: string, sseEvent: string): Record<string, unknown>;
3
+ export declare function takeSsePayloads(buffer: string, pendingEvent?: string): {
4
+ rest: string;
5
+ payloads: Record<string, unknown>[];
6
+ pendingEvent: string;
7
+ };
8
+ 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>>;
@@ -0,0 +1,79 @@
1
+ const DATA_PREFIX = 'data: ';
2
+ const EVENT_PREFIX = 'event: ';
3
+ const DONE = '[DONE]';
4
+ export function asObject(parsed) {
5
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
6
+ return parsed;
7
+ }
8
+ return undefined;
9
+ }
10
+ export function dataRecord(raw, sseEvent) {
11
+ const data = raw.slice(DATA_PREFIX.length).trim();
12
+ const row = {};
13
+ if (sseEvent) {
14
+ row.sseEvent = sseEvent;
15
+ }
16
+ if (!data || data === DONE) {
17
+ row.eventType = 'sse_done';
18
+ return row;
19
+ }
20
+ try {
21
+ const parsed = JSON.parse(data);
22
+ const obj = asObject(parsed);
23
+ if (obj) {
24
+ return { ...obj, ...row };
25
+ }
26
+ row.eventType = 'sse_unparsed';
27
+ row.data = parsed;
28
+ return row;
29
+ }
30
+ catch {
31
+ row.eventType = 'sse_unparsed';
32
+ row.data = data;
33
+ return row;
34
+ }
35
+ }
36
+ export function takeSsePayloads(buffer, pendingEvent = '') {
37
+ 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();
44
+ }
45
+ else if (line.startsWith(DATA_PREFIX)) {
46
+ payloads.push(dataRecord(line, sseEvent));
47
+ sseEvent = '';
48
+ }
49
+ }
50
+ return { rest, payloads, pendingEvent: sseEvent };
51
+ }
52
+ export async function* readSseChunks(body) {
53
+ const reader = body.getReader();
54
+ const decoder = new TextDecoder();
55
+ 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;
67
+ }
68
+ }
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;
78
+ }
79
+ }
@@ -0,0 +1,4 @@
1
+ import type { TurnEvent } from '../../kernel/types.js';
2
+ /** Invalid JSON is a `bad_response` error, never a silent skip. */
3
+ declare function structuredEvent(text: string): TurnEvent;
4
+ export { structuredEvent };
@@ -0,0 +1,11 @@
1
+ import { TheoremError, toErrorEvent } from '../../guardrails/error.js';
2
+ /** Invalid JSON is a `bad_response` error, never a silent skip. */
3
+ function structuredEvent(text) {
4
+ try {
5
+ return { type: 'structured', structured: JSON.parse(text) };
6
+ }
7
+ catch (cause) {
8
+ return toErrorEvent(new TheoremError('bad_response', 'structured output was not valid JSON', { cause }));
9
+ }
10
+ }
11
+ export { structuredEvent };
@@ -0,0 +1,25 @@
1
+ import { type ToolCallBase } from '../../kernel/tools/events.js';
2
+ import type { ProviderEvent } from '../../kernel/types.js';
3
+ /**
4
+ * Adapters never invent a history call id or name: a provider that needs a
5
+ * missing one rejects the request, and that error is the answer.
6
+ */
7
+ export declare function historyToolIdentity(fields: Record<string, string | undefined>): Record<string, string>;
8
+ export type ParsedToolArguments = {
9
+ ok: true;
10
+ value: Record<string, unknown>;
11
+ } | {
12
+ ok: false;
13
+ error: string;
14
+ raw: string;
15
+ };
16
+ export declare function parseToolArgumentsObject(raw: unknown): ParsedToolArguments;
17
+ export declare function historyToolArguments(raw: unknown): Record<string, unknown>;
18
+ /** A call sent without an id gets one, so its request and failure events join. */
19
+ export declare function toolCallEvents(call: {
20
+ 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[];
@@ -0,0 +1,84 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { failureEvent, newCallId, toolCallRequestEvent, } from '../../kernel/tools/events.js';
3
+ import { isRecord } from '../../kernel/util/record.js';
4
+ /**
5
+ * Adapters never invent a history call id or name: a provider that needs a
6
+ * missing one rejects the request, and that error is the answer.
7
+ */
8
+ export function historyToolIdentity(fields) {
9
+ const present = {};
10
+ for (const [key, value] of Object.entries(fields)) {
11
+ if (value !== undefined)
12
+ present[key] = value;
13
+ }
14
+ return present;
15
+ }
16
+ export function parseToolArgumentsObject(raw) {
17
+ if (typeof raw === 'string') {
18
+ const trimmed = raw.trim();
19
+ if (trimmed.length === 0) {
20
+ return { ok: true, value: {} };
21
+ }
22
+ try {
23
+ const parsed = JSON.parse(trimmed);
24
+ if (isRecord(parsed)) {
25
+ return { ok: true, value: parsed };
26
+ }
27
+ return {
28
+ ok: false,
29
+ error: 'tool arguments JSON must be an object',
30
+ raw,
31
+ };
32
+ }
33
+ catch {
34
+ return {
35
+ ok: false,
36
+ error: 'malformed tool arguments JSON',
37
+ raw,
38
+ };
39
+ }
40
+ }
41
+ if (isRecord(raw)) {
42
+ return { ok: true, value: raw };
43
+ }
44
+ if (raw === undefined || raw === null) {
45
+ return { ok: true, value: {} };
46
+ }
47
+ return {
48
+ ok: false,
49
+ error: 'tool arguments must be a JSON object',
50
+ raw: String(raw),
51
+ };
52
+ }
53
+ export function historyToolArguments(raw) {
54
+ const parsed = parseToolArgumentsObject(raw);
55
+ if (!parsed.ok) {
56
+ throw new TheoremError('bad_response', parsed.error);
57
+ }
58
+ return parsed.value;
59
+ }
60
+ /** A call sent without an id gets one, so its request and failure events join. */
61
+ export function toolCallEvents(call, rawArguments) {
62
+ const name = call.name.trim();
63
+ const base = { name, callId: call.id ?? newCallId(name) };
64
+ if (!name) {
65
+ return malformedToolCall(base, 'function call is missing a name', rawArguments, call.thoughtSignature);
66
+ }
67
+ const parsed = parseToolArgumentsObject(rawArguments);
68
+ if (!parsed.ok) {
69
+ return malformedToolCall(base, parsed.error, parsed.raw, call.thoughtSignature);
70
+ }
71
+ return [toolCallRequestEvent(base, parsed.value, { thoughtSignature: call.thoughtSignature })];
72
+ }
73
+ /** Keeps the thought signature: the model still reads the failed call's result back. */
74
+ export function malformedToolCall(base, message, raw, thoughtSignature) {
75
+ return [
76
+ toolCallRequestEvent(base, {}, { thoughtSignature }),
77
+ failureEvent(base, {
78
+ code: 'malformed_arguments',
79
+ kind: 'bad_response',
80
+ message,
81
+ details: { raw },
82
+ }),
83
+ ];
84
+ }
@@ -0,0 +1,8 @@
1
+ import type { KeySlot, ProviderCompleteRequest } from '../../kernel/types.js';
2
+ export declare function tapeHeaderValue(key: string, value: string): string;
3
+ export declare function tapeHeaders(headers?: HeadersInit): Record<string, string>;
4
+ export declare function throwRow(err: unknown): Record<string, unknown>;
5
+ export declare function tapFetch(tap: ProviderCompleteRequest['tapUpstream'], send?: typeof fetch, keySlot?: KeySlot): typeof fetch;
6
+ /** fetch rejects only when no response came back, so any non-abort, non-timeout rejection is `network`. */
7
+ export declare function networkError(err: unknown): unknown;
8
+ export declare function networkFetch(send?: typeof fetch): typeof fetch;
@@ -0,0 +1,85 @@
1
+ import { describeError, isAbortError, isTimeoutError, TheoremError, } from '../../guardrails/error.js';
2
+ const SECRET_HEADER = /key|auth|cookie|secret|token/i;
3
+ export function tapeHeaderValue(key, value) {
4
+ if (SECRET_HEADER.test(key)) {
5
+ return '[redacted]';
6
+ }
7
+ return value;
8
+ }
9
+ export function tapeHeaders(headers) {
10
+ const out = {};
11
+ for (const [key, value] of new Headers(headers).entries()) {
12
+ out[key] = tapeHeaderValue(key, value);
13
+ }
14
+ return out;
15
+ }
16
+ export function throwRow(err) {
17
+ if (err instanceof Error) {
18
+ return { eventType: 'http_throw', name: err.name, message: err.message };
19
+ }
20
+ return { eventType: 'http_throw', name: 'Error', message: String(err) };
21
+ }
22
+ /** A non-string body is named rather than read, since reading it would consume the stream. */
23
+ function tapeBody(body) {
24
+ if (body === undefined || body === null) {
25
+ return {};
26
+ }
27
+ if (typeof body !== 'string') {
28
+ return { bodyKind: body.constructor.name };
29
+ }
30
+ try {
31
+ return { body: JSON.parse(body) };
32
+ }
33
+ catch {
34
+ return { body };
35
+ }
36
+ }
37
+ export function tapFetch(tap, send = fetch, keySlot) {
38
+ if (!tap) {
39
+ return send;
40
+ }
41
+ return async (url, init) => {
42
+ const method = init?.method ?? 'GET';
43
+ tap({
44
+ eventType: 'http_request',
45
+ method,
46
+ url: String(url),
47
+ headers: tapeHeaders(init?.headers),
48
+ ...(keySlot ? { keySlot } : {}),
49
+ ...tapeBody(init?.body),
50
+ });
51
+ try {
52
+ const res = await send(url, init);
53
+ tap({
54
+ eventType: 'http_response',
55
+ status: res.status,
56
+ headers: tapeHeaders(res.headers),
57
+ });
58
+ if (!res.ok) {
59
+ tap({ eventType: 'http_error_body', body: await res.clone().text() });
60
+ }
61
+ return res;
62
+ }
63
+ catch (err) {
64
+ tap(throwRow(err));
65
+ throw err;
66
+ }
67
+ };
68
+ }
69
+ /** fetch rejects only when no response came back, so any non-abort, non-timeout rejection is `network`. */
70
+ export function networkError(err) {
71
+ if (err instanceof TheoremError || isAbortError(err) || isTimeoutError(err)) {
72
+ return err;
73
+ }
74
+ return new TheoremError('network', describeError(err), { cause: err });
75
+ }
76
+ export function networkFetch(send = fetch) {
77
+ return async (url, init) => {
78
+ try {
79
+ return await send(url, init);
80
+ }
81
+ catch (err) {
82
+ throw networkError(err);
83
+ }
84
+ };
85
+ }
@@ -0,0 +1,6 @@
1
+ export declare function inlineBytesKey(rec: Record<string, unknown>): string | undefined;
2
+ export declare function scrubRecord(rec: Record<string, unknown>): Promise<Record<string, unknown>>;
3
+ export declare function scrubUpstream(value: unknown): Promise<unknown>;
4
+ export declare function removeCanaries(text: string, canaries: readonly string[]): string;
5
+ export declare function redactCanaryInTree(value: unknown, canaries: readonly string[]): unknown;
6
+ export declare function tapeUpstream(value: unknown, canaries: readonly string[]): Promise<unknown>;
@@ -0,0 +1,88 @@
1
+ import { redactCanaryText } from '../../guardrails/canary.js';
2
+ import { sha256, sha256Base64 } from '../../kernel/engine/hash.js';
3
+ import { mapStrings } from '../../kernel/engine/tree.js';
4
+ /*
5
+ * Inline bytes on a taped row are stored as their sha256, never as bytes.
6
+ * The shapes are the ones every taped transport sends (probes 23/09/2026):
7
+ *
8
+ * - `{ mime_type, data }`: Interactions request parts, stream deltas and
9
+ * buffered steps (image, audio, document); the OpenRouter speech body row.
10
+ * - `{ mimeType, data }`: Theorem's own media parts (a tool's raw output) and
11
+ * Gemini Live `inlineData`.
12
+ * - `{ b64_json, media_type }`: OpenRouter `/images` `data[]` entries.
13
+ * - a `data:<mime>;base64,<bytes>` string: OpenRouter chat
14
+ * `message.images[].image_url.url`.
15
+ *
16
+ * The hash covers the raw bytes, the same hash a trace blob part carries. A
17
+ * record whose bytes were hashed carries `dataKind: 'sha256'`; a hashed data
18
+ * url becomes `data:<mime>;sha256,<hex>`. Inline data that is not base64 is
19
+ * hashed as text and says so: `dataKind: 'text_sha256'`, `data:<mime>;text_sha256,<hex>`.
20
+ */
21
+ const DATA_URL = /^data:([^;,]+);base64,/;
22
+ export function inlineBytesKey(rec) {
23
+ const mime = rec.mime_type ?? rec.mimeType;
24
+ if (typeof mime === 'string' && typeof rec.data === 'string') {
25
+ return 'data';
26
+ }
27
+ if (typeof rec.media_type === 'string' && typeof rec.b64_json === 'string') {
28
+ return 'b64_json';
29
+ }
30
+ return undefined;
31
+ }
32
+ const BYTES_SHA256 = 'sha256';
33
+ const TEXT_SHA256 = 'text_sha256';
34
+ async function inlineHash(base64) {
35
+ const digest = await sha256Base64(base64);
36
+ return digest
37
+ ? { kind: BYTES_SHA256, hash: digest.hash }
38
+ : { kind: TEXT_SHA256, hash: await sha256(base64) };
39
+ }
40
+ async function scrubString(text) {
41
+ const match = DATA_URL.exec(text);
42
+ if (!match) {
43
+ return text;
44
+ }
45
+ const { kind, hash } = await inlineHash(text.slice(match[0].length));
46
+ return `data:${match[1]};${kind},${hash}`;
47
+ }
48
+ export async function scrubRecord(rec) {
49
+ const bytesKey = inlineBytesKey(rec);
50
+ let dataKind;
51
+ const pairs = await Promise.all(Object.entries(rec).map(async ([key, nested]) => {
52
+ if (key === bytesKey && typeof nested === 'string') {
53
+ const { kind, hash } = await inlineHash(nested);
54
+ dataKind = kind;
55
+ return [key, hash];
56
+ }
57
+ return [key, await scrubUpstream(nested)];
58
+ }));
59
+ const out = Object.fromEntries(pairs);
60
+ if (dataKind) {
61
+ out.dataKind = dataKind;
62
+ }
63
+ return out;
64
+ }
65
+ export function scrubUpstream(value) {
66
+ if (typeof value === 'string') {
67
+ return scrubString(value);
68
+ }
69
+ if (Array.isArray(value)) {
70
+ return Promise.all(value.map((item) => scrubUpstream(item)));
71
+ }
72
+ if (value && typeof value === 'object') {
73
+ return scrubRecord(value);
74
+ }
75
+ return Promise.resolve(value);
76
+ }
77
+ export function removeCanaries(text, canaries) {
78
+ return canaries.reduce((out, canary) => redactCanaryText(out, canary), text);
79
+ }
80
+ export function redactCanaryInTree(value, canaries) {
81
+ if (!canaries.some(Boolean)) {
82
+ return value;
83
+ }
84
+ return mapStrings(value, (text) => removeCanaries(text, canaries));
85
+ }
86
+ export async function tapeUpstream(value, canaries) {
87
+ return redactCanaryInTree(await scrubUpstream(value), canaries);
88
+ }
@@ -0,0 +1,13 @@
1
+ import type { KeySlot, KeyVault, ProviderCompleteRequest } from '../../kernel/types.js';
2
+ /** The key in `slot`. One vault serves every provider; a slot holds whatever secret the host put there. */
3
+ export declare function requireKey(vault: KeyVault | undefined, slot: KeySlot): string;
4
+ /** The profile's fallback slot and its key, when the vault holds a different key there. */
5
+ export declare function fallbackKey(slot: KeySlot | undefined, vault: KeyVault | undefined, primary: string): {
6
+ slot: KeySlot;
7
+ key: string;
8
+ } | undefined;
9
+ /**
10
+ * A tapped fetch for a provider that takes a bearer token. A quota refusal retries once with the
11
+ * fallback slot's key, when the profile names one; each try's slot is on the tape.
12
+ */
13
+ export declare function bearerFetch(req: Pick<ProviderCompleteRequest, 'tapUpstream' | 'keySlot' | 'fallbackKeySlot'>, send: typeof fetch, vault: KeyVault | undefined, primary: string): typeof fetch;
@@ -0,0 +1,41 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { tapFetch } from './upstream-tap.js';
3
+ const HTTP_QUOTA = 429;
4
+ /** The key in `slot`. One vault serves every provider; a slot holds whatever secret the host put there. */
5
+ export function requireKey(vault, slot) {
6
+ const key = vault?.[slot]?.trim();
7
+ if (!key) {
8
+ throw new TheoremError('auth', `the vault has no key in slot '${slot}'`);
9
+ }
10
+ return key;
11
+ }
12
+ /** The profile's fallback slot and its key, when the vault holds a different key there. */
13
+ export function fallbackKey(slot, vault, primary) {
14
+ const key = slot ? vault?.[slot]?.trim() : undefined;
15
+ if (!slot || !key || key === primary) {
16
+ return undefined;
17
+ }
18
+ return { slot, key };
19
+ }
20
+ /**
21
+ * A tapped fetch for a provider that takes a bearer token. A quota refusal retries once with the
22
+ * fallback slot's key, when the profile names one; each try's slot is on the tape.
23
+ */
24
+ export function bearerFetch(req, send, vault, primary) {
25
+ const first = tapFetch(req.tapUpstream, send, req.keySlot);
26
+ const fallback = req.keySlot ? fallbackKey(req.fallbackKeySlot, vault, primary) : undefined;
27
+ if (!fallback) {
28
+ return first;
29
+ }
30
+ const second = tapFetch(req.tapUpstream, send, fallback.slot);
31
+ return async (url, init) => {
32
+ const res = await first(url, init);
33
+ if (res.status !== HTTP_QUOTA) {
34
+ return res;
35
+ }
36
+ await res.body?.cancel();
37
+ const headers = new Headers(init?.headers);
38
+ headers.set('Authorization', `Bearer ${fallback.key}`);
39
+ return await second(url, { ...init, headers });
40
+ };
41
+ }
@@ -0,0 +1,19 @@
1
+ import type { KeyVault } from '../kernel/types.js';
2
+ export interface OpenAiGatewayConfig {
3
+ baseUrl?: string;
4
+ siteUrl?: string;
5
+ siteName?: string;
6
+ fetch?: typeof fetch;
7
+ }
8
+ export interface LocalProviderConfig {
9
+ /** e.g. `http://127.0.0.1:11434` for Ollama. */
10
+ baseUrl: string;
11
+ fetch?: typeof globalThis.fetch;
12
+ }
13
+ /** What `createProvider` hands an adapter: the host's settings for it plus the one vault. */
14
+ export type OpenAiGatewayTransport = OpenAiGatewayConfig & {
15
+ vault?: KeyVault;
16
+ };
17
+ export type LocalTransport = LocalProviderConfig & {
18
+ vault?: KeyVault;
19
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ /** What an agent sees of a secret. */
2
+ export interface SecretCard {
3
+ secret: true;
4
+ set: boolean;
5
+ looksLike?: string;
6
+ /** Mistakes the value shows: whitespace, quotes, a line break, a placeholder. */
7
+ problems: string[];
8
+ /** Other secrets holding the same value. */
9
+ sameAs: string[];
10
+ usedBy: string[];
11
+ }
12
+ export declare function secretCard(value: unknown, extra?: {
13
+ sameAs?: readonly string[];
14
+ usedBy?: readonly string[];
15
+ }): SecretCard;
16
+ /** A URL with its credential query parameters and `user:pass@` masked. */
17
+ export declare function maskUrl(raw: string): string;
18
+ /**
19
+ * Headers as JSON, credential-named values masked. Text that is not a JSON object is
20
+ * told only by its length: a parse error would quote it.
21
+ */
22
+ export declare function maskHeaders(raw: unknown): unknown;
23
+ /** Scrubs text: each known secret value by name, then the kernel's sensitive patterns. */
24
+ export declare function scrubText(text: string, known: readonly [string, string][]): string;
25
+ /** Known secret values worth scrubbing: trimmed, long enough, longest first. */
26
+ export declare function knownSecrets(secrets: Record<string, string>): [string, string][];
27
+ /** Every string in `value` scrubbed and capped; long base64 under `data` told as bytes. */
28
+ export declare function scrubDeep(value: unknown, known: readonly [string, string][]): unknown;