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