@theoremjs/agents 0.3.0 → 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 (568) hide show
  1. package/README.md +276 -995
  2. package/esm/mod.d.ts +33 -19
  3. package/esm/mod.js +18 -11
  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 +23 -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 +874 -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 +29 -21
  123. package/esm/src/guardrails/mod.js +18 -13
  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 +1 -0
  135. package/esm/src/guardrails/quota.js +1 -1
  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 +4 -1
  148. package/esm/src/guardrails/theorem-error.js +3 -2
  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 +7 -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 +173 -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 +328 -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 +128 -87
  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 +105 -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/builtins.d.ts +14 -0
  435. package/esm/src/providers/google/builtins.js +57 -0
  436. package/esm/src/providers/google/grounding.d.ts +4 -4
  437. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  438. package/esm/src/providers/google/interactions/framing.js +85 -44
  439. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  440. package/esm/src/providers/google/interactions/steps.js +4 -4
  441. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  442. package/esm/src/providers/google/interactions/stream.js +33 -100
  443. package/esm/src/providers/google/live/framing.d.ts +15 -5
  444. package/esm/src/providers/google/live/framing.js +25 -25
  445. package/esm/src/providers/google/live/stream.d.ts +6 -44
  446. package/esm/src/providers/google/live/stream.js +3 -209
  447. package/esm/src/providers/google/urls.d.ts +1 -3
  448. package/esm/src/providers/google/urls.js +1 -3
  449. package/esm/src/providers/google/usage.js +2 -2
  450. package/esm/src/providers/live.d.ts +6 -0
  451. package/esm/src/providers/live.js +6 -0
  452. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  453. package/esm/src/providers/local/embedding-protocol.js +60 -0
  454. package/esm/src/providers/local/provider.d.ts +7 -0
  455. package/esm/src/providers/local/provider.js +28 -0
  456. package/esm/src/providers/mod.d.ts +28 -7
  457. package/esm/src/providers/mod.js +19 -3
  458. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  459. package/esm/src/providers/open-ai/protocol.js +189 -0
  460. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  461. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  462. package/esm/src/providers/openrouter/image.d.ts +0 -9
  463. package/esm/src/providers/openrouter/image.js +0 -153
  464. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  465. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  466. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  467. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  468. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  470. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  471. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  472. package/esm/src/providers/openrouter/protocol.js +171 -0
  473. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  474. package/esm/src/providers/openrouter/provider.js +50 -0
  475. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  476. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  477. package/esm/src/providers/shared/pcm.js +2 -2
  478. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  479. package/esm/src/providers/shared/protocol-events.js +20 -0
  480. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  481. package/esm/src/providers/shared/retry.d.ts +17 -0
  482. package/esm/src/providers/shared/retry.js +90 -0
  483. package/esm/src/providers/shared/sse.d.ts +0 -4
  484. package/esm/src/providers/shared/sse.js +50 -36
  485. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  486. package/esm/src/providers/shared/tool-args.js +10 -6
  487. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  488. package/esm/src/providers/shared/tool-draft.js +14 -0
  489. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  490. package/esm/src/providers/shared/upstream-tape.js +1 -1
  491. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  492. package/esm/src/providers/system-one/protocol.js +93 -0
  493. package/esm/src/providers/types.d.ts +48 -16
  494. package/esm/src/providers/types.js +2 -1
  495. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  496. package/esm/src/providers/typesafe/provider.js +24 -0
  497. package/esm/src/surface/formats.d.ts +19 -1
  498. package/esm/src/surface/formats.js +68 -29
  499. package/esm/src/surface/mod.d.ts +4 -2
  500. package/esm/src/surface/mod.js +4 -2
  501. package/esm/src/surface/runtime.d.ts +4 -0
  502. package/esm/src/surface/runtime.js +2 -0
  503. package/esm/src/surface/tools.d.ts +2 -8
  504. package/esm/src/surface/tools.js +4 -22
  505. package/esm/src/surface/types.d.ts +6 -0
  506. package/package.json +5 -13
  507. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  508. package/esm/src/cli/commands/egress-compile.js +0 -25
  509. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  510. package/esm/src/guardrails/egress-policy.js +0 -76
  511. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  512. package/esm/src/guardrails/egress-rules.js +0 -49
  513. package/esm/src/guardrails/lexicon.d.ts +0 -30
  514. package/esm/src/guardrails/lexicon.js +0 -478
  515. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  516. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  517. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  518. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  519. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  520. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  521. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  522. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  523. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  524. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  525. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  526. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  527. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  528. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  529. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  530. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  531. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  532. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  533. package/esm/src/presets/typesafe.d.ts +0 -2
  534. package/esm/src/presets/typesafe.js +0 -2
  535. package/esm/src/providers/create-provider.d.ts +0 -21
  536. package/esm/src/providers/create-provider.js +0 -90
  537. package/esm/src/providers/decision/usage.d.ts +0 -3
  538. package/esm/src/providers/decision/usage.js +0 -25
  539. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  540. package/esm/src/providers/google/interactions/mod.js +0 -2
  541. package/esm/src/providers/google/keys.d.ts +0 -20
  542. package/esm/src/providers/google/keys.js +0 -87
  543. package/esm/src/providers/google/live/mod.d.ts +0 -7
  544. package/esm/src/providers/google/live/mod.js +0 -7
  545. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  546. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  547. package/esm/src/providers/google/live/session.d.ts +0 -14
  548. package/esm/src/providers/google/live/session.js +0 -150
  549. package/esm/src/providers/local/local.d.ts +0 -12
  550. package/esm/src/providers/local/local.js +0 -186
  551. package/esm/src/providers/local/mod.d.ts +0 -8
  552. package/esm/src/providers/local/mod.js +0 -8
  553. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  554. package/esm/src/providers/openrouter/cache-control.js +0 -4
  555. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  556. package/esm/src/providers/openrouter/chat.js +0 -490
  557. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  558. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  559. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  560. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  561. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  562. package/esm/src/providers/openrouter/speech.js +0 -109
  563. package/esm/src/providers/probe.d.ts +0 -5
  564. package/esm/src/providers/probe.js +0 -15
  565. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  566. package/esm/src/providers/shared/builtin-wire.js +0 -9
  567. package/esm/src/providers/shared/vault.d.ts +0 -13
  568. package/esm/src/providers/shared/vault.js +0 -41
@@ -1,5 +1,6 @@
1
- import { normalizeForDetection } from './normalize.js';
2
- import { DIRECTIVE_RULES } from './rules.js';
1
+ import { typoFolded } from './injection.js';
2
+ import { overrideFrame } from './injection-patterns.js';
3
+ import { normalizedView, normalizeForDetection } from './normalize.js';
3
4
  /**
4
5
  * Imperatives aimed at an agent rather than a reader.
5
6
  *
@@ -23,8 +24,45 @@ const IMPERATIVES = [
23
24
  * articles say "to remove a user", status reports say "the user has approved".
24
25
  * Measured on a benign sample, directive signals alone produced false positives
25
26
  * on most of it. Pairing a signal with a destination removed all of them.
27
+ *
28
+ * The pairing is close. A web page always carries an address somewhere, and a
29
+ * shop's page says "Remove This Item" and "if you need to exchange it, send us
30
+ * an email at …": of 20 real search results, a destination anywhere in the
31
+ * result flagged 3. An order or a claim counts when the destination is in what
32
+ * it orders, up to the next comma; a tool's name when one is in its sentence.
26
33
  */
27
34
  const EXFIL_TARGET = /\b[\w.+-]{1,64}@[\w-]{1,63}(?:\.[\w-]{1,63}){1,4}\b|\bhttps?:\/\/\S{4,120}/i;
35
+ const EXFIL_TARGETS = new RegExp(EXFIL_TARGET.source, 'gi');
36
+ /** How far from a signal its sentence is read, where the text has no sentence ends. */
37
+ const SENTENCE_REACH = 240;
38
+ /** Whether a sentence of `text` ends at `at`: a line break, or `.`, `!`, or `?` before a space. */
39
+ function endsSentence(text, at) {
40
+ const ch = text[at];
41
+ if (ch === '\n')
42
+ return true;
43
+ return (ch === '.' || ch === '!' || ch === '?') && /\s/.test(text[at + 1] ?? ' ');
44
+ }
45
+ /** Whether a clause of `text` ends at `at`: where a sentence does, or at `,` or `;` before a space. */
46
+ function endsClause(text, at) {
47
+ const ch = text[at];
48
+ return endsSentence(text, at) || ((ch === ',' || ch === ';') && /\s/.test(text[at + 1] ?? ' '));
49
+ }
50
+ /** Where the stretch of `text` from `end` stops: at the first place `ends` holds, at most `SENTENCE_REACH` on. */
51
+ function reachFrom(text, end, ends) {
52
+ let to = end;
53
+ const ceiling = Math.min(text.length, end + SENTENCE_REACH);
54
+ while (to < ceiling && !ends(text, to))
55
+ to += 1;
56
+ return to;
57
+ }
58
+ /** Where the sentence of `text` holding `start` begins, at most `SENTENCE_REACH` back. */
59
+ function sentenceStart(text, start) {
60
+ let from = start;
61
+ const floor = Math.max(0, start - SENTENCE_REACH);
62
+ while (from > floor && !endsSentence(text, from - 1))
63
+ from -= 1;
64
+ return from;
65
+ }
28
66
  /** Claims of permission or provenance the content cannot actually hold. */
29
67
  const AUTHORITY = [
30
68
  /\b(?:the\s+)?user\s+has\s+(?:already\s+)?(?:approved|authorised|authorized|confirmed|requested)\b/gi,
@@ -32,78 +70,126 @@ const AUTHORITY = [
32
70
  /\bon\s+behalf\s+of\s+the\s+(?:user|operator|admin)\b/gi,
33
71
  /\bthis\s+(?:is|was)\s+(?:pre-?)?(?:approved|authorised|authorized)\b/gi,
34
72
  ];
35
- function matches(patterns, text) {
36
- return patterns.some((pattern) => {
37
- pattern.lastIndex = 0;
38
- return pattern.test(text);
39
- });
73
+ /**
74
+ * An order to set instructions aside. Data has no reason to address the
75
+ * agent's instructions, so here the order counts when negated and with more
76
+ * words between its verb and its object than `injection-patterns.ts` allows.
77
+ */
78
+ const OVERRIDE = [new RegExp(overrideFrame(5), 'gi')];
79
+ /** Every destination in `text` between `from` and `to`. */
80
+ function targetsIn(text, from, to) {
81
+ return [...text.slice(from, to).matchAll(EXFIL_TARGETS)].map((match) => [
82
+ from + match.index,
83
+ from + match.index + match[0].length,
84
+ ]);
85
+ }
86
+ /** Each match of `patterns` in `text` that names a destination before its clause ends, and the destinations it names. */
87
+ function directsOut(patterns, text) {
88
+ return patterns.flatMap((pattern) => [...text.matchAll(pattern)].flatMap((match) => {
89
+ const end = match.index + match[0].length;
90
+ const targets = targetsIn(text, match.index, reachFrom(text, end, endsClause));
91
+ return targets.length > 0 ? [[match.index, end], ...targets] : [];
92
+ }));
93
+ }
94
+ /** Each order in `text` to set instructions aside, read with its misspellings put right. */
95
+ function overrides(text) {
96
+ const folded = typoFolded(text);
97
+ return OVERRIDE.flatMap((pattern) => [...folded.text.matchAll(pattern)].map((match) => [folded.at(match.index), folded.at(match.index + match[0].length - 1) + 1]));
40
98
  }
41
99
  function isToolNameBoundary(ch) {
42
100
  return ch === undefined || !/[a-z0-9_-]/i.test(ch);
43
101
  }
44
- /** Word-boundary match for a tool name without compiling registry input as a pattern. */
45
- function mentionsTool(text, tool) {
102
+ /**
103
+ * Where `text` names `tool`, at word boundaries, in a sentence with a
104
+ * destination: the name, and the destinations of its sentence. A name inside a
105
+ * destination (`https://shop.example/search`) is part of the address. Registry
106
+ * input is not compiled as a pattern.
107
+ */
108
+ function directsToTool(text, tool) {
46
109
  if (tool.length < 3) {
47
- return false;
110
+ return [];
48
111
  }
49
112
  const haystack = text.toLowerCase();
50
113
  const needle = tool.toLowerCase();
114
+ const found = [];
51
115
  let at = haystack.indexOf(needle);
52
116
  while (at >= 0) {
53
- const before = haystack[at - 1];
54
- const after = haystack[at + needle.length];
55
- if (isToolNameBoundary(before) && isToolNameBoundary(after)) {
56
- return true;
117
+ const end = at + needle.length;
118
+ if (isToolNameBoundary(haystack[at - 1]) && isToolNameBoundary(haystack[end])) {
119
+ const targets = targetsIn(text, sentenceStart(text, at), reachFrom(text, end, endsSentence));
120
+ const isInTarget = targets.some(([start, stop]) => start <= at && end <= stop);
121
+ if (targets.length > 0 && !isInTarget) {
122
+ found.push([at, end], ...targets);
123
+ }
57
124
  }
58
- at = haystack.indexOf(needle, at + needle.length);
125
+ at = haystack.indexOf(needle, end);
126
+ }
127
+ return found;
128
+ }
129
+ /**
130
+ * What of a tool's text reads as an instruction to the agent: an order to set its instructions
131
+ * aside, the name of a tool it can call, an order, or a claim of authority. The last three count
132
+ * only beside a destination.
133
+ */
134
+ const DIRECTIVE_SIGNALS = ['override', 'tool_name', 'order', 'authority'];
135
+ /** One range for each run of overlapping `ranges`, in order. */
136
+ function mergedRanges(ranges) {
137
+ const runs = [];
138
+ for (const [start, end] of [...ranges].sort((a, b) => a[0] - b[0])) {
139
+ const last = runs.at(-1);
140
+ if (last && start <= last[1])
141
+ last[1] = Math.max(last[1], end);
142
+ else
143
+ runs.push([start, end]);
59
144
  }
60
- return false;
145
+ return runs;
146
+ }
147
+ /** One directive for each run of overlapping `ranges`. */
148
+ function directivesOf(signal, ranges) {
149
+ return mergedRanges(ranges).map(([start, end]) => ({ signal, start, end }));
61
150
  }
62
151
  /**
63
152
  * Real indirect injection rarely names what it attacks, so this looks for content that behaves
64
- * like an instruction. Hits raise the turn's taint rather than rewriting the text: a page
65
- * documenting an email API legitimately says "call send_email", and being wrong should cost a
66
- * refused write, not silently damaged input.
153
+ * like an instruction: each order, claim of authority, tool name, and destination, where it sits
154
+ * in `text`. A page documenting an email API legitimately says "call send_email", so the
155
+ * detector that reads with this (`tool_instructions`) starts at `flag`.
67
156
  *
68
157
  * `callableTools` is the set the model can invoke this turn. A result naming one is the
69
158
  * highest-precision signal: ordinary data has no reason to, and no generic filter can check it
70
159
  * without the turn's registry.
160
+ *
161
+ * The text is read normalized. Where that changes it, each signal found is placed on the
162
+ * stretch of `text` it was read from (`normalizedView`).
71
163
  */
72
- function directiveHits(text, callableTools = []) {
73
- if (!text || !EXFIL_TARGET.test(text)) {
74
- // No destination, no exfiltration. Action-shaped attacks that carry no target
75
- // are left to the taint gate, which does not depend on reading the content.
164
+ function directives(text, callableTools = []) {
165
+ if (!text) {
76
166
  return [];
77
167
  }
78
168
  const normalized = normalizeForDetection(text);
79
- const hits = [];
80
- // One hit per named tool — several names is a stronger signal than one.
81
- for (const _tool of callableTools.filter((tool) => mentionsTool(normalized, tool))) {
82
- hits.push({ rule: DIRECTIVE_RULES.toolName, severity: 'high' });
83
- }
84
- if (matches(IMPERATIVES, normalized)) {
85
- hits.push({ rule: DIRECTIVE_RULES.imperative, severity: 'medium' });
86
- }
87
- if (matches(AUTHORITY, normalized)) {
88
- hits.push({ rule: DIRECTIVE_RULES.authority, severity: 'medium' });
169
+ const found = directivesOf('override', overrides(normalized));
170
+ // why: No destination, no exfiltration. Action-shaped attacks that carry no target
171
+ // are left to the taint gate, which does not depend on reading the content.
172
+ if (EXFIL_TARGET.test(normalized)) {
173
+ found.push(...directivesOf('tool_name', callableTools.flatMap((tool) => directsToTool(normalized, tool))), ...directivesOf('order', directsOut(IMPERATIVES, normalized)), ...directivesOf('authority', directsOut(AUTHORITY, normalized)));
89
174
  }
90
- return hits;
91
- }
92
- function looksDirective(hits) {
93
- return hits.length > 0;
175
+ if (normalized === text || found.length === 0)
176
+ return found;
177
+ const view = normalizedView(text);
178
+ return found.map(({ signal, start, end }) => ({
179
+ signal,
180
+ start: view.start[start] ?? text.length,
181
+ end: view.end[end - 1] ?? text.length,
182
+ }));
94
183
  }
95
184
  /**
96
- * Naming a tool the model can call is the sharpest signal available, so it alone
97
- * reaches `high`; so does agreement between two different signal kinds.
185
+ * How strongly a tool's text reads as instructions, by the `signals` found in it: `high` for an
186
+ * order to drop instructions, a callable tool's name, or two signals together.
98
187
  */
99
- function advisoryLevel(hits) {
100
- if (hits.length === 0) {
188
+ function advisoryLevel(signals) {
189
+ if (signals.length === 0) {
101
190
  return 'none';
102
191
  }
103
- const kinds = new Set(hits.map((hit) => hit.rule));
104
- if (kinds.has(DIRECTIVE_RULES.toolName) || kinds.size > 1) {
105
- return 'high';
106
- }
107
- return 'elevated';
192
+ const kinds = new Set(signals);
193
+ return kinds.has('tool_name') || kinds.has('override') || kinds.size > 1 ? 'high' : 'elevated';
108
194
  }
109
- export { advisoryLevel, directiveHits, looksDirective };
195
+ export { advisoryLevel, DIRECTIVE_SIGNALS, directives, mergedRanges };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * What `tool_leak` reads for: the names of the profile's own tools, each as a word of its own,
3
+ * and the names of their parameters in double quotes, as tool-call JSON writes its keys. A
4
+ * parameter is often a plain word (`city`, `query`), so outside quotes it is left alone.
5
+ *
6
+ * @module
7
+ */
8
+ import type { RedactSpan } from '../observability/spans.js';
9
+ /** The names of a profile's own tools, and of their parameters. */
10
+ interface OwnTools {
11
+ names: readonly string[];
12
+ params: readonly string[];
13
+ }
14
+ /** A literal of a name to find, and the pattern that reads a match of it. */
15
+ interface NamePattern {
16
+ literal: string;
17
+ regex: RegExp;
18
+ }
19
+ /** The pattern of each name of `own`. A tool's name starts and ends where a word does. */
20
+ declare function namePatterns(own: OwnTools): NamePattern[];
21
+ /** Every match of a name of `own` in `text`. */
22
+ declare function toolLeakSpans(text: string, own: OwnTools | undefined): RedactSpan[];
23
+ /** `own` without the names in `innocent`, or `undefined` when none is left. */
24
+ declare function ownToolsWithout(own: OwnTools | undefined, innocent?: readonly string[]): OwnTools | undefined;
25
+ export type { NamePattern, OwnTools };
26
+ export { namePatterns, ownToolsWithout, toolLeakSpans };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * What `tool_leak` reads for: the names of the profile's own tools, each as a word of its own,
3
+ * and the names of their parameters in double quotes, as tool-call JSON writes its keys. A
4
+ * parameter is often a plain word (`city`, `query`), so outside quotes it is left alone.
5
+ *
6
+ * @module
7
+ */
8
+ const WORD = '[A-Za-z0-9_]';
9
+ function escaped(text) {
10
+ return text.replace(/[\\^$.*+?()[\]{}|/-]/g, '\\$&');
11
+ }
12
+ /** The pattern of each name of `own`. A tool's name starts and ends where a word does. */
13
+ function namePatterns(own) {
14
+ const after = `(?!${WORD})`;
15
+ const names = [...new Set(own.names)].filter(Boolean).map((name) => ({
16
+ literal: name,
17
+ regex: new RegExp(`(?<!${WORD})${escaped(name)}${after}`, 'g'),
18
+ }));
19
+ const keys = [...new Set(own.params)]
20
+ .filter(Boolean)
21
+ .flatMap((param) => [`"${param}"`, `\\"${param}\\"`])
22
+ .map((literal) => ({ literal, regex: new RegExp(escaped(literal), 'g') }));
23
+ return [...names, ...keys];
24
+ }
25
+ /** Every match of a name of `own` in `text`. */
26
+ function toolLeakSpans(text, own) {
27
+ if (!own)
28
+ return [];
29
+ return namePatterns(own).flatMap(({ literal, regex }) => text.includes(literal)
30
+ ? [...text.matchAll(regex)].map(({ index, 0: match }) => ({
31
+ start: index,
32
+ end: index + match.length,
33
+ kind: 'tool',
34
+ }))
35
+ : []);
36
+ }
37
+ /** `own` without the names in `innocent`, or `undefined` when none is left. */
38
+ function ownToolsWithout(own, innocent = []) {
39
+ if (!own)
40
+ return undefined;
41
+ const names = own.names.filter((name) => !innocent.includes(name));
42
+ const params = own.params.filter((name) => !innocent.includes(name));
43
+ return names.length + params.length > 0 ? { names, params } : undefined;
44
+ }
45
+ export { namePatterns, ownToolsWithout, toolLeakSpans };
@@ -1,20 +1,26 @@
1
- import { type LexiconOverrides } from './lexicon.js';
1
+ import type { ToolBoundary } from './boundaries.js';
2
+ import { type DetectScope } from './detect-at.js';
3
+ import { type LabelOverrides } from './labels.js';
2
4
  import type { AdvisoryLevel, GuardrailEvent, GuardrailHit, Provenance, ResolvedGuardrailPolicy, ToolOrigin, TurnTaint, Verdict } from './types.js';
5
+ /** The closing tag of the fence a tool result is wrapped in. */
3
6
  declare const TOOL_CLOSE = "</tool_data>";
7
+ /** True when the tool's bytes come from outside the host. */
4
8
  declare function isRemoteOrigin(origin: ToolOrigin): boolean;
5
9
  /**
6
10
  * The origin is on the tag rather than in prose so a result cannot claim a
7
11
  * friendlier provenance than it has by writing one into its own body.
8
12
  */
9
- declare function wrapToolData(text: string, provenance: Provenance, advisory?: AdvisoryLevel, lexicon?: LexiconOverrides): string;
13
+ declare function wrapToolData(text: string, provenance: Provenance, advisory?: AdvisoryLevel, labels?: LabelOverrides): string;
14
+ /** A tool result after the guard: the text the model sees, any event, and the suspicious hits. */
10
15
  export interface GuardedToolText {
11
- text: string;
16
+ /** Absent when a match blocks: the model does not read the text. */
17
+ text?: string;
12
18
  /** Emitted when the guard did anything worth recording. */
13
19
  event?: GuardrailEvent;
14
20
  /**
15
- * Reported, never redacted: legitimate tool output is frequently
16
- * instruction-shaped, so rewriting on this signal would corrupt real data.
17
- * These raise the turn's taint instead.
21
+ * What `tool_instructions` found. Legitimate tool output is frequently
22
+ * instruction-shaped, so the detector starts at `flag`; whatever its action,
23
+ * these raise the turn's taint.
18
24
  */
19
25
  suspicious?: GuardrailHit[];
20
26
  }
@@ -27,22 +33,45 @@ declare function composeToolText(finding: string, data: unknown): string;
27
33
  * Local host tools are still detected — a host tool reading a database returns
28
34
  * data the host did not write — but only remote origins are fenced, because
29
35
  * fencing a local tool's output would change prompts hosts have already tuned.
36
+ * `boundary` is absent for text that crosses none: a provider builtin's, or a
37
+ * failure already read at its own boundary.
30
38
  */
31
- declare function guardToolResult(finding: string, data: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, callableTools?: readonly string[], lexicon?: LexiconOverrides): GuardedToolText;
39
+ declare function guardToolResult(finding: string, data: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined, callableTools?: readonly string[], labels?: LabelOverrides): GuardedToolText;
32
40
  /**
33
41
  * A remote server authors its own error strings, so an unguarded failure message
34
42
  * is the cleanest injection path across this boundary: it reaches the model
35
43
  * verbatim and is framed by the kernel as a system report.
36
44
  */
37
- declare function guardToolFailureText(message: string, provenance: Provenance, policy: ResolvedGuardrailPolicy): GuardedToolText;
45
+ declare function guardToolFailureText(message: string, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined): GuardedToolText;
46
+ /** What a call shows the person of one value, after it was read at `tool_shown_<kind>`. */
47
+ export interface ShownToolValue {
48
+ /** The value to show: every match set to `redact` replaced. Absent when a match blocks it. */
49
+ value?: unknown;
50
+ event?: GuardrailEvent;
51
+ }
52
+ /**
53
+ * A call's output, error, artifacts, and trace reach the person on the turn's events, apart from
54
+ * what the model read back: the host's server forwards them to the browser as they are. Each is
55
+ * read here at `tool_shown_<kind>`, so a key a tool returned is not shown. `readBack` is
56
+ * untouched: what the model read is settled at `tool_output_<kind>`.
57
+ */
58
+ declare function guardShownValue(value: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined): ShownToolValue;
59
+ /** A tool call's arguments after they were read at their boundary. */
60
+ export interface InspectedToolArguments {
61
+ /** The arguments to call the tool with. Absent when a match blocks: the tool is not called. */
62
+ args?: unknown;
63
+ event?: GuardrailEvent;
64
+ }
38
65
  /**
39
66
  * Arguments are model-authored, so the risk is not instruction smuggling but
40
67
  * exfiltration: a credential lifted from context and posted outward as a
41
- * parameter. Detection reports rather than rewrites — silently altering a tool
42
- * argument would make the call succeed against something the model did not ask
43
- * for.
68
+ * parameter. The whole call is read as it will be sent; `redact` then replaces
69
+ * the match inside each string it sits in, so the tool is called with the
70
+ * placeholder. `scope` is what the detectors of what is the profile's own
71
+ * read of the turn: the canary, and its system instruction.
44
72
  */
45
- declare function inspectToolArguments(args: unknown, policy: ResolvedGuardrailPolicy): Verdict;
73
+ declare function inspectToolArguments(args: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined, scope?: DetectScope): InspectedToolArguments;
74
+ /** The guardrail event for a tool call verdict, or `undefined` when it was allowed. */
46
75
  declare function toolCallEvent(verdict: Verdict, provenance: Provenance): GuardrailEvent | undefined;
47
76
  /**
48
77
  * Only remote origins taint: a local host tool returns bytes the host's own code
@@ -50,12 +79,14 @@ declare function toolCallEvent(verdict: Verdict, provenance: Provenance): Guardr
50
79
  * useless in practice.
51
80
  */
52
81
  declare function recordTaint(taint: TurnTaint | undefined, provenance: Provenance, suspicious?: GuardrailHit[]): TurnTaint;
82
+ /** True when the turn has read content from outside the host. */
53
83
  declare function isTainted(taint: TurnTaint | undefined): boolean;
84
+ /** True when something the turn read looked like instructions. */
54
85
  declare function isSuspicious(taint: TurnTaint | undefined): boolean;
55
86
  /**
56
87
  * A `flag` says the call is happening on a tainted turn and is worth recording; a
57
88
  * `block` says the profile asked for it to be refused. Reporting happens whether
58
89
  * or not enforcement is configured, so the risk is visible before a host opts in.
59
90
  */
60
- declare function checkTaintGate(taint: TurnTaint | undefined, access: string, policy: ResolvedGuardrailPolicy, lexicon?: LexiconOverrides): Verdict;
61
- export { checkTaintGate, composeToolText, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };
91
+ declare function checkTaintGate(taint: TurnTaint | undefined, access: string, policy: ResolvedGuardrailPolicy, labels?: LabelOverrides): Verdict;
92
+ export { checkTaintGate, composeToolText, guardShownValue, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };