@theoremjs/agents 0.3.0 → 0.3.2

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 (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  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 +25 -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 +881 -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 +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  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 +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  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 +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  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 +8 -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 +174 -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 +329 -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 +130 -88
  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 +102 -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/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -0,0 +1,253 @@
1
+ import { z } from 'zod';
2
+ import { TheoremError } from '../../guardrails/error.js';
3
+ import { labelText } from '../../guardrails/labels.js';
4
+ /** The kinds of profile a protocol can serve, each at its own endpoint: every type but `host`. */
5
+ const MODEL_PROFILE_TYPES = [
6
+ 'text',
7
+ 'image',
8
+ 'speech',
9
+ 'live',
10
+ 'decision',
11
+ 'embedding',
12
+ ];
13
+ const definitionShape = z.object({
14
+ id: z.string().regex(/^[A-Za-z][A-Za-z0-9]*$/),
15
+ name: z.string().min(1),
16
+ description: z.string().min(1),
17
+ endpoints: z.partialRecord(z.enum(MODEL_PROFILE_TYPES), z.string().min(1)),
18
+ });
19
+ function refuse(id, issues) {
20
+ return new TheoremError('config', labelText('protocol.definition', { id, issues }));
21
+ }
22
+ function checkShape(definition) {
23
+ const parsed = definitionShape.safeParse(definition);
24
+ if (!parsed.success)
25
+ throw refuse(String(definition.id), z.prettifyError(parsed.error));
26
+ }
27
+ function own(protocol, kind, schema, value) {
28
+ if (!schema)
29
+ throw new TheoremError('internal', labelText('protocol.part_schema', { protocol: protocol.id, kind }));
30
+ const parsed = schema.safeParse(value);
31
+ if (!parsed.success)
32
+ throw new TheoremError('bad_response', labelText('protocol.part_invalid', { protocol: protocol.id, kind }), {
33
+ cause: parsed.error,
34
+ });
35
+ return parsed.data;
36
+ }
37
+ /**
38
+ * Marks an event a protocol wrote as its own: reasoning gets its origin, a custom kind its
39
+ * protocol prefix. Each is checked against the writer's schema.
40
+ */
41
+ function stamp(writer, event) {
42
+ if (event.type === 'reasoning')
43
+ return {
44
+ ...event,
45
+ data: own(writer, 'reasoning', writer.reasoning, event.data),
46
+ origin: { protocol: writer.id },
47
+ };
48
+ if (event.type === 'custom')
49
+ return {
50
+ type: 'custom',
51
+ kind: `${writer.id}.${event.kind}`,
52
+ data: own(writer, event.kind, writer.custom?.[event.kind], event.data),
53
+ };
54
+ return event;
55
+ }
56
+ async function* stamped(writer, events) {
57
+ for await (const event of events)
58
+ yield stamp(writer, event);
59
+ }
60
+ function stampOperations(writer, operations) {
61
+ const { complete, openSession } = operations;
62
+ return {
63
+ ...operations,
64
+ ...(complete
65
+ ? { complete: (request) => stamped(writer, complete.call(operations, request)) }
66
+ : {}),
67
+ ...(openSession
68
+ ? {
69
+ async openSession(request) {
70
+ const session = await openSession.call(operations, request);
71
+ return { ...session, events: () => stamped(writer, session.events()) };
72
+ },
73
+ }
74
+ : {}),
75
+ };
76
+ }
77
+ /**
78
+ * `options` as model `apiId` takes them on `protocol`: the protocol's schema, less any option that
79
+ * model refuses. Throws a `config` error naming what does not fit.
80
+ */
81
+ export function modelOptions(protocol, apiId, options) {
82
+ const given = options ?? {};
83
+ const parsed = protocol.options.safeParse(given);
84
+ const refused = (protocol.refusedOptions?.(apiId) ?? []).filter((key) => typeof given === 'object' && given !== null && key in given);
85
+ if (parsed.success && refused.length === 0)
86
+ return parsed.data;
87
+ const issues = parsed.success
88
+ ? refused.map((key) => `✖ ${apiId} takes no ${key}`).join('\n') // labels-exempt: builder config error
89
+ : z.prettifyError(parsed.error);
90
+ throw new TheoremError('config', labelText('protocol.options', { apiId, protocol: protocol.id, issues }));
91
+ }
92
+ /** Defines a protocol: the code that speaks one API shape, and everything on its wire. */
93
+ export function defineProtocol(definition) {
94
+ checkShape(definition);
95
+ if (typeof definition.create !== 'function' ||
96
+ typeof definition.options?.safeParse !== 'function')
97
+ // labels-exempt: builder diagnostic
98
+ throw refuse(definition.id, 'create and options are required');
99
+ return Object.freeze({
100
+ ...definition,
101
+ lineage: Object.freeze([definition.id]),
102
+ create: (context) => stampOperations(definition, definition.create(context)),
103
+ });
104
+ }
105
+ function shapeOf(schema) {
106
+ return schema instanceof z.ZodObject ? schema.shape : undefined;
107
+ }
108
+ function pick(value, keys) {
109
+ const source = (value ?? {});
110
+ const out = {};
111
+ for (const key of keys)
112
+ if (key in source)
113
+ out[key] = source[key];
114
+ return out;
115
+ }
116
+ function mergeOptions(base, extension) {
117
+ const baseShape = shapeOf(base.options);
118
+ const addedShape = extension.options ? shapeOf(extension.options) : {};
119
+ if (extension.options && !baseShape)
120
+ throw new TheoremError('config', labelText('protocol.base_options', { protocol: extension.id, base: base.id }));
121
+ for (const option of Object.keys(addedShape ?? {}))
122
+ if (baseShape && option in baseShape)
123
+ throw new TheoremError('config', labelText('protocol.option_clash', { protocol: extension.id, option, base: base.id }));
124
+ return {
125
+ schema: (baseShape
126
+ ? z.strictObject({ ...baseShape, ...addedShape })
127
+ : base.options),
128
+ baseKeys: baseShape ? Object.keys(baseShape) : undefined,
129
+ addedKeys: Object.keys(addedShape ?? {}),
130
+ };
131
+ }
132
+ /** One call through the extension: its body goes on what the base sends, its reader sees each row first. */
133
+ function extendedCall(base, extension, keys, context, request) {
134
+ const at = {
135
+ profileType: context.profileType,
136
+ apiId: context.apiId,
137
+ options: pick(context.options, keys.addedKeys),
138
+ };
139
+ const pending = [];
140
+ const reader = extension.read?.({
141
+ ...at,
142
+ ...(request ? { request: request } : {}),
143
+ });
144
+ const take = (events) => {
145
+ for (const event of events ?? [])
146
+ pending.push(stamp(extension, event));
147
+ };
148
+ const rewrite = (body, headers, wrote = []) => {
149
+ if (!extension.body)
150
+ return { body, wroteTools: wrote };
151
+ const out = extension.body(body, {
152
+ ...at,
153
+ builtInTools: context.builtInTools,
154
+ headers,
155
+ ...(request ? { request: request } : {}),
156
+ });
157
+ return { body: out.body, wroteTools: [...wrote, ...(out.wroteTools ?? [])] };
158
+ };
159
+ async function* read(rows) {
160
+ for await (const row of rows) {
161
+ const seen = reader?.row(row);
162
+ take(seen?.events);
163
+ if (!seen?.consumed)
164
+ yield row;
165
+ }
166
+ }
167
+ const inner = {
168
+ ...context,
169
+ options: (keys.baseKeys ? pick(context.options, keys.baseKeys) : context.options),
170
+ send(body, init) {
171
+ const headers = new Headers(init.headers);
172
+ const out = rewrite(body, headers, init.wroteTools);
173
+ return read(context.send(out.body, {
174
+ ...init,
175
+ headers: Object.fromEntries(headers),
176
+ wroteTools: out.wroteTools,
177
+ }));
178
+ },
179
+ async connect(setup, init) {
180
+ const out = rewrite(setup, new Headers(), init?.wroteTools);
181
+ const socket = await context.connect(out.body, { wroteTools: out.wroteTools });
182
+ return { ...socket, frames: () => read(socket.frames()) };
183
+ },
184
+ };
185
+ async function* drained(events) {
186
+ for await (const event of events) {
187
+ yield* pending.splice(0);
188
+ if (event.type === 'done')
189
+ take(reader?.finish?.().events);
190
+ yield* pending.splice(0);
191
+ yield event;
192
+ }
193
+ yield* pending.splice(0);
194
+ }
195
+ return { operations: base.create(inner), drained };
196
+ }
197
+ /** The operations the base offers, each run as a fresh extended call. */
198
+ function extendedOperations(call) {
199
+ // invariant: Each call gets its own reader and pending events; the first only says which operations the base has.
200
+ const offered = call().operations;
201
+ const operations = {};
202
+ if (offered.complete)
203
+ operations.complete = (request) => {
204
+ const { operations, drained } = call(request);
205
+ return drained(operations.complete(request));
206
+ };
207
+ if (offered.openSession)
208
+ operations.openSession = async (request) => {
209
+ const { operations, drained } = call(request);
210
+ const session = await operations.openSession(request);
211
+ return { ...session, events: () => drained(session.events()) };
212
+ };
213
+ if (offered.decide)
214
+ operations.decide = (request) => call().operations.decide(request);
215
+ if (offered.embed)
216
+ operations.embed = (request) => call().operations.embed(request);
217
+ return operations;
218
+ }
219
+ /** The extension's own value for a field, else the base's; absent when neither has one. */
220
+ function either(key, extension, base) {
221
+ const value = extension[key] ?? base[key];
222
+ return value ? { [key]: value } : {};
223
+ }
224
+ /**
225
+ * A new protocol built on a base it nearly matches. It has its own id, so what it sends has one
226
+ * answer: its definition. Its options are the base's plus its own; its endpoints, framing, and error
227
+ * typing are the base's unless it gives its own.
228
+ */
229
+ export function extendProtocol(base, extension) {
230
+ checkShape({ ...extension, endpoints: extension.endpoints ?? {} });
231
+ const keys = mergeOptions(base, extension);
232
+ return Object.freeze({
233
+ id: extension.id,
234
+ name: extension.name,
235
+ description: extension.description,
236
+ endpoints: { ...base.endpoints, ...extension.endpoints },
237
+ options: keys.schema,
238
+ ...(base.continuation ? { continuation: base.continuation } : {}),
239
+ ...(extension.reasoning ? { reasoning: extension.reasoning } : {}),
240
+ ...(extension.custom ? { custom: extension.custom } : {}),
241
+ ...either('framing', extension, base),
242
+ ...either('error', extension, base),
243
+ ...either('embeddingLimits', extension, base),
244
+ ...either('refusedOptions', extension, base),
245
+ base: base,
246
+ lineage: Object.freeze([extension.id, ...base.lineage]),
247
+ create: (context) => extendedOperations((request) => extendedCall(base, extension, keys, context, request)),
248
+ });
249
+ }
250
+ /** Whether something `writer` wrote may go back to `target`: the writer is in its lineage. */
251
+ export function carriesTo(writer, target) {
252
+ return target.lineage.includes(writer);
253
+ }
@@ -0,0 +1,108 @@
1
+ import { z } from 'zod';
2
+ import type { KeySlot } from '../types.js';
3
+ import { type DecisionModelBinding, type ModelBinding } from './binding.js';
4
+ import type { PriceTable } from './prices.js';
5
+ import { type Protocol } from './protocol.js';
6
+ /** One outgoing call or socket, for a sign-in to put its key on. `body` is final, for signing. */
7
+ export interface Outgoing {
8
+ transport: 'http' | 'ws';
9
+ url: URL;
10
+ headers: Headers;
11
+ /** WebSocket subprotocols, where some APIs sign in. */
12
+ protocols: string[];
13
+ readonly body?: string;
14
+ }
15
+ /** Signs outgoing calls for one key. `invalidate` drops a minted token after an `auth` refusal. */
16
+ export interface Signer {
17
+ sign(outgoing: Outgoing): void | Promise<void>;
18
+ invalidate?(): void;
19
+ }
20
+ /**
21
+ * How a key is put on a request. Made once per registration and key, so a minted token is reused
22
+ * until it expires. `webSocketHeaders` says it needs headers on a WebSocket, which a browser can't send.
23
+ */
24
+ export interface Authorize<K = unknown> {
25
+ (key: K): Signer;
26
+ readonly webSocketHeaders?: boolean;
27
+ }
28
+ /** A service's address in a connection: HTTP(S), with no credentials in it. Keys go in the vault. */
29
+ export declare const endpointUrlSchema: z.ZodString;
30
+ /** `Authorization: Bearer <key>`. */
31
+ export declare function bearer(): Authorize<string>;
32
+ /** The key in a header of its own, e.g. `x-goog-api-key`, or `api-key` for Azure. */
33
+ export declare function header(name: string): Authorize<string>;
34
+ /** The key in the URL's query, e.g. `key` for Gemini Live's WebSocket. */
35
+ export declare function query(name: string): Authorize<string>;
36
+ /** One protocol a provider serves, and where. `K` is the provider's key. */
37
+ export interface Serve<K = unknown> {
38
+ protocol: Protocol;
39
+ baseUrl: string;
40
+ /** Places the URL when the protocol's path isn't enough, e.g. the model in the path. */
41
+ url?(at: {
42
+ path: string;
43
+ apiId: string;
44
+ stream: boolean;
45
+ }): string;
46
+ /** In place of the provider's sign-in, for this protocol only. */
47
+ authorize?: Authorize<K>;
48
+ headers?: Readonly<Record<string, string>>;
49
+ }
50
+ /** A provider: where a service is and how to sign in to it. Data plus one sign-in function. */
51
+ export interface ProviderDefinition<C = unknown, K = unknown> {
52
+ /** The default id; a registration may rename it. */
53
+ id: string;
54
+ name: string;
55
+ description: string;
56
+ /** OpenTelemetry `gen_ai.provider.name`; else the id. */
57
+ traceName?: string;
58
+ /** What a builder sets when registering it, each field described. */
59
+ connection?: z.ZodType<C>;
60
+ /** Absent: no key. Optional: a key may be given. An object for e.g. a service account. */
61
+ key?: z.ZodType<K | undefined>;
62
+ authorize?: Authorize<K>;
63
+ /** Only where the API reports no cost. */
64
+ prices?: PriceTable;
65
+ serves(connection: C): Serve<K>[];
66
+ }
67
+ /** A provider as defined; register it to use it. */
68
+ export type Provider<C = unknown, K = unknown> = Readonly<ProviderDefinition<C, K>>;
69
+ /** Defines a provider. Nothing in it can change a request or read a reply. */
70
+ export declare function defineProvider<C = undefined, K = undefined>(definition: ProviderDefinition<C, K>): Provider<C, K>;
71
+ /** What a builder sets when registering a provider. */
72
+ export interface Registration<C> {
73
+ /** In place of the provider's id, e.g. two `local` servers. */
74
+ id?: string;
75
+ connection?: C;
76
+ keySlot?: KeySlot;
77
+ fallbackKeySlot?: KeySlot;
78
+ }
79
+ export type ModelSettings<O> = Omit<ModelBinding, 'protocol' | 'provider' | 'apiId' | 'options'> & {
80
+ options?: O;
81
+ };
82
+ export type DecisionModelSettings<O> = Omit<DecisionModelBinding, 'protocol' | 'provider' | 'apiId' | 'options'> & {
83
+ options?: O;
84
+ };
85
+ /** A provider registered in a scope, with its connection and slots. */
86
+ export interface RegisteredProvider {
87
+ readonly id: string;
88
+ readonly definition: Provider;
89
+ readonly connection: unknown;
90
+ readonly keySlot?: KeySlot;
91
+ readonly fallbackKeySlot?: KeySlot;
92
+ readonly serves: readonly Serve[];
93
+ /** A binding for this provider, its options checked against the protocol's schema. */
94
+ model<O>(protocol: Protocol<O> | string, apiId: string, settings?: ModelSettings<O>): ModelBinding;
95
+ decisionModel<O>(protocol: Protocol<O> | string, apiId: string, settings?: DecisionModelSettings<O>): DecisionModelBinding;
96
+ }
97
+ export interface ProviderRegistry {
98
+ /** Refuses an id already registered. */
99
+ register<C, K>(provider: Provider<C, K>, registration?: Registration<C>): RegisteredProvider;
100
+ /** Registers in place of the provider with the same id, for a tool that edits a project. */
101
+ replace<C, K>(provider: Provider<C, K>, registration?: Registration<C>): RegisteredProvider;
102
+ get(id: string): RegisteredProvider | undefined;
103
+ require(id: string, apiId: string): RegisteredProvider;
104
+ list(): RegisteredProvider[];
105
+ /** Every protocol the registered providers serve, with the protocols they extend. */
106
+ protocols(): Protocol[];
107
+ }
108
+ export declare function createProviderRegistry(): ProviderRegistry;
@@ -0,0 +1,143 @@
1
+ import { z } from 'zod';
2
+ import { TheoremError } from '../../guardrails/error.js';
3
+ import { labelText } from '../../guardrails/labels.js';
4
+ import { jsonValueSchema } from '../json.js';
5
+ import { decisionModelBindingSchema, keySlotSchema, modelBindingSchema, } from './binding.js';
6
+ import { modelOptions } from './protocol.js';
7
+ function authorizer(sign, webSocketHeaders) {
8
+ return Object.assign((key) => ({ sign: (outgoing) => sign(key, outgoing) }), {
9
+ webSocketHeaders,
10
+ });
11
+ }
12
+ /** A service's address in a connection: HTTP(S), with no credentials in it. Keys go in the vault. */
13
+ export const endpointUrlSchema = z
14
+ .string()
15
+ .url()
16
+ .refine((value) => {
17
+ // why: what is not a URL is refused by the check above, in its own words.
18
+ if (!URL.canParse(value))
19
+ return true;
20
+ const url = new URL(value);
21
+ return (['http:', 'https:'].includes(url.protocol) &&
22
+ !url.username &&
23
+ !url.password &&
24
+ ![...url.searchParams.keys()].some((key) => /key|auth|secret|token|password/i.test(key)));
25
+ }, labelText('protocol.endpoint_url'));
26
+ /** `Authorization: Bearer <key>`. */
27
+ export function bearer() {
28
+ return authorizer((key, outgoing) => outgoing.headers.set('Authorization', `Bearer ${key}`), true);
29
+ }
30
+ /** The key in a header of its own, e.g. `x-goog-api-key`, or `api-key` for Azure. */
31
+ export function header(name) {
32
+ return authorizer((key, outgoing) => outgoing.headers.set(name, key), true);
33
+ }
34
+ /** The key in the URL's query, e.g. `key` for Gemini Live's WebSocket. */
35
+ export function query(name) {
36
+ return authorizer((key, outgoing) => outgoing.url.searchParams.set(name, key), false);
37
+ }
38
+ const providerShape = z.object({
39
+ id: z.string().regex(/^[a-z][a-z0-9-]*$/),
40
+ name: z.string().min(1),
41
+ description: z.string().min(1),
42
+ traceName: z.string().min(1).optional(),
43
+ });
44
+ /** Defines a provider. Nothing in it can change a request or read a reply. */
45
+ export function defineProvider(definition) {
46
+ const parsed = providerShape.safeParse(definition);
47
+ if (!parsed.success || typeof definition.serves !== 'function')
48
+ throw new TheoremError('config', labelText('protocol.definition', {
49
+ id: String(definition.id),
50
+ // labels-exempt: builder diagnostic
51
+ issues: parsed.success ? 'serves is required' : z.prettifyError(parsed.error),
52
+ }));
53
+ return Object.freeze({ ...definition });
54
+ }
55
+ function served(provider, protocol) {
56
+ const serve = provider.serves.find((entry) => entry.protocol.id === protocol);
57
+ if (!serve)
58
+ throw new TheoremError('config', labelText('protocol.not_served', { provider: provider.id, protocol }));
59
+ return serve;
60
+ }
61
+ export function createProviderRegistry() {
62
+ const providers = new Map();
63
+ const protocols = new Map();
64
+ const claim = (protocol) => {
65
+ const lineage = [];
66
+ for (let at = protocol; at; at = at.base) {
67
+ const held = protocols.get(at.id);
68
+ if (held && held !== at)
69
+ throw new TheoremError('config', labelText('protocol.id_clash', { protocol: at.id }));
70
+ lineage.push(at);
71
+ }
72
+ return lineage;
73
+ };
74
+ const add = (provider, registration, replacing) => {
75
+ const id = registration.id ?? provider.id;
76
+ if (!replacing && providers.has(id))
77
+ throw new TheoremError('config', labelText('protocol.provider_id_clash', { provider: id }));
78
+ const parsed = provider.connection
79
+ ? provider.connection.safeParse(registration.connection)
80
+ : { success: true, data: undefined };
81
+ if (!parsed.success)
82
+ throw new TheoremError('config', labelText('protocol.connection', { provider: id, issues: z.prettifyError(parsed.error) }));
83
+ if (parsed.data !== undefined)
84
+ jsonValueSchema.parse(parsed.data);
85
+ if (registration.keySlot !== undefined)
86
+ keySlotSchema.parse(registration.keySlot);
87
+ if (registration.fallbackKeySlot !== undefined)
88
+ keySlotSchema.parse(registration.fallbackKeySlot);
89
+ if (registration.keySlot && registration.keySlot === registration.fallbackKeySlot)
90
+ throw new TheoremError('config', labelText('provider.fallback_slot'));
91
+ if ((registration.keySlot || registration.fallbackKeySlot) && !provider.key)
92
+ throw new TheoremError('config', labelText('protocol.no_key', { provider: id }));
93
+ const serves = Object.freeze(provider.serves(parsed.data).map((serve) => Object.freeze({ ...serve })));
94
+ const claimed = serves.flatMap((serve) => claim(serve.protocol));
95
+ const optionsOf = (protocol, apiId, options) => {
96
+ const { protocol: spoken } = served({ id, serves }, typeof protocol === 'string' ? protocol : protocol.id);
97
+ return { protocol: spoken.id, options: modelOptions(spoken, apiId, options) };
98
+ };
99
+ const registered = Object.freeze({
100
+ id,
101
+ definition: provider,
102
+ connection: parsed.data,
103
+ ...(registration.keySlot ? { keySlot: registration.keySlot } : {}),
104
+ ...(registration.fallbackKeySlot ? { fallbackKeySlot: registration.fallbackKeySlot } : {}),
105
+ serves,
106
+ model(protocol, apiId, settings = {}) {
107
+ const { options, ...rest } = settings;
108
+ return modelBindingSchema.parse({
109
+ ...rest,
110
+ provider: id,
111
+ apiId,
112
+ ...optionsOf(protocol, apiId, options),
113
+ });
114
+ },
115
+ decisionModel(protocol, apiId, settings = {}) {
116
+ const { options, ...rest } = settings;
117
+ return decisionModelBindingSchema.parse({
118
+ ...rest,
119
+ provider: id,
120
+ apiId,
121
+ ...optionsOf(protocol, apiId, options),
122
+ });
123
+ },
124
+ });
125
+ for (const protocol of claimed)
126
+ protocols.set(protocol.id, protocol);
127
+ providers.set(id, registered);
128
+ return registered;
129
+ };
130
+ return {
131
+ register: (provider, registration = {}) => add(provider, registration, false),
132
+ replace: (provider, registration = {}) => add(provider, registration, true),
133
+ get: (id) => providers.get(id),
134
+ require(id, apiId) {
135
+ const provider = providers.get(id);
136
+ if (!provider)
137
+ throw new TheoremError('config', labelText('protocol.provider_missing', { provider: id, apiId }));
138
+ return provider;
139
+ },
140
+ list: () => [...providers.values()],
141
+ protocols: () => [...protocols.values()],
142
+ };
143
+ }
@@ -0,0 +1,55 @@
1
+ import { type Wait } from '../../providers/shared/retry.js';
2
+ import { type JsonObject } from '../json.js';
3
+ import type { KeyVault } from '../registry/vault.js';
4
+ import type { DecisionResult, KeySlot } from '../types.js';
5
+ import { type DecisionModelBinding, type ModelBinding } from './binding.js';
6
+ import { type ProviderLimits } from './limits.js';
7
+ import type { DecisionCall, EmbeddingCall, EmbeddingResult, ModelProfileType, ProtocolOperations } from './protocol.js';
8
+ import type { RegisteredProvider } from './provider.js';
9
+ /** Opens a WebSocket with the headers and subprotocols a sign-in put on it. */
10
+ export type OpenWebSocket = (url: string, init: {
11
+ headers: Headers;
12
+ protocols: string[];
13
+ }) => Promise<WebSocket>;
14
+ /**
15
+ * The runtime's own WebSocket. It takes no headers, so a sign-in that needs them is refused; a host
16
+ * that can send them passes `openWebSocket`.
17
+ */
18
+ export declare function plainWebSocket(provider: string): OpenWebSocket;
19
+ /** What a host lends every provider call: its keys, its network, its clock, and its budgets. */
20
+ export interface ProviderHostOptions {
21
+ limits?: Partial<ProviderLimits>;
22
+ vault?: KeyVault;
23
+ fetch?: typeof fetch;
24
+ wait?: Wait;
25
+ openWebSocket?: OpenWebSocket;
26
+ }
27
+ /** One call's setup: a checked binding on its registered provider, and the host's means. */
28
+ export interface CallSetup {
29
+ provider: RegisteredProvider;
30
+ binding: ModelBinding | DecisionModelBinding;
31
+ profileType: ModelProfileType;
32
+ vault?: KeyVault;
33
+ fetch?: typeof fetch;
34
+ wait?: Wait;
35
+ /** Milliseconds the call has left; a retry never waits past it, so the real cause is reported. */
36
+ timeLeft?(): number;
37
+ openWebSocket?: OpenWebSocket;
38
+ limits?: ProviderLimits;
39
+ signal?: AbortSignal;
40
+ tapUpstream?(row: JsonObject): void;
41
+ /** Hands the wire rows to the stream as `raw` events, for looking around. */
42
+ rawRows?: boolean;
43
+ /** Told the slot and key each attempt signs with, so the caller can redact it and key its state. */
44
+ onKey?(slot: KeySlot | undefined, key: unknown): void;
45
+ }
46
+ /**
47
+ * One binding's call, as the kernel runs it: the protocol's operations with the kernel's retries,
48
+ * ids, origins, and prices around them.
49
+ */
50
+ /** What the kernel runs for one binding. */
51
+ export type ProtocolCall = Required<Omit<ProtocolOperations, 'decide'>> & {
52
+ decide(request: DecisionCall): Promise<DecisionResult>;
53
+ embed(request: EmbeddingCall): Promise<EmbeddingResult>;
54
+ };
55
+ export declare function callProtocol(setup: CallSetup): ProtocolCall;