@theoremjs/agents 0.0.0-stage → 0.3.0

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 (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -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 +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -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 +202 -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 +25 -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 +72 -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 +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -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 +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -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 +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,645 @@
1
+ /**
2
+ * The bundled egress policy, run on a reply as it streams.
3
+ *
4
+ * The bundled checks match their 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 the reply is
15
+ * blocked there. Each character is read a bounded number of times, so a long
16
+ * reply costs time in proportion to its length.
17
+ *
18
+ * @module
19
+ */
20
+ import { DEFAULT_CHECKS, standardEgressEnforce } from './egress.js';
21
+ import { FORWARD_AUTOMATON, REVERSED_AUTOMATON, REVERSED_INJECTION_PATTERNS, } from './egress-automata.js';
22
+ import { EGRESS_PATTERNS } from './egress-patterns.js';
23
+ import { globalPattern } from './egress-rules.js';
24
+ import { IMAGE_PATTERNS, imageReadings, LINK_PATTERNS, linkReadings, } from './egress-urls.js';
25
+ import { decodeUrlRuns, INJECTION_BLOBS, TYPO_TARGETS, tryLeet, tryRot13, typoNormalize, } from './injection.js';
26
+ import { isEmoji, normalizeCodePoint } from './normalize.js';
27
+ import { EGRESS_RULES } from './rules.js';
28
+ import { cardHit } from './sensitive.js';
29
+ const UNITS = 0x10000;
30
+ function compile(data) {
31
+ const classCount = data.classStarts.length;
32
+ const classOf = new Uint16Array(UNITS);
33
+ for (let k = 0; k < classCount; k++) {
34
+ classOf.fill(k, data.classStarts[k], data.classStarts[k + 1] ?? UNITS);
35
+ }
36
+ const has = data.charsets.map((classes) => {
37
+ const row = new Uint8Array(classCount);
38
+ for (const k of classes)
39
+ row[k] = 1;
40
+ return row;
41
+ });
42
+ const size = data.nodes.length;
43
+ const pattern = new Int32Array(size);
44
+ const final = new Uint8Array(size);
45
+ const edges = [];
46
+ data.nodes.forEach((node, id) => {
47
+ pattern[id] = node[0];
48
+ final[id] = node[1];
49
+ edges.push(Int32Array.from(node.slice(2)));
50
+ });
51
+ return { classOf, has, pattern, final, edges, initials: data.initials, size };
52
+ }
53
+ let forward;
54
+ let backward;
55
+ /** The first edges of the given patterns, per character class. */
56
+ function startEdges(automaton, patterns) {
57
+ const classCount = automaton.has[0]?.length ?? 0;
58
+ const byClass = Array.from({ length: classCount }, () => []);
59
+ for (const p of patterns) {
60
+ const e = automaton.edges[automaton.initials[p]];
61
+ for (let i = 0; i < e.length; i += 2) {
62
+ const set = automaton.has[e[i + 1]];
63
+ for (let k = 0; k < classCount; k++)
64
+ if (set[k])
65
+ byClass[k]?.push(e[i]);
66
+ }
67
+ }
68
+ return byClass.map((targets) => Int32Array.from(targets));
69
+ }
70
+ function grow(target, piece) {
71
+ target.text += piece;
72
+ target.fresh += piece;
73
+ }
74
+ /** Where `fresh` starts in `text`. */
75
+ function freshFrom(source) {
76
+ return source.text.length - source.fresh.length;
77
+ }
78
+ function unitAt(source, at) {
79
+ const base = freshFrom(source);
80
+ return at >= base ? source.fresh.charCodeAt(at - base) : source.text.charCodeAt(at);
81
+ }
82
+ function sliceOf(source, from, to = source.text.length) {
83
+ const base = freshFrom(source);
84
+ return from >= base ? source.fresh.slice(from - base, to - base) : source.text.slice(from, to);
85
+ }
86
+ /** The reply itself. */
87
+ function rawView(reply) {
88
+ const view = {
89
+ text: '',
90
+ fresh: '',
91
+ rawAt: (j) => j,
92
+ update() {
93
+ view.text = reply.text;
94
+ view.fresh = reply.fresh;
95
+ },
96
+ };
97
+ return view;
98
+ }
99
+ /** A rewrite of each UTF-16 unit on its own (rot13, leet): settled as soon as read. */
100
+ function unitView(source, rewrite) {
101
+ const view = {
102
+ text: '',
103
+ fresh: '',
104
+ rawAt: source.rawAt,
105
+ update() {
106
+ view.fresh = '';
107
+ grow(view, rewrite(sliceOf(source, view.text.length)));
108
+ },
109
+ };
110
+ return view;
111
+ }
112
+ const WORD_UNIT = /\w/;
113
+ const MAX_TARGET = Math.max(...TYPO_TARGETS.map((target) => target.length));
114
+ const TARGET_FIRSTS = new Set(TYPO_TARGETS.map((target) => target[0]));
115
+ /** Whether a word still being written could yet fold to a typo target. */
116
+ function mayFold(run) {
117
+ return (run.length <= MAX_TARGET &&
118
+ /^[A-Za-z]*$/.test(run) &&
119
+ (run.length === 0 || TARGET_FIRSTS.has(run[0]?.toLowerCase())));
120
+ }
121
+ /**
122
+ * `typoNormalize` of the source. It rewrites whole words (`\w` runs) of the
123
+ * same length, so a word settles when a non-word character ends it, or as soon
124
+ * as it can no longer fold to a target (then the rest of it passes as is).
125
+ */
126
+ function typoView(source) {
127
+ let read = 0;
128
+ /** The word being read, while it may still fold. */
129
+ let word;
130
+ let inWord = false;
131
+ const view = {
132
+ text: '',
133
+ fresh: '',
134
+ rawAt: (j) => source.rawAt(Math.min(j, view.text.length)),
135
+ update() {
136
+ view.fresh = '';
137
+ for (const end = source.text.length; read < end; read++) {
138
+ const unit = String.fromCharCode(unitAt(source, read));
139
+ const wordUnit = WORD_UNIT.test(unit);
140
+ if (wordUnit && !inWord)
141
+ word = '';
142
+ inWord = wordUnit;
143
+ if (!wordUnit) {
144
+ if (word !== undefined)
145
+ grow(view, typoNormalize(word));
146
+ word = undefined;
147
+ grow(view, unit);
148
+ }
149
+ else if (word === undefined)
150
+ grow(view, unit);
151
+ else
152
+ word += unit;
153
+ }
154
+ if (word !== undefined && !mayFold(word)) {
155
+ grow(view, word);
156
+ word = undefined;
157
+ }
158
+ },
159
+ };
160
+ return view;
161
+ }
162
+ function mappedView(pendingAt) {
163
+ const view = {
164
+ text: '',
165
+ fresh: '',
166
+ from: [],
167
+ rawAt: (j) => (j < view.from.length ? view.from[j] : pendingAt()),
168
+ update() { },
169
+ };
170
+ return view;
171
+ }
172
+ function append(view, text, from) {
173
+ grow(view, text);
174
+ for (let i = 0; i < text.length; i++)
175
+ view.from.push(from);
176
+ }
177
+ const HIGH_LO = 0xd800;
178
+ const HIGH_HI = 0xdbff;
179
+ const ASCII_LETTER = /[A-Za-z]/;
180
+ const LOW_LO = 0xdc00;
181
+ const LOW_HI = 0xdfff;
182
+ /**
183
+ * `normalizeForDetection` of the reply, in its three passes: each code point
184
+ * mapped, emoji runs between letters dropped, a backslash before a letter
185
+ * dropped. Unsettled: a high surrogate whose low half may follow (in the reply
186
+ * or in the mapped text), an emoji run after a letter until the character
187
+ * after it, a backslash until the character after it.
188
+ */
189
+ function normalizedView(reply) {
190
+ let read = 0;
191
+ /** Mapped text the emoji pass has not read: at most a trailing high surrogate. */
192
+ let mapped = '';
193
+ let mappedFrom = [];
194
+ /** The emoji run after a letter, waiting on the character after it. */
195
+ let run = '';
196
+ let runFrom = [];
197
+ let afterLetter = false;
198
+ /** A backslash waiting on the character after it: its reply index, or -1. */
199
+ let slashFrom = -1;
200
+ const pendingAt = () => Math.min(read, mappedFrom[0] ?? read, runFrom[0] ?? read, slashFrom < 0 ? read : slashFrom);
201
+ const view = mappedView(pendingAt);
202
+ function backslashPass(unit, from) {
203
+ if (slashFrom >= 0) {
204
+ if (!ASCII_LETTER.test(unit))
205
+ append(view, '\\', slashFrom);
206
+ slashFrom = -1;
207
+ }
208
+ if (unit === '\\')
209
+ slashFrom = from;
210
+ else
211
+ append(view, unit, from);
212
+ }
213
+ function emojiPass(point, from) {
214
+ if (isEmoji(point) && (afterLetter || run)) {
215
+ run += point;
216
+ for (let i = 0; i < point.length; i++)
217
+ runFrom.push(from);
218
+ return;
219
+ }
220
+ if (run) {
221
+ if (!ASCII_LETTER.test(point)) {
222
+ for (let i = 0; i < run.length; i++)
223
+ backslashPass(run[i], runFrom[i]);
224
+ }
225
+ run = '';
226
+ runFrom = [];
227
+ }
228
+ for (let i = 0; i < point.length; i++)
229
+ backslashPass(point[i], from);
230
+ afterLetter = ASCII_LETTER.test(point) && point.length === 1;
231
+ }
232
+ /** Feed the mapped text to the emoji pass by code point, keeping a high surrogate at the end. */
233
+ function drainMapped() {
234
+ let i = 0;
235
+ while (i < mapped.length) {
236
+ const code = mapped.charCodeAt(i);
237
+ const high = code >= HIGH_LO && code <= HIGH_HI;
238
+ if (high && i + 1 >= mapped.length)
239
+ break;
240
+ const low = mapped.charCodeAt(i + 1);
241
+ const width = high && low >= LOW_LO && low <= LOW_HI ? 2 : 1;
242
+ emojiPass(mapped.slice(i, i + width), mappedFrom[i]);
243
+ i += width;
244
+ }
245
+ mapped = mapped.slice(i);
246
+ mappedFrom = mappedFrom.slice(i);
247
+ }
248
+ view.update = () => {
249
+ view.fresh = '';
250
+ const end = reply.text.length;
251
+ while (read < end) {
252
+ const code = unitAt(reply, read);
253
+ const high = code >= HIGH_LO && code <= HIGH_HI;
254
+ if (high && read + 1 >= end)
255
+ break;
256
+ const low = unitAt(reply, read + 1);
257
+ const width = high && low >= LOW_LO && low <= LOW_HI ? 2 : 1;
258
+ const out = normalizeCodePoint(sliceOf(reply, read, read + width));
259
+ mapped += out;
260
+ for (let i = 0; i < out.length; i++)
261
+ mappedFrom.push(read);
262
+ read += width;
263
+ }
264
+ drainMapped();
265
+ };
266
+ return view;
267
+ }
268
+ const URL_HEX = /[0-9A-Fa-f]/;
269
+ /**
270
+ * `decodeUrlRuns` of the reply: a run of `%XX` escapes is unsettled until the
271
+ * character after it shows the run is over. Its decoded text holds from the
272
+ * run's first `%`.
273
+ */
274
+ function urlView(reply) {
275
+ let read = 0;
276
+ /** Where the escape run being read starts, or -1. */
277
+ let runStart = -1;
278
+ const view = mappedView(() => (runStart < 0 ? read : runStart));
279
+ view.update = () => {
280
+ view.fresh = '';
281
+ const end = reply.text.length;
282
+ while (read < end) {
283
+ const unit = String.fromCharCode(unitAt(reply, read));
284
+ if (runStart < 0) {
285
+ if (unit === '%') {
286
+ runStart = read;
287
+ }
288
+ else {
289
+ append(view, unit, read);
290
+ read++;
291
+ }
292
+ continue;
293
+ }
294
+ // Inside a run: complete escapes end at runStart + 3k.
295
+ const offset = (read - runStart) % 3;
296
+ const fits = offset === 0 ? unit === '%' : URL_HEX.test(unit);
297
+ if (fits) {
298
+ read++;
299
+ continue;
300
+ }
301
+ endRun(read - offset);
302
+ // The broken escape's text is literal; `read` rereads from its end.
303
+ for (let i = read - offset; i < read; i++)
304
+ append(view, String.fromCharCode(unitAt(reply, i)), i);
305
+ }
306
+ };
307
+ function endRun(end) {
308
+ if (end > runStart)
309
+ append(view, decodeUrlRuns(sliceOf(reply, runStart, end)), runStart);
310
+ runStart = -1;
311
+ }
312
+ return view;
313
+ }
314
+ const BLOB_HITS = new Map(INJECTION_BLOBS.map(({ pattern, hit }) => [pattern, hit]));
315
+ /** The bundled rule a pattern kind trips, with `collectEgressHits`' severity. */
316
+ const KIND_RULES = {
317
+ injection: { rule: EGRESS_RULES.injection, severity: 'medium' },
318
+ base64: { rule: EGRESS_RULES.injection, severity: 'medium' },
319
+ hex: { rule: EGRESS_RULES.injection, severity: 'medium' },
320
+ spaced: { rule: EGRESS_RULES.injection, severity: 'medium' },
321
+ pipe: { rule: EGRESS_RULES.injection, severity: 'medium' },
322
+ sensitive: { rule: EGRESS_RULES.sensitive, severity: 'high' },
323
+ card: { rule: EGRESS_RULES.sensitive, severity: 'high' },
324
+ boundary: { rule: EGRESS_RULES.boundary, severity: 'medium' },
325
+ image: { rule: EGRESS_RULES.image, severity: 'high' },
326
+ link: { rule: EGRESS_RULES.link, severity: 'high' },
327
+ };
328
+ /** How a settled match of `pattern` is read: a test of the match, or a finder in place of the regex. */
329
+ function patternReading(kind, pattern, urls) {
330
+ if (kind === 'card')
331
+ return { hit: cardHit };
332
+ if (kind === 'image' || kind === 'link') {
333
+ const index = (kind === 'image' ? IMAGE_PATTERNS : LINK_PATTERNS).indexOf(pattern);
334
+ const reading = urls[kind][index];
335
+ return 'find' in reading ? { find: reading.find } : { hit: reading.test };
336
+ }
337
+ const hit = BLOB_HITS.get(pattern);
338
+ return hit ? { hit } : {};
339
+ }
340
+ const INJECTION_KINDS = new Set([
341
+ 'injection',
342
+ 'base64',
343
+ 'hex',
344
+ 'spaced',
345
+ 'pipe',
346
+ ]);
347
+ /** Whether `checks` runs the check a pattern belongs to. */
348
+ function runs({ kind, group }, checks) {
349
+ if (INJECTION_KINDS.has(kind))
350
+ return checks.injection;
351
+ switch (kind) {
352
+ case 'sensitive':
353
+ case 'card':
354
+ return group !== undefined && checks.sensitive[group];
355
+ case 'boundary':
356
+ return checks.boundary;
357
+ case 'image':
358
+ return checks.images !== undefined;
359
+ default:
360
+ return checks.links !== undefined;
361
+ }
362
+ }
363
+ /** The patterns `checks` runs on the reply as written. */
364
+ function forwardPatterns(checks, given) {
365
+ const scope = (check) => ({ ...check, ...(given ? { given } : {}) });
366
+ const urls = {
367
+ image: imageReadings(scope(checks.images)),
368
+ link: linkReadings(scope(checks.links), checks.images !== undefined),
369
+ };
370
+ const out = [];
371
+ EGRESS_PATTERNS.forEach((entry, id) => {
372
+ if (!runs(entry, checks))
373
+ return;
374
+ out.push({
375
+ ...KIND_RULES[entry.kind],
376
+ id,
377
+ regex: new RegExp(entry.pattern.source, entry.pattern.flags),
378
+ ...patternReading(entry.kind, entry.pattern, urls),
379
+ });
380
+ });
381
+ return out;
382
+ }
383
+ /** The injection patterns, for the rewritten views. */
384
+ function injectionPatterns() {
385
+ const out = [];
386
+ EGRESS_PATTERNS.forEach(({ kind, pattern }, id) => {
387
+ if (kind !== 'injection')
388
+ return;
389
+ const hit = BLOB_HITS.get(pattern);
390
+ out.push({
391
+ ...KIND_RULES.injection,
392
+ id,
393
+ regex: new RegExp(pattern.source, pattern.flags),
394
+ ...(hit ? { hit } : {}),
395
+ });
396
+ });
397
+ return out;
398
+ }
399
+ function reversedPatterns() {
400
+ return REVERSED_INJECTION_PATTERNS.map((pattern, id) => ({
401
+ ...KIND_RULES.injection,
402
+ id,
403
+ regex: new RegExp(pattern.source, pattern.flags),
404
+ }));
405
+ }
406
+ /**
407
+ * One view scanned for some patterns: the automata, run one character at a
408
+ * time, give where each pattern could still be matching; the pattern's own
409
+ * regex, run only where the automaton reached a match, finds the match and
410
+ * whether it has settled. A pattern whose matches nest (tags inside tags) is
411
+ * read instead by its finder, once over each stretch that settles.
412
+ */
413
+ function createScan(view, automaton, patterns) {
414
+ const starts = startEdges(automaton, patterns.map((p) => p.id));
415
+ const local = new Int32Array(automaton.initials.length).fill(-1);
416
+ patterns.forEach((p, i) => {
417
+ local[p.id] = i;
418
+ });
419
+ let nodes = new Int32Array(automaton.size);
420
+ let from = new Int32Array(automaton.size);
421
+ let next = new Int32Array(automaton.size);
422
+ let nextFrom = new Int32Array(automaton.size);
423
+ let count = 0;
424
+ const slot = new Int32Array(automaton.size);
425
+ const mark = new Int32Array(automaton.size);
426
+ let step = 0;
427
+ let fed = 0;
428
+ const reached = new Uint8Array(patterns.length);
429
+ /** Whether the regex must look again: a match of it was unsettled, or its automaton sat on a final state. */
430
+ const recheck = new Uint8Array(patterns.length);
431
+ const resume = new Int32Array(patterns.length);
432
+ const liveFrom = new Int32Array(patterns.length);
433
+ const atFinal = new Uint8Array(patterns.length);
434
+ const finds = Uint8Array.from(patterns, (p) => (p.find ? 1 : 0));
435
+ /**
436
+ * Per finder: where its automaton first started a thread since the finder
437
+ * last read, or -1. A construct starts where a thread does, so a stretch
438
+ * with none needs no read; skipping it keeps a reply with no constructs from
439
+ * being reread whole at every step.
440
+ */
441
+ const openedFrom = new Int32Array(patterns.length).fill(-1);
442
+ const lastOpened = new Int32Array(patterns.length).fill(-1);
443
+ function feed() {
444
+ const { text, fresh } = view;
445
+ const base = freshFrom(view);
446
+ const { classOf, has, edges, final, pattern } = automaton;
447
+ for (; fed < text.length; fed++) {
448
+ const code = fed >= base ? fresh.charCodeAt(fed - base) : text.charCodeAt(fed);
449
+ const cls = classOf[code];
450
+ step++;
451
+ let size = 0;
452
+ const add = (target, start) => {
453
+ if (mark[target] === step) {
454
+ const at = slot[target];
455
+ if (start < nextFrom[at])
456
+ nextFrom[at] = start;
457
+ return;
458
+ }
459
+ mark[target] = step;
460
+ slot[target] = size;
461
+ next[size] = target;
462
+ nextFrom[size] = start;
463
+ size++;
464
+ if (final[target])
465
+ reached[local[pattern[target]]] = 1;
466
+ };
467
+ for (let i = 0; i < count; i++) {
468
+ const e = edges[nodes[i]];
469
+ const start = from[i];
470
+ for (let k = 0; k < e.length; k += 2) {
471
+ if (has[e[k + 1]][cls])
472
+ add(e[k], start);
473
+ }
474
+ }
475
+ const first = starts[cls];
476
+ for (let k = 0; k < first.length; k++) {
477
+ const target = first[k];
478
+ add(target, fed);
479
+ const p = local[pattern[target]];
480
+ if (finds[p]) {
481
+ lastOpened[p] = fed;
482
+ if (openedFrom[p] < 0)
483
+ openedFrom[p] = fed;
484
+ }
485
+ }
486
+ [nodes, next] = [next, nodes];
487
+ [from, nextFrom] = [nextFrom, from];
488
+ count = size;
489
+ }
490
+ }
491
+ /** Per pattern: the earliest start still under way, and whether it sits on a final state. */
492
+ function live() {
493
+ const end = view.text.length;
494
+ liveFrom.fill(end);
495
+ atFinal.fill(0);
496
+ let earliest = end;
497
+ for (let i = 0; i < count; i++) {
498
+ const node = nodes[i];
499
+ const p = local[automaton.pattern[node]];
500
+ const start = from[i];
501
+ if (start < liveFrom[p])
502
+ liveFrom[p] = start;
503
+ if (automaton.final[node])
504
+ atFinal[p] = 1;
505
+ if (start < earliest)
506
+ earliest = start;
507
+ }
508
+ return earliest;
509
+ }
510
+ /** A finder's hit up to `settledTo`, run only on a stretch its automaton opened a thread in. */
511
+ function found(p, settledTo) {
512
+ const opened = openedFrom[p];
513
+ const from = resume[p];
514
+ resume[p] = settledTo;
515
+ if (opened < 0 || opened >= settledTo)
516
+ return undefined;
517
+ openedFrom[p] = lastOpened[p] >= settledTo ? settledTo : -1;
518
+ const { find, rule, severity } = patterns[p];
519
+ const at = find?.(view.text, from, settledTo);
520
+ return at === undefined ? undefined : { rule, severity, start: view.rawAt(at) };
521
+ }
522
+ /** A regex pattern's hit up to `settledTo`. */
523
+ function matched(p, settledTo) {
524
+ if (!reached[p] && !recheck[p]) {
525
+ resume[p] = settledTo;
526
+ return undefined;
527
+ }
528
+ reached[p] = 0;
529
+ const text = view.text;
530
+ const { regex, hit, rule, severity } = patterns[p];
531
+ regex.lastIndex = resume[p];
532
+ for (;;) {
533
+ const match = regex.exec(text);
534
+ if (!match || match.index >= settledTo) {
535
+ resume[p] = settledTo;
536
+ recheck[p] = match || atFinal[p] ? 1 : 0;
537
+ return undefined;
538
+ }
539
+ const [blob] = match;
540
+ if (blob && (!hit || hit(blob, text, match.index))) {
541
+ return { rule, severity, start: view.rawAt(match.index) };
542
+ }
543
+ if (!blob)
544
+ regex.lastIndex++;
545
+ resume[p] = regex.lastIndex;
546
+ }
547
+ }
548
+ function detect() {
549
+ for (let p = 0; p < patterns.length; p++) {
550
+ const settledTo = liveFrom[p];
551
+ if (settledTo <= resume[p])
552
+ continue;
553
+ const hit = patterns[p].find ? found(p, settledTo) : matched(p, settledTo);
554
+ if (hit)
555
+ return hit;
556
+ }
557
+ return undefined;
558
+ }
559
+ return {
560
+ /** Read what the view settled; a hit, or the reply index to hold from. */
561
+ run() {
562
+ feed();
563
+ const earliest = live();
564
+ return detect() ?? view.rawAt(earliest);
565
+ },
566
+ };
567
+ }
568
+ /** Compiled host automata, kept per table so each is built once. */
569
+ const hostAutomata = new WeakMap();
570
+ function hostPatterns({ rules }) {
571
+ return rules.map(({ rule, severity, pattern }, id) => ({
572
+ rule,
573
+ severity,
574
+ id,
575
+ regex: globalPattern(pattern),
576
+ }));
577
+ }
578
+ /** Scans the bundled egress policy's patterns, and any host rules, as a reply streams. */
579
+ function createEgressStream(options = {}) {
580
+ const reply = { text: '', fresh: '' };
581
+ const raw = rawView(reply);
582
+ const views = [raw];
583
+ const scan = (view, automaton, patterns) => {
584
+ if (!views.includes(view))
585
+ views.push(view);
586
+ return createScan(view, automaton, patterns);
587
+ };
588
+ const scans = [];
589
+ const checks = options.checks ?? DEFAULT_CHECKS;
590
+ const forwardScan = forwardPatterns(checks, options.given);
591
+ if (forwardScan.length > 0) {
592
+ forward ??= compile(FORWARD_AUTOMATON);
593
+ scans.push(scan(raw, forward, forwardScan));
594
+ }
595
+ if (checks.injection) {
596
+ forward ??= compile(FORWARD_AUTOMATON);
597
+ backward ??= compile(REVERSED_AUTOMATON);
598
+ const normalized = normalizedView(reply);
599
+ const injection = injectionPatterns();
600
+ scans.push(scan(raw, backward, reversedPatterns()), scan(typoView(raw), forward, injection), scan(normalized, forward, injection), scan(typoView(normalized), forward, injection), scan(unitView(raw, tryRot13), forward, injection), scan(unitView(raw, (text) => tryLeet(text) ?? text), forward, injection), scan(urlView(reply), forward, injection));
601
+ }
602
+ if (options.host) {
603
+ let automaton = hostAutomata.get(options.host.automaton);
604
+ if (!automaton) {
605
+ automaton = compile(options.host.automaton);
606
+ hostAutomata.set(options.host.automaton, automaton);
607
+ }
608
+ scans.push(scan(raw, automaton, hostPatterns(options.host)));
609
+ }
610
+ let hold = 0;
611
+ return {
612
+ push(chunk) {
613
+ reply.text += chunk;
614
+ reply.fresh = chunk;
615
+ for (const view of views)
616
+ view.update();
617
+ let from = reply.text.length;
618
+ for (const s of scans) {
619
+ const result = s.run();
620
+ if (typeof result !== 'number')
621
+ return result;
622
+ from = Math.min(from, result);
623
+ }
624
+ hold = from;
625
+ return undefined;
626
+ },
627
+ holdFrom: () => hold,
628
+ };
629
+ }
630
+ /** Streaming plans for the policies whose checks the stream runs itself. */
631
+ const STREAM_PLANS = new WeakMap([
632
+ [
633
+ standardEgressEnforce,
634
+ (context) => createEgressStream(context.givenUrls ? { given: context.givenUrls } : {}),
635
+ ],
636
+ ]);
637
+ /** The streaming plan for `enforce`, when the stream knows its checks. */
638
+ function streamPlanOf(enforce) {
639
+ return STREAM_PLANS.get(enforce);
640
+ }
641
+ /** Tell the gate `enforce` runs exactly the checks `plan` streams. */
642
+ function registerStreamPlan(enforce, plan) {
643
+ STREAM_PLANS.set(enforce, plan);
644
+ }
645
+ export { createEgressStream, normalizedView, registerStreamPlan, streamPlanOf, typoView, urlView };