@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Build-time compiler for a host's patterns, behind `@theoremjs/agents/guardrails/compile`.
3
+ *
4
+ * The streaming hold reads each pattern as an automaton that accepts
5
+ * every match of it and more, so it can hold exactly the text a match could
6
+ * still be under way in. Building those automata takes a regex engine (refa)
7
+ * and time a Worker cold start cannot spare, so it runs here, at build time:
8
+ * `agents detect-compile` writes the tables, and `guardrails.detect` loads them.
9
+ *
10
+ * An automaton drops its pattern's assertions: a lookbehind, `\b`, `^`, and `$`
11
+ * match nothing, and a lookahead is skipped, with its text read after what
12
+ * precedes it wherever the match may end before that text does. A bounded
13
+ * repeat over `COUNT_LIMIT` is unbounded. An optional repeat of one character
14
+ * class that opens the pattern is left out and its class named in `leads`:
15
+ * the stream reads a match as starting where the run of that class it is in
16
+ * started. An inline modifier's flags are set on the whole pattern. Each
17
+ * change only widens what it accepts, so the hold can only hold more than it
18
+ * must. A backreference to text that varies has no automaton;
19
+ * compiling it fails.
20
+ *
21
+ * @module
22
+ */
23
+ import type { DetectSpec } from './detectors.js';
24
+ import { type AutomatonData, type CompiledPatterns, type HostPattern } from './host-patterns.js';
25
+ /**
26
+ * What makes `source` slow on hostile text, or `undefined`. A source that does not parse is
27
+ * not this check's to report: whatever reads it says so.
28
+ */
29
+ declare function slowPatternProblem(source: string, flags?: string): string | undefined;
30
+ /**
31
+ * The table a detector needs for the host's `patterns`: each checked, and their automaton. A
32
+ * pattern is refused when it does not compile, matches the empty text, is sticky, could hang
33
+ * or get slow on long text (`slowProblem`), or has no automaton the stream can hold by (a
34
+ * backreference to text that varies).
35
+ */
36
+ declare function compilePatterns(patterns: readonly HostPattern[]): CompiledPatterns;
37
+ /**
38
+ * `detect` with the table compiled for every detector's `patterns`, for a host that compiles as
39
+ * it starts in place of `agents detect-compile` at build time. A table already set is replaced.
40
+ */
41
+ declare function compileDetect<Spec extends DetectSpec>(detect: Spec): Spec;
42
+ /** The table for each detector `detect` gives patterns, by detector. */
43
+ declare function compileDetectTables(detect: DetectSpec): Record<string, CompiledPatterns>;
44
+ /** `tables` as a module exporting them as `compiledDetect`, each to set as its detector's `compiled`. */
45
+ declare function compiledDetectModule(tables: Record<string, CompiledPatterns>): string;
46
+ /**
47
+ * Everything `egress-automata.ts` holds, from the bundled patterns as they are
48
+ * now: the injection patterns reversed, and the forward and reversed automata.
49
+ */
50
+ declare function bundledEgressAutomata(): {
51
+ reversedPatterns: RegExp[];
52
+ forward: AutomatonData;
53
+ reversed: AutomatonData;
54
+ };
55
+ export { bundledEgressAutomata, compileDetect, compileDetectTables, compiledDetectModule, compilePatterns, slowPatternProblem, };
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Build-time compiler for a host's patterns, behind `@theoremjs/agents/guardrails/compile`.
3
+ *
4
+ * The streaming hold reads each pattern as an automaton that accepts
5
+ * every match of it and more, so it can hold exactly the text a match could
6
+ * still be under way in. Building those automata takes a regex engine (refa)
7
+ * and time a Worker cold start cannot spare, so it runs here, at build time:
8
+ * `agents detect-compile` writes the tables, and `guardrails.detect` loads them.
9
+ *
10
+ * An automaton drops its pattern's assertions: a lookbehind, `\b`, `^`, and `$`
11
+ * match nothing, and a lookahead is skipped, with its text read after what
12
+ * precedes it wherever the match may end before that text does. A bounded
13
+ * repeat over `COUNT_LIMIT` is unbounded. An optional repeat of one character
14
+ * class that opens the pattern is left out and its class named in `leads`:
15
+ * the stream reads a match as starting where the run of that class it is in
16
+ * started. An inline modifier's flags are set on the whole pattern. Each
17
+ * change only widens what it accepts, so the hold can only hold more than it
18
+ * must. A backreference to text that varies has no automaton;
19
+ * compiling it fails.
20
+ *
21
+ * @module
22
+ */
23
+ import { RegExpParser, visitRegExpAST } from '@eslint-community/regexpp';
24
+ import { JS, NFA } from 'refa';
25
+ import { analyse } from 'scslre';
26
+ import { EGRESS_PATTERNS } from './egress-patterns.js';
27
+ import { TheoremError } from './error.js';
28
+ import { MAX_PATTERNS, PATTERN_COMPILER_VERSION, patternProblem, patternSources, } from './host-patterns.js';
29
+ const MAX_CHAR = 0xffff;
30
+ /**
31
+ * A bounded repeat longer than this is read as unbounded: the hold cannot
32
+ * tell the bound is reached without counting, and holding on is the safe side.
33
+ */
34
+ const COUNT_LIMIT = 256;
35
+ /** The pattern read right to left: `P` on reversed text matches where this matches on the text. */
36
+ function reversed(alternatives) {
37
+ return alternatives.map((concat) => ({
38
+ type: 'Concatenation',
39
+ elements: concat.elements.map(reversedElement).reverse(),
40
+ }));
41
+ }
42
+ function reversedElement(element) {
43
+ switch (element.type) {
44
+ case 'Alternation':
45
+ case 'Quantifier':
46
+ return { ...element, alternatives: reversed(element.alternatives) };
47
+ case 'Assertion':
48
+ return {
49
+ ...element,
50
+ kind: element.kind === 'ahead' ? 'behind' : 'ahead',
51
+ alternatives: reversed(element.alternatives),
52
+ };
53
+ case 'CharacterClass':
54
+ return element;
55
+ default:
56
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
57
+ throw new Error(`cannot reverse a ${element.type} element`);
58
+ }
59
+ }
60
+ /**
61
+ * The pattern with its assertions loosened and a long bounded repeat
62
+ * unbounded. A lookbehind (and `\b`, `^`, `$`, which parse to lookarounds)
63
+ * matches the empty string. A lookahead:
64
+ *
65
+ * - no longer than what must follow it is skipped: the match has read its text;
66
+ * - with nothing after it is read or skipped;
67
+ * - otherwise is skipped, and what precedes it followed by its text is an
68
+ * alternative of the pattern (in `ends`), so the automaton is still under
69
+ * way, and then at a match, while the text that settles it arrives.
70
+ */
71
+ function loosened(alternatives, after, ends) {
72
+ return alternatives.map((concat) => {
73
+ const elements = [];
74
+ concat.elements.forEach((element, i) => {
75
+ const rest = lengthOf(concat.elements.slice(i + 1));
76
+ elements.push(...loosenedElement(element, { min: after.min + rest.min, max: after.max + rest.max }, ends && { before: [...ends.before, ...elements], out: ends.out }));
77
+ });
78
+ return { type: 'Concatenation', elements };
79
+ });
80
+ }
81
+ /** The fewest and the most characters a match of the elements, one after another, reads. */
82
+ function lengthOf(elements) {
83
+ let min = 0;
84
+ let max = 0;
85
+ for (const element of elements) {
86
+ if (element.type === 'Assertion')
87
+ continue;
88
+ if (element.type === 'CharacterClass') {
89
+ min++;
90
+ max++;
91
+ continue;
92
+ }
93
+ if (element.type === 'Unknown') {
94
+ max = Number.POSITIVE_INFINITY;
95
+ continue;
96
+ }
97
+ const each = element.alternatives.map((concat) => lengthOf(concat.elements));
98
+ const times = element.type === 'Quantifier' ? element : { min: 1, max: 1 };
99
+ const most = Math.max(...each.map((length) => length.max));
100
+ min += times.min * Math.min(...each.map((length) => length.min));
101
+ max += most === 0 ? 0 : times.max * most;
102
+ }
103
+ return { min, max };
104
+ }
105
+ /** `element` loosened, where `after` characters follow it in a match. */
106
+ function loosenedElement(element, after, ends) {
107
+ switch (element.type) {
108
+ case 'Alternation':
109
+ return [{ ...element, alternatives: loosened(element.alternatives, after, ends) }];
110
+ case 'Quantifier': {
111
+ const max = element.max > COUNT_LIMIT ? Number.POSITIVE_INFINITY : element.max;
112
+ const inside = max > 1 ? { min: after.min, max: Number.POSITIVE_INFINITY } : after;
113
+ const repeat = { ...element, max, alternatives: loosened(element.alternatives, inside) };
114
+ if (ends) {
115
+ const earlier = { ...repeat, min: 0, max: Number.POSITIVE_INFINITY };
116
+ loosened(element.alternatives, inside, {
117
+ before: max > 1 ? [...ends.before, earlier] : ends.before,
118
+ out: ends.out,
119
+ });
120
+ }
121
+ return [repeat];
122
+ }
123
+ case 'Assertion': {
124
+ if (element.kind === 'behind')
125
+ return [];
126
+ const text = loosened(element.alternatives, { min: 0, max: 0 }, ends);
127
+ const { max } = lengthOf([{ type: 'Alternation', alternatives: text }]);
128
+ if (max <= after.min)
129
+ return [];
130
+ const read = { type: 'Alternation', alternatives: text };
131
+ if (after.max > 0) {
132
+ ends?.out.push({ type: 'Concatenation', elements: [...ends.before, read] });
133
+ return [];
134
+ }
135
+ return [
136
+ {
137
+ type: 'Alternation',
138
+ alternatives: [{ type: 'Concatenation', elements: [] }, ...text],
139
+ },
140
+ ];
141
+ }
142
+ case 'CharacterClass':
143
+ return [element];
144
+ default:
145
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
146
+ throw new Error(`cannot loosen a ${element.type} element`);
147
+ }
148
+ }
149
+ /**
150
+ * `literal` as current JavaScript reads it: refa's own parser stops at ES2024,
151
+ * and refa ignores an inline modifier group, so its flags go on the pattern.
152
+ */
153
+ function literalAst(literal) {
154
+ const ast = new RegExpParser().parseLiteral(literal);
155
+ visitRegExpAST(ast, {
156
+ onModifiersEnter({ add }) {
157
+ ast.flags.ignoreCase ||= add.ignoreCase;
158
+ ast.flags.dotAll ||= add.dotAll;
159
+ ast.flags.multiline ||= add.multiline;
160
+ },
161
+ });
162
+ return ast;
163
+ }
164
+ /**
165
+ * The pattern over UTF-16 code units. A `u` or `v` pattern reads code points;
166
+ * it is rewritten to the equivalent pattern on the units that spell them.
167
+ */
168
+ function parsed(pattern) {
169
+ const ast = literalAst(String(pattern));
170
+ const { expression } = JS.Parser.fromAst(ast).parse({ assertions: 'parse' });
171
+ if (!ast.flags.unicode && !ast.flags.unicodeSets) {
172
+ return expression.alternatives;
173
+ }
174
+ const units = JS.toLiteral(expression, { flags: { unicode: false, unicodeSets: false } });
175
+ return JS.Parser.fromLiteral(units).parse({ assertions: 'parse' }).expression.alternatives;
176
+ }
177
+ /**
178
+ * The pattern's source spelled so no lint rule has anything to say about it: `[\s\S]` for any
179
+ * character (not `[^]`) and `\v` for the vertical tab (not `\x0b`). Each pair matches the same text.
180
+ */
181
+ function plainSource(source) {
182
+ let out = '';
183
+ let inClass = false;
184
+ for (let i = 0; i < source.length; i++) {
185
+ const char = source[i];
186
+ if (char === '\\') {
187
+ const next = source.slice(i, i + 4);
188
+ if (next === '\\x0b') {
189
+ out += '\\v';
190
+ i += 3;
191
+ }
192
+ else {
193
+ out += source.slice(i, i + 2);
194
+ i++;
195
+ }
196
+ }
197
+ else if (!inClass && source.startsWith('[^]', i)) {
198
+ out += '[\\s\\S]';
199
+ i += 2;
200
+ }
201
+ else {
202
+ if (char === '[')
203
+ inClass = true;
204
+ else if (char === ']')
205
+ inClass = false;
206
+ out += char;
207
+ }
208
+ }
209
+ return out;
210
+ }
211
+ /** A regex literal for the reversed pattern, with the original's flags. */
212
+ function reversedLiteral(pattern) {
213
+ const literal = JS.toLiteral(reversed(parsed(pattern)), {
214
+ flags: { global: true, unicode: false, sticky: false },
215
+ });
216
+ return new RegExp(plainSource(literal.source), literal.flags);
217
+ }
218
+ /**
219
+ * The pattern split at an optional repeat of one character class that opens
220
+ * it: the class, and the rest. Counted in the automaton, the repeat would keep
221
+ * a state per repeat alive at every character of a run of the class.
222
+ */
223
+ function led(alternatives) {
224
+ const [concat] = alternatives;
225
+ if (alternatives.length !== 1 || !concat)
226
+ return { rest: alternatives };
227
+ const [first, ...after] = concat.elements;
228
+ if (first?.type === 'Alternation' && first.alternatives.length === 1) {
229
+ const [inner] = first.alternatives;
230
+ return led([{ type: 'Concatenation', elements: [...(inner?.elements ?? []), ...after] }]);
231
+ }
232
+ if (first?.type !== 'Quantifier' || first.min !== 0 || first.max < 2) {
233
+ return { rest: alternatives };
234
+ }
235
+ const [repeated] = first.alternatives;
236
+ const [only] = repeated?.elements ?? [];
237
+ if (first.alternatives.length !== 1 || repeated?.elements.length !== 1) {
238
+ return { rest: alternatives };
239
+ }
240
+ return only?.type === 'CharacterClass'
241
+ ? { lead: only.characters, rest: [{ type: 'Concatenation', elements: after }] }
242
+ : { rest: alternatives };
243
+ }
244
+ function nfaOf(alternatives) {
245
+ const ends = [];
246
+ const whole = [...loosened(alternatives, { min: 0, max: 0 }, { before: [], out: ends }), ...ends];
247
+ const { lead, rest } = led(whole);
248
+ const build = (from) => {
249
+ const nfa = NFA.fromRegex(from, { maxCharacter: MAX_CHAR });
250
+ nfa.removeUnreachable();
251
+ return { initial: nfa.initial, nodes: [...nfa.nodes()], finals: nfa.finals };
252
+ };
253
+ const nfa = build(rest);
254
+ if (!lead)
255
+ return nfa;
256
+ return nfa.finals.has(nfa.initial) ? build(whole) : { ...nfa, lead };
257
+ }
258
+ /** The union of the patterns' automata as tables, nodes tagged with their pattern. */
259
+ function automatonData(patterns) {
260
+ const nfas = patterns.map(nfaOf);
261
+ const bounds = new Set([0]);
262
+ for (const nfa of nfas) {
263
+ const sets = nfa.nodes.flatMap((node) => [...node.out.values()]);
264
+ for (const set of nfa.lead ? [...sets, nfa.lead] : sets) {
265
+ for (const range of set.ranges) {
266
+ bounds.add(range.min);
267
+ if (range.max < MAX_CHAR)
268
+ bounds.add(range.max + 1);
269
+ }
270
+ }
271
+ }
272
+ const classStarts = [...bounds].sort((a, b) => a - b);
273
+ const classOf = (code) => {
274
+ let lo = 0;
275
+ let hi = classStarts.length - 1;
276
+ while (lo < hi) {
277
+ const mid = (lo + hi + 1) >> 1;
278
+ if (classStarts[mid] <= code)
279
+ lo = mid;
280
+ else
281
+ hi = mid - 1;
282
+ }
283
+ return lo;
284
+ };
285
+ const charsets = [];
286
+ const charsetIds = new Map();
287
+ const charsetId = (ranges) => {
288
+ const classes = [];
289
+ for (const { min, max } of ranges) {
290
+ for (let k = classOf(min); k < classStarts.length && classStarts[k] <= max; k++) {
291
+ classes.push(k);
292
+ }
293
+ }
294
+ const key = classes.join(',');
295
+ let id = charsetIds.get(key);
296
+ if (id === undefined) {
297
+ id = charsets.length;
298
+ charsets.push(classes);
299
+ charsetIds.set(key, id);
300
+ }
301
+ return id;
302
+ };
303
+ const nodes = [];
304
+ const initials = [];
305
+ nfas.forEach((nfa, pattern) => {
306
+ const ids = new Map();
307
+ for (const node of nfa.nodes)
308
+ ids.set(node, nodes.length + ids.size);
309
+ initials.push(ids.get(nfa.initial));
310
+ for (const node of nfa.nodes) {
311
+ const row = [pattern, nfa.finals.has(node) ? 1 : 0];
312
+ for (const [to, set] of node.out)
313
+ row.push(ids.get(to), charsetId(set.ranges));
314
+ nodes.push(row);
315
+ }
316
+ });
317
+ const leads = nfas.map(({ lead }) => (lead ? charsetId(lead.ranges) : -1));
318
+ return { classStarts, charsets, initials, leads, nodes };
319
+ }
320
+ function patternError(message) {
321
+ return new TheoremError('config', `compilePatterns: ${message}`);
322
+ }
323
+ /**
324
+ * Why `pattern` could take far longer than the text is long, or `undefined`: a repeat that
325
+ * matches the same text in more than one way, or one the engine reads again from every position.
326
+ */
327
+ function slowProblem(pattern) {
328
+ const [report] = analyse(pattern, { maxReports: 1 }).reports;
329
+ if (!report)
330
+ return undefined;
331
+ const repeat = report.type === 'Trade' ? report.startQuant.raw : report.quant.raw;
332
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
333
+ return report.type === 'Move'
334
+ ? `gets slow on long text: its time grows with the square of the text. Bound the repeat ${repeat} ({1,64} in place of + or *)`
335
+ : `can hang on text that nearly matches: the repeat ${repeat} matches the same text in more than one way. Bound it ({1,64} in place of + or *) or make its parts unable to overlap`;
336
+ }
337
+ /**
338
+ * What makes `source` slow on hostile text, or `undefined`. A source that does not parse is
339
+ * not this check's to report: whatever reads it says so.
340
+ */
341
+ function slowPatternProblem(source, flags = '') {
342
+ let regex;
343
+ try {
344
+ regex = new RegExp(source, flags);
345
+ }
346
+ catch {
347
+ return undefined;
348
+ }
349
+ return slowProblem(regex);
350
+ }
351
+ /**
352
+ * The table a detector needs for the host's `patterns`: each checked, and their automaton. A
353
+ * pattern is refused when it does not compile, matches the empty text, is sticky, could hang
354
+ * or get slow on long text (`slowProblem`), or has no automaton the stream can hold by (a
355
+ * backreference to text that varies).
356
+ */
357
+ function compilePatterns(patterns) {
358
+ if (patterns.length > MAX_PATTERNS) {
359
+ throw patternError(`${patterns.length} patterns; a detector takes at most ${MAX_PATTERNS}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
360
+ }
361
+ patterns.forEach((pattern, index) => {
362
+ const problem = patternProblem(`patterns[${index}]`, pattern);
363
+ if (problem !== undefined)
364
+ throw patternError(problem);
365
+ });
366
+ const sources = patternSources(patterns);
367
+ const alternatives = sources.map(({ name, source, flags }) => {
368
+ const slow = slowProblem(new RegExp(source, flags));
369
+ if (slow !== undefined)
370
+ throw patternError(`${name}: /${source}/${flags} ${slow}`);
371
+ try {
372
+ const units = parsed(new RegExp(source, flags));
373
+ nfaOf(units);
374
+ return units;
375
+ }
376
+ catch (err) {
377
+ throw patternError(`${name}: /${source}/${flags} has no automaton the stream can hold for (${err instanceof Error ? err.message : String(err)})`);
378
+ }
379
+ });
380
+ return {
381
+ compiler: PATTERN_COMPILER_VERSION,
382
+ patterns: sources,
383
+ automaton: automatonData(alternatives),
384
+ };
385
+ }
386
+ /**
387
+ * `detect` with the table compiled for every detector's `patterns`, for a host that compiles as
388
+ * it starts in place of `agents detect-compile` at build time. A table already set is replaced.
389
+ */
390
+ function compileDetect(detect) {
391
+ if (typeof detect === 'string')
392
+ return detect;
393
+ const tables = compileDetectTables(detect);
394
+ const rules = Object.entries(detect).map(([detector, rule]) => {
395
+ const compiled = tables[detector];
396
+ return [detector, compiled && typeof rule !== 'string' ? { ...rule, compiled } : rule];
397
+ });
398
+ return Object.fromEntries(rules);
399
+ }
400
+ /** The table for each detector `detect` gives patterns, by detector. */
401
+ function compileDetectTables(detect) {
402
+ if (typeof detect === 'string')
403
+ return {};
404
+ const tables = {};
405
+ for (const [detector, rule] of Object.entries(detect)) {
406
+ if (typeof rule === 'string' || !rule.patterns?.length)
407
+ continue;
408
+ tables[detector] = compilePatterns(rule.patterns);
409
+ }
410
+ return tables;
411
+ }
412
+ /** `tables` as a module exporting them as `compiledDetect`, each to set as its detector's `compiled`. */
413
+ function compiledDetectModule(tables) {
414
+ // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
415
+ return `// Generated by \`agents detect-compile\`. Do not edit: change the patterns and compile again.
416
+ export const compiledDetect = ${JSON.stringify(tables)};
417
+ `;
418
+ }
419
+ /**
420
+ * Everything `egress-automata.ts` holds, from the bundled patterns as they are
421
+ * now: the injection patterns reversed, and the forward and reversed automata.
422
+ */
423
+ function bundledEgressAutomata() {
424
+ const injection = EGRESS_PATTERNS.filter((entry) => entry.kind === 'injection');
425
+ return {
426
+ reversedPatterns: injection.map(({ pattern }) => reversedLiteral(pattern)),
427
+ forward: automatonData(EGRESS_PATTERNS.map(({ pattern }) => parsed(pattern))),
428
+ reversed: automatonData(injection.map(({ pattern }) => reversed(parsed(pattern)))),
429
+ };
430
+ }
431
+ export { bundledEgressAutomata, compileDetect, compileDetectTables, compiledDetectModule, compilePatterns, slowPatternProblem, };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Every pattern the bundled egress policy matches on the reply, in the order
3
+ * the streaming hold's automata number them (`egress-automata.ts`, generated
4
+ * from this list by `scripts/gen-egress-automata.ts`).
5
+ *
6
+ * @module
7
+ */
8
+ import type { SensitiveGroup } from './sensitive-groups.js';
9
+ declare const SYSTEM_BOUNDARY: RegExp;
10
+ /** What a match of the pattern means: the rule it trips, or the blob its filter decodes. */
11
+ type EgressPatternKind = 'injection' | 'sensitive' | 'card' | 'boundary' | 'base64' | 'hex' | 'spaced' | 'pipe' | 'image' | 'link';
12
+ interface EgressPattern {
13
+ kind: EgressPatternKind;
14
+ pattern: RegExp;
15
+ /** The sensitive-data group a `sensitive` or `card` pattern belongs to. */
16
+ group?: SensitiveGroup;
17
+ }
18
+ /**
19
+ * Patterns matched on the reply as written. The injection patterns come first:
20
+ * the rewritten views (typo, Unicode, rot13, leet, URL) match those alone.
21
+ */
22
+ declare const EGRESS_PATTERNS: readonly EgressPattern[];
23
+ /** A reply repeating `note`, a canary note's own words (`canaryNoteMarker`), as written, case aside. */
24
+ declare function notePattern(note: string): RegExp;
25
+ export type { EgressPattern, EgressPatternKind };
26
+ export { EGRESS_PATTERNS, notePattern, SYSTEM_BOUNDARY };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Every pattern the bundled egress policy matches on the reply, in the order
3
+ * the streaming hold's automata number them (`egress-automata.ts`, generated
4
+ * from this list by `scripts/gen-egress-automata.ts`).
5
+ *
6
+ * @module
7
+ */
8
+ import { IMAGE_PATTERNS, LINK_PATTERNS } from './egress-urls.js';
9
+ import { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, PIPE_SEPARATED, SPACED_LETTERS, } from './injection-patterns.js';
10
+ import { CARD_CANDIDATE, SENSITIVE_PATTERNS } from './sensitive.js';
11
+ const SYSTEM_BOUNDARY = /This turn\x27s canary is|Your canary token is|<\s*(?:\/\s*)?user_data(?:\s*(?:\/\s*)?>)?/i; // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
12
+ /**
13
+ * Patterns matched on the reply as written. The injection patterns come first:
14
+ * the rewritten views (typo, Unicode, rot13, leet, URL) match those alone.
15
+ */
16
+ const EGRESS_PATTERNS = [
17
+ ...INJECTION_PATTERNS.map((pattern) => ({ kind: 'injection', pattern })),
18
+ ...SENSITIVE_PATTERNS.map(({ group, pattern }) => ({
19
+ kind: 'sensitive',
20
+ pattern,
21
+ group,
22
+ })),
23
+ { kind: 'card', pattern: CARD_CANDIDATE, group: 'financial' },
24
+ { kind: 'boundary', pattern: new RegExp(SYSTEM_BOUNDARY.source, 'gi') },
25
+ { kind: 'base64', pattern: BASE64_BLOB },
26
+ { kind: 'hex', pattern: HEX_BLOB },
27
+ { kind: 'spaced', pattern: SPACED_LETTERS },
28
+ { kind: 'pipe', pattern: PIPE_SEPARATED },
29
+ ...IMAGE_PATTERNS.map((pattern) => ({ kind: 'image', pattern })),
30
+ ...LINK_PATTERNS.map((pattern) => ({ kind: 'link', pattern })),
31
+ ];
32
+ /** A reply repeating `note`, a canary note's own words (`canaryNoteMarker`), as written, case aside. */
33
+ function notePattern(note) {
34
+ return new RegExp(note.replace(/[\\^$.*+?()[\]{}|/-]/g, '\\$&'), 'gi');
35
+ }
36
+ export { EGRESS_PATTERNS, notePattern, SYSTEM_BOUNDARY };
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The detectors, Theorem's and the host's own, run on a reply as it streams.
3
+ *
4
+ * Each matches its patterns on the reply as written and, for
5
+ * injection phrasing, on
6
+ * rewrites of it (typo-folded, Unicode-folded, rot13, leet, URL-decoded, read
7
+ * backwards). The stream keeps each rewrite growing with the reply and, for
8
+ * every pattern, an automaton accepting every match of it and more
9
+ * (`egress-automata.ts`). Text is held from the earliest place any match could
10
+ * still be under way in any rewrite, and nowhere else: a match that completes
11
+ * later starts at or after that place, so none of it has been released.
12
+ *
13
+ * A match whose outcome no later text can change is settled; a settled match
14
+ * of the pattern itself (not the automaton) is a hit, and does what
15
+ * `guardrails.detect` sets (`detect-stream.ts`). Each character is read a bounded number of times, so a
16
+ * long reply costs time in proportion to its length.
17
+ *
18
+ * @module
19
+ */
20
+ import type { Detector, ResolvedAllow } from './detectors.js';
21
+ import { type GivenUrls } from './egress-urls.js';
22
+ import type { CompiledPatterns, HostMatcher } from './host-patterns.js';
23
+ import { type OwnTools } from './tool-leak.js';
24
+ import type { Severity } from './types.js';
25
+ /** A settled match. */
26
+ interface EgressStreamHit {
27
+ rule: string;
28
+ severity: Severity;
29
+ /** Where in the reply the match starts (the start of its rewrite's source). */
30
+ start: number;
31
+ /** The detector whose match it is, or the id of the host's own. */
32
+ detector: string;
33
+ }
34
+ interface EgressStream {
35
+ /**
36
+ * Read the next piece of the reply; the matches that settled, none when the reply is clear so
37
+ * far.
38
+ */
39
+ push: (chunk: string) => EgressStreamHit[];
40
+ /** The earliest index of the reply a match could still start at. */
41
+ holdFrom: () => number;
42
+ }
43
+ /**
44
+ * Reads Theorem's automata, the most of the kernel's size, the first time a stream needs them.
45
+ * Every gate's constructor waits for this, so an app that never streams a reply never loads them.
46
+ */
47
+ declare function loadEgressAutomata(): Promise<void>;
48
+ /**
49
+ * Text grown at its end, with what its latest update added. Reading a grown
50
+ * string copies the whole of it, so what reads each new character reads it
51
+ * from `fresh`.
52
+ */
53
+ interface Grown {
54
+ text: string;
55
+ fresh: string;
56
+ }
57
+ /**
58
+ * A rewrite of the reply, grown as the reply is: its settled text (no later
59
+ * reply text changes it) and, per settled character, the reply index a match
60
+ * starting there must be held from.
61
+ */
62
+ interface View extends Grown {
63
+ /** Reply index to hold from for a match starting at view index `j`. */
64
+ rawAt: (j: number) => number;
65
+ /** Take whatever the source has settled since the last call. */
66
+ update: () => void;
67
+ }
68
+ /**
69
+ * `typoNormalize` of the source. It rewrites whole words (`\w` runs), so a
70
+ * word settles when a non-word character ends it, or as soon as it can no
71
+ * longer fold to a target (then the rest of it passes as is). A corrected word
72
+ * may be a letter longer or shorter than the word as written, so each
73
+ * character keeps the source index it stands for.
74
+ */
75
+ declare function typoView(source: View): View;
76
+ /** A rewrite whose characters keep their own reply index. */
77
+ interface MappedView extends View {
78
+ from: number[];
79
+ }
80
+ /**
81
+ * `normalizeForDetection` of the reply, in its three passes: each code point
82
+ * mapped, emoji runs between letters dropped, a backslash before a letter
83
+ * dropped. Unsettled: a high surrogate whose low half may follow (in the reply
84
+ * or in the mapped text), an emoji run after a letter until the character
85
+ * after it, a backslash until the character after it.
86
+ */
87
+ declare function normalizedReplyView(reply: Grown): MappedView;
88
+ /**
89
+ * `decodeUrlRuns` of the reply: a run of `%XX` escapes is unsettled until the
90
+ * character after it shows the run is over. Its decoded text holds from the
91
+ * run's first `%`.
92
+ */
93
+ declare function urlView(reply: Grown): MappedView;
94
+ interface EgressStreamOptions {
95
+ /** The detectors whose matches the stream settles. Default none. */
96
+ detect?: readonly Detector[];
97
+ /** What `ungiven_images` and `ungiven_links` let through besides the given URLs. */
98
+ allow?: ResolvedAllow;
99
+ /**
100
+ * Whether `ungiven_links` leaves an image's own markup alone. Default: `ungiven_images` is
101
+ * among `detect`. Set when another reader has the images.
102
+ */
103
+ skipImages?: boolean;
104
+ /**
105
+ * The host's own patterns, read on the text as written, with their compiled table: those it
106
+ * adds to a detector, or those of a detector of its own, named by its id.
107
+ */
108
+ own?: readonly {
109
+ detector: string;
110
+ compiled: CompiledPatterns;
111
+ matchers: readonly HostMatcher[];
112
+ }[];
113
+ /** The URLs the model was given, for `ungiven_images` and `ungiven_links`. */
114
+ given?: GivenUrls;
115
+ /** The words of the profile's own canary note, for `marker_leak` (`boundaryNote`). */
116
+ note?: string;
117
+ /** The names of the profile's tools and of their parameters, for `tool_leak`. */
118
+ tools?: OwnTools;
119
+ }
120
+ /** Scans the detectors' patterns, Theorem's and the host's own, as a reply streams. */
121
+ declare function createEgressStream(options?: EgressStreamOptions): EgressStream;
122
+ export type { EgressStream, EgressStreamHit, EgressStreamOptions, Grown, MappedView, View };
123
+ export { createEgressStream, loadEgressAutomata, normalizedReplyView, typoView, urlView };