@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,211 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { injectionSpans } from '../../guardrails/injection.js';
3
+ import { lexiconText, } from '../../guardrails/lexicon.js';
4
+ import { sensitiveSpans } from '../../guardrails/sensitive.js';
5
+ import { applySpans } from '../../observability/spans.js';
6
+ import { base64ToBytes, bytesToBase64 } from '../util/base64.js';
7
+ import { mimeEssence } from '../util/mime.js';
8
+ import { mimeAllowed, profileAccept } from './catalog.js';
9
+ const B64_PAD = 2;
10
+ const B64_WORD = 4;
11
+ const B64_TRIPLET = 3;
12
+ const CSV_FORMULA = /(^|,)(\s*)("?)(?:([=@])|([+-])(?![0-9."]))/gm;
13
+ const B64_BODY = /^[A-Za-z0-9+/]*={0,2}$/;
14
+ const TEXT_MIMES = new Set(['text/csv', 'text/plain', 'text/markdown']);
15
+ function resolveMediaLimits(inputs) {
16
+ const { maxFiles, maxBytes, maxTurnBytes, limitsByMime } = inputs;
17
+ if (maxFiles && maxBytes && maxTurnBytes) {
18
+ return { maxFiles, maxBytes, maxTurnBytes, limitsByMime };
19
+ }
20
+ return undefined;
21
+ }
22
+ /** A MIME-specific cap, then its category wildcard, then the global cap. */
23
+ function maxBytesForMime(mimeType, limits) {
24
+ if (limits.limitsByMime) {
25
+ const cleanMime = mimeEssence(mimeType);
26
+ if (limits.limitsByMime[cleanMime]) {
27
+ return limits.limitsByMime[cleanMime];
28
+ }
29
+ const [category] = cleanMime.split('/');
30
+ const wildCard = `${category}/*`;
31
+ if (limits.limitsByMime[wildCard]) {
32
+ return limits.limitsByMime[wildCard];
33
+ }
34
+ }
35
+ return limits.maxBytes;
36
+ }
37
+ function isTurnMediaRef(item) {
38
+ return 'uri' in item;
39
+ }
40
+ function requireMediaLimits(profile) {
41
+ if (profile.type === 'speech') {
42
+ throw new TheoremError('request', `Profile ${profile.id} (speech) does not accept media input`); // lexicon-exempt: developer contract error
43
+ }
44
+ if (profile.type === 'live') {
45
+ throw new TheoremError('request', `Profile ${profile.id} (live) does not accept turn attachment input`);
46
+ }
47
+ if (profile.type === 'host' || profile.type === 'decision') {
48
+ throw new TheoremError('request', `Profile ${profile.id} (${profile.type}) does not accept turn input`);
49
+ }
50
+ const limits = resolveMediaLimits(profile.inputs ?? {});
51
+ if (!limits) {
52
+ throw new TheoremError('config', `Profile ${profile.id} must set maxFiles, maxBytes, and maxTurnBytes`);
53
+ }
54
+ return limits;
55
+ }
56
+ function b64DecodedLen(data) {
57
+ let pad = 0;
58
+ if (data.endsWith('==')) {
59
+ pad = B64_PAD;
60
+ }
61
+ else if (data.endsWith('=')) {
62
+ pad = 1;
63
+ }
64
+ return Math.floor((data.length * B64_TRIPLET) / B64_WORD) - pad;
65
+ }
66
+ function decodeText(bytes) {
67
+ try {
68
+ return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
69
+ }
70
+ catch {
71
+ return new TextDecoder('latin1').decode(bytes);
72
+ }
73
+ }
74
+ /** CSV formula injection: formula-like cells get an apostrophe before they reach a model. */
75
+ function sanitizeCsvText(text) {
76
+ return text.replace(CSV_FORMULA, (_full, ...groups) => {
77
+ const [a, b, c, d, e] = groups;
78
+ return `${a}${b}${c}'${d ?? ''}${e ?? ''}`;
79
+ });
80
+ }
81
+ function sanitizeTextBytes(mime, bytes) {
82
+ let text = decodeText(bytes);
83
+ if (mime === 'text/csv') {
84
+ text = sanitizeCsvText(text);
85
+ }
86
+ return new TextEncoder().encode(applySpans(text, [...injectionSpans(text), ...sensitiveSpans(text)]));
87
+ }
88
+ function named(issue, name) {
89
+ return name ? { ...issue, fileName: name } : issue;
90
+ }
91
+ function mimeIssues(accept, files, channel) {
92
+ return files
93
+ .filter((file) => !mimeAllowed(accept, file.mimeType))
94
+ .map((file) => named({ code: 'mime_not_allowed', params: { mimeType: file.mimeType, channel } }, file.name));
95
+ }
96
+ function limitIssues(files, limits) {
97
+ const issues = [];
98
+ if (files.length > limits.maxFiles) {
99
+ issues.push({ code: 'too_many_files', params: { maxFiles: limits.maxFiles } });
100
+ }
101
+ let total = 0;
102
+ for (const file of files) {
103
+ if (file.sizeBytes === undefined)
104
+ continue;
105
+ const maxAllowed = maxBytesForMime(file.mimeType, limits);
106
+ if (file.sizeBytes > maxAllowed) {
107
+ issues.push(named({ code: 'file_too_large', params: { maxBytes: maxAllowed } }, file.name));
108
+ }
109
+ total += file.sizeBytes;
110
+ }
111
+ if (total > limits.maxTurnBytes) {
112
+ issues.push({ code: 'turn_too_large', params: { maxTurnBytes: limits.maxTurnBytes } });
113
+ }
114
+ return issues;
115
+ }
116
+ /** The one attachment check: the kernel throws on it at ingress and the headless interface runs it before a send. */
117
+ function attachmentIssues(rules, files, clips) {
118
+ const issues = [];
119
+ if (files.length > 0 && !rules.attachments) {
120
+ issues.push({ code: 'attachments_not_accepted', params: { channel: 'attachment' } });
121
+ }
122
+ if (clips.length > 0 && !rules.voice) {
123
+ issues.push({ code: 'voice_not_accepted', params: { channel: 'voice' } });
124
+ }
125
+ if (issues.length > 0)
126
+ return issues;
127
+ if (files.length === 0 && clips.length === 0)
128
+ return issues;
129
+ if (rules.attachments)
130
+ issues.push(...mimeIssues(rules.attachments, files, 'attachment'));
131
+ if (rules.voice)
132
+ issues.push(...mimeIssues(rules.voice, clips, 'voice'));
133
+ if (!rules.limits)
134
+ return [...issues, { code: 'limits_unconfigured' }];
135
+ return [...issues, ...limitIssues([...files, ...clips], rules.limits)];
136
+ }
137
+ const ISSUE_KEYS = {
138
+ mime_not_allowed: 'attachments.mime_not_allowed',
139
+ too_many_files: 'attachments.too_many_files',
140
+ file_too_large: 'attachments.file_too_large',
141
+ turn_too_large: 'attachments.turn_too_large',
142
+ attachments_not_accepted: 'attachments.not_accepted',
143
+ voice_not_accepted: 'attachments.not_accepted',
144
+ limits_unconfigured: 'attachments.limits_unconfigured',
145
+ };
146
+ function attachmentIssueCopy(issue) {
147
+ const params = {};
148
+ for (const [key, value] of Object.entries(issue.params ?? {})) {
149
+ if (value !== undefined)
150
+ params[key] = value;
151
+ }
152
+ if (issue.fileName !== undefined)
153
+ params.fileName = issue.fileName;
154
+ return { key: ISSUE_KEYS[issue.code], params };
155
+ }
156
+ function attachmentIssueText(issue, lexicon) {
157
+ const copy = attachmentIssueCopy(issue);
158
+ return lexiconText(copy.key, copy.params, lexicon);
159
+ }
160
+ function attachmentsRefused(issues) {
161
+ return new TheoremError('input',
162
+ // lexicon-exempt: internal diagnostic; the user reads the copy lines
163
+ `attachments refused: ${issues.map((issue) => issue.code).join(', ')}`, { copy: issues.map(attachmentIssueCopy) });
164
+ }
165
+ function factsOf(item) {
166
+ const facts = { mimeType: item.mimeType, name: item.name };
167
+ if (isTurnMediaRef(item))
168
+ return facts;
169
+ if (!B64_BODY.test(item.data)) {
170
+ // lexicon-exempt: developer-facing wire-format diagnostic, not product copy
171
+ throw new TheoremError('request', 'attachment data must be base64');
172
+ }
173
+ facts.sizeBytes = b64DecodedLen(item.data);
174
+ return facts;
175
+ }
176
+ /** Provider references are checked for MIME and count; byte limits apply to inline blobs only. */
177
+ function assertTurnAttachments(profile, attachments, voice) {
178
+ if (!hasTurnBlobs(attachments, voice))
179
+ return;
180
+ const limits = requireMediaLimits(profile);
181
+ const issues = attachmentIssues({
182
+ attachments: profileAccept(profile, 'attachments'),
183
+ voice: profileAccept(profile, 'voice'),
184
+ limits,
185
+ }, (attachments ?? []).map(factsOf), (voice ?? []).map(factsOf));
186
+ if (issues.length > 0)
187
+ throw attachmentsRefused(issues);
188
+ }
189
+ function sanitizeAttachment(blob) {
190
+ if (isTurnMediaRef(blob)) {
191
+ return blob;
192
+ }
193
+ const { mimeType, data } = blob;
194
+ if (!TEXT_MIMES.has(mimeEssence(mimeType))) {
195
+ return blob;
196
+ }
197
+ const bytes = sanitizeTextBytes(mimeType, base64ToBytes(data));
198
+ return { ...blob, data: bytesToBase64(bytes) };
199
+ }
200
+ function hasTurnBlobs(attachments, voice) {
201
+ return (attachments?.length ?? 0) > 0 || (voice?.length ?? 0) > 0;
202
+ }
203
+ /** Provider file references pass through unsanitized: the kernel has no bytes to scan. */
204
+ function sanitizeTurnBlobs(profile, attachments, voice) {
205
+ assertTurnAttachments(profile, attachments, voice);
206
+ return {
207
+ attachments: attachments?.length ? attachments.map(sanitizeAttachment) : attachments,
208
+ voice: voice?.length ? voice.map(sanitizeAttachment) : voice,
209
+ };
210
+ }
211
+ export { assertTurnAttachments, attachmentIssueCopy, attachmentIssues, attachmentIssueText, attachmentsRefused, isTurnMediaRef, maxBytesForMime, requireMediaLimits, resolveMediaLimits, sanitizeCsvText, sanitizeTurnBlobs, };
@@ -0,0 +1,19 @@
1
+ import type { MediaInputKind, ModelBinding, ModelId, ModelProfile, Profile, ProfileInputsSpec, ThinkingLevel } from '../types.js';
2
+ import { mimeEssence } from '../util/mime.js';
3
+ type MediaInputChannel = 'attachments' | 'voice';
4
+ /** Rules support a subtype wildcard such as `image/*`; parameter values are ignored. */
5
+ declare function mimeAllowed(accept: readonly string[], mime: string): boolean;
6
+ declare function mediaKindForMime(mime: string): MediaInputKind | undefined;
7
+ declare function profileInputs(profile: Profile): ProfileInputsSpec | undefined;
8
+ declare function profileAccept(profile: Profile, channel: MediaInputChannel): string[] | undefined;
9
+ /**
10
+ * `undefined` when the profile accepts it nowhere or the kernel cannot classify it. Hosts route
11
+ * files with this instead of their own MIME table: the profile's `accept` lists are the whole declaration.
12
+ */
13
+ declare function mediaChannelForMime(profile: Profile, mime: string): MediaInputChannel | undefined;
14
+ declare function requireModelBinding(profile: ModelProfile, modelId: ModelId): ModelBinding;
15
+ declare function clampThinkingLevel(binding: ModelBinding, level: ThinkingLevel): ThinkingLevel;
16
+ declare function modelEntryByApiId(bindings: Record<string, ModelBinding>, apiId: string): ModelBinding | undefined;
17
+ declare function clampThinkingLevelForApiId(bindings: Record<string, ModelBinding>, apiId: string, level: ThinkingLevel): ThinkingLevel;
18
+ export type { MediaInputChannel };
19
+ export { clampThinkingLevel, clampThinkingLevelForApiId, mediaChannelForMime, mediaKindForMime, mimeAllowed, mimeEssence, modelEntryByApiId, profileAccept, profileInputs, requireModelBinding, };
@@ -0,0 +1,78 @@
1
+ import { TheoremError } from '../../guardrails/error.js';
2
+ import { MEDIA_INPUT_KINDS } from '../schema.js';
3
+ import { mimeEssence } from '../util/mime.js';
4
+ /** Rules support a subtype wildcard such as `image/*`; parameter values are ignored. */
5
+ function mimeAllowed(accept, mime) {
6
+ const actual = mimeEssence(mime);
7
+ return accept.some((rule) => {
8
+ const allowed = mimeEssence(rule);
9
+ if (allowed.endsWith('/*')) {
10
+ return actual.startsWith(allowed.slice(0, -1));
11
+ }
12
+ return allowed === actual;
13
+ });
14
+ }
15
+ function mediaKindForMime(mime) {
16
+ return MEDIA_INPUT_KINDS[mimeEssence(mime)];
17
+ }
18
+ function profileInputs(profile) {
19
+ return profile.type === 'text' || profile.type === 'image' ? profile.inputs : undefined;
20
+ }
21
+ function profileAccept(profile, channel) {
22
+ const inputs = profileInputs(profile);
23
+ return channel === 'voice' ? inputs?.voice?.accept : inputs?.attachments?.accept;
24
+ }
25
+ /**
26
+ * `undefined` when the profile accepts it nowhere or the kernel cannot classify it. Hosts route
27
+ * files with this instead of their own MIME table: the profile's `accept` lists are the whole declaration.
28
+ */
29
+ function mediaChannelForMime(profile, mime) {
30
+ if (!mediaKindForMime(mime)) {
31
+ return undefined;
32
+ }
33
+ for (const channel of ['attachments', 'voice']) {
34
+ const accept = profileAccept(profile, channel);
35
+ if (accept && mimeAllowed(accept, mime)) {
36
+ return channel;
37
+ }
38
+ }
39
+ return undefined;
40
+ }
41
+ function requireModelBinding(profile, modelId) {
42
+ const binding = profile.models[modelId];
43
+ if (!binding) {
44
+ throw new TheoremError('config', `Profile ${profile.id} has no model binding for '${modelId}'`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
45
+ }
46
+ return binding;
47
+ }
48
+ function effortLevels(binding) {
49
+ if (!binding?.efforts) {
50
+ return [];
51
+ }
52
+ return Object.values(binding.efforts);
53
+ }
54
+ function clampLevels(binding, level) {
55
+ const legal = effortLevels(binding);
56
+ if (legal.length === 0) {
57
+ return level;
58
+ }
59
+ if (legal.includes(level)) {
60
+ return level;
61
+ }
62
+ const fallbackAlias = binding?.defaultEffort;
63
+ const fallback = fallbackAlias ? binding?.efforts?.[fallbackAlias] : undefined;
64
+ if (fallback && legal.includes(fallback)) {
65
+ return fallback;
66
+ }
67
+ return legal[0] ?? level;
68
+ }
69
+ function clampThinkingLevel(binding, level) {
70
+ return clampLevels(binding, level);
71
+ }
72
+ function modelEntryByApiId(bindings, apiId) {
73
+ return Object.values(bindings).find((m) => m.apiId === apiId);
74
+ }
75
+ function clampThinkingLevelForApiId(bindings, apiId, level) {
76
+ return clampLevels(modelEntryByApiId(bindings, apiId), level);
77
+ }
78
+ export { clampThinkingLevel, clampThinkingLevelForApiId, mediaChannelForMime, mediaKindForMime, mimeAllowed, mimeEssence, modelEntryByApiId, profileAccept, profileInputs, requireModelBinding, };
@@ -0,0 +1,8 @@
1
+ import type { ImageResponseFormat, InteractionPart, Profile, TurnRequest } from '../types.js';
2
+ /** Typed profiles already make mixed wire formats unrepresentable; this is a safety net. */
3
+ declare function assertOutputMode(profile: Profile, structuredId: string | null): void;
4
+ declare function assertSpeechRole(profile: Profile, req: TurnRequest): void;
5
+ declare function resolveImageFormat(profile: Profile): ImageResponseFormat | null;
6
+ declare function resolveInputParts(profile: Profile, req: TurnRequest): InteractionPart[];
7
+ declare function assertTurnSlots(profile: Profile, req: TurnRequest): void;
8
+ export { assertOutputMode, assertSpeechRole, assertTurnSlots, resolveImageFormat, resolveInputParts, };
@@ -0,0 +1,134 @@
1
+ import { wrapUserData } from '../../guardrails/canary.js';
2
+ import { TheoremError } from '../../guardrails/error.js';
3
+ import { lexiconText } from '../../guardrails/lexicon.js';
4
+ import { synthesizeRepairPrompt } from '../engine/repair.js';
5
+ import { CONTINUE_INSTRUCTION_TYPES } from '../stop.js';
6
+ import { isTurnMediaRef } from './attachments.js';
7
+ import { mediaKindForMime, mimeEssence, profileInputs } from './catalog.js';
8
+ function activePrimaryOutputModes(profile, structuredId) {
9
+ const modes = [];
10
+ if (structuredId) {
11
+ modes.push('structured');
12
+ }
13
+ if (profile.type === 'image') {
14
+ modes.push('image');
15
+ }
16
+ if (profile.type === 'speech') {
17
+ modes.push('speech');
18
+ }
19
+ return modes;
20
+ }
21
+ /** Typed profiles already make mixed wire formats unrepresentable; this is a safety net. */
22
+ function assertOutputMode(profile, structuredId) {
23
+ const active = activePrimaryOutputModes(profile, structuredId);
24
+ if (active.length <= 1) {
25
+ return;
26
+ }
27
+ throw new TheoremError('config', `Profile ${profile.id} declares multiple output wire formats (${active.join(', ')}). ` + // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
28
+ 'Only one of a structured JSON schema (outputs.structured), image, or speech may be active.');
29
+ }
30
+ function assertSpeechRole(profile, req) {
31
+ if (profile.type !== 'speech') {
32
+ return;
33
+ }
34
+ if (req.system) {
35
+ throw new TheoremError('config', `Profile ${profile.id} (speech) takes no system prompt — the input text is the transcript`);
36
+ }
37
+ }
38
+ function resolveImageFormat(profile) {
39
+ if (profile.type !== 'image') {
40
+ return null;
41
+ }
42
+ const pins = profile.image;
43
+ return {
44
+ type: 'image',
45
+ mimeType: pins.mimeType,
46
+ aspectRatio: pins.aspectRatio,
47
+ resolution: pins.resolution,
48
+ quality: pins.quality,
49
+ background: pins.background,
50
+ n: pins.n,
51
+ seed: pins.seed,
52
+ outputCompression: pins.outputCompression,
53
+ includeText: pins.includeText === true,
54
+ };
55
+ }
56
+ function assertMediaMime(mime) {
57
+ const kind = mediaKindForMime(mime);
58
+ if (!kind) {
59
+ throw new TheoremError('input', `MIME '${mime}' is not a supported media input type`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
60
+ }
61
+ return kind;
62
+ }
63
+ /** Runs after `assertTurnAttachments`. A reference's uri passes untouched: the host owns the upload. */
64
+ function mediaParts(blobs) {
65
+ return blobs.map((blob) => {
66
+ const kind = assertMediaMime(blob.mimeType);
67
+ const essence = mimeEssence(blob.mimeType);
68
+ const mimeType = essence === 'image/jpg' ? 'image/jpeg' : essence;
69
+ if (isTurnMediaRef(blob)) {
70
+ return { type: kind, mimeType, uri: blob.uri };
71
+ }
72
+ return { type: kind, mimeType, data: blob.data };
73
+ });
74
+ }
75
+ function extractTextPart(profile, req) {
76
+ const { text, repair, history } = req.input ?? {};
77
+ if (profile.type === 'speech' && !text?.trim()) {
78
+ throw new TheoremError('request', `Profile ${profile.id} (speech) requires text input`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
79
+ }
80
+ if (profileInputs(profile)?.text === false && text) {
81
+ throw new TheoremError('request', `Profile ${profile.id} does not accept text input`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
82
+ }
83
+ // A repair is the kernel's, not the user's, so it applies even when the profile takes no user text.
84
+ const promptText = repair
85
+ ? synthesizeRepairPrompt({ profile, repair, history })
86
+ : (continueText(profile, req) ?? text);
87
+ return promptText ? { type: 'text', text: wrapUserData(promptText) } : null;
88
+ }
89
+ /** Image and speech get none: their continue re-sends the host's request unchanged. */
90
+ function continueText(profile, req) {
91
+ if (!req.continueFrom || !CONTINUE_INSTRUCTION_TYPES.includes(profile.type)) {
92
+ return undefined;
93
+ }
94
+ if (req.input?.text) {
95
+ throw new TheoremError('request', `Profile ${profile.id}: a continueFrom turn takes no input.text — its user message is the continue instruction`);
96
+ }
97
+ return lexiconText('continue.instruction', {}, profile.lexicon);
98
+ }
99
+ function pinnedReferenceParts(profile) {
100
+ return profile.type === 'image' && profile.image.references
101
+ ? mediaParts(profile.image.references)
102
+ : [];
103
+ }
104
+ /** `sanitizeTurnRequest` has already checked the blobs against the profile's limits and accept lists. */
105
+ function extractMediaParts(profile, req) {
106
+ const files = req.input?.attachments ?? [];
107
+ const clips = req.input?.voice ?? [];
108
+ return [...pinnedReferenceParts(profile), ...mediaParts(files), ...mediaParts(clips)];
109
+ }
110
+ function resolveInputParts(profile, req) {
111
+ const parts = [];
112
+ const textPart = extractTextPart(profile, req);
113
+ if (textPart) {
114
+ parts.push(textPart);
115
+ }
116
+ parts.push(...extractMediaParts(profile, req));
117
+ return parts;
118
+ }
119
+ function assertTurnSlots(profile, req) {
120
+ const slots = req.input?.slots;
121
+ if (!slots)
122
+ return;
123
+ const declared = profileInputs(profile)?.slots ?? {};
124
+ for (const [key, value] of Object.entries(slots)) {
125
+ const choices = Object.hasOwn(declared, key) ? declared[key] : undefined;
126
+ if (!choices) {
127
+ throw new TheoremError('request', `Profile ${profile.id} has no slot '${key}'`);
128
+ }
129
+ if (!choices.includes(value)) {
130
+ throw new TheoremError('request', `Profile ${profile.id}: slot '${key}' takes ${choices.join(', ')}, not '${value}'`);
131
+ }
132
+ }
133
+ }
134
+ export { assertOutputMode, assertSpeechRole, assertTurnSlots, resolveImageFormat, resolveInputParts, };
@@ -0,0 +1,12 @@
1
+ import { type ToolRegistry } from '../tools/registry.js';
2
+ import { type ProfileRegistry } from './profiles.js';
3
+ import { type SchemaRegistry } from './schemas.js';
4
+ /** Every run takes one explicitly; nothing reads a registry it was not handed. */
5
+ interface KernelRegistry {
6
+ readonly tools: ToolRegistry;
7
+ readonly profiles: ProfileRegistry;
8
+ readonly schemas: SchemaRegistry;
9
+ }
10
+ declare function createKernelRegistry(): KernelRegistry;
11
+ export type { KernelRegistry };
12
+ export { createKernelRegistry };
@@ -0,0 +1,8 @@
1
+ import { createToolRegistry } from '../tools/registry.js';
2
+ import { createProfileRegistry } from './profiles.js';
3
+ import { createSchemaRegistry } from './schemas.js';
4
+ function createKernelRegistry() {
5
+ const tools = createToolRegistry();
6
+ return { tools, profiles: createProfileRegistry(tools), schemas: createSchemaRegistry() };
7
+ }
8
+ export { createKernelRegistry };
@@ -0,0 +1,3 @@
1
+ import type { Profile, ProfileOutputsSpec } from '../types.js';
2
+ declare function profileTurnOutputs(profile: Profile): ProfileOutputsSpec | undefined;
3
+ export { profileTurnOutputs };
@@ -0,0 +1,7 @@
1
+ function profileTurnOutputs(profile) {
2
+ if (profile.type === 'live' || profile.type === 'host' || profile.type === 'decision') {
3
+ return undefined;
4
+ }
5
+ return profile.outputs;
6
+ }
7
+ export { profileTurnOutputs };
@@ -0,0 +1,92 @@
1
+ import { type LexiconOverrides } from '../../guardrails/lexicon.js';
2
+ import type { DecisionGuardrailsSpec, HostGuardrailsSpec, ProfileGuardrailsSpec } from '../../guardrails/types.js';
3
+ import type { ProfileObservabilitySpec } from '../../observability/types.js';
4
+ import type { ToolRegistry } from '../tools/registry.js';
5
+ import type { DecisionModelBinding, DecisionProfile, HostProfile, HostProfileToolsSpec, ImageInputsSpec, ImageProfile, LiveProfile, LiveProfileToolsSpec, MediaTurnBehaviourSpec, ModelBinding, ModelId, Profile, ProfileIdentity, ProfileInputsSpec, ProfileModelFields, ProfileOutputsSpec, ProfileToolsSpec, ProfileTurnBehaviourSpec, SpeechGuardrailsSpec, SpeechProfile, TextProfile } from '../types.js';
6
+ /** Not shared by host profiles, which invoke tools without a model turn. */
7
+ export type ProfileDefinitionBase = {
8
+ id: Profile['id'];
9
+ identity: ProfileIdentity;
10
+ models: Record<ModelId, ModelBinding>;
11
+ defaultModel?: ModelId;
12
+ allowModelSelect?: boolean;
13
+ maxSteps?: number;
14
+ key?: ProfileModelFields['key'];
15
+ fallbackKey?: ProfileModelFields['fallbackKey'];
16
+ outputs?: ProfileOutputsSpec;
17
+ guardrails?: ProfileGuardrailsSpec;
18
+ observability?: ProfileObservabilitySpec;
19
+ lexicon?: LexiconOverrides;
20
+ };
21
+ export type TextProfileDefinition = ProfileDefinitionBase & {
22
+ type: 'text';
23
+ tools: ProfileToolsSpec;
24
+ inputs: ProfileInputsSpec;
25
+ turnBehaviour?: ProfileTurnBehaviourSpec;
26
+ };
27
+ export type ImageProfileDefinition = ProfileDefinitionBase & {
28
+ type: 'image';
29
+ image: NonNullable<ImageProfile['image']>;
30
+ tools: ProfileToolsSpec;
31
+ inputs: ImageInputsSpec;
32
+ turnBehaviour?: MediaTurnBehaviourSpec;
33
+ };
34
+ export type SpeechProfileDefinition = Omit<ProfileDefinitionBase, 'identity' | 'guardrails'> & {
35
+ type: 'speech';
36
+ identity: SpeechProfile['identity'];
37
+ guardrails?: SpeechGuardrailsSpec;
38
+ speech: NonNullable<SpeechProfile['speech']>;
39
+ turnBehaviour?: MediaTurnBehaviourSpec;
40
+ };
41
+ export type LiveProfileDefinition = ProfileDefinitionBase & {
42
+ type: 'live';
43
+ live: NonNullable<LiveProfile['live']>;
44
+ tools: LiveProfileToolsSpec;
45
+ /** Inject gate only — resumption is `live.sessionResumption`. */
46
+ turnBehaviour?: Pick<ProfileTurnBehaviourSpec, 'allowSteering'>;
47
+ };
48
+ export type DecisionProfileDefinition = {
49
+ type: 'decision';
50
+ id: Profile['id'];
51
+ identity: Pick<ProfileIdentity, 'handle'>;
52
+ /** Exactly one model. */
53
+ models: Record<ModelId, DecisionModelBinding>;
54
+ key?: import('../types.js').KeySlot;
55
+ inputs: DecisionProfile['inputs'];
56
+ decision: DecisionProfile['decision'];
57
+ guardrails?: DecisionGuardrailsSpec;
58
+ observability?: ProfileObservabilitySpec;
59
+ lexicon?: LexiconOverrides;
60
+ };
61
+ export type HostProfileDefinition = {
62
+ type: 'host';
63
+ id: Profile['id'];
64
+ tools: HostProfileToolsSpec;
65
+ /** Only the guards that fire on the `invokeTool` path. */
66
+ guardrails?: HostGuardrailsSpec;
67
+ observability?: ProfileObservabilitySpec;
68
+ lexicon?: LexiconOverrides;
69
+ };
70
+ export type ProfileDefinition = TextProfileDefinition | ImageProfileDefinition | SpeechProfileDefinition | LiveProfileDefinition | DecisionProfileDefinition | HostProfileDefinition;
71
+ declare function defineProfile(input: TextProfileDefinition): TextProfile;
72
+ declare function defineProfile(input: ImageProfileDefinition): ImageProfile;
73
+ declare function defineProfile(input: SpeechProfileDefinition): SpeechProfile;
74
+ declare function defineProfile(input: LiveProfileDefinition): LiveProfile;
75
+ declare function defineProfile(input: DecisionProfileDefinition): DecisionProfile;
76
+ declare function defineProfile(input: HostProfileDefinition): HostProfile;
77
+ declare function defineProfile(input: Exclude<ProfileDefinition, LiveProfileDefinition | HostProfileDefinition>): Exclude<Profile, LiveProfile | HostProfile>;
78
+ declare function defineProfile(input: ProfileDefinition): Profile;
79
+ interface ProfileRegistry {
80
+ register(profileInput: Profile | ProfileDefinition): void;
81
+ registerMany(profilesList: Array<Profile | ProfileDefinition>): void;
82
+ /** Throws when there is none. */
83
+ get(id: string): Profile;
84
+ find(id: string): Profile | undefined;
85
+ has(id: string): boolean;
86
+ list(): Profile[];
87
+ clear(): void;
88
+ }
89
+ /** Profiles are checked against `tools`, so register a scope's tools before its profiles. */
90
+ declare function createProfileRegistry(tools: ToolRegistry): ProfileRegistry;
91
+ export type { ProfileRegistry };
92
+ export { createProfileRegistry, defineProfile };