@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
@@ -1,8 +1,5 @@
1
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';
2
+ import { labelText, } from '../../guardrails/labels.js';
6
3
  import { base64ToBytes, bytesToBase64 } from '../util/base64.js';
7
4
  import { mimeEssence } from '../util/mime.js';
8
5
  import { mimeAllowed, profileAccept } from './catalog.js';
@@ -12,6 +9,7 @@ const B64_TRIPLET = 3;
12
9
  const CSV_FORMULA = /(^|,)(\s*)("?)(?:([=@])|([+-])(?![0-9."]))/gm;
13
10
  const B64_BODY = /^[A-Za-z0-9+/]*={0,2}$/;
14
11
  const TEXT_MIMES = new Set(['text/csv', 'text/plain', 'text/markdown']);
12
+ /** The media limits an inputs spec sets, or `undefined` unless it sets `maxFiles`, `maxBytes`, and `maxTurnBytes`. */
15
13
  function resolveMediaLimits(inputs) {
16
14
  const { maxFiles, maxBytes, maxTurnBytes, limitsByMime } = inputs;
17
15
  if (maxFiles && maxBytes && maxTurnBytes) {
@@ -37,14 +35,15 @@ function maxBytesForMime(mimeType, limits) {
37
35
  function isTurnMediaRef(item) {
38
36
  return 'uri' in item;
39
37
  }
38
+ /** The profile's media limits; throws when it takes no media. */
40
39
  function requireMediaLimits(profile) {
41
40
  if (profile.type === 'speech') {
42
- throw new TheoremError('request', `Profile ${profile.id} (speech) does not accept media input`); // lexicon-exempt: developer contract error
41
+ throw new TheoremError('request', `Profile ${profile.id} (speech) does not accept media input`); // labels-exempt: developer contract error
43
42
  }
44
43
  if (profile.type === 'live') {
45
44
  throw new TheoremError('request', `Profile ${profile.id} (live) does not accept turn attachment input`);
46
45
  }
47
- if (profile.type === 'host' || profile.type === 'decision') {
46
+ if (profile.type === 'host' || profile.type === 'decision' || profile.type === 'embedding') {
48
47
  throw new TheoremError('request', `Profile ${profile.id} (${profile.type}) does not accept turn input`);
49
48
  }
50
49
  const limits = resolveMediaLimits(profile.inputs ?? {});
@@ -78,12 +77,12 @@ function sanitizeCsvText(text) {
78
77
  return `${a}${b}${c}'${d ?? ''}${e ?? ''}`;
79
78
  });
80
79
  }
81
- function sanitizeTextBytes(mime, bytes) {
80
+ function sanitizeTextBytes(mime, bytes, reader) {
82
81
  let text = decodeText(bytes);
83
82
  if (mime === 'text/csv') {
84
83
  text = sanitizeCsvText(text);
85
84
  }
86
- return new TextEncoder().encode(applySpans(text, [...injectionSpans(text), ...sensitiveSpans(text)]));
85
+ return new TextEncoder().encode(reader.read(text));
87
86
  }
88
87
  function named(issue, name) {
89
88
  return name ? { ...issue, fileName: name } : issue;
@@ -137,12 +136,14 @@ function attachmentIssues(rules, files, clips) {
137
136
  const ISSUE_KEYS = {
138
137
  mime_not_allowed: 'attachments.mime_not_allowed',
139
138
  too_many_files: 'attachments.too_many_files',
139
+ too_many_of_kind: 'attachments.too_many_of_kind',
140
140
  file_too_large: 'attachments.file_too_large',
141
141
  turn_too_large: 'attachments.turn_too_large',
142
142
  attachments_not_accepted: 'attachments.not_accepted',
143
143
  voice_not_accepted: 'attachments.not_accepted',
144
144
  limits_unconfigured: 'attachments.limits_unconfigured',
145
145
  };
146
+ /** The user-facing wording key and params for an attachment issue. */
146
147
  function attachmentIssueCopy(issue) {
147
148
  const params = {};
148
149
  for (const [key, value] of Object.entries(issue.params ?? {})) {
@@ -153,24 +154,30 @@ function attachmentIssueCopy(issue) {
153
154
  params.fileName = issue.fileName;
154
155
  return { key: ISSUE_KEYS[issue.code], params };
155
156
  }
156
- function attachmentIssueText(issue, lexicon) {
157
+ /** The user-facing text for an attachment issue. */
158
+ function attachmentIssueText(issue, labels) {
157
159
  const copy = attachmentIssueCopy(issue);
158
- return lexiconText(copy.key, copy.params, lexicon);
160
+ return labelText(copy.key, copy.params, labels);
159
161
  }
162
+ /** The error for a turn whose attachments were refused. */
160
163
  function attachmentsRefused(issues) {
161
164
  return new TheoremError('input',
162
- // lexicon-exempt: internal diagnostic; the user reads the copy lines
165
+ // labels-exempt: internal diagnostic; the user reads the copy lines
163
166
  `attachments refused: ${issues.map((issue) => issue.code).join(', ')}`, { copy: issues.map(attachmentIssueCopy) });
164
167
  }
168
+ /** The decoded size of inline base64 data; throws when it is not base64. */
169
+ function base64Bytes(data) {
170
+ if (!B64_BODY.test(data)) {
171
+ // labels-exempt: developer-facing wire-format diagnostic, not product copy
172
+ throw new TheoremError('request', 'attachment data must be base64');
173
+ }
174
+ return b64DecodedLen(data);
175
+ }
165
176
  function factsOf(item) {
166
177
  const facts = { mimeType: item.mimeType, name: item.name };
167
178
  if (isTurnMediaRef(item))
168
179
  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);
180
+ facts.sizeBytes = base64Bytes(item.data);
174
181
  return facts;
175
182
  }
176
183
  /** Provider references are checked for MIME and count; byte limits apply to inline blobs only. */
@@ -186,7 +193,7 @@ function assertTurnAttachments(profile, attachments, voice) {
186
193
  if (issues.length > 0)
187
194
  throw attachmentsRefused(issues);
188
195
  }
189
- function sanitizeAttachment(blob) {
196
+ function sanitizeAttachment(blob, reader) {
190
197
  if (isTurnMediaRef(blob)) {
191
198
  return blob;
192
199
  }
@@ -194,18 +201,20 @@ function sanitizeAttachment(blob) {
194
201
  if (!TEXT_MIMES.has(mimeEssence(mimeType))) {
195
202
  return blob;
196
203
  }
197
- const bytes = sanitizeTextBytes(mimeType, base64ToBytes(data));
204
+ const bytes = sanitizeTextBytes(mimeType, base64ToBytes(data), reader);
198
205
  return { ...blob, data: bytesToBase64(bytes) };
199
206
  }
200
207
  function hasTurnBlobs(attachments, voice) {
201
208
  return (attachments?.length ?? 0) > 0 || (voice?.length ?? 0) > 0;
202
209
  }
203
210
  /** Provider file references pass through unsanitized: the kernel has no bytes to scan. */
204
- function sanitizeTurnBlobs(profile, attachments, voice) {
211
+ function sanitizeTurnBlobs(profile, attachments, voice, at) {
205
212
  assertTurnAttachments(profile, attachments, voice);
206
213
  return {
207
- attachments: attachments?.length ? attachments.map(sanitizeAttachment) : attachments,
208
- voice: voice?.length ? voice.map(sanitizeAttachment) : voice,
214
+ attachments: attachments?.length
215
+ ? attachments.map((blob) => sanitizeAttachment(blob, at.attachment))
216
+ : attachments,
217
+ voice: voice?.length ? voice.map((blob) => sanitizeAttachment(blob, at.voice)) : voice,
209
218
  };
210
219
  }
211
- export { assertTurnAttachments, attachmentIssueCopy, attachmentIssues, attachmentIssueText, attachmentsRefused, isTurnMediaRef, maxBytesForMime, requireMediaLimits, resolveMediaLimits, sanitizeCsvText, sanitizeTurnBlobs, };
220
+ export { assertTurnAttachments, attachmentIssueCopy, attachmentIssues, attachmentIssueText, attachmentsRefused, base64Bytes, isTurnMediaRef, maxBytesForMime, requireMediaLimits, resolveMediaLimits, sanitizeCsvText, sanitizeTurnBlobs, };
@@ -1,8 +1,10 @@
1
1
  import type { MediaInputKind, ModelBinding, ModelId, ModelProfile, Profile, ProfileInputsSpec, ThinkingLevel } from '../types.js';
2
2
  import { mimeEssence } from '../util/mime.js';
3
+ /** Where a media input arrives: as an attachment or as voice. */
3
4
  type MediaInputChannel = 'attachments' | 'voice';
4
5
  /** Rules support a subtype wildcard such as `image/*`; parameter values are ignored. */
5
6
  declare function mimeAllowed(accept: readonly string[], mime: string): boolean;
7
+ /** The kind of media a MIME type is, or `undefined` when it is not accepted. */
6
8
  declare function mediaKindForMime(mime: string): MediaInputKind | undefined;
7
9
  declare function profileInputs(profile: Profile): ProfileInputsSpec | undefined;
8
10
  declare function profileAccept(profile: Profile, channel: MediaInputChannel): string[] | undefined;
@@ -11,9 +13,13 @@ declare function profileAccept(profile: Profile, channel: MediaInputChannel): st
11
13
  * files with this instead of their own MIME table: the profile's `accept` lists are the whole declaration.
12
14
  */
13
15
  declare function mediaChannelForMime(profile: Profile, mime: string): MediaInputChannel | undefined;
16
+ /** The profile's binding for the model id; throws when there is none. */
14
17
  declare function requireModelBinding(profile: ModelProfile, modelId: ModelId): ModelBinding;
18
+ /** The level if the binding accepts it, else the binding's default effort level, else its first listed level. */
15
19
  declare function clampThinkingLevel(binding: ModelBinding, level: ThinkingLevel): ThinkingLevel;
20
+ /** The binding whose provider model id is `apiId`, or `undefined`. */
16
21
  declare function modelEntryByApiId(bindings: Record<string, ModelBinding>, apiId: string): ModelBinding | undefined;
22
+ /** The level if the binding for this provider model id accepts it, else that binding's default effort level, else its first listed level. */
17
23
  declare function clampThinkingLevelForApiId(bindings: Record<string, ModelBinding>, apiId: string, level: ThinkingLevel): ThinkingLevel;
18
24
  export type { MediaInputChannel };
19
25
  export { clampThinkingLevel, clampThinkingLevelForApiId, mediaChannelForMime, mediaKindForMime, mimeAllowed, mimeEssence, modelEntryByApiId, profileAccept, profileInputs, requireModelBinding, };
@@ -12,11 +12,14 @@ function mimeAllowed(accept, mime) {
12
12
  return allowed === actual;
13
13
  });
14
14
  }
15
+ /** The kind of media a MIME type is, or `undefined` when it is not accepted. */
15
16
  function mediaKindForMime(mime) {
16
17
  return MEDIA_INPUT_KINDS[mimeEssence(mime)];
17
18
  }
18
19
  function profileInputs(profile) {
19
- return profile.type === 'text' || profile.type === 'image' ? profile.inputs : undefined;
20
+ return profile.type === 'text' || profile.type === 'image' || profile.type === 'live'
21
+ ? profile.inputs
22
+ : undefined;
20
23
  }
21
24
  function profileAccept(profile, channel) {
22
25
  const inputs = profileInputs(profile);
@@ -38,10 +41,11 @@ function mediaChannelForMime(profile, mime) {
38
41
  }
39
42
  return undefined;
40
43
  }
44
+ /** The profile's binding for the model id; throws when there is none. */
41
45
  function requireModelBinding(profile, modelId) {
42
46
  const binding = profile.models[modelId];
43
47
  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)
48
+ throw new TheoremError('config', `Profile ${profile.id} has no model binding for '${modelId}'`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
45
49
  }
46
50
  return binding;
47
51
  }
@@ -66,12 +70,15 @@ function clampLevels(binding, level) {
66
70
  }
67
71
  return legal[0] ?? level;
68
72
  }
73
+ /** The level if the binding accepts it, else the binding's default effort level, else its first listed level. */
69
74
  function clampThinkingLevel(binding, level) {
70
75
  return clampLevels(binding, level);
71
76
  }
77
+ /** The binding whose provider model id is `apiId`, or `undefined`. */
72
78
  function modelEntryByApiId(bindings, apiId) {
73
79
  return Object.values(bindings).find((m) => m.apiId === apiId);
74
80
  }
81
+ /** The level if the binding for this provider model id accepts it, else that binding's default effort level, else its first listed level. */
75
82
  function clampThinkingLevelForApiId(bindings, apiId, level) {
76
83
  return clampLevels(modelEntryByApiId(bindings, apiId), level);
77
84
  }
@@ -0,0 +1,28 @@
1
+ import type { EmbeddingModelLimits } from '../protocols/protocol.js';
2
+ import type { AttachmentValidationIssue, MimeInputs } from '../types.js';
3
+ import { type AttachmentFacts } from './attachments.js';
4
+ /**
5
+ * What one embedding request may carry: the profile's inputs held to its model's limits. File
6
+ * counts are per input, sizes per file and across the request.
7
+ */
8
+ export interface EmbeddingRules {
9
+ text: boolean;
10
+ attachments?: {
11
+ accept: string[];
12
+ };
13
+ maxFiles?: number;
14
+ maxBytes?: number;
15
+ maxTurnBytes?: number;
16
+ limitsByMime?: Record<string, number>;
17
+ /** Inputs one request may carry. */
18
+ maxInputs?: number;
19
+ /** The model's caps on one kind of media in one input. */
20
+ perInput?: {
21
+ accept: string[];
22
+ max: number;
23
+ }[];
24
+ }
25
+ /** The profile's inputs held to what its model takes; without the model's limits, the profile's alone. */
26
+ export declare function embeddingRules(inputs: MimeInputs, model?: EmbeddingModelLimits): EmbeddingRules;
27
+ /** The one embedding media check, input by input: the kernel throws on it and the client runs it before a send. */
28
+ export declare function embeddingMediaIssues(rules: EmbeddingRules, media: readonly (readonly AttachmentFacts[])[]): AttachmentValidationIssue[];
@@ -0,0 +1,66 @@
1
+ import { mimeEssence } from '../util/mime.js';
2
+ import { attachmentIssues, resolveMediaLimits } from './attachments.js';
3
+ import { mimeAllowed } from './catalog.js';
4
+ /** The types both lists take, each as narrow as the narrower list names it. */
5
+ function bothAccept(profile, model) {
6
+ return [
7
+ ...new Set([
8
+ ...model.filter((mime) => mimeAllowed(profile, mime)),
9
+ ...profile.filter((mime) => mimeAllowed(model, mime)),
10
+ ]),
11
+ ];
12
+ }
13
+ /** The profile's inputs held to what its model takes; without the model's limits, the profile's alone. */
14
+ export function embeddingRules(inputs, model) {
15
+ const accept = inputs.attachments
16
+ ? model
17
+ ? bothAccept(inputs.attachments.accept, model.media.flatMap((kind) => kind.accept))
18
+ : [...inputs.attachments.accept]
19
+ : [];
20
+ const perInput = (model?.media ?? []).flatMap((kind) => kind.maxPerInput === undefined ? [] : [{ accept: [...kind.accept], max: kind.maxPerInput }]);
21
+ return {
22
+ text: inputs.text !== false,
23
+ ...(accept.length > 0 ? { attachments: { accept } } : {}),
24
+ ...(inputs.maxFiles === undefined ? {} : { maxFiles: inputs.maxFiles }),
25
+ ...(inputs.maxBytes === undefined ? {} : { maxBytes: inputs.maxBytes }),
26
+ ...(inputs.maxTurnBytes === undefined ? {} : { maxTurnBytes: inputs.maxTurnBytes }),
27
+ ...(inputs.limitsByMime === undefined ? {} : { limitsByMime: { ...inputs.limitsByMime } }),
28
+ ...(model?.maxInputs === undefined ? {} : { maxInputs: model.maxInputs }),
29
+ ...(perInput.length > 0 ? { perInput } : {}),
30
+ };
31
+ }
32
+ /** How the user reads a kind of media: PDF, or its top-level type. */
33
+ function kindName(accept) {
34
+ const first = mimeEssence(accept[0] ?? '');
35
+ return first === 'application/pdf' ? 'PDF' : (first.split('/')[0] ?? first);
36
+ }
37
+ /** The one embedding media check, input by input: the kernel throws on it and the client runs it before a send. */
38
+ export function embeddingMediaIssues(rules, media) {
39
+ const limits = resolveMediaLimits(rules);
40
+ const issues = attachmentIssues({
41
+ attachments: rules.attachments?.accept,
42
+ ...(limits ? { limits: { ...limits, maxFiles: Number.MAX_SAFE_INTEGER } } : {}),
43
+ }, media.flat(), []);
44
+ if (limits) {
45
+ for (const files of media) {
46
+ if (files.length > limits.maxFiles)
47
+ issues.push({ code: 'too_many_files', params: { maxFiles: limits.maxFiles } });
48
+ for (const kind of rules.perInput ?? []) {
49
+ const count = files.filter((file) => mimeAllowed(kind.accept, file.mimeType)).length;
50
+ if (count > kind.max)
51
+ issues.push({
52
+ code: 'too_many_of_kind',
53
+ params: { maxFiles: kind.max, kind: kindName(kind.accept) },
54
+ });
55
+ }
56
+ }
57
+ }
58
+ const seen = new Set();
59
+ return issues.filter((issue) => {
60
+ const key = JSON.stringify(issue);
61
+ if (seen.has(key))
62
+ return false;
63
+ seen.add(key);
64
+ return true;
65
+ });
66
+ }
@@ -1,8 +1,12 @@
1
- import type { ImageResponseFormat, InteractionPart, Profile, TurnRequest } from '../types.js';
1
+ import type { ImageResponseFormat, InteractionPart, Profile, ProfileSpeechSpec, TurnRequest } from '../types.js';
2
2
  /** Typed profiles already make mixed wire formats unrepresentable; this is a safety net. */
3
3
  declare function assertOutputMode(profile: Profile, structuredId: string | null): void;
4
4
  declare function assertSpeechRole(profile: Profile, req: TurnRequest): void;
5
+ /** The profile's speech settings with this turn's laid over them. */
6
+ declare function resolveSpeech(profile: Profile, req: TurnRequest): ProfileSpeechSpec | undefined;
5
7
  declare function resolveImageFormat(profile: Profile): ImageResponseFormat | null;
6
8
  declare function resolveInputParts(profile: Profile, req: TurnRequest): InteractionPart[];
7
9
  declare function assertTurnSlots(profile: Profile, req: TurnRequest): void;
8
- export { assertOutputMode, assertSpeechRole, assertTurnSlots, resolveImageFormat, resolveInputParts, };
10
+ /** Refuses context from a sender the profile's `inputs.context` does not list, and a package over its `maxChars`. */
11
+ declare function assertTurnContext(profile: Profile, req: TurnRequest): void;
12
+ export { assertOutputMode, assertSpeechRole, assertTurnContext, assertTurnSlots, resolveImageFormat, resolveInputParts, resolveSpeech, };
@@ -1,7 +1,9 @@
1
- import { wrapUserData } from '../../guardrails/canary.js';
1
+ import { wrapContext, wrapUserData } from '../../guardrails/canary.js';
2
2
  import { TheoremError } from '../../guardrails/error.js';
3
- import { lexiconText } from '../../guardrails/lexicon.js';
3
+ import { labelText } from '../../guardrails/labels.js';
4
+ import { contextText } from '../../guardrails/sanitize.js';
4
5
  import { synthesizeRepairPrompt } from '../engine/repair.js';
6
+ import { CONTEXT_SENDERS } from '../schema.js';
5
7
  import { CONTINUE_INSTRUCTION_TYPES } from '../stop.js';
6
8
  import { isTurnMediaRef } from './attachments.js';
7
9
  import { mediaKindForMime, mimeEssence, profileInputs } from './catalog.js';
@@ -24,17 +26,29 @@ function assertOutputMode(profile, structuredId) {
24
26
  if (active.length <= 1) {
25
27
  return;
26
28
  }
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)
29
+ throw new TheoremError('config', `Profile ${profile.id} declares multiple output wire formats (${active.join(', ')}). ` + // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
28
30
  'Only one of a structured JSON schema (outputs.structured), image, or speech may be active.');
29
31
  }
30
32
  function assertSpeechRole(profile, req) {
31
33
  if (profile.type !== 'speech') {
34
+ if (req.speech) {
35
+ throw new TheoremError('request', `Profile ${profile.id} (${profile.type}) takes no speech settings — only a speech profile speaks`);
36
+ }
32
37
  return;
33
38
  }
34
39
  if (req.system) {
35
40
  throw new TheoremError('config', `Profile ${profile.id} (speech) takes no system prompt — the input text is the transcript`);
36
41
  }
37
42
  }
43
+ /** The profile's speech settings with this turn's laid over them. */
44
+ function resolveSpeech(profile, req) {
45
+ return profile.type === 'speech'
46
+ ? { ...profile.speech, ...definedFields(req.speech) }
47
+ : undefined;
48
+ }
49
+ function definedFields(speech) {
50
+ return Object.fromEntries(Object.entries(speech ?? {}).filter(([, value]) => value !== undefined));
51
+ }
38
52
  function resolveImageFormat(profile) {
39
53
  if (profile.type !== 'image') {
40
54
  return null;
@@ -56,7 +70,7 @@ function resolveImageFormat(profile) {
56
70
  function assertMediaMime(mime) {
57
71
  const kind = mediaKindForMime(mime);
58
72
  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)
73
+ throw new TheoremError('input', `MIME '${mime}' is not a supported media input type`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
60
74
  }
61
75
  return kind;
62
76
  }
@@ -75,16 +89,29 @@ function mediaParts(blobs) {
75
89
  function extractTextPart(profile, req) {
76
90
  const { text, repair, history } = req.input ?? {};
77
91
  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)
92
+ throw new TheoremError('request', `Profile ${profile.id} (speech) requires text input`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
79
93
  }
80
94
  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)
95
+ throw new TheoremError('request', `Profile ${profile.id} does not accept text input`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
82
96
  }
83
- // A repair is the kernel's, not the user's, so it applies even when the profile takes no user text.
97
+ // why: A repair is the kernel's, not the user's, so it applies even when the profile takes no user text.
84
98
  const promptText = repair
85
99
  ? synthesizeRepairPrompt({ profile, repair, history })
86
100
  : (continueText(profile, req) ?? text);
87
- return promptText ? { type: 'text', text: wrapUserData(promptText) } : null;
101
+ // why: A speech model reads its input aloud, fence and all; it follows no instruction, so none needs fencing.
102
+ if (profile.type === 'speech') {
103
+ return promptText ? { type: 'text', text: promptText } : null;
104
+ }
105
+ const blocks = [...contextBlocks(req), ...(promptText ? [wrapUserData(promptText)] : [])];
106
+ return blocks.length > 0 ? { type: 'text', text: blocks.join('\n\n') } : null;
107
+ }
108
+ /** Each sender's context in its own fence, the host's first: the model reads it before the user's message. */
109
+ function contextBlocks(req) {
110
+ const context = req.input?.context ?? {};
111
+ return [...CONTEXT_SENDERS]
112
+ .reverse()
113
+ .filter((sender) => context[sender] !== undefined)
114
+ .map((sender) => wrapContext(sender, contextText(context[sender])));
88
115
  }
89
116
  /** Image and speech get none: their continue re-sends the host's request unchanged. */
90
117
  function continueText(profile, req) {
@@ -94,7 +121,7 @@ function continueText(profile, req) {
94
121
  if (req.input?.text) {
95
122
  throw new TheoremError('request', `Profile ${profile.id}: a continueFrom turn takes no input.text — its user message is the continue instruction`);
96
123
  }
97
- return lexiconText('continue.instruction', {}, profile.lexicon);
124
+ return labelText('continue.instruction', {}, profile.labels);
98
125
  }
99
126
  function pinnedReferenceParts(profile) {
100
127
  return profile.type === 'image' && profile.image.references
@@ -131,4 +158,22 @@ function assertTurnSlots(profile, req) {
131
158
  }
132
159
  }
133
160
  }
134
- export { assertOutputMode, assertSpeechRole, assertTurnSlots, resolveImageFormat, resolveInputParts, };
161
+ /** Refuses context from a sender the profile's `inputs.context` does not list, and a package over its `maxChars`. */
162
+ function assertTurnContext(profile, req) {
163
+ const context = req.input?.context;
164
+ if (!context)
165
+ return;
166
+ const spec = profileInputs(profile)?.context;
167
+ for (const [sender, value] of Object.entries(context)) {
168
+ if (value === undefined)
169
+ continue;
170
+ const allowed = CONTEXT_SENDERS.includes(sender);
171
+ if (!allowed || !spec?.from.some((from) => from === sender)) {
172
+ throw new TheoremError('request', `Profile ${profile.id} takes no context from '${sender}'`);
173
+ }
174
+ if (contextText(value).length > spec.maxChars) {
175
+ throw new TheoremError('request', `Profile ${profile.id}: context from '${sender}' is over inputs.context.maxChars (${String(spec.maxChars)})`);
176
+ }
177
+ }
178
+ }
179
+ export { assertOutputMode, assertSpeechRole, assertTurnContext, assertTurnSlots, resolveImageFormat, resolveInputParts, resolveSpeech, };
@@ -1,12 +1,15 @@
1
+ import { type ProviderRegistry } from '../protocols/provider.js';
1
2
  import { type ToolRegistry } from '../tools/registry.js';
2
3
  import { type ProfileRegistry } from './profiles.js';
3
4
  import { type SchemaRegistry } from './schemas.js';
4
5
  /** Every run takes one explicitly; nothing reads a registry it was not handed. */
5
6
  interface KernelRegistry {
7
+ readonly providers: ProviderRegistry;
6
8
  readonly tools: ToolRegistry;
7
9
  readonly profiles: ProfileRegistry;
8
10
  readonly schemas: SchemaRegistry;
9
11
  }
12
+ /** Creates an empty registry of tools, profiles, and schemas, wired so a tool that names a profile can find it. */
10
13
  declare function createKernelRegistry(): KernelRegistry;
11
14
  export type { KernelRegistry };
12
15
  export { createKernelRegistry };
@@ -1,8 +1,15 @@
1
+ import { createProviderRegistry } from '../protocols/provider.js';
1
2
  import { createToolRegistry } from '../tools/registry.js';
2
3
  import { createProfileRegistry } from './profiles.js';
3
4
  import { createSchemaRegistry } from './schemas.js';
5
+ /** Creates an empty registry of tools, profiles, and schemas, wired so a tool that names a profile can find it. */
4
6
  function createKernelRegistry() {
5
- const tools = createToolRegistry();
6
- return { tools, profiles: createProfileRegistry(tools), schemas: createSchemaRegistry() };
7
+ // why: An agent tool names a profile, and a profile allows tools: each registry reads
8
+ // the other. Tools look profiles up only when one registers, after both exist.
9
+ const tools = createToolRegistry((id) => profiles.find(id));
10
+ const schemas = createSchemaRegistry();
11
+ const providers = createProviderRegistry();
12
+ const profiles = createProfileRegistry(tools, schemas, providers);
13
+ return { tools, profiles, schemas, providers };
7
14
  }
8
15
  export { createKernelRegistry };
@@ -1,5 +1,8 @@
1
1
  function profileTurnOutputs(profile) {
2
- if (profile.type === 'live' || profile.type === 'host' || profile.type === 'decision') {
2
+ if (profile.type === 'live' ||
3
+ profile.type === 'host' ||
4
+ profile.type === 'decision' ||
5
+ profile.type === 'embedding') {
3
6
  return undefined;
4
7
  }
5
8
  return profile.outputs;
@@ -1,29 +1,38 @@
1
- import { type LexiconOverrides } from '../../guardrails/lexicon.js';
2
- import type { DecisionGuardrailsSpec, HostGuardrailsSpec, ProfileGuardrailsSpec } from '../../guardrails/types.js';
1
+ import { type LabelOverrides } from '../../guardrails/labels.js';
2
+ import { type DecisionGuardrailsSpec, type HostGuardrailsSpec, type ProfileGuardrailsSpec } from '../../guardrails/types.js';
3
3
  import type { ProfileObservabilitySpec } from '../../observability/types.js';
4
+ import type { ProviderRegistry } from '../protocols/provider.js';
4
5
  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
+ import type { DecisionModelBinding, DecisionProfile, EmbeddingProfile, HostProfile, HostProfileToolsSpec, ImageInputsSpec, ImageProfile, LiveProfile, LiveProfileToolsSpec, MediaTurnBehaviourSpec, ModelBinding, ModelId, Profile, ProfileIdentity, ProfileInputsSpec, ProfileOutputsSpec, ProfileToolsSpec, ProfileTurnBehaviourSpec, SpeechProfile, TextProfile } from '../types.js';
7
+ import type { SchemaRegistry } from './schemas.js';
6
8
  /** Not shared by host profiles, which invoke tools without a model turn. */
7
9
  export type ProfileDefinitionBase = {
8
10
  id: Profile['id'];
9
11
  identity: ProfileIdentity;
10
12
  models: Record<ModelId, ModelBinding>;
13
+ providerContinuation?: import('../checkpoint.js').ProviderContinuationPolicy;
11
14
  defaultModel?: ModelId;
12
15
  allowModelSelect?: boolean;
13
16
  maxSteps?: number;
14
- key?: ProfileModelFields['key'];
15
- fallbackKey?: ProfileModelFields['fallbackKey'];
16
17
  outputs?: ProfileOutputsSpec;
17
18
  guardrails?: ProfileGuardrailsSpec;
18
19
  observability?: ProfileObservabilitySpec;
19
- lexicon?: LexiconOverrides;
20
+ labels?: LabelOverrides;
20
21
  };
22
+ /** What a host writes to define an embedding profile. */
23
+ export type EmbeddingProfileDefinition = Omit<ProfileDefinitionBase, 'identity' | 'outputs' | 'maxSteps'> & {
24
+ type: 'embedding';
25
+ identity: Pick<ProfileIdentity, 'handle'>;
26
+ inputs: EmbeddingProfile['inputs'];
27
+ };
28
+ /** What a host writes to define a text profile. */
21
29
  export type TextProfileDefinition = ProfileDefinitionBase & {
22
30
  type: 'text';
23
31
  tools: ProfileToolsSpec;
24
32
  inputs: ProfileInputsSpec;
25
33
  turnBehaviour?: ProfileTurnBehaviourSpec;
26
34
  };
35
+ /** What a host writes to define an image profile. */
27
36
  export type ImageProfileDefinition = ProfileDefinitionBase & {
28
37
  type: 'image';
29
38
  image: NonNullable<ImageProfile['image']>;
@@ -31,33 +40,36 @@ export type ImageProfileDefinition = ProfileDefinitionBase & {
31
40
  inputs: ImageInputsSpec;
32
41
  turnBehaviour?: MediaTurnBehaviourSpec;
33
42
  };
34
- export type SpeechProfileDefinition = Omit<ProfileDefinitionBase, 'identity' | 'guardrails'> & {
43
+ /** What a host writes to define a speech profile. */
44
+ export type SpeechProfileDefinition = Omit<ProfileDefinitionBase, 'identity'> & {
35
45
  type: 'speech';
36
46
  identity: SpeechProfile['identity'];
37
- guardrails?: SpeechGuardrailsSpec;
38
47
  speech: NonNullable<SpeechProfile['speech']>;
39
48
  turnBehaviour?: MediaTurnBehaviourSpec;
40
49
  };
50
+ /** What a host writes to define a live profile. */
41
51
  export type LiveProfileDefinition = ProfileDefinitionBase & {
42
52
  type: 'live';
43
53
  live: NonNullable<LiveProfile['live']>;
54
+ inputs?: LiveProfile['inputs'];
44
55
  tools: LiveProfileToolsSpec;
45
56
  /** Inject gate only — resumption is `live.sessionResumption`. */
46
57
  turnBehaviour?: Pick<ProfileTurnBehaviourSpec, 'allowSteering'>;
47
58
  };
59
+ /** What a host writes to define a decision profile. */
48
60
  export type DecisionProfileDefinition = {
49
61
  type: 'decision';
50
62
  id: Profile['id'];
51
63
  identity: Pick<ProfileIdentity, 'handle'>;
52
64
  /** Exactly one model. */
53
65
  models: Record<ModelId, DecisionModelBinding>;
54
- key?: import('../types.js').KeySlot;
55
66
  inputs: DecisionProfile['inputs'];
56
67
  decision: DecisionProfile['decision'];
57
68
  guardrails?: DecisionGuardrailsSpec;
58
69
  observability?: ProfileObservabilitySpec;
59
- lexicon?: LexiconOverrides;
70
+ labels?: LabelOverrides;
60
71
  };
72
+ /** What a host writes to define a host profile, which runs tools and no model. */
61
73
  export type HostProfileDefinition = {
62
74
  type: 'host';
63
75
  id: Profile['id'];
@@ -65,17 +77,29 @@ export type HostProfileDefinition = {
65
77
  /** Only the guards that fire on the `invokeTool` path. */
66
78
  guardrails?: HostGuardrailsSpec;
67
79
  observability?: ProfileObservabilitySpec;
68
- lexicon?: LexiconOverrides;
80
+ labels?: LabelOverrides;
69
81
  };
70
- export type ProfileDefinition = TextProfileDefinition | ImageProfileDefinition | SpeechProfileDefinition | LiveProfileDefinition | DecisionProfileDefinition | HostProfileDefinition;
82
+ /** Any profile definition, discriminated by `type`. */
83
+ export type ProfileDefinition = TextProfileDefinition | ImageProfileDefinition | SpeechProfileDefinition | LiveProfileDefinition | DecisionProfileDefinition | EmbeddingProfileDefinition | HostProfileDefinition;
84
+ /** Validate a definition and return the profile; throws on a malformed one. */
71
85
  declare function defineProfile(input: TextProfileDefinition): TextProfile;
86
+ /** Validate an image definition and return the profile. */
72
87
  declare function defineProfile(input: ImageProfileDefinition): ImageProfile;
88
+ /** Validate a speech definition and return the profile. */
73
89
  declare function defineProfile(input: SpeechProfileDefinition): SpeechProfile;
90
+ /** Validate a live definition and return the profile. */
74
91
  declare function defineProfile(input: LiveProfileDefinition): LiveProfile;
92
+ /** Validate a decision definition and return the profile. */
75
93
  declare function defineProfile(input: DecisionProfileDefinition): DecisionProfile;
94
+ /** Validate a host definition and return the profile. */
76
95
  declare function defineProfile(input: HostProfileDefinition): HostProfile;
96
+ /** Validate an embedding definition and return the profile. */
97
+ declare function defineProfile(input: EmbeddingProfileDefinition): EmbeddingProfile;
98
+ /** Validate a definition of any type except live and host, and return the profile. */
77
99
  declare function defineProfile(input: Exclude<ProfileDefinition, LiveProfileDefinition | HostProfileDefinition>): Exclude<Profile, LiveProfile | HostProfile>;
100
+ /** Validate any definition and return the profile. */
78
101
  declare function defineProfile(input: ProfileDefinition): Profile;
102
+ /** A set of registered profiles, kept by id. */
79
103
  interface ProfileRegistry {
80
104
  register(profileInput: Profile | ProfileDefinition): void;
81
105
  registerMany(profilesList: Array<Profile | ProfileDefinition>): void;
@@ -86,7 +110,7 @@ interface ProfileRegistry {
86
110
  list(): Profile[];
87
111
  clear(): void;
88
112
  }
89
- /** Profiles are checked against `tools`, so register a scope's tools before its profiles. */
90
- declare function createProfileRegistry(tools: ToolRegistry): ProfileRegistry;
113
+ /** Profiles are checked against `tools` and `schemas`, so register a scope's tools and schemas before its profiles. */
114
+ declare function createProfileRegistry(tools: ToolRegistry, schemas: SchemaRegistry, providers?: ProviderRegistry): ProfileRegistry;
91
115
  export type { ProfileRegistry };
92
116
  export { createProfileRegistry, defineProfile };