@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,80 @@
1
+ import { resolveGuardrailPolicy } from './policy.js';
2
+ import { TheoremError } from './theorem-error.js';
3
+ const LOOPBACK = new Set(['127.0.0.1', '::1', 'localhost']);
4
+ const slots = new Map();
5
+ function utcDay(now) {
6
+ return new Date(now).toISOString().slice(0, 10);
7
+ }
8
+ function isLoopback(peer) {
9
+ return LOOPBACK.has(peer);
10
+ }
11
+ function cfConnectingIp(req) {
12
+ return req.headers.get('cf-connecting-ip')?.trim() ?? '';
13
+ }
14
+ function slotKey(profileId, ip) {
15
+ return `${profileId}:${ip}`;
16
+ }
17
+ /** Returns whether a local request lacks the proxy header needed for quota identity. */
18
+ function skipQuota(peer, req) {
19
+ return isLoopback(peer) && !cfConnectingIp(req);
20
+ }
21
+ /** Resolves the client identity, preferring Cloudflare's header for local peers. */
22
+ function clientIp(peer, req) {
23
+ if (isLoopback(peer)) {
24
+ const cf = cfConnectingIp(req);
25
+ if (cf) {
26
+ return cf;
27
+ }
28
+ }
29
+ if (peer) {
30
+ return peer;
31
+ }
32
+ return 'unknown';
33
+ }
34
+ /**
35
+ * Reserves one profile-and-client daily quota slot. The reservation stays busy
36
+ * until `releaseSlot` is called, preventing concurrent turns from overspending.
37
+ */
38
+ function takeSlot(profile, ip, now) {
39
+ const quota = resolveGuardrailPolicy(profile.guardrails).quota;
40
+ if (!quota) {
41
+ return 'not_configured';
42
+ }
43
+ const day = utcDay(now);
44
+ const key = slotKey(profile.id, ip);
45
+ let slot = slots.get(key);
46
+ if (!slot || slot.day !== day) {
47
+ slot = { day, count: 0, busy: false };
48
+ slots.set(key, slot);
49
+ }
50
+ if (slot.busy) {
51
+ return 'busy';
52
+ }
53
+ if (slot.count >= quota.perDay) {
54
+ return 'quota';
55
+ }
56
+ slot.busy = true;
57
+ slot.count += 1;
58
+ return 'ok';
59
+ }
60
+ /** Releases an active quota reservation without decrementing its daily count. */
61
+ function releaseSlot(profile, ip) {
62
+ const slot = slots.get(slotKey(profile.id, ip));
63
+ if (slot) {
64
+ slot.busy = false;
65
+ }
66
+ }
67
+ /** `undefined` when the profile has no quota configured. */
68
+ function quotaExhausted(profile) {
69
+ const quota = resolveGuardrailPolicy(profile.guardrails).quota;
70
+ if (!quota) {
71
+ return undefined;
72
+ }
73
+ return new TheoremError('rate_limit', `${profile.id} used its daily quota of ${quota.perDay} turns`, // labels-exempt: internal diagnostic; the user reads the copy key
74
+ { copy: { key: 'quota.exhausted', params: { perDay: quota.perDay } } });
75
+ }
76
+ /** Clears all process-local quota counters; intended for tests or host resets. */
77
+ function resetSlots() {
78
+ slots.clear();
79
+ }
80
+ export { clientIp, quotaExhausted, releaseSlot, resetSlots, skipQuota, takeSlot };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Every rule id Theorem's own guardrails report, in one place. The trace
3
+ * catalog describes each one, and its description map is keyed by
4
+ * {@link GuardrailRule}, so a new id fails typecheck until it is described.
5
+ * A host's egress `enforce` hook may report ids of its own; those are not here.
6
+ *
7
+ * @module
8
+ */
9
+ /** What a detector found, the same id at every boundary; the event names the boundary. */
10
+ export declare const DETECT_RULES: {
11
+ readonly ids: "detect.ids";
12
+ readonly financial: "detect.financial";
13
+ readonly network: "detect.network";
14
+ readonly credentials: "detect.credentials";
15
+ readonly injection: "detect.injection";
16
+ readonly tool_instructions: "detect.tool_instructions";
17
+ readonly canary_leak: "detect.canary_leak";
18
+ readonly prompt_leak: "detect.prompt_leak";
19
+ readonly marker_leak: "detect.marker_leak";
20
+ readonly ungiven_images: "detect.ungiven_images";
21
+ readonly ungiven_links: "detect.ungiven_links";
22
+ readonly tool_leak: "detect.tool_leak";
23
+ };
24
+ /** The rule a match of `key` reports: a detector of Theorem's, or the id of one of the host's own (`detect.acme.record`). */
25
+ export declare function detectRule(key: string): string;
26
+ /** What stops a reply besides a detector's match. */
27
+ export declare const EGRESS_RULES: {
28
+ /**
29
+ * A provider-side built-in tool carried the canary or the system prompt. It
30
+ * ran before Theorem saw it: the data already left, so this is an incident.
31
+ */
32
+ readonly providerToolLeak: "egress.provider-tool-leak";
33
+ /** Payload could not be rendered for inspection — released output is unverified. */
34
+ readonly unscannable: "egress.unscannable";
35
+ };
36
+ /** A tool call refused for what the turn read before it. */
37
+ export declare const TOOL_RULES: {
38
+ readonly taintedTurn: "tool_call.tainted-turn";
39
+ readonly steeredTurn: "tool_call.steered-turn";
40
+ readonly remoteDestination: "tool_call.remote-destination";
41
+ };
42
+ /** A tool's network target refused before any request was made. */
43
+ export declare const NETWORK_RULES: {
44
+ readonly blocked: "network.blocked";
45
+ };
46
+ /** A rule id Theorem's own guardrails report. */
47
+ export type GuardrailRule = (typeof DETECT_RULES)[keyof typeof DETECT_RULES] | (typeof EGRESS_RULES)[keyof typeof EGRESS_RULES] | (typeof TOOL_RULES)[keyof typeof TOOL_RULES] | (typeof NETWORK_RULES)[keyof typeof NETWORK_RULES];
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Every rule id Theorem's own guardrails report, in one place. The trace
3
+ * catalog describes each one, and its description map is keyed by
4
+ * {@link GuardrailRule}, so a new id fails typecheck until it is described.
5
+ * A host's egress `enforce` hook may report ids of its own; those are not here.
6
+ *
7
+ * @module
8
+ */
9
+ /** What a detector found, the same id at every boundary; the event names the boundary. */
10
+ export const DETECT_RULES = {
11
+ ids: 'detect.ids',
12
+ financial: 'detect.financial',
13
+ network: 'detect.network',
14
+ credentials: 'detect.credentials',
15
+ injection: 'detect.injection',
16
+ tool_instructions: 'detect.tool_instructions',
17
+ canary_leak: 'detect.canary_leak',
18
+ prompt_leak: 'detect.prompt_leak',
19
+ marker_leak: 'detect.marker_leak',
20
+ ungiven_images: 'detect.ungiven_images',
21
+ ungiven_links: 'detect.ungiven_links',
22
+ tool_leak: 'detect.tool_leak',
23
+ };
24
+ /** The rule a match of `key` reports: a detector of Theorem's, or the id of one of the host's own (`detect.acme.record`). */
25
+ export function detectRule(key) {
26
+ return `detect.${key}`;
27
+ }
28
+ /** What stops a reply besides a detector's match. */
29
+ export const EGRESS_RULES = {
30
+ /**
31
+ * A provider-side built-in tool carried the canary or the system prompt. It
32
+ * ran before Theorem saw it: the data already left, so this is an incident.
33
+ */
34
+ providerToolLeak: 'egress.provider-tool-leak', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
35
+ /** Payload could not be rendered for inspection — released output is unverified. */
36
+ unscannable: 'egress.unscannable', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
37
+ };
38
+ /** A tool call refused for what the turn read before it. */
39
+ export const TOOL_RULES = {
40
+ taintedTurn: 'tool_call.tainted-turn',
41
+ steeredTurn: 'tool_call.steered-turn',
42
+ remoteDestination: 'tool_call.remote-destination',
43
+ };
44
+ /** A tool's network target refused before any request was made. */
45
+ export const NETWORK_RULES = {
46
+ blocked: 'network.blocked',
47
+ };
@@ -0,0 +1,40 @@
1
+ import type { NormalizedTurnRequest, Profile, TurnContext, TurnEvent, TurnHistoryMessage, TurnRequest } from '../kernel/types.js';
2
+ import { type Boundary } from './boundaries.js';
3
+ import { type BoundaryReader } from './detect-at.js';
4
+ import { TheoremError } from './theorem-error.js';
5
+ import type { GuardrailEvent } from './types.js';
6
+ /** A context package as the model reads it: text as written, anything else as JSON. */
7
+ declare function contextText(value: unknown): string;
8
+ /** Each sender's package read at the `context` boundary, with what was found there. */
9
+ declare function sanitizeContext(context: TurnContext | undefined, readerFor: () => BoundaryReader): {
10
+ context: TurnContext | undefined;
11
+ events: GuardrailEvent[];
12
+ blocked: boolean;
13
+ };
14
+ /** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
15
+ declare function sanitizeProjectId(id: string | undefined): string | undefined;
16
+ /**
17
+ * Exported because every path that injects messages into a turn needs it — turn
18
+ * history, and host steer injects mid-turn. A second copy would drift.
19
+ */
20
+ declare function sanitizeHistory(history: TurnHistoryMessage[], reader: BoundaryReader): TurnHistoryMessage[];
21
+ /** The error a turn ends on when a detector set to `block` matched at `boundary`. */
22
+ declare function requestRefused(boundary: Boundary): TheoremError;
23
+ /** A turn request read at each boundary it crosses. */
24
+ interface SanitizedTurnRequest {
25
+ request: NormalizedTurnRequest;
26
+ /** One guardrail event for each boundary where something matched. */
27
+ events: TurnEvent[];
28
+ /** Set when a match blocks: the request does not reach the model, and the turn ends on this. */
29
+ refusal?: TheoremError;
30
+ }
31
+ /**
32
+ * `req.system` is host-assembled per turn — it interpolates retrieval and user
33
+ * data, so it is read at its own boundary. `identity.system` never reaches this
34
+ * path and stays verbatim.
35
+ */
36
+ declare function sanitizeTurnRequestWithEvents(req: TurnRequest, profile: Profile): SanitizedTurnRequest;
37
+ /** The turn request with its input cleaned under the profile's guardrails. Throws when a match blocks it. */
38
+ declare function sanitizeTurnRequest(req: TurnRequest, profile: Profile): NormalizedTurnRequest;
39
+ export type { SanitizedTurnRequest };
40
+ export { contextText, requestRefused, sanitizeContext, sanitizeHistory, sanitizeProjectId, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
@@ -0,0 +1,160 @@
1
+ import { sanitizeTurnBlobs } from '../kernel/registry/attachments.js';
2
+ import { CONTEXT_SENDERS } from '../kernel/schema.js';
3
+ import { mapSystemPrompt } from '../kernel/system-parts.js';
4
+ import { recordOf } from './boundaries.js';
5
+ import { boundaryReader, detectEvent } from './detect-at.js';
6
+ import { guardrailTurnEvent } from './events.js';
7
+ import { resolveGuardrailPolicy } from './policy.js';
8
+ import { TheoremError } from './theorem-error.js';
9
+ /** The boundaries one turn request crosses, in the order their events are reported. */
10
+ const REQUEST_BOUNDARIES = [
11
+ 'user',
12
+ 'slots',
13
+ 'repair',
14
+ 'attachment',
15
+ 'voice',
16
+ 'history',
17
+ 'system',
18
+ ];
19
+ function sanitizeSlots(slots, reader) {
20
+ if (!slots) {
21
+ return slots;
22
+ }
23
+ return Object.fromEntries(Object.entries(slots).map(([key, value]) => [key, reader.read(value)]));
24
+ }
25
+ /** The browser's context is the visitor's to change; the host's is built by its own code, like turn system text. */
26
+ const CONTEXT_TRUST = {
27
+ client: 'untrusted',
28
+ server: 'assembled',
29
+ };
30
+ /** A context package as the model reads it: text as written, anything else as JSON. */
31
+ function contextText(value) {
32
+ return typeof value === 'string' ? value : JSON.stringify(value);
33
+ }
34
+ /** Each sender's package read at the `context` boundary, with what was found there. */
35
+ function sanitizeContext(context, readerFor) {
36
+ const events = [];
37
+ let blocked = false;
38
+ if (!context)
39
+ return { context, events, blocked };
40
+ const read = {};
41
+ for (const sender of CONTEXT_SENDERS) {
42
+ const value = context[sender];
43
+ if (value === undefined)
44
+ continue;
45
+ const reader = readerFor();
46
+ read[sender] = reader.read(contextText(value));
47
+ const found = reader.found();
48
+ const event = detectEvent('context', found);
49
+ if (event)
50
+ events.push({ ...event, trust: CONTEXT_TRUST[sender] });
51
+ blocked ||= found.action === 'block';
52
+ }
53
+ return { context: read, events, blocked };
54
+ }
55
+ const PROJECT_ID_OK = /^[A-Za-z0-9._-]+$/;
56
+ /** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
57
+ function sanitizeProjectId(id) {
58
+ const trimmed = id?.trim();
59
+ return trimmed && PROJECT_ID_OK.test(trimmed) ? trimmed : undefined;
60
+ }
61
+ function sanitizeRepair(repair, reader) {
62
+ if (!repair) {
63
+ return repair;
64
+ }
65
+ const guidance = repair.guidance ? reader.read(repair.guidance) : undefined;
66
+ return {
67
+ previousOutput: reader.read(repair.previousOutput),
68
+ rejection: reader.read(repair.rejection),
69
+ ...(guidance ? { guidance } : {}),
70
+ };
71
+ }
72
+ /**
73
+ * Exported because every path that injects messages into a turn needs it — turn
74
+ * history, and host steer injects mid-turn. A second copy would drift.
75
+ */
76
+ function sanitizeHistory(history, reader) {
77
+ return history.map((m) => {
78
+ const content = m.content === undefined ? undefined : reader.read(m.content);
79
+ const parts = m.parts?.map((p) => p.type === 'text' ? { ...p, text: reader.read(p.text) } : p);
80
+ return {
81
+ role: m.role,
82
+ ...(content !== undefined ? { content } : {}),
83
+ ...(parts ? { parts } : {}),
84
+ ...(m.tool_calls ? { tool_calls: m.tool_calls } : {}),
85
+ ...(m.tool_call_id ? { tool_call_id: m.tool_call_id } : {}),
86
+ ...(m.name ? { name: m.name } : {}),
87
+ ...(m.metadata ? { metadata: m.metadata } : {}),
88
+ // why: Google refuses a call from the current turn replayed without its thought signature, so a reply resumed after a gate needs it.
89
+ ...(m.reasoning ? { reasoning: m.reasoning } : {}),
90
+ };
91
+ });
92
+ }
93
+ /** The error a turn ends on when a detector set to `block` matched at `boundary`. */
94
+ function requestRefused(boundary) {
95
+ // labels-exempt: developer contract / internal diagnostic — the user's wording is `detect.blocked`
96
+ return new TheoremError('input', `guardrails.detect blocked the request at ${boundary}`, {
97
+ copy: { key: 'detect.blocked' },
98
+ });
99
+ }
100
+ /**
101
+ * `req.system` is host-assembled per turn — it interpolates retrieval and user
102
+ * data, so it is read at its own boundary. `identity.system` never reaches this
103
+ * path and stays verbatim.
104
+ */
105
+ function sanitizeTurnRequestWithEvents(req, profile) {
106
+ const { detect } = resolveGuardrailPolicy(profile.guardrails);
107
+ const at = recordOf(REQUEST_BOUNDARIES, (boundary) => boundaryReader(boundary, detect));
108
+ const input = req.input ?? {};
109
+ const text = input.text === undefined ? undefined : at.user.read(input.text);
110
+ const system = req.system === undefined
111
+ ? undefined
112
+ : mapSystemPrompt(req.system, 'TurnRequest.system', (part) => at.system.read(part));
113
+ const slots = sanitizeSlots(input.slots, at.slots);
114
+ const told = sanitizeContext(input.context, () => boundaryReader('context', detect));
115
+ const repair = sanitizeRepair(input.repair, at.repair);
116
+ const history = input.history ? sanitizeHistory(input.history, at.history) : undefined;
117
+ const { attachments, voice } = input.attachments?.length || input.voice?.length
118
+ ? sanitizeTurnBlobs(profile, input.attachments, input.voice, at)
119
+ : input;
120
+ const events = [];
121
+ let refusal;
122
+ for (const boundary of REQUEST_BOUNDARIES) {
123
+ const found = at[boundary].found();
124
+ const event = detectEvent(boundary, found);
125
+ if (event)
126
+ events.push(guardrailTurnEvent(event));
127
+ if (found.action === 'block')
128
+ refusal ??= requestRefused(boundary);
129
+ }
130
+ events.push(...told.events.map(guardrailTurnEvent));
131
+ if (told.blocked)
132
+ refusal ??= requestRefused('context');
133
+ return {
134
+ request: {
135
+ ...req,
136
+ system,
137
+ projectId: sanitizeProjectId(req.projectId),
138
+ input: {
139
+ ...input,
140
+ text,
141
+ slots,
142
+ ...(told.context ? { context: told.context } : {}),
143
+ repair,
144
+ history,
145
+ attachments,
146
+ voice,
147
+ },
148
+ },
149
+ events,
150
+ ...(refusal ? { refusal } : {}),
151
+ };
152
+ }
153
+ /** The turn request with its input cleaned under the profile's guardrails. Throws when a match blocks it. */
154
+ function sanitizeTurnRequest(req, profile) {
155
+ const { request, refusal } = sanitizeTurnRequestWithEvents(req, profile);
156
+ if (refusal)
157
+ throw refusal;
158
+ return request;
159
+ }
160
+ export { contextText, requestRefused, sanitizeContext, sanitizeHistory, sanitizeProjectId, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The names of the sensitive-data groups and how a profile switches them, apart from the patterns
3
+ * that find them: what reads or shows a profile's settings has no need of the patterns.
4
+ *
5
+ * @module
6
+ */
7
+ /**
8
+ * The families of sensitive data, each switched on its own: a profile can
9
+ * redact credentials and card numbers but leave network addresses alone.
10
+ */
11
+ declare const SENSITIVE_GROUPS: readonly ["ids", "financial", "network", "credentials"];
12
+ /** A group of sensitive-value checks: ids, financial, network, or credentials. */
13
+ type SensitiveGroup = (typeof SENSITIVE_GROUPS)[number];
14
+ /** Per group, whether it runs. A group left out keeps its default. */
15
+ type SensitiveSwitches = Partial<Record<SensitiveGroup, boolean>>;
16
+ /** `true` runs every group, `false` none; an object switches the groups it names. */
17
+ type SensitiveSelection = boolean | SensitiveSwitches;
18
+ /** Every group's switch, defaults applied. */
19
+ type SensitiveGroups = Readonly<Record<SensitiveGroup, boolean>>;
20
+ export type { SensitiveGroup, SensitiveGroups, SensitiveSelection, SensitiveSwitches };
21
+ export { SENSITIVE_GROUPS };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The names of the sensitive-data groups and how a profile switches them, apart from the patterns
3
+ * that find them: what reads or shows a profile's settings has no need of the patterns.
4
+ *
5
+ * @module
6
+ */
7
+ /**
8
+ * The families of sensitive data, each switched on its own: a profile can
9
+ * redact credentials and card numbers but leave network addresses alone.
10
+ */
11
+ const SENSITIVE_GROUPS = ['ids', 'financial', 'network', 'credentials'];
12
+ export { SENSITIVE_GROUPS };
@@ -0,0 +1,22 @@
1
+ import { type RedactSpan } from '../observability/spans.js';
2
+ import type { SensitiveGroup, SensitiveSelection } from './sensitive-groups.js';
3
+ declare const CARD_CANDIDATE: RegExp;
4
+ interface SensitivePattern {
5
+ group: SensitiveGroup;
6
+ pattern: RegExp;
7
+ /** Whether a match at `at` of `text` counts. */
8
+ hit?: (match: string, text: string, at: number) => boolean;
9
+ }
10
+ /** Every pattern, with its group. */
11
+ declare const SENSITIVE_PATTERNS: readonly SensitivePattern[];
12
+ /**
13
+ * A card-number candidate at `at` of `text` that is a card: digits a card
14
+ * network issues, passing the Luhn check, outside a web address. A run of
15
+ * digits in an address is the address's own identifier: one random 19-digit
16
+ * identifier in a hundred passes the first two tests.
17
+ */
18
+ declare function cardHit(blob: string, text: string, at: number): boolean;
19
+ /** Sensitive-data spans in `text`, from the groups `selection` runs (every group by default). */
20
+ declare function sensitiveSpans(text: string, selection?: SensitiveSelection): RedactSpan[];
21
+ export type { SensitivePattern };
22
+ export { CARD_CANDIDATE, cardHit, SENSITIVE_PATTERNS, sensitiveSpans };
@@ -0,0 +1,234 @@
1
+ import { blobAt, spansFromPatterns } from '../observability/spans.js';
2
+ import { CREDENTIAL_RULES, GLOBAL_ALLOWLIST } from './credential-rules.js';
3
+ import { credentialHit, credentialSpans } from './credential-scan.js';
4
+ const SSN = /\b\d{3}-\d{2}-\d{4}\b/g;
5
+ const SSN_CONTEXTUAL = /(?:SSN|social\s*security(?:\s*number)?)[:\s]+\d(?:[-\s]*\d){8}/gi;
6
+ const ITIN = /\b9\d{2}-\d{2}-\d{4}\b/g;
7
+ const EIN = /\b\d{2}-\d{7}\b/g;
8
+ const IBAN = /\b[A-Z]{2}\d{2}[A-Z0-9]{13,30}\b/g;
9
+ const IPV4 = /\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b/g;
10
+ const HEX_GROUP = '[0-9a-f]{1,4}';
11
+ const DOTTED_QUAD = '(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)';
12
+ /** Every RFC 4291 text form: full, `::`-compressed, and with a dotted IPv4 tail. */
13
+ const IPV6_FORMS = [
14
+ `(?:${HEX_GROUP}:){6}${DOTTED_QUAD}`,
15
+ `(?:${HEX_GROUP}:){1,5}:${DOTTED_QUAD}`,
16
+ `::(?:${HEX_GROUP}:){0,5}${DOTTED_QUAD}`,
17
+ `(?:${HEX_GROUP}:){7}${HEX_GROUP}`,
18
+ `(?:${HEX_GROUP}:){1,6}(?::${HEX_GROUP}){1,6}`,
19
+ `(?:${HEX_GROUP}:){1,7}:`,
20
+ `:(?::${HEX_GROUP}){1,7}`,
21
+ ];
22
+ const IPV6 = new RegExp(`(?<![\\w:.])(?:${IPV6_FORMS.join('|')})(?![\\w:])`, 'gi');
23
+ /** Credentials gitleaks' rules miss: keys cut short or spaced out, a short private key, and a bare bearer token. */
24
+ const OWN_CREDENTIAL_RULES = [
25
+ {
26
+ id: 'openai-api-key-any',
27
+ pattern: /\bsk-\s*[A-Za-z0-9]{20,}\b/,
28
+ keywords: ['sk-'],
29
+ allowlists: [],
30
+ },
31
+ {
32
+ id: 'anthropic-api-key-any',
33
+ pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}\b/,
34
+ keywords: ['sk-ant-'],
35
+ allowlists: [],
36
+ },
37
+ {
38
+ id: 'openrouter-api-key',
39
+ pattern: /\bsk-or-[A-Za-z0-9_-]{20,}\b/,
40
+ keywords: ['sk-or-'],
41
+ allowlists: [],
42
+ },
43
+ {
44
+ id: 'github-fine-grained-pat-any',
45
+ pattern: /\bgithub_pat_[A-Za-z0-9_]{20,}\b/,
46
+ keywords: ['github_pat_'],
47
+ allowlists: [],
48
+ },
49
+ {
50
+ id: 'slack-token-any',
51
+ pattern: /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/,
52
+ keywords: ['xox'],
53
+ allowlists: [],
54
+ },
55
+ {
56
+ id: 'private-key-any',
57
+ pattern: /-----BEGIN (?:(?:RSA|DSA|EC|OPENSSH|ENCRYPTED|PGP) )?PRIVATE KEY(?: BLOCK)?-----[\s\S]{0,16384}?-----END (?:(?:RSA|DSA|EC|OPENSSH|ENCRYPTED|PGP) )?PRIVATE KEY(?: BLOCK)?-----/,
58
+ keywords: ['-----begin'],
59
+ allowlists: [],
60
+ },
61
+ {
62
+ id: 'bearer-token',
63
+ pattern: /\bBearer[ \t]+([A-Za-z0-9._~+/-]{16,}=*)/i,
64
+ entropy: 3,
65
+ keywords: ['bearer'],
66
+ allowlists: [],
67
+ },
68
+ ];
69
+ /** Every credential rule: gitleaks', then Theorem's own. */
70
+ const CREDENTIALS = [...CREDENTIAL_RULES, ...OWN_CREDENTIAL_RULES];
71
+ const CARD_CANDIDATE = /\b(?:\d[\s.-]*?){13,19}\b/g;
72
+ /** The patterns each group matches. Card numbers are financial too, found by `cardSpans`; credentials by `credentialSpans`. */
73
+ const GROUP_PATTERNS = {
74
+ ids: [SSN, SSN_CONTEXTUAL, ITIN, EIN],
75
+ financial: [IBAN],
76
+ network: [IPV4, IPV6],
77
+ };
78
+ /** Every pattern, with its group. */
79
+ const SENSITIVE_PATTERNS = [
80
+ ...['ids', 'financial', 'network'].flatMap((group) => GROUP_PATTERNS[group].map((pattern) => ({ group, pattern }))),
81
+ ...CREDENTIALS.map((rule) => ({
82
+ group: 'credentials',
83
+ pattern: new RegExp(rule.pattern.source, `${rule.pattern.flags}g`),
84
+ hit: (match, text, at) => credentialHit(rule, GLOBAL_ALLOWLIST, match, text, at),
85
+ })),
86
+ ];
87
+ const ALL_GROUPS = {
88
+ ids: true,
89
+ financial: true,
90
+ network: true,
91
+ credentials: true,
92
+ };
93
+ /** `selection` with the groups it leaves out taken from `defaults`. */
94
+ function resolveSensitive(selection, defaults = ALL_GROUPS) {
95
+ if (selection === undefined)
96
+ return defaults;
97
+ if (typeof selection === 'boolean') {
98
+ return { ids: selection, financial: selection, network: selection, credentials: selection };
99
+ }
100
+ return { ...defaults, ...selection };
101
+ }
102
+ const LUHN_DOUBLE = 2;
103
+ const LUHN_NINE = 9;
104
+ const LUHN_TEN = 10;
105
+ function luhnOk(digits) {
106
+ let sum = 0;
107
+ let doubleIt = false;
108
+ for (let i = digits.length - 1; i >= 0; i -= 1) {
109
+ const ch = digits[i];
110
+ if (ch === undefined) {
111
+ return false;
112
+ }
113
+ let n = Number(ch);
114
+ if (doubleIt) {
115
+ n *= LUHN_DOUBLE;
116
+ if (n > LUHN_NINE) {
117
+ n -= LUHN_NINE;
118
+ }
119
+ }
120
+ sum += n;
121
+ doubleIt = !doubleIt;
122
+ }
123
+ return sum % LUHN_TEN === 0;
124
+ }
125
+ const LENGTHS_16_TO_19 = [16, 17, 18, 19];
126
+ /** Visa, Mastercard, American Express, Diners Club, Discover, JCB, UnionPay, Maestro, Mir, and RuPay, in that order. */
127
+ const CARD_NETWORKS = [
128
+ { leading: [['4', '4']], lengths: [13, 16, 19] },
129
+ {
130
+ leading: [
131
+ ['51', '55'],
132
+ ['2221', '2720'],
133
+ ],
134
+ lengths: [16],
135
+ },
136
+ {
137
+ leading: [
138
+ ['34', '34'],
139
+ ['37', '37'],
140
+ ],
141
+ lengths: [15],
142
+ },
143
+ {
144
+ leading: [
145
+ ['300', '305'],
146
+ ['3095', '3095'],
147
+ ['36', '36'],
148
+ ['38', '39'],
149
+ ],
150
+ lengths: [14, 15, ...LENGTHS_16_TO_19],
151
+ },
152
+ {
153
+ leading: [
154
+ ['6011', '6011'],
155
+ ['644', '649'],
156
+ ['65', '65'],
157
+ ],
158
+ lengths: LENGTHS_16_TO_19,
159
+ },
160
+ { leading: [['3528', '3589']], lengths: LENGTHS_16_TO_19 },
161
+ { leading: [['62', '62']], lengths: LENGTHS_16_TO_19 },
162
+ {
163
+ leading: [
164
+ ['5018', '5018'],
165
+ ['5020', '5020'],
166
+ ['5038', '5038'],
167
+ ['5893', '5893'],
168
+ ['6304', '6304'],
169
+ ['6759', '6759'],
170
+ ['6761', '6763'],
171
+ ],
172
+ lengths: [13, 14, 15, ...LENGTHS_16_TO_19],
173
+ },
174
+ { leading: [['2200', '2204']], lengths: LENGTHS_16_TO_19 },
175
+ {
176
+ leading: [
177
+ ['60', '60'],
178
+ ['81', '82'],
179
+ ['508', '508'],
180
+ ['353', '353'],
181
+ ['356', '356'],
182
+ ],
183
+ lengths: [16],
184
+ },
185
+ ];
186
+ /** Whether some card network issues numbers that start and run as long as `digits`. */
187
+ function isIssued(digits) {
188
+ return CARD_NETWORKS.some((network) => network.lengths.includes(digits.length) &&
189
+ network.leading.some(([low, high]) => {
190
+ const start = digits.slice(0, low.length);
191
+ return start >= low && start <= high;
192
+ }));
193
+ }
194
+ const URL_SCHEME = /https?:\/\//i;
195
+ const URL_LOOKBACK = 2048;
196
+ /** Whether `at` of `text` is inside a web address: the unbroken run of characters before it holds `http://` or `https://`. */
197
+ function isInUrl(text, at) {
198
+ const floor = Math.max(0, at - URL_LOOKBACK);
199
+ let from = at;
200
+ while (from > floor && !/\s/.test(text[from - 1] ?? ' '))
201
+ from -= 1;
202
+ return URL_SCHEME.test(text.slice(from, at));
203
+ }
204
+ /**
205
+ * A card-number candidate at `at` of `text` that is a card: digits a card
206
+ * network issues, passing the Luhn check, outside a web address. A run of
207
+ * digits in an address is the address's own identifier: one random 19-digit
208
+ * identifier in a hundred passes the first two tests.
209
+ */
210
+ function cardHit(blob, text, at) {
211
+ const digits = blob.replaceAll(/[^\d]/g, '');
212
+ return isIssued(digits) && luhnOk(digits) && !isInUrl(text, at);
213
+ }
214
+ function cardSpans(text) {
215
+ const spans = [];
216
+ for (const match of text.matchAll(CARD_CANDIDATE)) {
217
+ const found = blobAt(match);
218
+ if (found && cardHit(found.blob, text, found.index)) {
219
+ spans.push({ start: found.index, end: found.index + found.blob.length, kind: 'sensitive' });
220
+ }
221
+ }
222
+ return spans;
223
+ }
224
+ /** Sensitive-data spans in `text`, from the groups `selection` runs (every group by default). */
225
+ function sensitiveSpans(text, selection = true) {
226
+ const groups = resolveSensitive(selection);
227
+ const patterns = ['ids', 'financial', 'network'].flatMap((group) => groups[group] ? GROUP_PATTERNS[group] : []);
228
+ return [
229
+ ...spansFromPatterns(text, patterns, 'sensitive'),
230
+ ...(groups.financial ? cardSpans(text) : []),
231
+ ...(groups.credentials ? credentialSpans(text, CREDENTIALS, GLOBAL_ALLOWLIST) : []),
232
+ ];
233
+ }
234
+ export { CARD_CANDIDATE, cardHit, SENSITIVE_PATTERNS, sensitiveSpans };