@theoremjs/agents 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +23 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +874 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +7 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +173 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +328 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +128 -87
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,4 +1,29 @@
1
+ import { toErrorEvent, withPublicLabels, } from '../guardrails/error.js';
1
2
  import { projectGuardrailTurnEvent } from '../guardrails/events.js';
3
+ /**
4
+ * For the builder, the wording of a failure is its raw reason, wherever a visitor's wording
5
+ * stands: a failed turn, an ended session, a tool call's failure.
6
+ */
7
+ function builderWording(event) {
8
+ if (event.type === 'error' && event.errorInternal !== undefined) {
9
+ // why: `errorCopy` stays: worded raw or not, its key still names what failed for the page.
10
+ const { errorInternal, ...rest } = event;
11
+ return { ...rest, error: errorInternal };
12
+ }
13
+ if (event.type === 'session' &&
14
+ event.session.kind === 'ended' &&
15
+ event.errorInternal !== undefined) {
16
+ const { errorInternal, ...rest } = event;
17
+ return { ...rest, session: { ...event.session, message: errorInternal } };
18
+ }
19
+ if (event.type === 'tool' &&
20
+ event.tool.phase === 'error' &&
21
+ event.tool.failure.error !== undefined) {
22
+ const { failure } = event.tool;
23
+ return { ...event, tool: { ...event.tool, failure: { ...failure, error: failure.message } } };
24
+ }
25
+ return event;
26
+ }
2
27
  /** Raw diagnostics ride on error events, an ended session's close, and a tool call's failure. */
3
28
  function stripErrorInternal(event) {
4
29
  if ((event.type !== 'error' && event.type !== 'session' && event.type !== 'tool') ||
@@ -22,17 +47,34 @@ function stripEvidenceRaw(event) {
22
47
  const { raw: _raw, ...evidence } = event.evidence;
23
48
  return { ...event, evidence };
24
49
  }
25
- /** Strips host-only diagnostics, so the copy is safe to forward to browsers or end-user SSE. */
50
+ /**
51
+ * The copy of an event its reader may have. For a visitor (the default) host-only diagnostics are
52
+ * stripped, so the copy is safe to forward to browsers or end-user SSE.
53
+ */
26
54
  function forClient(event, options) {
27
- let out = stripGuardrailInternal(stripErrorInternal(event));
55
+ let out = options?.reader === 'builder'
56
+ ? builderWording(event)
57
+ : stripGuardrailInternal(stripErrorInternal(event));
28
58
  if (!options?.includeEvidenceRaw) {
29
59
  out = stripEvidenceRaw(out);
30
60
  }
31
- // Clients never receive matched substrings, even if the host opted into guardrailMatchPreview.
61
+ // invariant: Clients never receive matched substrings, even if the host opted into guardrailMatchPreview.
32
62
  out = projectGuardrailTurnEvent(out, false);
33
63
  return out;
34
64
  }
65
+ /** `forClient` over a list of events. */
35
66
  function forClientEvents(events, options) {
36
67
  return events.map((event) => forClient(event, options));
37
68
  }
38
- export { forClient, forClientEvents };
69
+ /**
70
+ * A caught failure as its reader may have it, by the same rule as `forClient`: the profile's
71
+ * wording (pass its `labels`) for a visitor, the raw diagnostic for a builder.
72
+ */
73
+ function clientError(err, labels, options) {
74
+ const event = forClient(withPublicLabels(toErrorEvent(err), labels), options);
75
+ // why: An error event stays one through `withPublicLabels` and `forClient`, worded by the first.
76
+ const { error = '', errorKind, errorCopy } = event;
77
+ // why: The key tells the page what failed (a conversation the host lost), which `errorKind` cannot.
78
+ return { error, errorKind, ...(errorCopy ? { errorCopy } : {}) };
79
+ }
80
+ export { clientError, forClient, forClientEvents };
@@ -1,6 +1,7 @@
1
1
  import type { Profile } from '../kernel/types.js';
2
2
  import { type TraceRecord } from '../observability/trace-record.js';
3
3
  import type { TraceSink } from '../observability/trace-sink.js';
4
+ /** The record of a cutout call kept on the trace: whether it succeeded, how long it took, its URL, the hashes of its input, and output, the upstream exchange and any error. */
4
5
  interface CutoutTape {
5
6
  ok: boolean;
6
7
  /** How long the cutout took; the span ends now and starts this long before. */
@@ -30,10 +30,11 @@ async function flushMintTrace(args) {
30
30
  const { sink, policy } = resolveTraceWriter({
31
31
  override: args.sink,
32
32
  observability: args.profile.observability,
33
+ guardrails: args.profile.guardrails,
33
34
  });
34
35
  await writeTrace(sink, Promise.resolve(record), policy);
35
36
  const { cutout } = args;
36
- // One instant: the cutout was reported done now and ran for `ms` before it.
37
+ // why: One instant: the cutout was reported done now and ran for `ms` before it.
37
38
  const now = BigInt(Date.now()) * BigInt(NANOS_PER_MS);
38
39
  const tree = startTrace('cutout', {
39
40
  clock: { nowUnixNano: () => now },
@@ -45,7 +46,7 @@ async function flushMintTrace(args) {
45
46
  if (cutout.http !== undefined) {
46
47
  tree.root.event('theorem.upstream.row', { row: traceJson(cutout.http) });
47
48
  }
48
- // The host's error text is free text: stored by hash under the scrub, like any exception.
49
+ // why: The host's error text is free text: stored by hash under the scrub, like any exception.
49
50
  if (cutout.error) {
50
51
  tree.root.event('exception', { 'exception.message': traceContent(cutout.error) });
51
52
  }
@@ -5,8 +5,8 @@
5
5
  * @module
6
6
  */
7
7
  import "../../_dnt.polyfills.js";
8
- export type { ClientTurnOptions } from './client-turn.js';
9
- export { forClient, forClientEvents } from './client-turn.js';
8
+ export type { ClientError, ClientTurnOptions } from './client-turn.js';
9
+ export { clientError, forClient, forClientEvents } from './client-turn.js';
10
10
  export type { CutoutTape } from './mint-trace.js';
11
11
  export { flushMintTrace } from './mint-trace.js';
12
12
  export { readStreamingJsonStringField } from './readStreamingJsonStringField.js';
@@ -5,7 +5,7 @@
5
5
  * @module
6
6
  */
7
7
  import "../../_dnt.polyfills.js";
8
- export { forClient, forClientEvents } from './client-turn.js';
8
+ export { clientError, forClient, forClientEvents } from './client-turn.js';
9
9
  export { flushMintTrace } from './mint-trace.js';
10
10
  export { readStreamingJsonStringField } from './readStreamingJsonStringField.js';
11
11
  export { caughtStatus, HTTP_BUSY, HTTP_METHOD, HTTP_NOT_FOUND, HTTP_OK, json, } from './reply.js';
@@ -1,21 +1,4 @@
1
- const JSON_ESCAPES = {
2
- n: '\n',
3
- t: '\t',
4
- r: '\r',
5
- '"': '"',
6
- '\\': '\\',
7
- '/': '/',
8
- };
9
- function decodeEscapedChar(ch, jsonText, index) {
10
- if (ch === 'u' && index + 4 < jsonText.length) {
11
- const hex = jsonText.slice(index + 1, index + 5);
12
- if (/^[0-9a-fA-F]{4}$/.test(hex)) {
13
- return { text: String.fromCharCode(Number.parseInt(hex, 16)), next: index + 4 };
14
- }
15
- }
16
- const mapped = JSON_ESCAPES[ch];
17
- return { text: mapped ?? ch, next: index };
18
- }
1
+ import { readJsonString } from '../kernel/util/partial-json.js';
19
2
  /** The buffer may lack a closing quote; any decoded prefix is returned for live preview. */
20
3
  export function readStreamingJsonStringField(jsonText, key) {
21
4
  const keyLiteral = JSON.stringify(key);
@@ -40,29 +23,5 @@ export function readStreamingJsonStringField(jsonText, key) {
40
23
  if (keyAt < 0 || jsonText[i] !== '"') {
41
24
  return null;
42
25
  }
43
- i += 1;
44
- let result = '';
45
- let escaped = false;
46
- while (i < jsonText.length) {
47
- const ch = jsonText[i];
48
- if (escaped) {
49
- const decoded = decodeEscapedChar(ch, jsonText, i);
50
- result += decoded.text;
51
- i = decoded.next;
52
- escaped = false;
53
- i += 1;
54
- continue;
55
- }
56
- if (ch === '\\') {
57
- escaped = true;
58
- }
59
- else if (ch === '"') {
60
- return result;
61
- }
62
- else {
63
- result += ch;
64
- }
65
- i += 1;
66
- }
67
- return result;
26
+ return readJsonString(jsonText, i).text;
68
27
  }
@@ -1,7 +1,13 @@
1
+ /** HTTP status for a success. */
1
2
  declare const HTTP_OK = 200;
3
+ /** HTTP status for an unknown route. */
2
4
  declare const HTTP_NOT_FOUND = 404;
5
+ /** HTTP status for a method the route does not take. */
3
6
  declare const HTTP_METHOD = 405;
7
+ /** HTTP status for a request refused because the host is busy. */
4
8
  declare const HTTP_BUSY = 429;
9
+ /** A JSON response with the status and the CORS headers. */
5
10
  declare function json(status: number, body: unknown, cors: Record<string, string>): Response;
11
+ /** The HTTP status for a caught error, by its kind. */
6
12
  declare function caughtStatus(err: unknown): number;
7
13
  export { caughtStatus, HTTP_BUSY, HTTP_METHOD, HTTP_NOT_FOUND, HTTP_OK, json };
@@ -1,7 +1,11 @@
1
1
  import { errorKind } from '../guardrails/error.js';
2
+ /** HTTP status for a success. */
2
3
  const HTTP_OK = 200;
4
+ /** HTTP status for an unknown route. */
3
5
  const HTTP_NOT_FOUND = 404;
6
+ /** HTTP status for a method the route does not take. */
4
7
  const HTTP_METHOD = 405;
8
+ /** HTTP status for a request refused because the host is busy. */
5
9
  const HTTP_BUSY = 429;
6
10
  const STATUS_BY_KIND = {
7
11
  config: 500,
@@ -19,16 +23,18 @@ const STATUS_BY_KIND = {
19
23
  blocked: 403,
20
24
  declined: 409,
21
25
  failed: 502,
22
- // Client closed request (nginx convention): the caller went away.
26
+ // why: Client closed request (nginx convention): the caller went away.
23
27
  cancelled: 499,
24
28
  internal: 500,
25
29
  };
30
+ /** A JSON response with the status and the CORS headers. */
26
31
  function json(status, body, cors) {
27
32
  return new Response(JSON.stringify(body), {
28
33
  status,
29
34
  headers: { ...cors, 'Content-Type': 'application/json' },
30
35
  });
31
36
  }
37
+ /** The HTTP status for a caught error, by its kind. */
32
38
  function caughtStatus(err) {
33
39
  return STATUS_BY_KIND[errorKind(err)];
34
40
  }
@@ -1,8 +1,11 @@
1
1
  import type { TurnEvent } from '../kernel/types.js';
2
2
  import type { FoldTurnEventsOptions, TranscriptBlock, UserTurnDraft } from './types.js';
3
+ /** Restarts block id numbering at zero. */
3
4
  declare function resetBlockIds(): void;
5
+ /** Turns a user draft into transcript blocks: a `user-text` block for the trimmed text, then one block per attachment and per voice clip. */
4
6
  declare function buildUserTurnBlocks(draft: UserTurnDraft, idPrefix?: string): TranscriptBlock[];
5
7
  /** Resets only the turn id sequence, so streaming refolds keep stable `turn-*` keys. */
6
8
  declare function foldTurnEvents(events: readonly TurnEvent[], options?: FoldTurnEventsOptions): TranscriptBlock[];
9
+ /** One conversation turn as blocks: the user draft's blocks followed by the assistant events folded into blocks. */
7
10
  declare function foldConversationTurn(draft: UserTurnDraft, assistantEvents: readonly TurnEvent[], options?: FoldTurnEventsOptions): TranscriptBlock[];
8
11
  export { buildUserTurnBlocks, foldConversationTurn, foldTurnEvents, resetBlockIds };
@@ -1,4 +1,6 @@
1
- import { applyToolEvent } from './tool-calls.js';
1
+ import { keptReply } from '../kernel/turn-events.js';
2
+ import { partialJsonObject } from '../kernel/util/partial-json.js';
3
+ import { applyToolDraft, applyToolEvent } from './tool-calls.js';
2
4
  import { collectPromotedMediaFromToolOutput } from './tool-media.js';
3
5
  let turnBlockCounter = 0;
4
6
  /**
@@ -12,6 +14,7 @@ function nextBlockId(prefix) {
12
14
  turnBlockCounter += 1;
13
15
  return `${prefix}-${String(turnBlockCounter)}`;
14
16
  }
17
+ /** Restarts block id numbering at zero. */
15
18
  function resetBlockIds() {
16
19
  turnBlockCounter = 0;
17
20
  }
@@ -30,17 +33,77 @@ function appendText(blocks, kind, text, idPrefix) {
30
33
  text,
31
34
  });
32
35
  }
33
- /** One block per call, keyed by `callId`; each event folds into it (`applyToolEvent`). */
36
+ /**
37
+ * A decision made while text streams goes ahead of that text's block, so the block stays last and
38
+ * the rest of the text joins it.
39
+ */
40
+ function addGuardrailBlock(blocks, block) {
41
+ const last = blocks.at(-1);
42
+ const streaming = last?.kind === 'text' || last?.kind === 'thought';
43
+ blocks.splice(streaming ? blocks.length - 1 : blocks.length, 0, block);
44
+ }
45
+ function findToolBlock(blocks, id) {
46
+ return blocks.find((block) => block.kind === 'tool' && block.id === id);
47
+ }
48
+ /** invariant: Issued operation IDs separate action blocks; historical events use callId. */
34
49
  function upsertToolBlock(blocks, tool) {
35
- const id = `tool-${tool.callId}`;
36
- const existing = blocks.find((block) => block.kind === 'tool' && block.id === id);
50
+ const id = `tool-${tool.operationId ?? tool.callId}`;
51
+ const existing = findToolBlock(blocks, id);
37
52
  const call = applyToolEvent(existing?.tool, tool);
38
53
  if (existing) {
39
54
  existing.tool = call;
40
55
  return;
41
56
  }
57
+ // why: The call the model was drafting arrives whole where its draft stood.
58
+ const draft = tool.phase === undefined ? findToolBlock(blocks, `tool-${tool.callId}`) : undefined;
59
+ if (draft?.tool.draft !== undefined) {
60
+ draft.id = id;
61
+ draft.tool = call;
62
+ return;
63
+ }
64
+ blocks.push({ id, kind: 'tool', tool: call });
65
+ }
66
+ /** The call the model is still writing, as far as its draft has come. */
67
+ function upsertToolDraft(blocks, draft) {
68
+ const id = `tool-${draft.callId}`;
69
+ const existing = findToolBlock(blocks, id);
70
+ const call = applyToolDraft(existing?.tool, draft);
71
+ if (existing) {
72
+ existing.tool = call;
73
+ return;
74
+ }
42
75
  blocks.push({ id, kind: 'tool', tool: call });
43
76
  }
77
+ /** The structured reply the model is still writing, if one is showing. */
78
+ function openStructuredDraft(blocks) {
79
+ return blocks.findLast((block) => block.kind === 'structured' && block.draft !== undefined);
80
+ }
81
+ /** The structured reply the model is still writing, as far as its draft has come. */
82
+ function upsertStructuredDraft(blocks, text, idPrefix) {
83
+ const open = openStructuredDraft(blocks);
84
+ const draft = (open?.draft ?? '') + text;
85
+ if (open) {
86
+ open.draft = draft;
87
+ open.value = partialJsonObject(draft);
88
+ return;
89
+ }
90
+ blocks.push({
91
+ id: nextBlockId(idPrefix),
92
+ kind: 'structured',
93
+ value: partialJsonObject(draft),
94
+ draft,
95
+ });
96
+ }
97
+ /** The structured reply, in its draft's place when one is showing. */
98
+ function settleStructured(blocks, value, idPrefix) {
99
+ const open = openStructuredDraft(blocks);
100
+ if (open) {
101
+ open.value = value;
102
+ delete open.draft;
103
+ return;
104
+ }
105
+ blocks.push({ id: nextBlockId(idPrefix), kind: 'structured', value });
106
+ }
44
107
  /** Same source: one place, or one link. */
45
108
  function sameSource(a, b) {
46
109
  if (a.type !== b.type)
@@ -89,6 +152,7 @@ function appendPromotedToolMedia(blocks, tool, idPrefix, seenUrls) {
89
152
  });
90
153
  }
91
154
  }
155
+ /** Turns a user draft into transcript blocks: a `user-text` block for the trimmed text, then one block per attachment and per voice clip. */
92
156
  function buildUserTurnBlocks(draft, idPrefix = 'user') {
93
157
  const blocks = [];
94
158
  const text = draft.text?.trim();
@@ -128,7 +192,7 @@ function foldTurnEvents(events, options = {}) {
128
192
  turnBlockCounter = 0;
129
193
  const blocks = [];
130
194
  const promotedMediaUrls = new Set();
131
- for (const event of events) {
195
+ for (const event of keptReply(events)) {
132
196
  switch (event.type) {
133
197
  case 'thought':
134
198
  if (showThoughts && event.text) {
@@ -140,16 +204,18 @@ function foldTurnEvents(events, options = {}) {
140
204
  appendText(blocks, 'text', event.text, idPrefix);
141
205
  }
142
206
  break;
207
+ case 'tool_draft':
208
+ upsertToolDraft(blocks, event);
209
+ break;
143
210
  case 'tool':
144
211
  upsertToolBlock(blocks, event.tool);
145
212
  appendPromotedToolMedia(blocks, event.tool, idPrefix, promotedMediaUrls);
146
213
  break;
214
+ case 'structured_draft':
215
+ upsertStructuredDraft(blocks, event.text, idPrefix);
216
+ break;
147
217
  case 'structured':
148
- blocks.push({
149
- id: nextBlockId(idPrefix),
150
- kind: 'structured',
151
- value: event.structured,
152
- });
218
+ settleStructured(blocks, event.structured, idPrefix);
153
219
  break;
154
220
  case 'media':
155
221
  if (event.media) {
@@ -178,6 +244,13 @@ function foldTurnEvents(events, options = {}) {
178
244
  evidence: event.evidence,
179
245
  });
180
246
  break;
247
+ case 'guardrail':
248
+ addGuardrailBlock(blocks, {
249
+ id: nextBlockId(idPrefix),
250
+ kind: 'guardrail',
251
+ guardrail: event.guardrail,
252
+ });
253
+ break;
181
254
  case 'error':
182
255
  if (event.error) {
183
256
  blocks.push({
@@ -197,16 +270,13 @@ function foldTurnEvents(events, options = {}) {
197
270
  compaction: event.compaction !== undefined,
198
271
  });
199
272
  break;
200
- case 'tokens':
201
- case 'session':
202
- case 'stage':
203
- break;
204
273
  default:
205
274
  break;
206
275
  }
207
276
  }
208
277
  return blocks;
209
278
  }
279
+ /** One conversation turn as blocks: the user draft's blocks followed by the assistant events folded into blocks. */
210
280
  function foldConversationTurn(draft, assistantEvents, options = {}) {
211
281
  return [...buildUserTurnBlocks(draft, 'user'), ...foldTurnEvents(assistantEvents, options)];
212
282
  }
@@ -1,4 +1,5 @@
1
1
  import type { ComposerPendingKind } from './pending.js';
2
+ /** Where a run is: idle, streaming, or held at a tool gate. */
2
3
  export type ComposerRunPhase = 'idle' | 'streaming' | 'gated';
3
4
  /** Primary button / Enter target. */
4
5
  export type ComposerPrimaryAction = 'send' | 'stop' | 'queue' | 'none';
@@ -7,6 +8,7 @@ export type ComposerPrimaryAction = 'send' | 'stop' | 'queue' | 'none';
7
8
  * abandon the tool gate (no model continue) + send while gated; not a pending kind.
8
9
  */
9
10
  export type ComposerMenuAction = ComposerPendingKind | 'send_now';
11
+ /** What decides the composer's actions: the run phase, whether there is something to send, and whether steering and stop are allowed. */
10
12
  export type ComposerActionContext = {
11
13
  phase: ComposerRunPhase;
12
14
  hasPayload: boolean;
@@ -15,6 +17,8 @@ export type ComposerActionContext = {
15
17
  /** Composer profiles always project `canStop: true`. */
16
18
  canStop?: boolean;
17
19
  };
20
+ /** The action of the primary button and Enter: `send` when idle with a draft, `queue` mid-run with one, `stop` while streaming with none (when stop is allowed), else `none`. */
18
21
  declare function resolveComposerPrimary(ctx: ComposerActionContext): ComposerPrimaryAction;
22
+ /** The split menu's actions: none without a draft; `stash` when idle; mid-run `queue`, `steer` while streaming when steering is allowed, `send_now` and `stash`. */
19
23
  declare function resolveComposerMenuActions(ctx: ComposerActionContext): ComposerMenuAction[];
20
24
  export { resolveComposerMenuActions, resolveComposerPrimary };
@@ -1,3 +1,4 @@
1
+ /** The action of the primary button and Enter: `send` when idle with a draft, `queue` mid-run with one, `stop` while streaming with none (when stop is allowed), else `none`. */
1
2
  function resolveComposerPrimary(ctx) {
2
3
  const canStop = ctx.canStop !== false;
3
4
  if (ctx.phase === 'idle') {
@@ -8,9 +9,10 @@ function resolveComposerPrimary(ctx) {
8
9
  return canStop ? 'stop' : 'none';
9
10
  return 'queue';
10
11
  }
11
- // Gated is still the same run: queue only, no stream to stop.
12
+ // why: Gated is still the same run: queue only, no stream to stop.
12
13
  return ctx.hasPayload ? 'queue' : 'none';
13
14
  }
15
+ /** The split menu's actions: none without a draft; `stash` when idle; mid-run `queue`, `steer` while streaming when steering is allowed, `send_now` and `stash`. */
14
16
  function resolveComposerMenuActions(ctx) {
15
17
  if (!ctx.hasPayload)
16
18
  return [];
@@ -24,8 +26,8 @@ function resolveComposerMenuActions(ctx) {
24
26
  actions.push('send_now', 'stash');
25
27
  return actions;
26
28
  }
27
- // gated: no steer (not an inject stage); send_now = host ends wait + send
29
+ // why: gated: no steer (not an inject stage); send_now = host ends wait + send
28
30
  return ['queue', 'send_now', 'stash'];
29
31
  }
30
- // Emits semantic action keys only: English labels live in the rendering layer or the host UI.
32
+ // invariant: Emits semantic action keys only: English labels live in the rendering layer or the host UI.
31
33
  export { resolveComposerMenuActions, resolveComposerPrimary };
@@ -1,6 +1,12 @@
1
1
  import type { AttachmentValidationIssue } from '../kernel/types.js';
2
2
  import type { ProfileGuardrailsView, ProfileInputsInterface, TranscriptBlock, UserTurnDraft } from './types.js';
3
+ /**
4
+ * Reads a draft's text at the `user` boundary with Theorem's patterns, as the kernel will: a
5
+ * match set to redact shows as its placeholder. A match set to block leaves the draft as typed;
6
+ * the kernel refuses the turn. A match of the host's own patterns is the kernel's to find.
7
+ */
3
8
  declare function sanitizeUserDraft(draft: UserTurnDraft, guardrails?: ProfileGuardrailsView): UserTurnDraft;
9
+ /** The result of preparing a user turn: the sanitized draft with its transcript blocks, or the attachment issues that rejected it. */
4
10
  export type PrepareUserTurnResult = {
5
11
  ok: true;
6
12
  draft: UserTurnDraft;
@@ -1,20 +1,31 @@
1
- import { resolveGuardrailPolicy } from '../guardrails/policy.js';
2
- import { sanitizeText } from '../guardrails/sanitize.js';
3
- import { anySensitive } from '../guardrails/sensitive.js';
1
+ import { detectAt } from '../guardrails/detect-at.js';
2
+ import { DETECT_DEFAULTS } from '../guardrails/detectors.js';
4
3
  import { buildUserTurnBlocks } from './blocks.js';
5
4
  import { validateProfileInputs } from './inputs.js';
5
+ /** The view's matrix with Theorem's patterns off where the profile turned them off. The host's own patterns stay with the kernel. */
6
+ function detectOf(guardrails) {
7
+ if (!guardrails)
8
+ return DETECT_DEFAULTS;
9
+ const { detect, patterns } = guardrails;
10
+ if (!patterns)
11
+ return detect;
12
+ const sources = Object.fromEntries(Object.entries(patterns).map(([detector, { theorem }]) => [
13
+ detector,
14
+ { theorem, matchers: [] },
15
+ ]));
16
+ return { ...detect, sources };
17
+ }
18
+ /**
19
+ * Reads a draft's text at the `user` boundary with Theorem's patterns, as the kernel will: a
20
+ * match set to redact shows as its placeholder. A match set to block leaves the draft as typed;
21
+ * the kernel refuses the turn. A match of the host's own patterns is the kernel's to find.
22
+ */
6
23
  function sanitizeUserDraft(draft, guardrails) {
7
- const options = guardrails ?? resolveGuardrailPolicy(undefined);
8
- if (!options.sanitizeInput && !anySensitive(options.redactSensitive)) {
9
- return draft;
10
- }
11
24
  if (draft.text === undefined) {
12
25
  return draft;
13
26
  }
14
- return {
15
- ...draft,
16
- text: sanitizeText(draft.text, options),
17
- };
27
+ const detected = detectAt(draft.text, 'user', detectOf(guardrails));
28
+ return { ...draft, text: detected.text ?? draft.text };
18
29
  }
19
30
  /** Call before appending to the thread and before `runTurn` ingress. */
20
31
  function prepareUserTurn(inputs, draft, guardrails) {
@@ -6,7 +6,19 @@ import type { ComposerProfileInterface, LiveProfileInterface, ProfileInterface }
6
6
  * the scope that runs the profile.
7
7
  */
8
8
  declare function interfaceFromProfile(input: LiveProfile, tools: ToolRegistry): LiveProfileInterface;
9
+ /** The interface for a profile that is not live. */
9
10
  declare function interfaceFromProfile(input: Exclude<Profile, LiveProfile>, tools: ToolRegistry): ComposerProfileInterface;
11
+ /** The interface for any profile. */
10
12
  declare function interfaceFromProfile(input: Profile, tools: ToolRegistry): ProfileInterface;
13
+ /** The interface for a profile the host has already projected, without resolving its tools again. */
11
14
  declare function interfaceFromProjected(projected: ProjectedProfile): ProfileInterface;
12
- export { interfaceFromProfile, interfaceFromProjected };
15
+ /**
16
+ * The interface a browser may read: {@linkcode interfaceFromProfile} without `identity.system` and
17
+ * `systemByRole`, which stay on the server. Labels, turn behaviour, guardrails, and observability are kept.
18
+ */
19
+ declare function clientProfileInterface(input: LiveProfile, tools: ToolRegistry): LiveProfileInterface;
20
+ /** The client-safe interface for a profile that is not live. */
21
+ declare function clientProfileInterface(input: Exclude<Profile, LiveProfile>, tools: ToolRegistry): ComposerProfileInterface;
22
+ /** The client-safe interface for any profile. */
23
+ declare function clientProfileInterface(input: Profile, tools: ToolRegistry): ProfileInterface;
24
+ export { clientProfileInterface, interfaceFromProfile, interfaceFromProjected };