@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,36 +1,42 @@
1
- // Imports nothing from `src/kernel/` but the dependency-free `Equals`: `src/kernel/turn-events.ts` imports these.
1
+ // invariant: Imports nothing from `src/kernel/` but the dependency-free `Equals`: `src/kernel/turn-events.ts` imports these.
2
2
  import { z } from 'zod';
3
- import { LEXICON_KEYS } from './lexicon.js';
3
+ import { BOUNDARIES } from './boundaries.js';
4
+ import { LABEL_KEYS } from './labels.js';
4
5
  import { ERROR_KINDS } from './theorem-error.js';
5
6
  import { GUARDRAIL_ACTIONS, GUARDRAIL_STAGES, SEVERITIES, TOOL_ORIGINS, TRUST_LEVELS, } from './types.js';
6
7
  const errorKind = z.enum(ERROR_KINDS);
7
8
  true;
9
+ /** The schema an error kind parses against. */
8
10
  export const errorKindSchema = errorKind;
9
11
  const errorCopy = z.object({
10
- key: z.enum(LEXICON_KEYS),
12
+ key: z.enum(LABEL_KEYS),
11
13
  params: z.record(z.string(), z.union([z.string(), z.number()])).optional(),
12
14
  });
13
15
  true;
14
16
  const errorCopies = z.union([errorCopy, z.array(errorCopy).readonly()]);
15
17
  true;
18
+ /** The schema error wording parses against. */
16
19
  export const errorCopiesSchema = errorCopies;
17
- const provenance = z.object({
20
+ export const provenance = z.object({
18
21
  origin: z.enum(TOOL_ORIGINS),
19
22
  tool: z.string(),
20
23
  depth: z.number(),
21
24
  });
22
25
  true;
23
- const guardrailHit = z.object({
26
+ export const guardrailHit = z.object({
24
27
  rule: z.string(),
25
28
  severity: z.enum(SEVERITIES),
26
29
  span: z.object({ start: z.number(), end: z.number() }).optional(),
27
30
  match: z.string().optional(),
28
31
  label: z.string().optional(),
29
32
  doc: z.string().optional(),
33
+ pattern: z.string().optional(),
34
+ signal: z.string().optional(),
30
35
  });
31
36
  true;
32
37
  const guardrailEvent = z.object({
33
38
  stage: z.enum(GUARDRAIL_STAGES),
39
+ boundary: z.enum(BOUNDARIES).optional(),
34
40
  trust: z.enum(TRUST_LEVELS),
35
41
  action: z.enum(GUARDRAIL_ACTIONS),
36
42
  hits: z.array(guardrailHit),
@@ -38,4 +44,5 @@ const guardrailEvent = z.object({
38
44
  errorInternal: z.string().optional(),
39
45
  });
40
46
  true;
47
+ /** The schema a guardrail event parses against. */
41
48
  export const guardrailEventSchema = guardrailEvent;
@@ -1,9 +1,13 @@
1
1
  import type { TurnEvent, TurnEventOf } from '../kernel/turn-events.js';
2
2
  import type { GuardrailAction, GuardrailEvent, GuardrailHit, GuardrailStage, Provenance, TrustLevel, Verdict } from './types.js';
3
+ /** Wraps a guardrail event as a turn event. */
3
4
  declare function guardrailTurnEvent(guardrail: GuardrailEvent): TurnEventOf<'guardrail'>;
4
- /** `allow` yields nothing; `flag`, `redact` and `block` all emit so hosts and traces can count hits. */
5
+ /** `allow` yields nothing; `flag`, `redact`, and `block` all emit so hosts and traces can count hits. */
5
6
  declare function guardrailFromVerdict(stage: GuardrailStage, trust: TrustLevel, verdict: Verdict, provenance?: Provenance): TurnEventOf<'guardrail'> | undefined;
7
+ /** Builds the guardrail event for the hits found at a stage. */
6
8
  declare function guardrailFromHits(stage: GuardrailStage, trust: TrustLevel, hits: GuardrailHit[], action?: GuardrailAction, provenance?: Provenance): TurnEventOf<'guardrail'> | undefined;
9
+ /** The guardrail turn event, with the matched text kept or dropped. */
7
10
  declare function projectGuardrailTurnEvent(event: TurnEventOf<'guardrail'>, includeMatch: boolean): TurnEventOf<'guardrail'>;
11
+ /** The turn event unchanged, or a guardrail one with the matched text kept or dropped. */
8
12
  declare function projectGuardrailTurnEvent(event: TurnEvent, includeMatch: boolean): TurnEvent;
9
13
  export { guardrailFromHits, guardrailFromVerdict, guardrailTurnEvent, projectGuardrailTurnEvent };
@@ -1,8 +1,9 @@
1
1
  import { projectGuardrailEvent } from './hits.js';
2
+ /** Wraps a guardrail event as a turn event. */
2
3
  function guardrailTurnEvent(guardrail) {
3
4
  return { type: 'guardrail', guardrail };
4
5
  }
5
- /** `allow` yields nothing; `flag`, `redact` and `block` all emit so hosts and traces can count hits. */
6
+ /** `allow` yields nothing; `flag`, `redact`, and `block` all emit so hosts and traces can count hits. */
6
7
  function guardrailFromVerdict(stage, trust, verdict, provenance) {
7
8
  if (verdict.action === 'allow') {
8
9
  return undefined;
@@ -18,6 +19,7 @@ function guardrailFromVerdict(stage, trust, verdict, provenance) {
18
19
  : {}),
19
20
  });
20
21
  }
22
+ /** Builds the guardrail event for the hits found at a stage. */
21
23
  function guardrailFromHits(stage, trust, hits, action = 'redact', provenance) {
22
24
  if (hits.length === 0) {
23
25
  return undefined;
@@ -30,6 +32,7 @@ function guardrailFromHits(stage, trust, hits, action = 'redact', provenance) {
30
32
  ...(provenance ? { provenance } : {}),
31
33
  });
32
34
  }
35
+ /** The turn event unchanged, or a guardrail one with the matched text kept or dropped. */
33
36
  function projectGuardrailTurnEvent(event, includeMatch) {
34
37
  if (event.type !== 'guardrail') {
35
38
  return event;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * What a model is told when a reply a detector blocked is retried: for each detector that
3
+ * matched, its hint and, where a match may be repeated, what it matched. The retry is read at the
4
+ * `repair` boundary like any other text on its way to the model, so a secret quoted here meets
5
+ * the action the profile set there.
6
+ *
7
+ * @module
8
+ */
9
+ import { type ResolvedDetect } from './detectors.js';
10
+ import type { GuardrailHit } from './event-schemas.js';
11
+ import { type LabelOverrides } from './labels.js';
12
+ /** The rejection a retry carries for the `hits` that stopped a reply, a line for each rule among them. */
13
+ declare function retryRejection(hits: readonly GuardrailHit[], detect: ResolvedDetect, labels?: LabelOverrides): string;
14
+ export { retryRejection };
@@ -0,0 +1,57 @@
1
+ /**
2
+ * What a model is told when a reply a detector blocked is retried: for each detector that
3
+ * matched, its hint and, where a match may be repeated, what it matched. The retry is read at the
4
+ * `repair` boundary like any other text on its way to the model, so a secret quoted here meets
5
+ * the action the profile set there.
6
+ *
7
+ * @module
8
+ */
9
+ import { isDetector } from './detectors.js';
10
+ import { labelText } from './labels.js';
11
+ import { DETECT_RULES, EGRESS_RULES } from './rules.js';
12
+ /** The hint of what stops a reply besides a detector's match. */
13
+ const OTHER_HINTS = {
14
+ [EGRESS_RULES.unscannable]: 'egress.hint_unscannable',
15
+ [EGRESS_RULES.providerToolLeak]: 'egress.hint_provider_tool_leak',
16
+ };
17
+ /** The rules whose match is the profile's own, and is never repeated. */
18
+ const UNQUOTED = [DETECT_RULES.canary_leak, DETECT_RULES.prompt_leak];
19
+ /** How many matches a detector's line quotes, and how much of each. */
20
+ const MAX_QUOTED = 3;
21
+ const MAX_QUOTE = 120;
22
+ const DETECT_PREFIX = 'detect.';
23
+ /** The hint of the rule `hit` reports: the profile's, or else the labels'. */
24
+ function hintOf(hit, detect, labels) {
25
+ const other = OTHER_HINTS[hit.rule];
26
+ if (other)
27
+ return labelText(other, {}, labels);
28
+ const key = hit.rule.startsWith(DETECT_PREFIX) ? hit.rule.slice(DETECT_PREFIX.length) : hit.rule;
29
+ if (isDetector(key)) {
30
+ return detect.hints?.[key] ?? labelText(`detect.hint.${key}`, {}, labels);
31
+ }
32
+ const host = detect.host?.find(({ id }) => id === key);
33
+ const label = host?.label ?? hit.label ?? key;
34
+ return host?.hint ?? labelText('detect.hint.own', { label }, labels);
35
+ }
36
+ /** The matched text of `hits` a line may quote: each once, the first few, cut to length. */
37
+ function quoted(hits) {
38
+ const matches = hits.flatMap(({ rule, match }) => match && !UNQUOTED.includes(rule) ? [match] : []);
39
+ return [...new Set(matches)]
40
+ .slice(0, MAX_QUOTED)
41
+ .map((match) => JSON.stringify(match.length > MAX_QUOTE ? match.slice(0, MAX_QUOTE) : match));
42
+ }
43
+ /** The rejection a retry carries for the `hits` that stopped a reply, a line for each rule among them. */
44
+ function retryRejection(hits, detect, labels) {
45
+ const byRule = new Map();
46
+ for (const hit of hits)
47
+ byRule.set(hit.rule, [...(byRule.get(hit.rule) ?? []), hit]);
48
+ const lines = [...byRule.values()].map((found) => {
49
+ const hint = hintOf(found[0], detect, labels);
50
+ const matches = quoted(found);
51
+ return matches.length > 0
52
+ ? labelText('egress.rejection_found', { hint, matches: matches.join(', ') }, labels)
53
+ : hint;
54
+ });
55
+ return labelText('egress.rejection', { found: lines.join('\n') }, labels);
56
+ }
57
+ export { retryRejection };
@@ -1,8 +1,14 @@
1
1
  import type { GuardrailEvent, GuardrailHit, Severity } from './types.js';
2
+ /** A canary leak. Never carries the live token, only a placeholder. */
3
+ declare const CANARY_HIT: GuardrailHit;
4
+ /** A prompt leak. Never carries the words: they are the private system instruction's. */
5
+ declare const PROMPT_ECHO_HIT: GuardrailHit;
6
+ /** A guardrail hit for a span of the text, with the matched text sliced from it. */
2
7
  declare function hitFromSpan(text: string, span: {
3
8
  start: number;
4
9
  end: number;
10
+ name?: string;
5
11
  }, rule: string, severity: Severity): GuardrailHit;
6
12
  /** `match` is the caught text itself, so hosts and traces get it only via `observability.include.guardrailMatchPreview`. */
7
13
  declare function projectGuardrailEvent(event: GuardrailEvent, includeMatch: boolean): GuardrailEvent;
8
- export { hitFromSpan, projectGuardrailEvent };
14
+ export { CANARY_HIT, hitFromSpan, PROMPT_ECHO_HIT, projectGuardrailEvent };
@@ -1,9 +1,20 @@
1
+ import { DETECT_RULES } from './rules.js';
2
+ /** A canary leak. Never carries the live token, only a placeholder. */
3
+ const CANARY_HIT = {
4
+ rule: DETECT_RULES.canary_leak,
5
+ severity: 'high',
6
+ match: '[canary]',
7
+ };
8
+ /** A prompt leak. Never carries the words: they are the private system instruction's. */
9
+ const PROMPT_ECHO_HIT = { rule: DETECT_RULES.prompt_leak, severity: 'high' };
10
+ /** A guardrail hit for a span of the text, with the matched text sliced from it. */
1
11
  function hitFromSpan(text, span, rule, severity) {
2
12
  return {
3
13
  rule,
4
14
  severity,
5
15
  span: { start: span.start, end: span.end },
6
16
  match: text.slice(span.start, span.end),
17
+ ...(span.name === undefined ? {} : { pattern: span.name }),
7
18
  };
8
19
  }
9
20
  /** `match` is the caught text itself, so hosts and traces get it only via `observability.include.guardrailMatchPreview`. */
@@ -16,4 +27,4 @@ function projectGuardrailEvent(event, includeMatch) {
16
27
  hits: event.hits.map(({ match: _match, ...hit }) => hit),
17
28
  };
18
29
  }
19
- export { hitFromSpan, projectGuardrailEvent };
30
+ export { CANARY_HIT, hitFromSpan, PROMPT_ECHO_HIT, projectGuardrailEvent };
@@ -0,0 +1,85 @@
1
+ /** labels-exempt-file: profile-registration diagnostics for a host's patterns — not runtime user or model copy (P2) */
2
+ /**
3
+ * A pattern of the host's own, as data: a regular expression, or words. Words match whole and
4
+ * without regard to case, and a space in one matches any run of whitespace.
5
+ */
6
+ type HostPattern = {
7
+ /** What a match is called in the trace. */
8
+ name: string;
9
+ /** The source of a regular expression. */
10
+ pattern: string;
11
+ /** Any of `i`, `m`, `s`, and `u`. Every match is found, so `g` is implied; `y` is refused. */
12
+ flags?: string;
13
+ } | {
14
+ /** What a match is called in the trace. */
15
+ name: string;
16
+ words: readonly string[];
17
+ };
18
+ /**
19
+ * An automaton over UTF-16 code units, as tables.
20
+ *
21
+ * - `classStarts`: first code unit of each character class; class k covers
22
+ * `[classStarts[k], classStarts[k+1])`.
23
+ * - `charsets`: each charset as the sorted class ids it contains.
24
+ * - `initials`: the initial node of each pattern.
25
+ * - `leads`: per pattern, the charset an optional repeat opening it reads, or
26
+ * -1. The pattern's nodes are of what follows the repeat.
27
+ * - `nodes`: each node as `[pattern, final (0/1), target, charset, target, charset, ...]`.
28
+ */
29
+ interface AutomatonData {
30
+ classStarts: readonly number[];
31
+ charsets: readonly (readonly number[])[];
32
+ initials: readonly number[];
33
+ leads: readonly number[];
34
+ nodes: readonly (readonly number[])[];
35
+ }
36
+ /**
37
+ * What compiling a list of patterns writes (`compilePatterns`, `agents detect-compile`): the
38
+ * patterns it read and checked, and their automaton. A stream holds exactly the text a match
39
+ * could still be under way in by it.
40
+ */
41
+ interface CompiledPatterns {
42
+ /** `PATTERN_COMPILER_VERSION` of the compiler that wrote it. */
43
+ compiler: number;
44
+ /** Each pattern as compiled, in order: a table that no longer matches its patterns is refused. */
45
+ patterns: readonly PatternSource[];
46
+ automaton: AutomatonData;
47
+ }
48
+ /** A pattern as the kernel runs it: the source and flags of its regular expression. */
49
+ interface PatternSource {
50
+ name: string;
51
+ source: string;
52
+ flags: string;
53
+ }
54
+ /** A host pattern ready to run. */
55
+ interface HostMatcher {
56
+ name: string;
57
+ /** Global, so every match is found. */
58
+ regex: RegExp;
59
+ }
60
+ /** Bumped whenever the compiled table's layout or meaning changes. */
61
+ declare const PATTERN_COMPILER_VERSION = 3;
62
+ /** The most patterns one detector takes, and the longest each may be once written as a regular expression. */
63
+ declare const MAX_PATTERNS = 64;
64
+ declare const MAX_PATTERN_LENGTH = 1024;
65
+ /** The patterns as a compiled table records them. */
66
+ declare function patternSources(patterns: readonly HostPattern[]): PatternSource[];
67
+ /** What is wrong with one pattern, or `undefined` when it runs. */
68
+ declare function patternProblem(path: string, pattern: unknown): string | undefined;
69
+ /**
70
+ * What is wrong with a detector's `patterns` and the table `compiled` for them, or `undefined`
71
+ * when both are sound. Patterns need their table: compiling is where a pattern that could take
72
+ * more than linear time on hostile text is refused.
73
+ */
74
+ declare function patternsProblem(path: string, patterns: unknown, compiled: unknown): string | undefined;
75
+ /**
76
+ * What is wrong with a list of patterns before it is compiled, or `undefined`: an editor checks
77
+ * with it as the patterns are written.
78
+ */
79
+ declare function patternListProblem(path: string, patterns: unknown): string | undefined;
80
+ /** Whether any detector of `detect` lists patterns of the host's own, which need compiling. */
81
+ declare function listsPatterns(detect: unknown): boolean;
82
+ /** `patterns`, valid, ready to run. */
83
+ declare function matchersOf(patterns: readonly HostPattern[]): readonly HostMatcher[];
84
+ export type { AutomatonData, CompiledPatterns, HostMatcher, HostPattern, PatternSource };
85
+ export { listsPatterns, MAX_PATTERN_LENGTH, MAX_PATTERNS, matchersOf, PATTERN_COMPILER_VERSION, patternListProblem, patternProblem, patternSources, patternsProblem, };
@@ -0,0 +1,173 @@
1
+ // invariant: Leaf module. Imports nothing from `src/guardrails/types.ts` or `src/kernel/`, so
2
+ // `detectors.ts` can read a host's patterns without a cycle.
3
+ /** Bumped whenever the compiled table's layout or meaning changes. */
4
+ const PATTERN_COMPILER_VERSION = 3;
5
+ /** The most patterns one detector takes, and the longest each may be once written as a regular expression. */
6
+ const MAX_PATTERNS = 64;
7
+ const MAX_PATTERN_LENGTH = 1024;
8
+ const PATTERN_FLAGS = 'imsu';
9
+ /** A letter, digit, or underscore in any script: what a word may not touch on either side. */
10
+ const WORD_UNIT = '[\\p{L}\\p{N}_]';
11
+ function escaped(text) {
12
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
13
+ }
14
+ /** `words` as one alternation, longest first so a word is not cut short by one it starts with. */
15
+ function wordsSource(words) {
16
+ const alternatives = [...new Set(words.map((word) => word.trim()).filter(Boolean))]
17
+ .sort((left, right) => right.length - left.length)
18
+ .map((word) => word.split(/\s+/).map(escaped).join('\\s+'));
19
+ return `(?<!${WORD_UNIT})(?:${alternatives.join('|')})(?!${WORD_UNIT})`;
20
+ }
21
+ /** The regular expression `pattern` runs as. */
22
+ function patternSource(pattern) {
23
+ if ('words' in pattern) {
24
+ return { name: pattern.name, source: wordsSource(pattern.words), flags: 'iu' };
25
+ }
26
+ return { name: pattern.name, source: pattern.pattern, flags: pattern.flags ?? '' };
27
+ }
28
+ /** The patterns as a compiled table records them. */
29
+ function patternSources(patterns) {
30
+ return patterns.map(patternSource);
31
+ }
32
+ function isRecord(value) {
33
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
34
+ }
35
+ function isStrings(value) {
36
+ return Array.isArray(value) && value.every((item) => typeof item === 'string');
37
+ }
38
+ /** What is wrong with the shape of one pattern, before it is compiled. */
39
+ function shapeProblem(path, pattern) {
40
+ if (!isRecord(pattern))
41
+ return `${path} must be an object`;
42
+ const { name, words, flags } = pattern;
43
+ if (typeof name !== 'string' || !name.trim())
44
+ return `${path}.name must be a non-empty string`;
45
+ const kinds = ['pattern', 'words'].filter((key) => pattern[key] !== undefined);
46
+ if (kinds.length !== 1)
47
+ return `${path} takes one of pattern and words`;
48
+ const unknown = Object.keys(pattern).find((key) => !['name', 'pattern', 'flags', 'words'].includes(key));
49
+ if (unknown !== undefined) {
50
+ return `${path}.${unknown} is not a setting of a pattern (name, pattern, flags, words)`;
51
+ }
52
+ if (words !== undefined) {
53
+ if (flags !== undefined)
54
+ return `${path}.flags is a setting of pattern, not of words`;
55
+ if (!isStrings(words) || !words.some((word) => word.trim())) {
56
+ return `${path}.words must be a list with at least one word`;
57
+ }
58
+ return undefined;
59
+ }
60
+ if (typeof pattern.pattern !== 'string' || !pattern.pattern) {
61
+ return `${path}.pattern must be a non-empty string`;
62
+ }
63
+ if (flags === undefined)
64
+ return undefined;
65
+ if (typeof flags !== 'string')
66
+ return `${path}.flags must be a string`;
67
+ const bad = [...flags].find((flag, at) => !PATTERN_FLAGS.includes(flag) || flags.indexOf(flag) < at);
68
+ if (bad === 'y')
69
+ return `${path}.flags: a sticky (y) pattern only matches where the last one ended`;
70
+ if (bad === 'g')
71
+ return `${path}.flags: g is implied, every match is found`;
72
+ return bad === undefined
73
+ ? undefined
74
+ : `${path}.flags takes each of ${[...PATTERN_FLAGS].join(', ')} once, not ${JSON.stringify(bad)}`;
75
+ }
76
+ /** What is wrong with one pattern, or `undefined` when it runs. */
77
+ function patternProblem(path, pattern) {
78
+ const shape = shapeProblem(path, pattern);
79
+ if (shape !== undefined)
80
+ return shape;
81
+ const { source, flags } = patternSource(pattern);
82
+ if (source.length > MAX_PATTERN_LENGTH) {
83
+ return `${path} is ${source.length} characters as a regular expression; the most is ${MAX_PATTERN_LENGTH}`;
84
+ }
85
+ let regex;
86
+ try {
87
+ // why: this only checks that the pattern parses and tests it on the empty text; a pattern that
88
+ // could run away on hostile text is refused when it is compiled (compilePatterns).
89
+ regex = new RegExp(source, `${flags}g`);
90
+ }
91
+ catch (err) {
92
+ return `${path} does not compile (${err instanceof Error ? err.message : String(err)})`;
93
+ }
94
+ // why: A pattern the empty text matches matches between every two characters: it names nothing.
95
+ return regex.test('') ? `${path} matches the empty text` : undefined;
96
+ }
97
+ /** Whether `compiled` was written for `sources` by this compiler. */
98
+ function compiledProblem(path, compiled, sources) {
99
+ const again = 'run `agents detect-compile` or compilePatterns again';
100
+ if (!isRecord(compiled) || !isRecord(compiled.automaton) || !Array.isArray(compiled.patterns)) {
101
+ return `${path} must be the table compilePatterns or \`agents detect-compile\` writes`;
102
+ }
103
+ if (compiled.compiler !== PATTERN_COMPILER_VERSION) {
104
+ return `${path} comes from compiler ${String(compiled.compiler)}, this one is ${PATTERN_COMPILER_VERSION}; ${again}`;
105
+ }
106
+ return JSON.stringify(compiled.patterns) === JSON.stringify(sources)
107
+ ? undefined
108
+ : `${path} was compiled from other patterns; ${again}`;
109
+ }
110
+ /**
111
+ * What is wrong with a detector's `patterns` and the table `compiled` for them, or `undefined`
112
+ * when both are sound. Patterns need their table: compiling is where a pattern that could take
113
+ * more than linear time on hostile text is refused.
114
+ */
115
+ function patternsProblem(path, patterns, compiled) {
116
+ if (patterns === undefined) {
117
+ return compiled === undefined ? undefined : `${path}.compiled is set without patterns`;
118
+ }
119
+ const problem = patternListProblem(path, patterns);
120
+ if (problem !== undefined)
121
+ return problem;
122
+ if (patterns.length === 0) {
123
+ return compiled === undefined ? undefined : `${path}.compiled is set without patterns`;
124
+ }
125
+ if (compiled === undefined) {
126
+ return `${path}.patterns need their compiled table: set ${path}.compiled from \`agents detect-compile\`, or wrap the detect setting in compileDetect from @theoremjs/agents/guardrails/compile`;
127
+ }
128
+ return compiledProblem(`${path}.compiled`, compiled, patternSources(patterns));
129
+ }
130
+ /**
131
+ * What is wrong with a list of patterns before it is compiled, or `undefined`: an editor checks
132
+ * with it as the patterns are written.
133
+ */
134
+ function patternListProblem(path, patterns) {
135
+ if (!Array.isArray(patterns))
136
+ return `${path}.patterns must be a list`;
137
+ if (patterns.length > MAX_PATTERNS) {
138
+ return `${path}.patterns lists ${patterns.length} patterns; the most is ${MAX_PATTERNS}`;
139
+ }
140
+ const names = new Set();
141
+ for (const [index, pattern] of patterns.entries()) {
142
+ const at = `${path}.patterns[${index}]`;
143
+ const problem = patternProblem(at, pattern);
144
+ if (problem !== undefined)
145
+ return problem;
146
+ const { name } = pattern;
147
+ if (names.has(name))
148
+ return `${at}.name ${JSON.stringify(name)} is listed twice`;
149
+ names.add(name);
150
+ }
151
+ return undefined;
152
+ }
153
+ /** Whether any detector of `detect` lists patterns of the host's own, which need compiling. */
154
+ function listsPatterns(detect) {
155
+ if (!isRecord(detect))
156
+ return false;
157
+ return Object.values(detect).some((rule) => isRecord(rule) && Array.isArray(rule.patterns) && rule.patterns.length > 0);
158
+ }
159
+ /** The matchers of each list of patterns, built once: a profile's patterns are resolved every turn. */
160
+ const MATCHERS = new WeakMap();
161
+ /** `patterns`, valid, ready to run. */
162
+ function matchersOf(patterns) {
163
+ let matchers = MATCHERS.get(patterns);
164
+ if (!matchers) {
165
+ matchers = patternSources(patterns).map(({ name, source, flags }) => ({
166
+ name,
167
+ regex: new RegExp(source, `${flags}g`),
168
+ }));
169
+ MATCHERS.set(patterns, matchers);
170
+ }
171
+ return matchers;
172
+ }
173
+ export { listsPatterns, MAX_PATTERN_LENGTH, MAX_PATTERNS, matchersOf, PATTERN_COMPILER_VERSION, patternListProblem, patternProblem, patternSources, patternsProblem, };
@@ -5,6 +5,11 @@
5
5
  *
6
6
  * @module
7
7
  */
8
+ /**
9
+ * An order to set instructions aside, with up to `gap` words between the verb
10
+ * and its object. `word` is what a word in the gap may be.
11
+ */
12
+ declare function overrideFrame(gap: number, word?: string): string;
8
13
  declare const INJECTION_PATTERNS: RegExp[];
9
14
  /** Runs that might encode an injection; each is decoded and checked in `injection.ts`. */
10
15
  declare const BASE64_BLOB: RegExp;
@@ -12,4 +17,4 @@ declare const HEX_BLOB: RegExp;
12
17
  declare const SPACED_LETTERS: RegExp;
13
18
  /** Three+ alphabetic tokens joined by `|` (no shell spaces around pipes). */
14
19
  declare const PIPE_SEPARATED: RegExp;
15
- export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, PIPE_SEPARATED, SPACED_LETTERS };
20
+ export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, overrideFrame, PIPE_SEPARATED, SPACED_LETTERS };
@@ -45,6 +45,37 @@ const LLAMA_INST = /\[\/?INST\]/gi;
45
45
  const IGNORE_YOUR_INSTRUCTIONS = /ignore\s+(all\s+)?(your\s+)?(instructions?|rules?)\b/gi;
46
46
  const UNRESTRICTED_MODE = /\bunrestricted\s+(ai|mode|model)\b/gi;
47
47
  const IGNORE_MULTILANG = /\b(?:ignorieren|ignorez|ignora|ignorer|oubliez|vergessen|olvida|desestima|missachten)\b[\s\S]{0,50}\b(?:anweisungen|instructions?|instrucciones|directives?|r[eè]gles|reglas)\b/gi;
48
+ /** The verbs that tell a reader to set a thing aside, as written to give an order. */
49
+ const OVERRIDE_VERB = 'ignore|disregard|forget|override|bypass';
50
+ /** What an agent is told to set aside. */
51
+ const OVERRIDE_OBJECT = 'instructions?|rules|guidelines?|constraints?|directives?|prompts?';
52
+ const FRAME_WORD = String.raw `[\w'’-]{1,40}`;
53
+ /**
54
+ * An order to set instructions aside, with up to `gap` words between the verb
55
+ * and its object. `word` is what a word in the gap may be.
56
+ */
57
+ function overrideFrame(gap, word = FRAME_WORD) {
58
+ return String.raw `\b(?:${OVERRIDE_VERB})\s+(?:${word}\s+){0,${gap}}(?:${OVERRIDE_OBJECT})\b`;
59
+ }
60
+ /** The verb is negated: "never ignore the rules". */
61
+ const NEGATED = String.raw `(?<!(?:\b(?:not|never|cannot|without)|n['’]t)\s+(?:${FRAME_WORD}\s+)?)`;
62
+ /** The verb is a noun: "his disregard for the rules". */
63
+ const NOUN_USE = String.raw `(?<!\b(?:the|a|an|his|her|its|their|your|my|our)\s+)`;
64
+ /**
65
+ * The verb reports or describes, and "you" is not its subject: "an attempt to
66
+ * bypass the rules", "I must ignore the instructions", "they override
67
+ * constraints". "you must ignore the rules" and "I want you to ignore the
68
+ * rules" stay orders.
69
+ */
70
+ const DESCRIBED = String.raw `(?:(?<=\byou\s+(?:${FRAME_WORD}\s+){0,2})|(?<!\b(?:to|must|should|would|will|can|could|may|might|shall|I|we|they|he|she|it|who|that|which)\s+(?:\w+ly\s+)?))`;
71
+ /** A word in the gap that is not the writer's own: "ignore my rules" speaks of the writer's rules. */
72
+ const NOT_OWN = String.raw `(?!(?:my|our)\b)${FRAME_WORD}`;
73
+ /**
74
+ * {@linkcode overrideFrame} where the verb gives the reader an order about
75
+ * the reader's instructions. The patterns above still match their own wording
76
+ * in every guarded case.
77
+ */
78
+ const OVERRIDE_FRAME = new RegExp(`${NEGATED}${NOUN_USE}${DESCRIBED}${overrideFrame(3, NOT_OWN)}`, 'gi');
48
79
  const INJECTION_PATTERNS = [
49
80
  IGNORE_PREVIOUS,
50
81
  DISREGARD_INSTRUCTIONS,
@@ -84,6 +115,7 @@ const INJECTION_PATTERNS = [
84
115
  IGNORE_YOUR_INSTRUCTIONS,
85
116
  UNRESTRICTED_MODE,
86
117
  IGNORE_MULTILANG,
118
+ OVERRIDE_FRAME,
87
119
  ];
88
120
  /** Runs that might encode an injection; each is decoded and checked in `injection.ts`. */
89
121
  const BASE64_BLOB = /[A-Za-z0-9+/]{16,}={0,2}/g;
@@ -91,4 +123,4 @@ const HEX_BLOB = /(?:[0-9a-f]{2}[\s]?){8,}/gi;
91
123
  const SPACED_LETTERS = /\b(?:[A-Za-z] ){3,}[A-Za-z]\b/g;
92
124
  /** Three+ alphabetic tokens joined by `|` (no shell spaces around pipes). */
93
125
  const PIPE_SEPARATED = /\b(?:[A-Za-z]+\|){2,}[A-Za-z]+\b/g;
94
- export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, PIPE_SEPARATED, SPACED_LETTERS };
126
+ export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, overrideFrame, PIPE_SEPARATED, SPACED_LETTERS };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generated by `scripts/gen-egress-automata.ts` from `egress-patterns.ts`.
3
+ * Do not edit: change the patterns and run the script.
4
+ *
5
+ * @module
6
+ */
7
+ /** Each injection pattern reversed: it matches where the pattern matches the text written backwards. */
8
+ declare const REVERSED_INJECTION_PATTERNS: RegExp[];
9
+ export { REVERSED_INJECTION_PATTERNS };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Generated by `scripts/gen-egress-automata.ts` from `egress-patterns.ts`.
3
+ * Do not edit: change the patterns and run the script.
4
+ *
5
+ * @module
6
+ */
7
+ /** Each injection pattern reversed: it matches where the pattern matches the text written backwards. */
8
+ const REVERSED_INJECTION_PATTERNS = [
9
+ /(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)(?:\s+(?:YTEFAS|YTIRUCES|METSYS|LANOITAREPO|LANRETNI|EROC|LANIGIRO|LAITINI|GNITSIXE|NEVIG|DETATS|DEDIVORP|DENIFED|DEIFICEPS|DEHSILBATSE))?\s+(?:SUOIVERP|ROIRP)(?:\s+LLA)?\s+ERONGI/gi,
10
+ /(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:SUOIVERP|ROIRP|EVOBA)(?:\s+LLA)?\s+DRAGERSID/gi,
11
+ /(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:SUOIVERP|ROIRP|EVOBA)(?:\s+LLA)?\s+TEGROF/gi,
12
+ /:S?NOITCURTSNI\s+WEN/gi,
13
+ /(?:METSYS|REPOLEVED|SUOIVERP|LANIGIRO)(?:\s+EHT)?\s+WOLLOF\s+TON\s+OD/gi,
14
+ /(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:ROIRP|SUOIVERP)(?:\s+LLA)?\s+S?EDESREPUS/gi,
15
+ /(?:DIOV|DILAVNI|LLUN|ETELOSBO|DELLECNAC|DEKOVER)\s+(?:ERA|SI)\s+S?NOITCURTSNI\s+(?:SUOIVERP|ROIRP)(?:\s+LLA)?/gi,
16
+ /EDOM\s+REPOLEVED(?:\s+NI)?\s+WON\s+ERA\s+UOY/gi,
17
+ /(?<!\b(?:NI|NO|AIV|HGUORHT|MORF|GNISU|ROF)\s+)EDOM\s+(?:REPOLEVED|NIMDA|GUBED|ECNANETNIAM)\s+RETNE/gi,
18
+ /(?<!\b(?:NI|NO|AIV|HGUORHT|MORF|GNISU|ROF)\s+)EDOM\s+(?:REPOLEVED|NIMDA|GUBED|KAERBLIAJ)\s+ETAVITCA/gi,
19
+ /\bEDIRREVO\s+METSYS\b/gi,
20
+ /(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)(?:\s+RUOY)?\s+EDIRREVO/gi,
21
+ /\bTPMORP(?:\s+(?:METSYS|EMTSYS|MTESYS|P?METSYS))?(?:\s+(?:LLUF|NEDDIH|ETELPMOC|LANRETNI|TERCES|LANIGIRO|ERITNE|TCAXE|LAUTCA|LAER)){0,2}(?:\s+(?:R?UOY|UROY|ROUY|EHT|YM|STI|SIH|REH|RUO|RIEHT))?\s+LAEVER/gi,
22
+ /\bTPMORP(?:\s+(?:METSYS|EMTSYS|MTESYS|P?METSYS))?\s+(?:R?UOY|UROY|ROUY|EHT|YM|STI|SIH|REH|RUO|RIEHT)(?:\s+EM)?\s+WOHS/gi,
23
+ /SNOITCURTSNI(?:\s+TCAXE)?(?:\s+RUOY)?\s+(?:ERA|EREW)\s+TAHW/gi,
24
+ /(?:EVOBA|EROFEB)\s+(?:TXET|S?NOITCURTSNI)(?:\s+EHT)?\s+TAEPER/gi,
25
+ /(?:TPMORP|S?NOITCURTSNI)\s+(?:LAITINI|LANIGIRO|METSYS)(?:\s+RUOY)?\s+TUPTUO/gi,
26
+ /(?:DNUOB|DETCIRTSER|DETIMIL)\s+REGNOL\s+ON\s+ERA\s+UOY/gi,
27
+ /DNUOB\s+TON(?:\s+(?:ER'|ERA\s+)UOY)?\s+FI\s+SA\s+TCA/gi,
28
+ /(?:IA|TNATSISSA|LEDOM)\s+TNEREFFID(?:\s+A)?(?:\s+(?:ER'|ERA\s+)UOY)?\s+DNETERP/gi,
29
+ /(?:TCIRTSER(?:\s+YNA)?\s+TUOHTIW|(?:LLA|YNA|YREVE|VERP)\s+\w*RONGI|SSAPYB|TCIRTSERNU|TIMILNU|YLNO\s+YEBO|(?:SELUR|STIMIL|TCIRTSER|IRADNUOB)\s+ON).{0,40}\w+(?:\s+(?:A|NA))?\s+WON\s+ERA\s+UOY/gi,
30
+ /\bwon\s+gnihtyna\s+od\b[\s\S]{0,120}\bNAD\b/g,
31
+ /(?:EDOM|TPMORP)\s+(?:DE)?KAERBLIAJ/gi,
32
+ /\bWON\s+GNIHTYNA\s+OD\b/gi,
33
+ /(?:S?RETLIF|S?ERUSAEM|S?ENILEDIUG|S?NOITCIRTSER)\s+(?:YTEFAS|YTIRUCES|TNETNOC|LACIHTE)(?:\s+RUOY)?\s+SSAPYB/gi,
34
+ /(?:S?RETLIF|S?ERUSAEM|S?ELUR|S?ENILEDIUG|S?NOITCIRTSER)\s+(?:YTEFAS|YTIRUCES|TNETNOC)(?:\s+RUOY)?(?:\s+LLA)?\s+(?:ELBASID|ETELED|EVOMER|FFO\s+NRUT|ETANIMILE)/gi,
35
+ /(?:S?ENILEDIUG|S?ELUR|S?NOITCIRTSER|S?ERUSAEM|S?RETLIF|(?:Y|SEI)CILOP|S?LOCOTORP)\s+(?:YTEFAS|YTIRUCES|LACIHTE|TNETNOC)(?:\s+RUOY)?(?:\s+LLA)?\s+(?:ERONGI|DRAGERSID)/gi,
36
+ />\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}METSYS[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}</gi,
37
+ />\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}(?:TNATSISSA|REPOLEVED|LOOT|NOITCNUF)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}</gi,
38
+ /:\]?(?:METSYS|TNATSISSA|RESU)\[?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\n[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\]/gi,
39
+ /\][\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}(?:EGASSEM[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,8}METSYS|METSYS|TNATSISSA|LANRETNI)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\[/gi,
40
+ /(?:ERA\s+UOY|ERONGI|EDIRREVO)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{1,32}:METSYS[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}$/gim,
41
+ />\|(?:trats_mi|dne_mi|di_toe|di_redaeh_trats|di_redaeh_dne|txetfodne)\|</g,
42
+ />\uff5c(?:ecnetnes\u2581fo\u2581dne|ecnetnes\u2581fo\u2581nigeb)\uff5c</g,
43
+ /\]TSNI\/?\[/gi,
44
+ /\b(?:S?NOITCURTSNI|S?ELUR)(?:\s+RUOY)?(?:\s+LLA)?\s+ERONGI/gi,
45
+ /\b(?:IA|EDOM|LEDOM)\s+DETCIRTSERNU\b/gi,
46
+ /\b(?:NEGNUSIEWNA|S?NOITCURTSNI|SENOICCURTSNI|S?EVITCERID|SELG[E\xc8]R|SALGER)\b[\s\S]{0,50}\b(?:NEREIRONGI|ZERONGI|ARONGI|RERONGI|ZEILBUO|NESSEGREV|ADIVLO|AMITSESED|NETHCASSIM)\b/gi,
47
+ /\b(?:S?NOITCURTSNI|SELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID|S?TPMORP)(?:\s+[-\w'\u2019]{1,40}(?<!\b(?:YM|RUO))){0,3}\s+(?:ERONGI|DRAGERSID|TEGROF|EDIRREVO|SSAPYB)\b(?:(?=(?:\s+[-\w'\u2019]{1,40}){0,2}\s+UOY\b)|(?!(?:\s+YL\w+)?\s+(?:OT|TSUM|DLUOHS|DLUOW|LLIW|NAC|DLUOC|YAM|THGIM|LLAHS|I|EW|YEHT|EH|EHS|TI|OHW|TAHT|HCIHW)\b))(?!\s+(?:EHT|A|NA|SIH|REH|STI|RIEHT|RUOY|YM|RUO)\b)(?!(?:\s+[-\w'\u2019]{1,40})?\s+(?:(?:TON|REVEN|TONNAC|TUOHTIW)\b|T['\u2019]N))/gi,
48
+ ];
49
+ export { REVERSED_INJECTION_PATTERNS };
@@ -1,6 +1,15 @@
1
1
  import { type RedactSpan } from '../observability/spans.js';
2
2
  declare const TYPO_TARGETS: string[];
3
3
  declare function typoNormalize(text: string): string;
4
+ /**
5
+ * `typoNormalize(text)`, and for an index in it the index of `text` it stands
6
+ * for. A corrected word may be a letter longer or shorter than the word as
7
+ * written, so an index past the written word stands for its last letter.
8
+ */
9
+ declare function typoFolded(text: string): {
10
+ text: string;
11
+ at: (index: number) => number;
12
+ };
4
13
  /** Blob patterns whose match is a hit only when the blob decodes to an injection. */
5
14
  declare const INJECTION_BLOBS: readonly {
6
15
  pattern: RegExp;
@@ -9,6 +18,13 @@ declare const INJECTION_BLOBS: readonly {
9
18
  declare function tryRot13(text: string): string;
10
19
  /** Each run of `%XX` escapes decoded on its own, so one stray `%` cannot switch decoding off. */
11
20
  declare function decodeUrlRuns(text: string): string;
21
+ declare const LEET_MAP: Record<string, string>;
12
22
  declare function tryLeet(text: string): string | undefined;
23
+ /**
24
+ * The spans of injection in the text, each stretch once. The text is read as
25
+ * written and in each rewrite of it: typo-folded, normalized, decoded, and its
26
+ * encoded blobs. A match in a rewrite is the stretch of the text as written it
27
+ * was read from, so text around a match stays.
28
+ */
13
29
  declare function injectionSpans(text: string): RedactSpan[];
14
- export { decodeUrlRuns, INJECTION_BLOBS, injectionSpans, TYPO_TARGETS, tryLeet, tryRot13, typoNormalize, };
30
+ export { decodeUrlRuns, INJECTION_BLOBS, injectionSpans, LEET_MAP, TYPO_TARGETS, tryLeet, tryRot13, typoFolded, typoNormalize, };