@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,29 +1,15 @@
1
- import { isRecord } from '../kernel/util/record.js';
2
- import { guardedEventTexts, scanTextForCanaryLeak } from './canary.js';
1
+ import { canaryNoteMarker, guardedEventTexts, scanTextForCanaryLeak } from './canary.js';
3
2
  import { SYSTEM_BOUNDARY } from './egress-patterns.js';
4
- import { imageLeakSpans, linkLeakSpans } from './egress-urls.js';
5
- import { describeError } from './error.js';
6
- import { hitFromSpan } from './hits.js';
7
- import { injectionSpans } from './injection.js';
8
- import { lexiconText } from './lexicon.js';
3
+ import { CANARY_HIT, PROMPT_ECHO_HIT } from './hits.js';
9
4
  import { scanTextForPromptEcho } from './prompt-echo.js';
10
- import { EGRESS_RULES } from './rules.js';
11
- import { anySensitive, resolveSensitive, SENSITIVE_GROUPS, sensitiveSpans, } from './sensitive.js';
12
- import { textForScan } from './serialize.js';
13
- import { SEVERITIES } from './types.js';
14
- function hitsFromSpans(text, spans, rule, severity) {
15
- return spans.map((span) => hitFromSpan(text, span, rule, severity));
16
- }
5
+ import { DETECT_RULES, EGRESS_RULES } from './rules.js';
17
6
  /** Why a reply was withheld, for the builder (`errorInternal`); the user reads `error.safety`. */
18
7
  const WITHHELD_REASON = {
19
8
  canary: 'canary leaked',
20
- promptEcho: 'system prompt echoed', // lexicon-exempt: internal diagnostic — the user reads error.safety
21
- providerToolLeak: 'a provider-side tool already sent the canary or system prompt', // lexicon-exempt: internal diagnostic — the user reads error.safety
22
- egress: 'Turn withheld: egress disclosure violation', // lexicon-exempt: internal diagnostic — the user reads error.safety
9
+ promptEcho: 'system prompt echoed', // labels-exempt: internal diagnostic — the user reads error.safety
10
+ providerToolLeak: 'a provider-side tool already sent the canary or system prompt', // labels-exempt: internal diagnostic — the user reads error.safety
11
+ egress: 'Turn withheld: egress disclosure violation', // labels-exempt: internal diagnostic — the user reads error.safety
23
12
  };
24
- /** Never carries the live token, only a placeholder. */
25
- const CANARY_HIT = { rule: EGRESS_RULES.canary, severity: 'high', match: '[canary]' };
26
- const PROMPT_ECHO_HIT = { rule: EGRESS_RULES.promptEcho, severity: 'high' };
27
13
  function canaryHits(text, canary) {
28
14
  return canary && scanTextForCanaryLeak(text, canary) ? [CANARY_HIT] : [];
29
15
  }
@@ -33,9 +19,13 @@ function promptEchoHits(text, privateSystem, canary) {
33
19
  ? [PROMPT_ECHO_HIT]
34
20
  : [];
35
21
  }
36
- /** The system-prompt leak hits: the canary, and the prompt's own words when guarded. */
37
- function promptLeakHits(text, canary, privateSystem) {
38
- return [...canaryHits(text, canary), ...promptEchoHits(text, privateSystem, canary)];
22
+ /** The system-prompt leak hits: the canary unless it was given, and the prompt's own words when guarded. */
23
+ function promptLeakHits(text, scope) {
24
+ const { canary, canaryGiven, privateSystem } = scope;
25
+ return [
26
+ ...canaryHits(text, canaryGiven ? undefined : canary),
27
+ ...promptEchoHits(text, privateSystem, canary),
28
+ ];
39
29
  }
40
30
  const PROVIDER_TOOL_LEAK_HIT = {
41
31
  rule: EGRESS_RULES.providerToolLeak,
@@ -61,19 +51,50 @@ function isProviderToolReport(event) {
61
51
  * (`guardedEventTexts`). In the report of a provider-side tool they are one
62
52
  * `egress.provider-tool-leak`: the call already ran.
63
53
  */
64
- function eventPromptLeakHits(event, canary, privateSystem) {
65
- const hits = guardedEventTexts(event).flatMap((text) => promptLeakHits(text, canary, privateSystem));
54
+ function eventPromptLeakHits(event, scope) {
55
+ const hits = guardedEventTexts(event).flatMap((text) => promptLeakHits(text, scope));
66
56
  if (hits.length > 0 && isProviderToolReport(event)) {
67
57
  return [PROVIDER_TOOL_LEAK_HIT];
68
58
  }
69
59
  return [...new Map(hits.map((hit) => [hit.rule, hit])).values()];
70
60
  }
61
+ /**
62
+ * What the detectors of what is ours find in an event's host content
63
+ * (`guardedEventTexts`) under their actions at `boundary`, as the event goes
64
+ * to the host with the reply. `flag` reports it; `redact` and `block` stop the
65
+ * turn, as an event has no text to replace. The report of a provider-side tool
66
+ * is read whatever the actions are and always stops: the call already ran.
67
+ */
68
+ function eventLeak(event, scope, detect, boundary) {
69
+ if (isProviderToolReport(event)) {
70
+ const hits = eventPromptLeakHits(event, scope);
71
+ return hits.length > 0 ? { stop: true, hits } : undefined;
72
+ }
73
+ const texts = guardedEventTexts(event);
74
+ const found = [];
75
+ const canary = scope.canaryGiven ? undefined : scope.canary;
76
+ const canaryAction = detect.canary_leak[boundary];
77
+ if (canaryAction !== 'ignore' && texts.some((text) => canaryHits(text, canary).length > 0)) {
78
+ found.push([canaryAction, CANARY_HIT]);
79
+ }
80
+ const promptAction = detect.prompt_leak[boundary];
81
+ if (promptAction !== 'ignore' &&
82
+ texts.some((text) => promptEchoHits(text, scope.privateSystem, scope.canary).length > 0)) {
83
+ found.push([promptAction, PROMPT_ECHO_HIT]);
84
+ }
85
+ if (found.length === 0)
86
+ return undefined;
87
+ return {
88
+ stop: found.some(([action]) => action !== 'flag'),
89
+ hits: found.map(([, hit]) => hit),
90
+ };
91
+ }
71
92
  const PROMPT_LEAK_RULES = new Set([
72
- EGRESS_RULES.canary,
73
- EGRESS_RULES.promptEcho,
93
+ DETECT_RULES.canary_leak,
94
+ DETECT_RULES.prompt_leak,
74
95
  EGRESS_RULES.providerToolLeak,
75
96
  ]);
76
- /** Whether a hit is a system-prompt leak: a hard stop under any host policy. */
97
+ /** Whether a hit is a system-prompt leak. */
77
98
  function isPromptLeakHit(hit) {
78
99
  return PROMPT_LEAK_RULES.has(hit.rule);
79
100
  }
@@ -82,293 +103,22 @@ function promptLeakReason(hits) {
82
103
  if (hits.some((hit) => hit.rule === EGRESS_RULES.providerToolLeak)) {
83
104
  return WITHHELD_REASON.providerToolLeak;
84
105
  }
85
- return hits.some((hit) => hit.rule === EGRESS_RULES.canary)
106
+ return hits.some((hit) => hit.rule === DETECT_RULES.canary_leak)
86
107
  ? WITHHELD_REASON.canary
87
108
  : WITHHELD_REASON.promptEcho;
88
109
  }
89
- const EGRESS_SENSITIVE_DEFAULT = {
90
- ids: true,
91
- financial: true,
92
- network: false,
93
- credentials: true,
94
- };
95
- function resolveUrlCheck(check, byDefault) {
96
- if (check === undefined)
97
- return byDefault ? {} : undefined;
98
- if (typeof check === 'boolean')
99
- return check ? {} : undefined;
100
- return check;
101
- }
102
- function resolveEgressChecks(checks = {}) {
103
- const images = resolveUrlCheck(checks.images, true);
104
- const resolved = resolveUrlCheck(checks.links, false);
105
- // A host images load from already takes data with no click, so a link there opens nothing new.
106
- const links = resolved && images?.hosts
107
- ? { ...resolved, hosts: [...new Set([...(resolved.hosts ?? []), ...images.hosts])] }
108
- : resolved;
109
- return {
110
- sensitive: resolveSensitive(checks.sensitive, EGRESS_SENSITIVE_DEFAULT),
111
- boundary: checks.boundary ?? true,
112
- injection: checks.injection ?? true,
113
- ...(images ? { images } : {}),
114
- ...(links ? { links } : {}),
115
- };
116
- }
117
- /** Every check off: the system-prompt leak checks alone. */
118
- const NO_CHECKS = resolveEgressChecks({
119
- sensitive: false,
120
- boundary: false,
121
- injection: false,
122
- images: false,
123
- });
124
- const DEFAULT_CHECKS = resolveEgressChecks();
125
- function urlScope(check, given) {
126
- return { ...check, ...(given ? { given } : {}) };
127
- }
128
- /** The bundled policy's hits in `text`, from the checks `checks` runs. */
129
- function collectEgressHits(text, scope = {}, checks = DEFAULT_CHECKS) {
130
- const hits = promptLeakHits(text, scope.canary, scope.privateSystem);
131
- if (anySensitive(checks.sensitive)) {
132
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
133
- hits.push(...hitsFromSpans(text, sensitiveSpans(text, checks.sensitive), EGRESS_RULES.sensitive, 'high'));
134
- }
135
- const boundary = checks.boundary ? SYSTEM_BOUNDARY.exec(text) : null;
136
- if (boundary && boundary.index !== undefined) {
137
- hits.push(hitFromSpan(text, { start: boundary.index, end: boundary.index + boundary[0].length }, EGRESS_RULES.boundary, 'medium'));
138
- }
139
- if (checks.injection) {
140
- hits.push(...hitsFromSpans(text, injectionSpans(text), EGRESS_RULES.injection, 'medium')); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
141
- }
142
- if (checks.images) {
143
- const spans = imageLeakSpans(text, urlScope(checks.images, scope.given));
144
- hits.push(...hitsFromSpans(text, spans, EGRESS_RULES.image, 'high'));
145
- }
146
- if (checks.links) {
147
- const spans = linkLeakSpans(text, urlScope(checks.links, scope.given), Boolean(checks.images));
148
- hits.push(...hitsFromSpans(text, spans, EGRESS_RULES.link, 'high'));
149
- }
150
- return hits;
151
- }
110
+ /** The distinct rule names among the hits. */
152
111
  function hitRules(hits) {
153
112
  return [...new Set(hits.map((hit) => hit.rule))];
154
113
  }
155
- function isGuardrailHit(value) {
156
- if (!isRecord(value) ||
157
- typeof value.rule !== 'string' ||
158
- !value.rule.trim() ||
159
- !SEVERITIES.includes(value.severity)) {
160
- return false;
161
- }
162
- for (const key of ['match', 'label', 'doc']) {
163
- if (value[key] !== undefined && typeof value[key] !== 'string')
164
- return false;
165
- }
166
- if (value.span !== undefined) {
167
- if (!isRecord(value.span) ||
168
- typeof value.span.start !== 'number' ||
169
- !Number.isFinite(value.span.start) ||
170
- typeof value.span.end !== 'number' ||
171
- !Number.isFinite(value.span.end)) {
172
- return false;
173
- }
174
- }
175
- return true;
176
- }
177
- function isGuardrailHits(value) {
178
- return Array.isArray(value) && value.every(isGuardrailHit);
179
- }
180
- function isVerdict(value) {
181
- if (!isRecord(value))
182
- return false;
183
- switch (value.action) {
184
- case 'allow':
185
- return true;
186
- case 'redact':
187
- return typeof value.text === 'string' && isGuardrailHits(value.hits);
188
- case 'flag':
189
- return isGuardrailHits(value.hits);
190
- case 'block':
191
- return (isGuardrailHits(value.hits) &&
192
- typeof value.rejection === 'string' &&
193
- (value.errorInternal === undefined || typeof value.errorInternal === 'string'));
194
- default:
195
- return false;
196
- }
197
- }
198
- function legacyHits(value) {
199
- if (!Array.isArray(value)) {
200
- return [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }];
201
- }
202
- const hits = value
203
- .map((hit) => {
204
- if (typeof hit === 'string' && hit.trim()) {
205
- return { rule: hit, severity: 'high' };
206
- }
207
- if (isRecord(hit) && typeof hit.rule === 'string' && hit.rule.trim()) {
208
- const severity = SEVERITIES.includes(hit.severity)
209
- ? hit.severity
210
- : 'high';
211
- return {
212
- rule: hit.rule,
213
- severity,
214
- ...(typeof hit.label === 'string' ? { label: hit.label } : {}),
215
- ...(typeof hit.doc === 'string' ? { doc: hit.doc } : {}),
216
- };
217
- }
218
- return undefined;
219
- })
220
- .filter((hit) => Boolean(hit));
221
- return hits.length ? hits : [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }];
222
- }
223
- function normalizeVerdict(value, context) {
224
- if (isVerdict(value)) {
225
- return value;
226
- }
227
- if (isRecord(value) && typeof value.blocked === 'boolean') {
228
- if (!value.blocked) {
229
- return { action: 'allow' };
230
- }
231
- const hits = legacyHits(value.hits);
232
- const rejection = typeof value.rejectionMessage === 'string' && value.rejectionMessage.trim()
233
- ? value.rejectionMessage
234
- : lexiconText('egress.rejection', { rules: hitRules(hits).join(', ') }, context.lexicon);
235
- return { action: 'block', hits, rejection };
236
- }
237
- return {
238
- action: 'block',
239
- hits: [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }],
240
- rejection: lexiconText('egress.invalid_verdict', {}, context.lexicon),
241
- };
242
- }
243
- /** An enforce that blocks on `collect`'s hits in the reply and in any structured output. */
244
- function hitsEnforcer(collect) {
245
- return (payload, context) => {
246
- const hits = collect(payload.text, context);
247
- if (payload.structured !== undefined) {
248
- const structured = textForScan(payload.structured);
249
- if (structured.unscannable) {
250
- // Cannot inspect it, so cannot vouch for it. Fail closed.
251
- hits.push({ rule: EGRESS_RULES.unscannable, severity: 'high' }); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
252
- }
253
- else {
254
- hits.push(...collect(structured.text, context));
255
- }
256
- }
257
- if (hits.length === 0) {
258
- return { action: 'allow' };
259
- }
260
- return {
261
- action: 'block',
262
- hits,
263
- rejection: lexiconText('egress.rejection', { rules: hitRules(hits).join(', ') }, context.lexicon),
264
- };
265
- };
266
- }
267
- /** What the bundled policy reads from a gate's context. */
268
- function egressScope(context) {
269
- return {
270
- ...(context.canary ? { canary: context.canary } : {}),
271
- ...(context.privateSystem ? { privateSystem: context.privateSystem } : {}),
272
- ...(context.givenUrls ? { given: context.givenUrls } : {}),
273
- };
274
- }
275
- /** Default egress enforce: every bundled check at its default (`EgressChecks`). */
276
- const standardEgressEnforce = hitsEnforcer((text, context) => collectEgressHits(text, egressScope(context)));
277
- /** The bundled checks each enforce runs, for the enforces built from them. */
278
- const KNOWN_CHECKS = new WeakMap([
279
- [standardEgressEnforce, DEFAULT_CHECKS],
280
- ]);
281
- function registerEgressChecks(enforce, checks) {
282
- KNOWN_CHECKS.set(enforce, checks);
283
- }
284
- /** The bundled checks `enforce` runs; undefined for a host enforce, whose checks are its own. */
285
- function egressChecksOf(enforce) {
286
- return enforce && KNOWN_CHECKS.get(enforce);
287
- }
288
- const CHECK_NAMES = new Set(['sensitive', 'boundary', 'injection', 'images', 'links']);
289
- const URL_CHECK_NAMES = new Set(['hosts', 'fromTools']);
290
- const GROUP_NAMES = new Set(SENSITIVE_GROUPS);
291
- /** A hostname is all a URL check's host is: a scheme, port or path would never match one. */
292
- function urlCheckProblem(path, check) {
293
- if (check === undefined || typeof check === 'boolean')
294
- return undefined;
295
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
296
- if (typeof check !== 'object' || check === null)
297
- return `${path} must be a boolean or an object`;
298
- const unknown = Object.keys(check).find((key) => !URL_CHECK_NAMES.has(key));
299
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
300
- if (unknown !== undefined)
301
- return `${path} has no option ${JSON.stringify(unknown)}`;
302
- const { hosts, fromTools } = check;
303
- if (fromTools !== undefined && typeof fromTools !== 'boolean') {
304
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
305
- return `${path}.fromTools must be a boolean`;
306
- }
307
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
308
- if (hosts !== undefined && !Array.isArray(hosts))
309
- return `${path}.hosts must be a list`;
310
- const bad = (hosts ?? []).find((host) => typeof host !== 'string' || !/^[a-z0-9.-]+$/i.test(host) || host.startsWith('.'));
311
- return bad === undefined
312
- ? undefined
313
- : // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
314
- `${path}.hosts lists ${JSON.stringify(bad)}, which is not a hostname`;
315
- }
316
- /** A misspelt check or group would leave the check it meant at its default, silently. */
317
- function egressChecksProblem(path, checks) {
318
- if (typeof checks === 'boolean')
319
- return undefined;
320
- if (typeof checks !== 'object' || checks === null)
321
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
322
- return `${path} must be a boolean or an object`;
323
- const unknown = Object.keys(checks).find((key) => !CHECK_NAMES.has(key));
324
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
325
- if (unknown !== undefined)
326
- return `${path} has no check ${JSON.stringify(unknown)}`;
327
- const { sensitive, boundary, injection, images, links } = checks;
328
- for (const [name, value] of [
329
- ['boundary', boundary],
330
- ['injection', injection],
331
- ]) {
332
- if (value !== undefined && typeof value !== 'boolean')
333
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
334
- return `${path}.${name} must be a boolean`;
335
- }
336
- if (sensitive !== undefined && typeof sensitive !== 'boolean') {
337
- if (typeof sensitive !== 'object' || sensitive === null) {
338
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
339
- return `${path}.sensitive must be a boolean or an object`;
340
- }
341
- const unknownGroup = Object.keys(sensitive).find((group) => !GROUP_NAMES.has(group));
342
- if (unknownGroup !== undefined) {
343
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
344
- return `${path}.sensitive has no group ${JSON.stringify(unknownGroup)} (${SENSITIVE_GROUPS.join(', ')})`;
345
- }
346
- const bad = Object.entries(sensitive).find(([, on]) => typeof on !== 'boolean');
347
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
348
- if (bad !== undefined)
349
- return `${path}.sensitive.${bad[0]} must be a boolean`;
350
- }
351
- // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
352
- return urlCheckProblem(`${path}.images`, images) ?? urlCheckProblem(`${path}.links`, links);
353
- }
354
114
  /**
355
- * A policy that throws has reached no decision, so it cannot vouch for the output:
356
- * the failure becomes a `block`, not a pass. The turn then follows the profile's
357
- * ordinary `onBlock` handling instead of surfacing a raw host stack trace. The
358
- * thrown message may carry host internals, so it goes to the builder only
359
- * (`errorInternal`); the model reads the lexicon's `egress.policy_failed`.
115
+ * The words of the canary note a turn binds, when the profile's labels
116
+ * rewords it so that `SYSTEM_BOUNDARY` no longer reads them.
360
117
  */
361
- async function runEnforcer(enforce, payload, context) {
362
- try {
363
- return normalizeVerdict(await enforce(payload, context), context);
364
- }
365
- catch (err) {
366
- return {
367
- action: 'block',
368
- hits: [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }],
369
- rejection: lexiconText('egress.policy_failed', {}, context.lexicon),
370
- errorInternal: describeError(err),
371
- };
372
- }
118
+ function boundaryNote({ canary, labels, }) {
119
+ if (!canary)
120
+ return undefined;
121
+ const marker = canaryNoteMarker(labels);
122
+ return marker && !SYSTEM_BOUNDARY.test(marker) ? marker : undefined;
373
123
  }
374
- export { CANARY_HIT, collectEgressHits, DEFAULT_CHECKS, egressChecksOf, egressChecksProblem, egressScope, eventPromptLeakHits, hitRules, hitsEnforcer, isPromptLeakHit, NO_CHECKS, PROMPT_ECHO_HIT, promptEchoHits, promptLeakReason, registerEgressChecks, resolveEgressChecks, runEnforcer, standardEgressEnforce, WITHHELD_REASON, };
124
+ export { boundaryNote, eventLeak, eventPromptLeakHits, hitRules, isPromptLeakHit, promptEchoHits, promptLeakReason, WITHHELD_REASON, };
@@ -1,26 +1,31 @@
1
1
  import type { TurnEventOf } from '../kernel/turn-events.js';
2
2
  import type { TurnEvent } from '../kernel/types.js';
3
- import { type LexiconOverrides } from './lexicon.js';
4
- import { type ErrorKind, TheoremError } from './theorem-error.js';
3
+ import { type LabelOverrides } from './labels.js';
4
+ import { type ErrorCopies, type ErrorKind, TheoremError } from './theorem-error.js';
5
+ /** True when the value is an error named `AbortError`. */
5
6
  declare function isAbortError(err: unknown): boolean;
6
7
  /** `AbortSignal.timeout` rejects with a `TimeoutError`, not an `AbortError`. */
7
8
  declare function isTimeoutError(err: unknown): boolean;
9
+ /** Throws when the signal has aborted: its framework, abort or timeout reason, else an `AbortError`. */
8
10
  declare function throwIfAborted(signal?: AbortSignal): void;
9
11
  /** Anything that is not a `TheoremError` or an abort escaped every boundary that names kinds: a THEOREM bug. */
10
12
  declare function errorKind(err: unknown): ErrorKind;
13
+ /** The error kind for an HTTP status: 401, 402 and 403 are `auth`; 408, 504 and 524 `timeout`; 429 `rate_limit`; 503 and 529 (overloaded) `busy`; 500 and above `unavailable`; the rest `unsupported`. */
11
14
  declare function kindOfHttpStatus(status: number): ErrorKind;
12
- /** Pass the profile's `lexicon`, or the profile's wording is skipped. */
13
- declare function publicError(err: unknown, lexicon?: LexiconOverrides): string;
14
- /** Raw diagnostic for hosts, traces and logs; never shown to end users. */
15
+ /** The named reasons an error carries, one line each, in the profile's wording. */
16
+ declare function errorCopyText(copy: ErrorCopies, labels?: LabelOverrides): string;
17
+ /** Pass the profile's `labels`, or the profile's wording is skipped. */
18
+ declare function publicError(err: unknown, labels?: LabelOverrides): string;
19
+ /** Raw diagnostic for hosts, traces, and logs; never shown to end users. */
15
20
  declare function describeError(err: unknown): string;
16
21
  type ProducedError = TurnEventOf<'error'> & {
17
22
  errorInternal: string;
18
23
  };
19
- /** No user wording yet: `withPublicWording` adds it where the event reaches the host, the one place that knows the profile. */
24
+ /** No user wording yet: `withPublicLabels` adds it where the event reaches the host, the one place that knows the profile. */
20
25
  declare function toErrorEvent(err: unknown): ProducedError;
21
26
  /** Wording already set (host copy) is kept. */
22
- declare function withPublicWording(event: TurnEvent, lexicon?: LexiconOverrides): TurnEvent;
27
+ declare function withPublicLabels(event: TurnEvent, labels?: LabelOverrides): TurnEvent;
23
28
  export type { ErrorCopies, ErrorCopy, ErrorKind, TheoremErrorOptions } from './theorem-error.js';
24
29
  export { ERROR_KINDS } from './theorem-error.js';
25
30
  export type { ProducedError };
26
- export { describeError, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicWording, };
31
+ export { describeError, errorCopyText, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicLabels, };
@@ -1,5 +1,6 @@
1
- import { lexiconText } from './lexicon.js';
1
+ import { labelText } from './labels.js';
2
2
  import { TheoremError } from './theorem-error.js';
3
+ /** True when the value is an error named `AbortError`. */
3
4
  function isAbortError(err) {
4
5
  return errorName(err) === 'AbortError';
5
6
  }
@@ -10,15 +11,16 @@ function isTimeoutError(err) {
10
11
  function errorName(err) {
11
12
  return err && typeof err === 'object' ? err.name : undefined;
12
13
  }
14
+ /** Throws when the signal has aborted: its framework, abort or timeout reason, else an `AbortError`. */
13
15
  function throwIfAborted(signal) {
14
16
  if (!signal?.aborted) {
15
17
  return;
16
18
  }
17
19
  const { reason } = signal;
18
- if (isAbortError(reason) || isTimeoutError(reason)) {
20
+ if (reason instanceof TheoremError || isAbortError(reason) || isTimeoutError(reason)) {
19
21
  throw reason;
20
22
  }
21
- throw new DOMException('The operation was aborted.', 'AbortError'); // lexicon-exempt: DOM AbortError fingerprint
23
+ throw new DOMException('The operation was aborted.', 'AbortError'); // labels-exempt: DOM AbortError fingerprint
22
24
  }
23
25
  /** Anything that is not a `TheoremError` or an abort escaped every boundary that names kinds: a THEOREM bug. */
24
26
  function errorKind(err) {
@@ -30,6 +32,7 @@ function errorKind(err) {
30
32
  return 'cancelled';
31
33
  return 'internal';
32
34
  }
35
+ /** The error kind for an HTTP status: 401, 402 and 403 are `auth`; 408, 504 and 524 `timeout`; 429 `rate_limit`; 503 and 529 (overloaded) `busy`; 500 and above `unavailable`; the rest `unsupported`. */
33
36
  function kindOfHttpStatus(status) {
34
37
  if (status === 401 || status === 402 || status === 403)
35
38
  return 'auth';
@@ -37,24 +40,28 @@ function kindOfHttpStatus(status) {
37
40
  return 'timeout';
38
41
  if (status === 429)
39
42
  return 'rate_limit';
43
+ if (status === 503 || status === 529)
44
+ return 'busy';
40
45
  if (status >= 500)
41
46
  return 'unavailable';
42
47
  return 'unsupported';
43
48
  }
44
- function kindText(kind, lexicon, params) {
45
- return lexiconText(`error.${kind}`, params, lexicon);
49
+ function kindText(kind, labels, params) {
50
+ return labelText(`error.${kind}`, params, labels);
46
51
  }
47
- function wording(kind, copy, lexicon) {
48
- if (!copy)
49
- return kindText(kind, lexicon);
52
+ function wording(kind, copy, labels) {
53
+ return copy ? errorCopyText(copy, labels) : kindText(kind, labels);
54
+ }
55
+ /** The named reasons an error carries, one line each, in the profile's wording. */
56
+ function errorCopyText(copy, labels) {
50
57
  const lines = 'key' in copy ? [copy] : copy;
51
- return lines.map((line) => lexiconText(line.key, line.params, lexicon)).join('\n');
58
+ return lines.map((line) => labelText(line.key, line.params, labels)).join('\n');
52
59
  }
53
- /** Pass the profile's `lexicon`, or the profile's wording is skipped. */
54
- function publicError(err, lexicon) {
55
- return wording(errorKind(err), err instanceof TheoremError ? err.copy : undefined, lexicon);
60
+ /** Pass the profile's `labels`, or the profile's wording is skipped. */
61
+ function publicError(err, labels) {
62
+ return wording(errorKind(err), err instanceof TheoremError ? err.copy : undefined, labels);
56
63
  }
57
- /** Raw diagnostic for hosts, traces and logs; never shown to end users. */
64
+ /** Raw diagnostic for hosts, traces, and logs; never shown to end users. */
58
65
  function describeError(err) {
59
66
  if (typeof err === 'string') {
60
67
  return err;
@@ -64,7 +71,7 @@ function describeError(err) {
64
71
  }
65
72
  return String(err);
66
73
  }
67
- /** No user wording yet: `withPublicWording` adds it where the event reaches the host, the one place that knows the profile. */
74
+ /** No user wording yet: `withPublicLabels` adds it where the event reaches the host, the one place that knows the profile. */
68
75
  function toErrorEvent(err) {
69
76
  return {
70
77
  type: 'error',
@@ -74,18 +81,18 @@ function toErrorEvent(err) {
74
81
  };
75
82
  }
76
83
  /** Wording already set (host copy) is kept. */
77
- function withPublicWording(event, lexicon) {
84
+ function withPublicLabels(event, labels) {
78
85
  if (event.type === 'error' && event.error === undefined) {
79
- return { ...event, error: wording(event.errorKind, event.errorCopy, lexicon) };
86
+ return { ...event, error: wording(event.errorKind, event.errorCopy, labels) };
80
87
  }
81
88
  if (event.type === 'tool' &&
82
89
  event.tool.phase === 'error' &&
83
90
  event.tool.failure.error === undefined) {
84
91
  const { tool } = event;
85
- const error = kindText(tool.failure.kind, lexicon, { tool: tool.name });
92
+ const error = kindText(tool.failure.kind, labels, { tool: tool.name });
86
93
  return { ...event, tool: { ...tool, failure: { ...tool.failure, error } } };
87
94
  }
88
95
  return event;
89
96
  }
90
97
  export { ERROR_KINDS } from './theorem-error.js';
91
- export { describeError, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicWording, };
98
+ export { describeError, errorCopyText, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicLabels, };
@@ -1,15 +1,18 @@
1
1
  import { z } from 'zod';
2
- import { type LexiconKey } from './lexicon.js';
2
+ import { type Boundary } from './boundaries.js';
3
+ import { type LabelKey } from './labels.js';
3
4
  import { type ErrorKind } from './theorem-error.js';
4
5
  import { type GuardrailAction, type GuardrailStage, type Severity, type ToolOrigin, type TrustLevel } from './types.js';
6
+ /** The schema an error kind parses against. */
5
7
  export declare const errorKindSchema: z.ZodType<ErrorKind>;
6
- /** Wording for the user more specific than its kind's: a lexicon key and its parameters. */
8
+ /** Wording for the user more specific than its kind's: a label key and its parameters. */
7
9
  export interface ErrorCopy {
8
- key: LexiconKey;
10
+ key: LabelKey;
9
11
  params?: Record<string, string | number>;
10
12
  }
11
13
  /** One line of wording, or one per problem found. */
12
14
  export type ErrorCopies = ErrorCopy | readonly ErrorCopy[];
15
+ /** The schema error wording parses against. */
13
16
  export declare const errorCopiesSchema: z.ZodType<ErrorCopies>;
14
17
  /**
15
18
  * `depth` is hops from the user's turn: a direct tool call is 1; a tool result
@@ -22,6 +25,18 @@ export interface Provenance {
22
25
  tool: string;
23
26
  depth: number;
24
27
  }
28
+ export declare const provenance: z.ZodObject<{
29
+ origin: z.ZodEnum<{
30
+ http: "http";
31
+ mcp: "mcp";
32
+ builtin: "builtin";
33
+ local: "local";
34
+ delegated: "delegated";
35
+ }>;
36
+ tool: z.ZodString;
37
+ depth: z.ZodNumber;
38
+ }, z.core.$strip>;
39
+ /** One rule match: the rule id, its severity, where it matched and, when kept, the matched text. */
25
40
  export interface GuardrailHit {
26
41
  /** Stable rule id, e.g. `egress.canary-leak`. */
27
42
  rule: string;
@@ -40,13 +55,40 @@ export interface GuardrailHit {
40
55
  label?: string;
41
56
  /** Why a match matters, in a sentence, for a host's own rule. */
42
57
  doc?: string;
58
+ /** The name of the host's pattern that matched; unset for a match of Theorem's own patterns. */
59
+ pattern?: string;
60
+ /**
61
+ * What about the match made it one, for `tool_instructions`: `override`, `tool_name`, `order`
62
+ * or `authority`. For a host's `find` that failed, how: `find_threw` or `find_result`.
63
+ */
64
+ signal?: string;
43
65
  }
66
+ export declare const guardrailHit: z.ZodObject<{
67
+ rule: z.ZodString;
68
+ severity: z.ZodEnum<{
69
+ low: "low";
70
+ medium: "medium";
71
+ high: "high";
72
+ info: "info";
73
+ }>;
74
+ span: z.ZodOptional<z.ZodObject<{
75
+ start: z.ZodNumber;
76
+ end: z.ZodNumber;
77
+ }, z.core.$strip>>;
78
+ match: z.ZodOptional<z.ZodString>;
79
+ label: z.ZodOptional<z.ZodString>;
80
+ doc: z.ZodOptional<z.ZodString>;
81
+ pattern: z.ZodOptional<z.ZodString>;
82
+ signal: z.ZodOptional<z.ZodString>;
83
+ }, z.core.$strip>;
44
84
  /**
45
85
  * Matched text rides only under `observability.include.guardrailMatchPreview`, so by default a
46
86
  * trace sink can count and locate hits without becoming a second copy of the secret.
47
87
  */
48
88
  export interface GuardrailEvent {
49
89
  stage: GuardrailStage;
90
+ /** Where the text was crossing, when a detector read it there. */
91
+ boundary?: Boundary;
50
92
  trust: TrustLevel;
51
93
  action: GuardrailAction;
52
94
  hits: GuardrailHit[];
@@ -54,4 +96,5 @@ export interface GuardrailEvent {
54
96
  /** The block verdict's `errorInternal`: builder-only, stripped by `forClient`. */
55
97
  errorInternal?: string;
56
98
  }
99
+ /** The schema a guardrail event parses against. */
57
100
  export declare const guardrailEventSchema: z.ZodType<GuardrailEvent>;