@theoremjs/agents 0.3.0 → 0.3.2

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 (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +25 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +881 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +8 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +174 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +329 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +130 -88
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +102 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -6,51 +6,42 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- /** Injection phrasing or sensitive data stripped from text entering the turn. */
10
- export declare const SANITIZE_RULES: {
11
- readonly injection: "sanitize.injection";
12
- readonly sensitive: "sanitize.sensitive";
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";
13
23
  };
14
- /** What the bundled egress policy finds in the model's outbound text. */
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. */
15
27
  export declare const EGRESS_RULES: {
16
- readonly canary: "egress.canary-leak";
17
- /** The reply repeats the system prompt (`guardrails.promptEcho`). */
18
- readonly promptEcho: "egress.prompt-echo";
19
28
  /**
20
29
  * A provider-side built-in tool carried the canary or the system prompt. It
21
30
  * ran before Theorem saw it: the data already left, so this is an incident.
22
31
  */
23
32
  readonly providerToolLeak: "egress.provider-tool-leak";
24
- readonly sensitive: "egress.sensitive-echo";
25
- readonly boundary: "egress.system-boundary";
26
- readonly injection: "egress.injection-echo";
27
- /** An image loads a URL the model was not given, from a host not allowed. */
28
- readonly image: "egress.image-exfil";
29
- /** A link goes to a URL the model was not given, on a host not allowed. */
30
- readonly link: "egress.link-exfil";
31
33
  /** Payload could not be rendered for inspection — released output is unverified. */
32
34
  readonly unscannable: "egress.unscannable";
33
- readonly enforcerError: "egress.enforcer-error";
34
- /** The progressive gate stopped the stream on a host verdict that named no rule. */
35
- readonly blocked: "egress.blocked";
36
35
  };
37
- /** Remote tool content behaving like an instruction to the agent. */
38
- export declare const DIRECTIVE_RULES: {
39
- readonly toolName: "tool_result.names-callable-tool";
40
- readonly imperative: "tool_result.imperative";
41
- readonly authority: "tool_result.authority-claim";
42
- };
43
- /** The tool boundary: results and failures redacted, and calls flagged or blocked. */
36
+ /** A tool call refused for what the turn read before it. */
44
37
  export declare const TOOL_RULES: {
45
- readonly resultRedacted: "tool_result.redacted";
46
- readonly failureRedacted: "tool_failure.redacted";
47
- readonly sensitiveArgument: "tool_call.sensitive-argument";
48
38
  readonly taintedTurn: "tool_call.tainted-turn";
49
39
  readonly steeredTurn: "tool_call.steered-turn";
40
+ readonly remoteDestination: "tool_call.remote-destination";
50
41
  };
51
42
  /** A tool's network target refused before any request was made. */
52
43
  export declare const NETWORK_RULES: {
53
44
  readonly blocked: "network.blocked";
54
45
  };
55
46
  /** A rule id Theorem's own guardrails report. */
56
- export type GuardrailRule = (typeof SANITIZE_RULES)[keyof typeof SANITIZE_RULES] | (typeof EGRESS_RULES)[keyof typeof EGRESS_RULES] | (typeof DIRECTIVE_RULES)[keyof typeof DIRECTIVE_RULES] | (typeof TOOL_RULES)[keyof typeof TOOL_RULES] | (typeof NETWORK_RULES)[keyof typeof NETWORK_RULES];
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];
@@ -6,47 +6,40 @@
6
6
  *
7
7
  * @module
8
8
  */
9
- /** Injection phrasing or sensitive data stripped from text entering the turn. */
10
- export const SANITIZE_RULES = {
11
- injection: 'sanitize.injection',
12
- sensitive: 'sanitize.sensitive',
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',
13
23
  };
14
- /** What the bundled egress policy finds in the model's outbound text. */
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. */
15
29
  export const EGRESS_RULES = {
16
- canary: 'egress.canary-leak',
17
- /** The reply repeats the system prompt (`guardrails.promptEcho`). */
18
- promptEcho: 'egress.prompt-echo', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
19
30
  /**
20
31
  * A provider-side built-in tool carried the canary or the system prompt. It
21
32
  * ran before Theorem saw it: the data already left, so this is an incident.
22
33
  */
23
- providerToolLeak: 'egress.provider-tool-leak', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
24
- sensitive: 'egress.sensitive-echo',
25
- boundary: 'egress.system-boundary',
26
- injection: 'egress.injection-echo', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
27
- /** An image loads a URL the model was not given, from a host not allowed. */
28
- image: 'egress.image-exfil', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
29
- /** A link goes to a URL the model was not given, on a host not allowed. */
30
- link: 'egress.link-exfil', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
34
+ providerToolLeak: 'egress.provider-tool-leak', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
31
35
  /** Payload could not be rendered for inspection — released output is unverified. */
32
- unscannable: 'egress.unscannable', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
33
- enforcerError: 'egress.enforcer-error', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
34
- /** The progressive gate stopped the stream on a host verdict that named no rule. */
35
- blocked: 'egress.blocked',
36
+ unscannable: 'egress.unscannable', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
36
37
  };
37
- /** Remote tool content behaving like an instruction to the agent. */
38
- export const DIRECTIVE_RULES = {
39
- toolName: 'tool_result.names-callable-tool',
40
- imperative: 'tool_result.imperative',
41
- authority: 'tool_result.authority-claim',
42
- };
43
- /** The tool boundary: results and failures redacted, and calls flagged or blocked. */
38
+ /** A tool call refused for what the turn read before it. */
44
39
  export const TOOL_RULES = {
45
- resultRedacted: 'tool_result.redacted',
46
- failureRedacted: 'tool_failure.redacted',
47
- sensitiveArgument: 'tool_call.sensitive-argument',
48
40
  taintedTurn: 'tool_call.tainted-turn',
49
41
  steeredTurn: 'tool_call.steered-turn',
42
+ remoteDestination: 'tool_call.remote-destination',
50
43
  };
51
44
  /** A tool's network target refused before any request was made. */
52
45
  export const NETWORK_RULES = {
@@ -1,23 +1,40 @@
1
- import type { NormalizedTurnRequest, Profile, TurnEvent, TurnRequest } from '../kernel/types.js';
2
- import { type DetectionOptions } from './policy.js';
3
- import type { GuardrailHit, TrustLevel } from './types.js';
4
- declare function detectText(text: string, options?: Partial<DetectionOptions>): {
5
- text: string;
6
- hits: GuardrailHit[];
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;
7
13
  };
8
- declare function sanitizeText(text: string, options?: Partial<DetectionOptions>): string;
9
- declare function redactSensitiveOnly(text: string): string;
14
+ /** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
10
15
  declare function sanitizeProjectId(id: string | undefined): string | undefined;
11
16
  /**
12
17
  * Exported because every path that injects messages into a turn needs it — turn
13
18
  * history, and host steer injects mid-turn. A second copy would drift.
14
19
  */
15
- declare function sanitizeHistory(history: import('../kernel/types.js').TurnHistoryMessage[], options: DetectionOptions, hits?: GuardrailHit[]): import('../kernel/types.js').TurnHistoryMessage[];
16
- declare function detectionForProfile(profile: Profile, trust: TrustLevel): DetectionOptions;
17
- declare function sanitizeTurnRequest(req: TurnRequest, profile: Profile): NormalizedTurnRequest;
18
- /** Attachments and voice are validated but emit no guardrail events. */
19
- declare function sanitizeTurnRequestWithEvents(req: TurnRequest, profile: Profile): {
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 {
20
25
  request: NormalizedTurnRequest;
26
+ /** One guardrail event for each boundary where something matched. */
21
27
  events: TurnEvent[];
22
- };
23
- export { detectionForProfile, detectText, redactSensitiveOnly, sanitizeHistory, sanitizeProjectId, sanitizeText, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
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, };
@@ -1,67 +1,71 @@
1
1
  import { sanitizeTurnBlobs } from '../kernel/registry/attachments.js';
2
+ import { CONTEXT_SENDERS } from '../kernel/schema.js';
2
3
  import { mapSystemPrompt } from '../kernel/system-parts.js';
3
- import { applySpans } from '../observability/spans.js';
4
- import { guardrailFromHits } from './events.js';
5
- import { hitFromSpan } from './hits.js';
6
- import { injectionSpans } from './injection.js';
7
- import { detectionForTrust, resolveGuardrailPolicy } from './policy.js';
8
- import { SANITIZE_RULES } from './rules.js';
9
- import { anySensitive, resolveSensitive, sensitiveSpans } from './sensitive.js';
10
- function detectText(text, options) {
11
- const sanitizeInput = options?.sanitizeInput ?? true;
12
- const groups = resolveSensitive(options?.redactSensitive);
13
- if (!sanitizeInput && !anySensitive(groups)) {
14
- return { text, hits: [] };
15
- }
16
- const spans = [...(sanitizeInput ? injectionSpans(text) : []), ...sensitiveSpans(text, groups)];
17
- const hits = spans.map((span) => hitFromSpan(text, span, span.kind === 'injection' ? SANITIZE_RULES.injection : SANITIZE_RULES.sensitive, 'high'));
18
- return { text: applySpans(text, spans), hits };
19
- }
20
- function sanitizeText(text, options) {
21
- return detectText(text, options).text;
22
- }
23
- function redactSensitiveOnly(text) {
24
- return detectText(text, { sanitizeInput: false, redactSensitive: true }).text;
25
- }
26
- function appendHits(into, hits) {
27
- for (const hit of hits) {
28
- into.push(hit);
29
- }
30
- }
31
- function sanitizeSlots(slots, options, hits) {
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) {
32
20
  if (!slots) {
33
21
  return slots;
34
22
  }
35
- const out = {};
36
- for (const [key, value] of Object.entries(slots)) {
37
- const detected = detectText(value, options);
38
- appendHits(hits, detected.hits);
39
- out[key] = detected.text;
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';
40
52
  }
41
- return out;
53
+ return { context: read, events, blocked };
42
54
  }
43
55
  const PROJECT_ID_OK = /^[A-Za-z0-9._-]+$/;
56
+ /** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
44
57
  function sanitizeProjectId(id) {
45
58
  const trimmed = id?.trim();
46
59
  return trimmed && PROJECT_ID_OK.test(trimmed) ? trimmed : undefined;
47
60
  }
48
- function sanitizeRepair(repair, options, hits) {
61
+ function sanitizeRepair(repair, reader) {
49
62
  if (!repair) {
50
63
  return repair;
51
64
  }
52
- const previous = detectText(repair.previousOutput, options);
53
- const rejection = detectText(repair.rejection, options);
54
- appendHits(hits, previous.hits);
55
- appendHits(hits, rejection.hits);
56
- let guidance = repair.guidance;
57
- if (guidance) {
58
- const detected = detectText(guidance, options);
59
- appendHits(hits, detected.hits);
60
- guidance = detected.text;
61
- }
65
+ const guidance = repair.guidance ? reader.read(repair.guidance) : undefined;
62
66
  return {
63
- previousOutput: previous.text,
64
- rejection: rejection.text,
67
+ previousOutput: reader.read(repair.previousOutput),
68
+ rejection: reader.read(repair.rejection),
65
69
  ...(guidance ? { guidance } : {}),
66
70
  };
67
71
  }
@@ -69,25 +73,10 @@ function sanitizeRepair(repair, options, hits) {
69
73
  * Exported because every path that injects messages into a turn needs it — turn
70
74
  * history, and host steer injects mid-turn. A second copy would drift.
71
75
  */
72
- function sanitizeHistory(history, options, hits = []) {
76
+ function sanitizeHistory(history, reader) {
73
77
  return history.map((m) => {
74
- let content = m.content;
75
- if (content !== undefined) {
76
- const detected = detectText(content, options);
77
- appendHits(hits, detected.hits);
78
- content = detected.text;
79
- }
80
- let parts = m.parts;
81
- if (parts) {
82
- parts = parts.map((p) => {
83
- if (p.type !== 'text') {
84
- return p;
85
- }
86
- const detected = detectText(p.text, options);
87
- appendHits(hits, detected.hits);
88
- return { ...p, text: detected.text };
89
- });
90
- }
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);
91
80
  return {
92
81
  role: m.role,
93
82
  ...(content !== undefined ? { content } : {}),
@@ -96,53 +85,51 @@ function sanitizeHistory(history, options, hits = []) {
96
85
  ...(m.tool_call_id ? { tool_call_id: m.tool_call_id } : {}),
97
86
  ...(m.name ? { name: m.name } : {}),
98
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 } : {}),
99
90
  };
100
91
  });
101
92
  }
102
- function detectionForProfile(profile, trust) {
103
- return detectionForTrust(resolveGuardrailPolicy(profile.guardrails), trust);
104
- }
105
- function pushStageEvent(events, stage, trust, hits) {
106
- const event = guardrailFromHits(stage, trust, hits, 'redact');
107
- if (event) {
108
- events.push(event);
109
- }
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
+ });
110
99
  }
111
100
  /**
112
101
  * `req.system` is host-assembled per turn — it interpolates retrieval and user
113
- * data, so it is treated as `assembled`, not trusted. `identity.system` never
114
- * reaches this path and stays verbatim.
102
+ * data, so it is read at its own boundary. `identity.system` never reaches this
103
+ * path and stays verbatim.
115
104
  */
116
- function sanitizeTurnRequestText(req, profile) {
117
- const untrusted = detectionForProfile(profile, 'untrusted');
118
- const assembled = detectionForProfile(profile, 'assembled');
105
+ function sanitizeTurnRequestWithEvents(req, profile) {
106
+ const { detect } = resolveGuardrailPolicy(profile.guardrails);
107
+ const at = recordOf(REQUEST_BOUNDARIES, (boundary) => boundaryReader(boundary, detect));
119
108
  const input = req.input ?? {};
120
- const events = [];
121
- const inputHits = [];
122
- const historyHits = [];
123
- const systemHits = [];
124
- const { text: rawText } = input;
125
- let text = rawText;
126
- if (rawText !== undefined) {
127
- const detected = detectText(rawText, untrusted);
128
- appendHits(inputHits, detected.hits);
129
- text = detected.text;
130
- }
109
+ const text = input.text === undefined ? undefined : at.user.read(input.text);
131
110
  const system = req.system === undefined
132
111
  ? undefined
133
- : mapSystemPrompt(req.system, 'TurnRequest.system', (part) => {
134
- const detected = detectText(part, assembled);
135
- appendHits(systemHits, detected.hits);
136
- return detected.text;
137
- });
138
- const slots = sanitizeSlots(input.slots, untrusted, inputHits);
139
- const repair = sanitizeRepair(input.repair, untrusted, inputHits);
140
- const history = input.history
141
- ? sanitizeHistory(input.history, untrusted, historyHits)
142
- : undefined;
143
- pushStageEvent(events, 'input', 'untrusted', inputHits);
144
- pushStageEvent(events, 'history', 'untrusted', historyHits);
145
- pushStageEvent(events, 'system', 'assembled', systemHits);
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');
146
133
  return {
147
134
  request: {
148
135
  ...req,
@@ -152,33 +139,22 @@ function sanitizeTurnRequestText(req, profile) {
152
139
  ...input,
153
140
  text,
154
141
  slots,
142
+ ...(told.context ? { context: told.context } : {}),
155
143
  repair,
156
144
  history,
157
- },
158
- },
159
- events,
160
- };
161
- }
162
- function sanitizeTurnRequest(req, profile) {
163
- return sanitizeTurnRequestWithEvents(req, profile).request;
164
- }
165
- /** Attachments and voice are validated but emit no guardrail events. */
166
- function sanitizeTurnRequestWithEvents(req, profile) {
167
- const { request: textSafe, events } = sanitizeTurnRequestText(req, profile);
168
- const input = textSafe.input ?? {};
169
- const { attachments, voice } = input.attachments?.length || input.voice?.length
170
- ? sanitizeTurnBlobs(profile, input.attachments, input.voice)
171
- : input;
172
- return {
173
- request: {
174
- ...textSafe,
175
- input: {
176
- ...input,
177
145
  attachments,
178
146
  voice,
179
147
  },
180
148
  },
181
149
  events,
150
+ ...(refusal ? { refusal } : {}),
182
151
  };
183
152
  }
184
- export { detectionForProfile, detectText, redactSensitiveOnly, sanitizeHistory, sanitizeProjectId, sanitizeText, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
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 };
@@ -1,29 +1,22 @@
1
1
  import { type RedactSpan } from '../observability/spans.js';
2
+ import type { SensitiveGroup, SensitiveSelection } from './sensitive-groups.js';
2
3
  declare const CARD_CANDIDATE: RegExp;
3
- /**
4
- * The families of sensitive data, each switched on its own: a profile can
5
- * redact credentials and card numbers but leave network addresses alone.
6
- */
7
- declare const SENSITIVE_GROUPS: readonly ["ids", "financial", "network", "credentials"];
8
- type SensitiveGroup = (typeof SENSITIVE_GROUPS)[number];
9
- /** Per group, whether it runs. A group left out keeps its default. */
10
- type SensitiveSwitches = Partial<Record<SensitiveGroup, boolean>>;
11
- /** `true` runs every group, `false` none; an object switches the groups it names. */
12
- type SensitiveSelection = boolean | SensitiveSwitches;
13
- /** Every group's switch, defaults applied. */
14
- type SensitiveGroups = Readonly<Record<SensitiveGroup, boolean>>;
15
- /** Every pattern, with its group. */
16
- declare const SENSITIVE_PATTERNS: readonly {
4
+ interface SensitivePattern {
17
5
  group: SensitiveGroup;
18
6
  pattern: RegExp;
19
- }[];
20
- /** `selection` with the groups it leaves out taken from `defaults`. */
21
- declare function resolveSensitive(selection: SensitiveSelection | undefined, defaults?: SensitiveGroups): SensitiveGroups;
22
- /** Whether any group runs. */
23
- declare function anySensitive(groups: SensitiveGroups): boolean;
24
- /** A card-number candidate that is a card: 13–19 digits passing the Luhn check. */
25
- declare function cardHit(blob: string): boolean;
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;
26
19
  /** Sensitive-data spans in `text`, from the groups `selection` runs (every group by default). */
27
20
  declare function sensitiveSpans(text: string, selection?: SensitiveSelection): RedactSpan[];
28
- export type { SensitiveGroup, SensitiveGroups, SensitiveSelection, SensitiveSwitches };
29
- export { anySensitive, CARD_CANDIDATE, cardHit, resolveSensitive, SENSITIVE_GROUPS, SENSITIVE_PATTERNS, sensitiveSpans, };
21
+ export type { SensitivePattern };
22
+ export { CARD_CANDIDATE, cardHit, SENSITIVE_PATTERNS, sensitiveSpans };