@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,328 @@
1
+ import { TheoremError } from './error.js';
2
+ /**
3
+ * IPv4 ranges refused outright:
4
+ * - Loopback: 127.0.0.0/8
5
+ * - RFC 1918: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16
6
+ * - Link-local / Cloud metadata: 169.254.0.0/16
7
+ * - Current network: 0.0.0.0/8
8
+ * - RFC 6598 Carrier-grade NAT: 100.64.0.0/10
9
+ * - RFC 5737 / RFC 6890 documentation / assignments: 192.0.0.0/24, 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24
10
+ * - RFC 2544 benchmark testing: 198.18.0.0/15
11
+ * - Broadcast / multicast / reserved: 224.0.0.0/4, 240.0.0.0/4, 255.255.255.255
12
+ */
13
+ /** Four dotted decimal octets and nothing else, so an IPv6 literal's dotted tail is never read as an IPv4 address. */
14
+ const IPV4_LITERAL = /^\d{1,3}(\.\d{1,3}){3}$/;
15
+ const PRIVATE_OR_LOCAL_IPV4_MATCHES = [
16
+ (b0) => b0 === 0, // 0.0.0.0/8
17
+ (b0) => b0 === 127, // 127.0.0.0/8 (loopback)
18
+ (b0) => b0 === 10, // 10.0.0.0/8
19
+ (b0, b1) => b0 === 100 && b1 >= 64 && b1 <= 127, // 100.64.0.0/10 (CGNAT)
20
+ (b0, b1) => b0 === 172 && b1 >= 16 && b1 <= 31, // 172.16.0.0/12
21
+ (b0, b1) => b0 === 192 && b1 === 168, // 192.168.0.0/16
22
+ (b0, b1) => b0 === 169 && b1 === 254, // 169.254.0.0/16 (link-local)
23
+ (b0, b1, b2) => b0 === 192 && b1 === 0 && (b2 === 0 || b2 === 2), // 192.0.0.0/24, 192.0.2.0/24
24
+ (b0, b1) => b0 === 198 && (b1 === 18 || b1 === 19), // 198.18.0.0/15
25
+ (b0, b1, b2) => b0 === 198 && b1 === 51 && b2 === 100, // 198.51.100.0/24
26
+ (b0, b1, b2) => b0 === 203 && b1 === 0 && b2 === 113, // 203.0.113.0/24
27
+ (b0) => b0 >= 224, // Multicast & Reserved (224.0.0.0/4, 240.0.0.0/4)
28
+ ];
29
+ function isPrivateOrLocalIPv4Parts(b0, b1, b2, _b3) {
30
+ return PRIVATE_OR_LOCAL_IPV4_MATCHES.some((match) => match(b0, b1, b2));
31
+ }
32
+ function isPrivateOrLocalIPv4(ip) {
33
+ if (!IPV4_LITERAL.test(ip)) {
34
+ return false;
35
+ }
36
+ const [b0 = 0, b1 = 0, b2 = 0, b3 = 0] = ip.split('.').map(Number);
37
+ if (b0 > 255 || b1 > 255 || b2 > 255 || b3 > 255) {
38
+ return false;
39
+ }
40
+ return isPrivateOrLocalIPv4Parts(b0, b1, b2, b3);
41
+ }
42
+ function parseIPv6Words(ip) {
43
+ const trimmed = ip.toLowerCase().trim();
44
+ const lastColon = trimmed.lastIndexOf(':');
45
+ let ipv4Words = [];
46
+ let v6Str = trimmed;
47
+ if (lastColon !== -1) {
48
+ const potentialV4 = trimmed.slice(lastColon + 1);
49
+ if (potentialV4.includes('.')) {
50
+ const v4Parts = potentialV4.split('.').map((p) => Number.parseInt(p, 10));
51
+ if (v4Parts.length !== 4 || v4Parts.some((p) => Number.isNaN(p) || p < 0 || p > 255)) {
52
+ return null;
53
+ }
54
+ const b0 = v4Parts[0] ?? 0;
55
+ const b1 = v4Parts[1] ?? 0;
56
+ const b2 = v4Parts[2] ?? 0;
57
+ const b3 = v4Parts[3] ?? 0;
58
+ ipv4Words = [(b0 << 8) | b1, (b2 << 8) | b3];
59
+ const head = trimmed.slice(0, lastColon + 1);
60
+ v6Str = head.endsWith('::') ? head : head.slice(0, -1);
61
+ }
62
+ }
63
+ const parts = v6Str.split('::');
64
+ if (parts.length > 2)
65
+ return null;
66
+ const left = parts[0] ? parts[0].split(':').filter(Boolean) : [];
67
+ const right = parts.length === 2 && parts[1] ? parts[1].split(':').filter(Boolean) : [];
68
+ const needed = 8 - ipv4Words.length;
69
+ if (parts.length === 1) {
70
+ if (left.length !== needed)
71
+ return null;
72
+ }
73
+ else {
74
+ if (left.length + right.length >= needed)
75
+ return null;
76
+ }
77
+ const zerosNeeded = needed - (left.length + right.length);
78
+ const mid = new Array(zerosNeeded).fill(0);
79
+ const parseHex = (s) => (/^[0-9a-f]{1,4}$/.test(s) ? Number.parseInt(s, 16) : null);
80
+ const leftWords = [];
81
+ for (const s of left) {
82
+ const w = parseHex(s);
83
+ if (w === null)
84
+ return null;
85
+ leftWords.push(w);
86
+ }
87
+ const rightWords = [];
88
+ for (const s of right) {
89
+ const w = parseHex(s);
90
+ if (w === null)
91
+ return null;
92
+ rightWords.push(w);
93
+ }
94
+ return [...leftWords, ...mid, ...rightWords, ...ipv4Words];
95
+ }
96
+ const zeros = (w, from, to) => w.slice(from, to).every((x) => x === 0);
97
+ /**
98
+ * IPv6 ranges refused outright:
99
+ * - Unspecified `::` and loopback `::1`
100
+ * - Link-local fe80::/10, deprecated site-local fec0::/10, unique local fc00::/7
101
+ * - Multicast ff00::/8, documentation 2001:db8::/32, discard 100::/64
102
+ * - Local-use NAT64 64:ff9b:1::/48 (RFC 8215), which translates to IPv4 behind
103
+ * the host's own gateway, and Teredo 2001::/32, whose client address is hidden
104
+ */
105
+ const PRIVATE_OR_LOCAL_IPV6_MATCHES = [
106
+ (w) => zeros(w, 0, 8),
107
+ (w) => zeros(w, 0, 7) && w[7] === 1,
108
+ (w) => ((w[0] ?? 0) & 0xffc0) === 0xfe80,
109
+ (w) => ((w[0] ?? 0) & 0xffc0) === 0xfec0,
110
+ (w) => ((w[0] ?? 0) & 0xfe00) === 0xfc00,
111
+ (w) => ((w[0] ?? 0) & 0xff00) === 0xff00,
112
+ (w) => w[0] === 0x2001 && w[1] === 0x0db8,
113
+ (w) => w[0] === 0x0100 && zeros(w, 1, 4),
114
+ (w) => w[0] === 0x0064 && w[1] === 0xff9b && w[2] === 0x0001,
115
+ (w) => w[0] === 0x2001 && w[1] === 0x0000,
116
+ ];
117
+ /**
118
+ * IPv6 ranges that carry an IPv4 address, judged by that address. `at` is the
119
+ * word where its two words start.
120
+ * - IPv4-mapped ::ffff:0:0/96 and IPv4-translated ::ffff:0:0:0/96
121
+ * - IPv4-compatible ::/96 and NAT64 64:ff9b::/96
122
+ * - 6to4 2002::/16, whose relay forwards to the embedded address
123
+ */
124
+ const EMBEDDED_IPV4_RANGES = [
125
+ { match: (w) => zeros(w, 0, 5) && w[5] === 0xffff, at: 6 },
126
+ { match: (w) => zeros(w, 0, 4) && w[4] === 0xffff && w[5] === 0, at: 6 },
127
+ { match: (w) => zeros(w, 0, 6), at: 6 },
128
+ { match: (w) => w[0] === 0x0064 && w[1] === 0xff9b && zeros(w, 2, 6), at: 6 },
129
+ { match: (w) => w[0] === 0x2002, at: 1 },
130
+ ];
131
+ function isPrivateOrLocalIPv6(ip) {
132
+ const words = parseIPv6Words(ip);
133
+ if (words?.length !== 8) {
134
+ return false;
135
+ }
136
+ if (PRIVATE_OR_LOCAL_IPV6_MATCHES.some((match) => match(words)))
137
+ return true;
138
+ return EMBEDDED_IPV4_RANGES.some(({ match, at }) => {
139
+ if (!match(words))
140
+ return false;
141
+ const hi = words[at] ?? 0;
142
+ const lo = words[at + 1] ?? 0;
143
+ return isPrivateOrLocalIPv4Parts((hi >> 8) & 0xff, hi & 0xff, (lo >> 8) & 0xff, lo & 0xff);
144
+ });
145
+ }
146
+ export function isLocalhostName(hostname) {
147
+ let lower = hostname.toLowerCase();
148
+ while (lower.endsWith('.')) {
149
+ lower = lower.slice(0, -1);
150
+ }
151
+ return (lower === 'localhost' ||
152
+ lower.endsWith('.localhost') ||
153
+ lower === 'local' ||
154
+ lower.endsWith('.local') ||
155
+ lower === 'internal' ||
156
+ lower.endsWith('.internal') ||
157
+ lower === 'lan' ||
158
+ lower.endsWith('.lan') ||
159
+ lower === 'home.arpa' ||
160
+ lower.endsWith('.home.arpa') ||
161
+ lower === 'localdomain' ||
162
+ lower.endsWith('.localdomain') ||
163
+ lower === '127.0.0.1' ||
164
+ lower === '::1' ||
165
+ lower === '[::1]');
166
+ }
167
+ export function isPrivateOrLocalAddress(ipOrHost) {
168
+ const stripped = ipOrHost.startsWith('[') && ipOrHost.endsWith(']') ? ipOrHost.slice(1, -1) : ipOrHost;
169
+ return isPrivateOrLocalIPv4(stripped) || isPrivateOrLocalIPv6(stripped);
170
+ }
171
+ /** Throws a `TheoremError` when the URL is blocked. */
172
+ export function assertSafeUrl(urlStr, policy) {
173
+ let parsed;
174
+ try {
175
+ parsed = new URL(urlStr);
176
+ }
177
+ catch {
178
+ throw new TheoremError('request', `Invalid URL provided: "${urlStr}"`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
179
+ }
180
+ const allowPrivate = policy?.allowPrivateNetworks ?? false;
181
+ const allowedHosts = policy?.allowedHosts?.map((h) => h.toLowerCase()) ?? [];
182
+ const hostname = parsed.hostname.toLowerCase();
183
+ // An allowed host is exempt from the address checks, never from the scheme.
184
+ const defaultSchemes = allowPrivate ? ['http:', 'https:'] : ['https:'];
185
+ const allowedSchemes = policy?.allowedSchemes
186
+ ? policy.allowedSchemes.map((s) => (s.endsWith(':') ? s.toLowerCase() : `${s.toLowerCase()}:`))
187
+ : defaultSchemes;
188
+ if (!allowedSchemes.includes(parsed.protocol)) {
189
+ throw new TheoremError('blocked', `URL scheme "${parsed.protocol}" is not permitted by network policy. Allowed: ${allowedSchemes.join(', ')}`);
190
+ }
191
+ if (!allowPrivate && !allowedHosts.includes(hostname)) {
192
+ if (isLocalhostName(hostname)) {
193
+ throw new TheoremError('blocked', `Access to loopback target "${hostname}" blocked by network guardrail. Enable allowPrivateNetworks to permit local addresses.`);
194
+ }
195
+ if (isPrivateOrLocalIPv4(hostname)) {
196
+ throw new TheoremError('blocked', `Access to private IPv4 address "${hostname}" blocked by network guardrail.`);
197
+ }
198
+ const strippedV6 = hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;
199
+ if (isPrivateOrLocalIPv6(strippedV6)) {
200
+ throw new TheoremError('blocked', `Access to private IPv6 address "${hostname}" blocked by network guardrail.`);
201
+ }
202
+ }
203
+ return parsed;
204
+ }
205
+ /** The Fetch standard's redirect limit — the one `redirect: 'follow'` applies. */
206
+ const FETCH_REDIRECT_LIMIT = 20;
207
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
208
+ /**
209
+ * `assertSafeUrl` judges literal addresses and local names, so a public name whose DNS answers a
210
+ * private address passes it. This lookup is separate from the connection's own: it stops names that
211
+ * point inward, but not a DNS server that changes its answer between the two (rebinding); only the
212
+ * host's egress layer can.
213
+ */
214
+ async function assertResolvesPublic(target, options, signal) {
215
+ const { resolveHost, policy } = options;
216
+ const hostname = target.hostname.toLowerCase();
217
+ if (resolveHost === undefined ||
218
+ policy?.allowPrivateNetworks === true ||
219
+ policy?.allowedHosts?.some((h) => h.toLowerCase() === hostname) === true ||
220
+ hostname.startsWith('[') ||
221
+ IPV4_LITERAL.test(hostname)) {
222
+ return;
223
+ }
224
+ const addresses = await resolveHost(hostname, signal ?? undefined);
225
+ if (addresses.length === 0) {
226
+ throw new TheoremError('blocked', `Host "${hostname}" did not resolve to an address.`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
227
+ }
228
+ const inward = addresses.find(isPrivateOrLocalAddress);
229
+ if (inward !== undefined) {
230
+ throw new TheoremError('blocked', `Host "${hostname}" resolves to private address "${inward}", blocked by network guardrail.`);
231
+ }
232
+ }
233
+ /** A 301/302 turns a POST into a GET, and a 303 turns anything but HEAD into a GET (Fetch standard). */
234
+ function redirectsToGet(status, method) {
235
+ if (status === 303)
236
+ return method !== 'HEAD';
237
+ return (status === 301 || status === 302) && method === 'POST';
238
+ }
239
+ /** Every redirect hop must clear `policy`; throws a `TheoremError` (`blocked`) when one is refused. */
240
+ export async function fetchGuarded(url, init, options) {
241
+ const fetchFn = options.fetchFn ?? fetch;
242
+ const clearHop = async (href) => {
243
+ const start = performance.now();
244
+ try {
245
+ const safe = assertSafeUrl(href, options.policy);
246
+ await assertResolvesPublic(safe, options, init.signal);
247
+ return safe;
248
+ }
249
+ finally {
250
+ options.onCheck?.(performance.now() - start);
251
+ }
252
+ };
253
+ let target = await clearHop(url);
254
+ const origin = target.origin;
255
+ const headers = new Headers(init.headers);
256
+ let method = init.method ?? 'GET';
257
+ let body = init.body;
258
+ let onOrigin = true;
259
+ for (let hop = 0;; hop++) {
260
+ const sent = new Headers(headers);
261
+ if (onOrigin) {
262
+ for (const [name, value] of Object.entries(options.originBoundHeaders ?? {})) {
263
+ sent.set(name, value);
264
+ }
265
+ }
266
+ const response = await fetchFn(target.href, {
267
+ ...init,
268
+ method,
269
+ headers: sent,
270
+ body,
271
+ redirect: 'manual',
272
+ });
273
+ const location = response.headers.get('location');
274
+ if (!options.followRedirects || !REDIRECT_STATUSES.has(response.status) || location === null) {
275
+ return response;
276
+ }
277
+ await response.body?.cancel();
278
+ if (hop === FETCH_REDIRECT_LIMIT) {
279
+ throw new TheoremError('network', `Too many redirects from "${url}"`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
280
+ }
281
+ target = await clearHop(new URL(location, target).href);
282
+ onOrigin &&= target.origin === origin;
283
+ if (redirectsToGet(response.status, method)) {
284
+ method = 'GET';
285
+ body = undefined;
286
+ headers.delete('content-type');
287
+ }
288
+ }
289
+ }
290
+ const DNS_TYPE_A = 1;
291
+ const DNS_TYPE_AAAA = 28;
292
+ const DNS_NOERROR = 0;
293
+ const DNS_NXDOMAIN = 3;
294
+ /**
295
+ * A {@link ResolveHost} over DNS-over-HTTPS (the DNS JSON API), for runtimes
296
+ * with `fetch` but no DNS lookup, such as Cloudflare Workers. It asks the
297
+ * endpoint, not the machine's resolver, so names only an internal resolver
298
+ * knows are not seen; a server host should resolve through its own DNS.
299
+ */
300
+ export function dnsOverHttpsResolver(options) {
301
+ const fetchFn = options.fetchFn ?? fetch;
302
+ const query = async (hostname, type, signal) => {
303
+ const url = new URL(options.endpoint);
304
+ url.searchParams.set('name', hostname);
305
+ url.searchParams.set('type', String(type));
306
+ const response = await fetchFn(url.href, {
307
+ headers: { accept: 'application/dns-json' },
308
+ ...(signal ? { signal } : {}),
309
+ });
310
+ if (!response.ok) {
311
+ throw new TheoremError('network', `DNS lookup for "${hostname}" failed: HTTP ${response.status}`);
312
+ }
313
+ const answer = (await response.json());
314
+ if (answer.Status === DNS_NXDOMAIN)
315
+ return [];
316
+ if (answer.Status !== DNS_NOERROR) {
317
+ throw new TheoremError('network', `DNS lookup for "${hostname}" failed: status ${answer.Status}`);
318
+ }
319
+ return (answer.Answer ?? []).flatMap((record) => record.type === type && typeof record.data === 'string' ? [record.data] : []);
320
+ };
321
+ return async (hostname, signal) => {
322
+ const [v4, v6] = await Promise.all([
323
+ query(hostname, DNS_TYPE_A, signal),
324
+ query(hostname, DNS_TYPE_AAAA, signal),
325
+ ]);
326
+ return [...v4, ...v6];
327
+ };
328
+ }
@@ -0,0 +1,6 @@
1
+ /** What one code point reads as: stripped, folded to ASCII, or itself. */
2
+ declare function normalizeCodePoint(ch: string): string;
3
+ /** Whether a code point is one `EMOJI_BETWEEN` drops between letters. */
4
+ declare function isEmoji(ch: string): boolean;
5
+ declare function normalizeForDetection(text: string): string;
6
+ export { isEmoji, normalizeCodePoint, normalizeForDetection };
@@ -0,0 +1,132 @@
1
+ const STRIP_CODES = [
2
+ 0x200b, 0x200c, 0x200d, 0xfeff, 0x00ad, 0x200e, 0x200f, 0x202a, 0x202b, 0x202c, 0x202d, 0x202e,
3
+ 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x034f, 0x061c, 0x180e, 0x2066, 0x2067, 0x2068, 0x2069,
4
+ ];
5
+ const STRIP_SET = new Set(STRIP_CODES);
6
+ const SPACE_CODES = [
7
+ 0x00a0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009,
8
+ 0x200a, 0x202f, 0x205f, 0x3000,
9
+ ];
10
+ const SPACE_SET = new Set(SPACE_CODES);
11
+ const HOMOGLYPH_MAP = new Map([
12
+ [0x0430, 'a'],
13
+ [0x0441, 'c'],
14
+ [0x0435, 'e'],
15
+ [0x0456, 'i'],
16
+ [0x043e, 'o'],
17
+ [0x0440, 'p'],
18
+ [0x0455, 's'],
19
+ [0x0443, 'y'],
20
+ [0x0445, 'x'],
21
+ [0x043a, 'k'],
22
+ [0x043d, 'h'],
23
+ [0x0410, 'A'],
24
+ [0x0412, 'B'],
25
+ [0x0415, 'E'],
26
+ [0x041d, 'H'],
27
+ [0x041e, 'O'],
28
+ [0x041a, 'K'],
29
+ [0x041c, 'M'],
30
+ [0x0420, 'P'],
31
+ [0x0421, 'C'],
32
+ [0x0422, 'T'],
33
+ [0x0425, 'X'],
34
+ [0x03b1, 'a'],
35
+ [0x03b5, 'e'],
36
+ [0x03b9, 'i'],
37
+ [0x03bf, 'o'],
38
+ [0x03c1, 'p'],
39
+ [0x2071, 'i'],
40
+ [0x207f, 'n'],
41
+ [0x1d43, 'a'],
42
+ [0x1d47, 'b'],
43
+ [0x1d48, 'd'],
44
+ [0x1d49, 'e'],
45
+ [0x1d4d, 'g'],
46
+ [0x1d4f, 'k'],
47
+ [0x1d50, 'm'],
48
+ [0x1d52, 'o'],
49
+ [0x1d56, 'p'],
50
+ [0x1d57, 't'],
51
+ [0x1d58, 'u'],
52
+ [0x1d5b, 'v'],
53
+ ]);
54
+ const FULLWIDTH_LO = 0xff01;
55
+ const FULLWIDTH_HI = 0xff5e;
56
+ const FULLWIDTH_OFFSET = 0xfee0;
57
+ const COMBINING_LO = 0x0300;
58
+ const COMBINING_HI = 0x036f;
59
+ const MATH_ALPHA = [
60
+ [0x1d400, 0x1d41a],
61
+ [0x1d434, 0x1d44e],
62
+ [0x1d468, 0x1d482],
63
+ [0x1d49c, 0x1d4b6],
64
+ [0x1d4d0, 0x1d4ea],
65
+ [0x1d504, 0x1d51e],
66
+ [0x1d538, 0x1d552],
67
+ [0x1d56c, 0x1d586],
68
+ [0x1d5a0, 0x1d5ba],
69
+ [0x1d5d4, 0x1d5ee],
70
+ [0x1d608, 0x1d622],
71
+ [0x1d63c, 0x1d656],
72
+ [0x1d670, 0x1d68a],
73
+ ];
74
+ const MATH_DIGIT = [0x1d7ce, 0x1d7d8, 0x1d7e2, 0x1d7ec, 0x1d7f6];
75
+ const ALPHA_SIZE = 26;
76
+ const DIGIT_SIZE = 10;
77
+ const UPPER_A = 0x41;
78
+ const LOWER_A = 0x61;
79
+ const DIGIT_0 = 0x30;
80
+ function mapMath(code) {
81
+ for (const [upper, lower] of MATH_ALPHA) {
82
+ if (code >= upper && code < upper + ALPHA_SIZE) {
83
+ return String.fromCodePoint(UPPER_A + code - upper);
84
+ }
85
+ if (code >= lower && code < lower + ALPHA_SIZE) {
86
+ return String.fromCodePoint(LOWER_A + code - lower);
87
+ }
88
+ }
89
+ for (const start of MATH_DIGIT) {
90
+ if (code >= start && code < start + DIGIT_SIZE) {
91
+ return String.fromCodePoint(DIGIT_0 + code - start);
92
+ }
93
+ }
94
+ return undefined;
95
+ }
96
+ const EMOJI = String.raw `(?:[\u{1F300}-\u{1FFFF}]|[\u{2600}-\u{27BF}]|[\u{FE00}-\u{FE0F}]|[\u{231A}-\u{23FF}])`;
97
+ /** Emoji runs between two letters are dropped: `ig😀nore` reads `ignore`. */
98
+ const EMOJI_BETWEEN = new RegExp(`(?<=[a-zA-Z])${EMOJI}+(?=[a-zA-Z])`, 'gu');
99
+ const EMOJI_CHAR = new RegExp(`^${EMOJI}$`, 'u');
100
+ const BACKSLASH_BEFORE_ALPHA = /\\(?=[a-zA-Z])/g;
101
+ /** What one code point reads as: stripped, folded to ASCII, or itself. */
102
+ function normalizeCodePoint(ch) {
103
+ const code = ch.codePointAt(0) ?? 0;
104
+ if (STRIP_SET.has(code))
105
+ return '';
106
+ if (code >= COMBINING_LO && code <= COMBINING_HI)
107
+ return '';
108
+ if (code >= FULLWIDTH_LO && code <= FULLWIDTH_HI) {
109
+ return String.fromCodePoint(code - FULLWIDTH_OFFSET);
110
+ }
111
+ const math = mapMath(code);
112
+ if (math !== undefined)
113
+ return math;
114
+ const homo = HOMOGLYPH_MAP.get(code);
115
+ if (homo !== undefined)
116
+ return homo;
117
+ if (SPACE_SET.has(code))
118
+ return ' ';
119
+ return ch;
120
+ }
121
+ /** Whether a code point is one `EMOJI_BETWEEN` drops between letters. */
122
+ function isEmoji(ch) {
123
+ return EMOJI_CHAR.test(ch);
124
+ }
125
+ function normalizeForDetection(text) {
126
+ let out = '';
127
+ for (const ch of text) {
128
+ out += normalizeCodePoint(ch);
129
+ }
130
+ return out.replace(EMOJI_BETWEEN, '').replace(BACKSLASH_BEFORE_ALPHA, '');
131
+ }
132
+ export { isEmoji, normalizeCodePoint, normalizeForDetection };
@@ -0,0 +1,19 @@
1
+ import { type SensitiveSelection } from './sensitive.js';
2
+ import type { ProfileGuardrailsSpec, ResolvedGuardrailPolicy, TrustLevel } from './types.js';
3
+ export interface DetectionOptions {
4
+ sanitizeInput: boolean;
5
+ redactSensitive: SensitiveSelection;
6
+ }
7
+ /** Every ingress and egress path resolves through here so none can drift on what "unset" means. */
8
+ declare function resolveGuardrailPolicy(spec: ProfileGuardrailsSpec | undefined): ResolvedGuardrailPolicy;
9
+ /**
10
+ * Trusted text is author-time profile copy. Injection redaction would strip the
11
+ * host's own anti-injection instructions, and sensitive redaction would rewrite a
12
+ * prompt that legitimately shows a key or address format — so trusted text is
13
+ * passed to the provider verbatim. Trace safety does not depend on this: the trace
14
+ * writer redacts independently on every path.
15
+ *
16
+ * Assembled and untrusted text take whatever the profile enabled.
17
+ */
18
+ declare function detectionForTrust(policy: ResolvedGuardrailPolicy, trust: TrustLevel): DetectionOptions;
19
+ export { detectionForTrust, resolveGuardrailPolicy };
@@ -0,0 +1,50 @@
1
+ import { egressPolicy } from './egress-policy.js';
2
+ import { resolveSensitive } from './sensitive.js';
3
+ const NO_GROUPS = resolveSensitive(false);
4
+ /** One enforce per spec, so the gates' per-enforce plans are built once. */
5
+ const BUNDLED = new WeakMap();
6
+ function resolveEgress(spec) {
7
+ if (!spec)
8
+ return undefined;
9
+ const { enforce, checks, ...rest } = spec;
10
+ if (enforce)
11
+ return { ...rest, enforce };
12
+ let bundled = BUNDLED.get(spec);
13
+ if (!bundled) {
14
+ bundled = egressPolicy({ bundled: checks ?? true });
15
+ BUNDLED.set(spec, bundled);
16
+ }
17
+ return { ...rest, enforce: bundled };
18
+ }
19
+ /** Every ingress and egress path resolves through here so none can drift on what "unset" means. */
20
+ function resolveGuardrailPolicy(spec) {
21
+ return {
22
+ sanitizeInput: spec?.sanitizeInput ?? true,
23
+ redactSensitive: resolveSensitive(spec?.redactSensitive),
24
+ canary: spec?.canary ?? true,
25
+ promptEcho: spec?.promptEcho ?? true,
26
+ egress: resolveEgress(spec?.egress),
27
+ network: spec?.network,
28
+ quota: spec?.quota,
29
+ taint: spec?.taint,
30
+ };
31
+ }
32
+ /**
33
+ * Trusted text is author-time profile copy. Injection redaction would strip the
34
+ * host's own anti-injection instructions, and sensitive redaction would rewrite a
35
+ * prompt that legitimately shows a key or address format — so trusted text is
36
+ * passed to the provider verbatim. Trace safety does not depend on this: the trace
37
+ * writer redacts independently on every path.
38
+ *
39
+ * Assembled and untrusted text take whatever the profile enabled.
40
+ */
41
+ function detectionForTrust(policy, trust) {
42
+ if (trust === 'trusted') {
43
+ return { sanitizeInput: false, redactSensitive: NO_GROUPS };
44
+ }
45
+ return {
46
+ sanitizeInput: policy.sanitizeInput,
47
+ redactSensitive: policy.redactSensitive,
48
+ };
49
+ }
50
+ export { detectionForTrust, resolveGuardrailPolicy };
@@ -0,0 +1,69 @@
1
+ import type { EgressEnforcer, GuardrailContext, GuardrailHit, ResolvedGuardrailPolicy } from './types.js';
2
+ /** Default lookback under a host `egress.enforce` the gate cannot read. */
3
+ declare const DEFAULT_HOLDBACK = 256;
4
+ /**
5
+ * Default lookback on Live under a host policy the gate cannot read, where the
6
+ * held transcript holds back audio too: the shortest that shows the host no
7
+ * character of any egress corpus match however the transcript is chunked
8
+ * (88), with a margin.
9
+ */
10
+ declare const LIVE_DEFAULT_HOLDBACK = 96;
11
+ export type ProgressiveYieldOk = {
12
+ blocked: false;
13
+ emit: string;
14
+ };
15
+ export type ProgressiveYieldBlocked = {
16
+ blocked: true;
17
+ hits: GuardrailHit[];
18
+ };
19
+ export type ProgressiveYieldResult = ProgressiveYieldOk | ProgressiveYieldBlocked;
20
+ export interface ProgressiveYieldGateOptions {
21
+ /** Also carries the turn canary. */
22
+ context: GuardrailContext;
23
+ /** When set, each step runs this policy on the accumulated window before emit. */
24
+ enforce?: EgressEnforcer;
25
+ /**
26
+ * Lookback in characters under an `enforce` the gate cannot read (default
27
+ * `DEFAULT_HOLDBACK`). The bundled policy holds exactly and takes none: it
28
+ * is an error to set one with it. A tail that could start a canary leak is
29
+ * always held on top.
30
+ */
31
+ holdback?: number;
32
+ /**
33
+ * Text an earlier window of the same canary ended on that could still open a
34
+ * leak (`promptLeakCarry`). It is scanned in front of this window, never released
35
+ * again, so a token split across steps or cycles is still one match.
36
+ */
37
+ carry?: string;
38
+ }
39
+ /**
40
+ * Incremental outbound gate that scans accumulated output and releases only
41
+ * prefixes outside its retained lookback window.
42
+ */
43
+ interface ProgressiveYieldGate {
44
+ process: (fragment: string) => Promise<ProgressiveYieldResult>;
45
+ flush: () => Promise<ProgressiveYieldResult>;
46
+ /** Full window inspected so far (for end-of-attempt egress / repair). */
47
+ accumulated: () => string;
48
+ /** Lookback tail not yet released to the host. Peek only. */
49
+ unreleased: () => string;
50
+ /**
51
+ * Take the tail not yet released and mark it released.
52
+ *
53
+ * Used when the runner records withheld text for the egress window: without
54
+ * advancing the cursor a later `flush` re-releases the same range and the
55
+ * attempt buffer ends up holding the text twice.
56
+ */
57
+ drainUnreleased: () => string;
58
+ /** The tail the next window of the same canary must scan in front of its own. */
59
+ carryOut: () => string;
60
+ }
61
+ /** Call `flush` when the stream ends to release the held tail. */
62
+ declare function createProgressiveYieldGate(options: ProgressiveYieldGateOptions): ProgressiveYieldGate;
63
+ /**
64
+ * Shared constructor for runTurn + Live: gate when canary and/or egress.enforce
65
+ * is active. `context.canary` is set only when the profile enabled canary minting.
66
+ */
67
+ declare function createOutboundProgressiveGate(policy: ResolvedGuardrailPolicy, context: GuardrailContext, carry?: string): ProgressiveYieldGate | null;
68
+ export type { ProgressiveYieldGate };
69
+ export { createOutboundProgressiveGate, createProgressiveYieldGate, DEFAULT_HOLDBACK, LIVE_DEFAULT_HOLDBACK, };