@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
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Credentials found the way gitleaks finds them: a rule's regex, then the
3
+ * secret in it (its `secretGroup`, else its first non-empty group), dropped
4
+ * when the rule's keywords are not in the text, when the secret's Shannon
5
+ * entropy is at or under the rule's floor, or when an allowlist lets it through.
6
+ *
7
+ * gitleaks reads a rule's keywords anywhere in a file. Here one must be in the
8
+ * text by the end of the match, so a reply read as it streams and the reply
9
+ * read whole find the same secrets.
10
+ *
11
+ * gitleaks' `gitleaks:allow` comment is not honoured: in a chat the model or
12
+ * a page writes it, not the owner of the secret.
13
+ *
14
+ * @module
15
+ */
16
+ import type { RedactSpan } from '../observability/spans.js';
17
+ /** Matches a credential rule lets through. */
18
+ interface CredentialAllowlist {
19
+ /** What the regexes read: the secret, the whole match, or the lines the match is on. */
20
+ target: 'secret' | 'match' | 'line';
21
+ regexes: readonly RegExp[];
22
+ /** SHA-256 hex digests of values that let through, so a literal is not kept in source. */
23
+ hashes: readonly string[];
24
+ /** Words that, anywhere in the secret, case aside, let it through. */
25
+ stopwords: readonly string[];
26
+ }
27
+ interface CredentialRule {
28
+ id: string;
29
+ pattern: RegExp;
30
+ /** The group holding the secret; else the first non-empty group, else the match. */
31
+ secretGroup?: number;
32
+ /** The Shannon entropy, in bits per character, a secret must be over. */
33
+ entropy?: number;
34
+ /** Words, lower case, one of which the text must hold by the end of a match. */
35
+ keywords: readonly string[];
36
+ allowlists: readonly CredentialAllowlist[];
37
+ }
38
+ /** Shannon entropy over the characters of `data`, per UTF-8 byte as gitleaks counts it. */
39
+ declare function shannonEntropy(data: string): number;
40
+ /** The secrets `rules` find in `text`, each one's span. */
41
+ declare function credentialSpans(text: string, rules: readonly CredentialRule[], global: CredentialAllowlist): RedactSpan[];
42
+ /** Whether a match of `rule` at `at` of `text` is a credential gitleaks reports. */
43
+ declare function credentialHit(rule: CredentialRule, global: CredentialAllowlist, match: string, text: string, at: number): boolean;
44
+ export type { CredentialAllowlist, CredentialRule };
45
+ export { credentialHit, credentialSpans, shannonEntropy };
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Credentials found the way gitleaks finds them: a rule's regex, then the
3
+ * secret in it (its `secretGroup`, else its first non-empty group), dropped
4
+ * when the rule's keywords are not in the text, when the secret's Shannon
5
+ * entropy is at or under the rule's floor, or when an allowlist lets it through.
6
+ *
7
+ * gitleaks reads a rule's keywords anywhere in a file. Here one must be in the
8
+ * text by the end of the match, so a reply read as it streams and the reply
9
+ * read whole find the same secrets.
10
+ *
11
+ * gitleaks' `gitleaks:allow` comment is not honoured: in a chat the model or
12
+ * a page writes it, not the owner of the secret.
13
+ *
14
+ * @module
15
+ */
16
+ /** Shannon entropy over the characters of `data`, per UTF-8 byte as gitleaks counts it. */
17
+ function shannonEntropy(data) {
18
+ if (data === '')
19
+ return 0;
20
+ const counts = new Map();
21
+ for (const char of data)
22
+ counts.set(char, (counts.get(char) ?? 0) + 1);
23
+ const bytes = new TextEncoder().encode(data).length;
24
+ let entropy = 0;
25
+ for (const count of counts.values()) {
26
+ const freq = count / bytes;
27
+ entropy -= freq * Math.log2(freq);
28
+ }
29
+ return entropy;
30
+ }
31
+ const SHA256_K = new Uint32Array([
32
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
33
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
34
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
35
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
36
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
37
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
38
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
39
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
40
+ ]);
41
+ /** SHA-256 of `text` as lower-case hex, synchronously: the scan is synchronous and runs in the browser too. */
42
+ function sha256Hex(text) {
43
+ const bytes = new TextEncoder().encode(text);
44
+ const bits = bytes.length * 8;
45
+ const padded = new Uint8Array(((bytes.length + 9 + 63) >> 6) * 64);
46
+ padded.set(bytes);
47
+ padded[bytes.length] = 0x80;
48
+ const view = new DataView(padded.buffer);
49
+ view.setUint32(padded.length - 4, bits >>> 0);
50
+ view.setUint32(padded.length - 8, Math.floor(bits / 0x100000000));
51
+ const h = new Uint32Array([
52
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
53
+ ]);
54
+ const w = new Uint32Array(64);
55
+ for (let off = 0; off < padded.length; off += 64) {
56
+ for (let i = 0; i < 16; i++)
57
+ w[i] = view.getUint32(off + i * 4);
58
+ for (let i = 16; i < 64; i++) {
59
+ const x = w[i - 15];
60
+ const y = w[i - 2];
61
+ const s0 = ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3);
62
+ const s1 = ((y >>> 17) | (y << 15)) ^ ((y >>> 19) | (y << 13)) ^ (y >>> 10);
63
+ w[i] = (w[i - 16] + s0 + w[i - 7] + s1) | 0;
64
+ }
65
+ let [a, b, c, d, e, f, g, k] = h;
66
+ for (let i = 0; i < 64; i++) {
67
+ const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
68
+ const ch = (e & f) ^ (~e & g);
69
+ const t1 = (k + S1 + ch + SHA256_K[i] + w[i]) | 0;
70
+ const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
71
+ const maj = (a & b) ^ (a & c) ^ (b & c);
72
+ const t2 = (S0 + maj) | 0;
73
+ [k, g, f, e, d, c, b, a] = [g, f, e, (d + t1) | 0, c, b, a, (t1 + t2) | 0];
74
+ }
75
+ const next = [a, b, c, d, e, f, g, k];
76
+ for (let i = 0; i < 8; i++)
77
+ h[i] = (h[i] + next[i]) | 0;
78
+ }
79
+ return [...h].map((x) => x.toString(16).padStart(8, '0')).join('');
80
+ }
81
+ function allowed(list, read) {
82
+ const target = read[list.target];
83
+ const lower = read.secret.toLowerCase();
84
+ return ((target !== '' && list.regexes.some((regex) => regex.test(target))) ||
85
+ (target !== '' && list.hashes.length > 0 && list.hashes.includes(sha256Hex(target))) ||
86
+ (lower !== '' && list.stopwords.some((word) => lower.includes(word))));
87
+ }
88
+ /** The lines of `text` the stretch [start, end) is on. */
89
+ function linesOf(text, start, end) {
90
+ const from = text.lastIndexOf('\n', start - 1) + 1;
91
+ const to = text.indexOf('\n', end);
92
+ return text.slice(from, to < 0 ? text.length : to);
93
+ }
94
+ /** Whether one of `rule`'s keywords is in `lower`, the text in lower case, by `end`. */
95
+ function keywordsIn(rule, lower, end = lower.length) {
96
+ return (rule.keywords.length === 0 ||
97
+ rule.keywords.some((word) => {
98
+ const at = lower.indexOf(word);
99
+ return at >= 0 && at + word.length <= end;
100
+ }));
101
+ }
102
+ const FINDERS = new WeakMap();
103
+ /** `pattern` with its indices, read from the start of a string. */
104
+ function finder(pattern) {
105
+ let found = FINDERS.get(pattern);
106
+ if (!found) {
107
+ found = new RegExp(pattern.source, `${pattern.flags.replace('g', '')}d`);
108
+ FINDERS.set(pattern, found);
109
+ }
110
+ return found;
111
+ }
112
+ /**
113
+ * Where the secret in `rule`'s match at `at` of `text` is, or undefined when
114
+ * gitleaks would let the match through. Keywords are not read here.
115
+ */
116
+ function credentialSecret(rule, global, text, match, at) {
117
+ let lead = 0;
118
+ while (match[lead] === '\n')
119
+ lead++;
120
+ let tail = match.length;
121
+ while (tail > lead && match[tail - 1] === '\n')
122
+ tail--;
123
+ const trimmed = match.slice(lead, tail);
124
+ const start = at + lead;
125
+ let secret = { start, end: start + trimmed.length };
126
+ const groups = finder(rule.pattern).exec(trimmed);
127
+ const indices = groups?.indices;
128
+ if (groups && indices && groups.length >= 2) {
129
+ const group = rule.secretGroup ??
130
+ groups.findIndex((value, index) => index > 0 && value !== undefined && value !== '');
131
+ const span = indices[group];
132
+ if (span)
133
+ secret = { start: start + span[0], end: start + span[1] };
134
+ else if (rule.secretGroup)
135
+ secret = { start, end: start };
136
+ }
137
+ const read = {
138
+ secret: text.slice(secret.start, secret.end),
139
+ match: trimmed,
140
+ line: linesOf(text, start, start + trimmed.length),
141
+ };
142
+ if (rule.entropy !== undefined && shannonEntropy(read.secret) <= rule.entropy)
143
+ return undefined;
144
+ if (allowed(global, read) || rule.allowlists.some((list) => allowed(list, read))) {
145
+ return undefined;
146
+ }
147
+ return secret.end > secret.start ? secret : { start, end: start + trimmed.length };
148
+ }
149
+ /** The secrets `rules` find in `text`, each one's span. */
150
+ function credentialSpans(text, rules, global) {
151
+ const lower = text.toLowerCase();
152
+ const spans = [];
153
+ for (const rule of rules) {
154
+ if (!keywordsIn(rule, lower))
155
+ continue;
156
+ const pattern = new RegExp(rule.pattern.source, `${rule.pattern.flags}g`);
157
+ for (const match of text.matchAll(pattern)) {
158
+ if (match[0] === '' || !keywordsIn(rule, lower, match.index + match[0].length))
159
+ continue;
160
+ const secret = credentialSecret(rule, global, text, match[0], match.index);
161
+ if (secret)
162
+ spans.push({ ...secret, kind: 'sensitive' });
163
+ }
164
+ }
165
+ return spans;
166
+ }
167
+ /** Whether a match of `rule` at `at` of `text` is a credential gitleaks reports. */
168
+ function credentialHit(rule, global, match, text, at) {
169
+ return (keywordsIn(rule, text.slice(0, at + match.length).toLowerCase()) &&
170
+ credentialSecret(rule, global, text, match, at) !== undefined);
171
+ }
172
+ export { credentialHit, credentialSpans, shannonEntropy };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * A hijacked agent has to send what it took somewhere, and the hijacker has to
3
+ * say where.
4
+ *
5
+ * @module
6
+ */
7
+ import type { TurnHistoryMessage } from '../kernel/turn-events.js';
8
+ import type { ModelRequest } from '../kernel/types.js';
9
+ import { type LabelOverrides } from './labels.js';
10
+ import type { Provenance, ResolvedGuardrailPolicy, Verdict } from './types.js';
11
+ /** What the turn has read so far, by who wrote it. Keys are `kind:value`, lowercased. */
12
+ interface TurnDestinations {
13
+ /** From the system prompt, the user, host history, and local tools. */
14
+ given: Set<string>;
15
+ /** From the running text of remote tool results, with the tool that returned each. */
16
+ remote: Map<string, string>;
17
+ }
18
+ declare function turnDestinations(): TurnDestinations;
19
+ /** Notes every destination in `value`'s strings as given. */
20
+ declare function addGivenDestinations(turn: TurnDestinations, value: unknown): void;
21
+ /** Notes what the user and the host said in `messages`. */
22
+ declare function addHistoryDestinations(turn: TurnDestinations, messages: readonly TurnHistoryMessage[], own: WeakSet<object>): void;
23
+ /** Notes what a provider request gives the model. `own` holds what quotes the model's own words. */
24
+ declare function addRequestDestinations(turn: TurnDestinations, request: Pick<ModelRequest, 'system' | 'input' | 'history'>, own: WeakSet<object>): void;
25
+ /**
26
+ * Notes what a tool result gives the model. A local tool runs the host's own
27
+ * code, so what it returns is given, as for taint.
28
+ */
29
+ declare function addResultDestinations(turn: TurnDestinations, result: {
30
+ finding: string;
31
+ data?: unknown;
32
+ }, provenance: Provenance): void;
33
+ /** A call's verdict, and what an approval card says when the profile asks the user first. */
34
+ interface DestinationVerdict {
35
+ verdict: Verdict;
36
+ /** Set when the profile holds the call for the user's answer. */
37
+ confirm?: string;
38
+ }
39
+ /**
40
+ * Reported whether or not the profile acts on it, so a host sees how often the
41
+ * rule would hold a call before it turns that on.
42
+ */
43
+ declare function checkDestinationGate(turn: TurnDestinations | undefined, args: unknown, policy: ResolvedGuardrailPolicy, labels?: LabelOverrides): DestinationVerdict;
44
+ export type { DestinationVerdict, TurnDestinations };
45
+ export { addGivenDestinations, addHistoryDestinations, addRequestDestinations, addResultDestinations, checkDestinationGate, turnDestinations, };
@@ -0,0 +1,234 @@
1
+ /**
2
+ * A hijacked agent has to send what it took somewhere, and the hijacker has to
3
+ * say where.
4
+ *
5
+ * @module
6
+ */
7
+ import { labelText } from './labels.js';
8
+ import { TOOL_RULES } from './rules.js';
9
+ import { textForScan } from './serialize.js';
10
+ import { isRemoteOrigin } from './tool-result.js';
11
+ function turnDestinations() {
12
+ return { given: new Set(), remote: new Map() };
13
+ }
14
+ const LOCAL_PART = /[\p{L}\p{N}_.+-]/u;
15
+ const LABEL_CHAR = /[\p{L}\p{N}_-]/u;
16
+ const LINK = /(?:https?:\/\/|www\.)[^\s'"<>)\]]+/gi;
17
+ /** An IBAN's shape: two letters, two check digits, then the account. */
18
+ const ACCOUNT = /\b[A-Z]{2}\d{2}[A-Z0-9]{10,30}\b/g;
19
+ const HOST_END = /[/?#]/;
20
+ /** Where the run of label characters starting at `from` ends. */
21
+ function labelEnd(text, from) {
22
+ let end = from;
23
+ while (end < text.length) {
24
+ const char = String.fromCodePoint(text.codePointAt(end) ?? 0);
25
+ if (!LABEL_CHAR.test(char))
26
+ break;
27
+ end += char.length;
28
+ }
29
+ return end;
30
+ }
31
+ /**
32
+ * Where the domain starting at `from` ends: two or more labels joined by single
33
+ * dots. `-1` when there is no domain there. Read in one pass, so a long run of
34
+ * hyphens costs its length once.
35
+ */
36
+ function domainEnd(text, from) {
37
+ let end = labelEnd(text, from);
38
+ if (end === from)
39
+ return -1;
40
+ let labels = 1;
41
+ while (text.charAt(end) === '.') {
42
+ const next = labelEnd(text, end + 1);
43
+ if (next === end + 1)
44
+ break;
45
+ end = next;
46
+ labels += 1;
47
+ }
48
+ return labels > 1 ? end : -1;
49
+ }
50
+ /** `host` without the full stops and commas a sentence left on its end. */
51
+ function withoutTrailingPunctuation(host) {
52
+ let end = host.length;
53
+ while (end > 0 && (host.charAt(end - 1) === '.' || host.charAt(end - 1) === ','))
54
+ end -= 1;
55
+ return host.slice(0, end);
56
+ }
57
+ /** Read outward from each `@`, so a long run of letters with no address in it is read once. */
58
+ function emailsIn(text) {
59
+ const found = [];
60
+ let at = text.indexOf('@');
61
+ while (at >= 0) {
62
+ let start = at;
63
+ while (start > 0 && LOCAL_PART.test(text.charAt(start - 1)))
64
+ start -= 1;
65
+ const end = start < at ? domainEnd(text, at + 1) : -1;
66
+ if (end >= 0) {
67
+ found.push({ key: `email:${text.slice(start, end).toLowerCase()}`, start, end });
68
+ at = text.indexOf('@', end);
69
+ }
70
+ else {
71
+ at = text.indexOf('@', at + 1);
72
+ }
73
+ }
74
+ return found;
75
+ }
76
+ /** Two links to one server are one destination, whatever their paths. */
77
+ function hostOf(link) {
78
+ const afterScheme = link.replace(/^https?:\/\//i, '');
79
+ const end = afterScheme.search(HOST_END);
80
+ const authority = end < 0 ? afterScheme : afterScheme.slice(0, end);
81
+ const host = authority.slice(authority.lastIndexOf('@') + 1).replace(/:\d*$/, '');
82
+ return withoutTrailingPunctuation(host.toLowerCase()).replace(/^www\./, '');
83
+ }
84
+ function destinationsIn(text) {
85
+ const emails = emailsIn(text);
86
+ let rest = text;
87
+ for (const { start, end } of emails) {
88
+ rest = rest.slice(0, start) + ' '.repeat(end - start) + rest.slice(end);
89
+ }
90
+ const found = [...emails];
91
+ for (const match of [...rest.matchAll(LINK)]) {
92
+ const host = hostOf(match[0]);
93
+ if (host) {
94
+ found.push({ key: `host:${host}`, start: match.index, end: match.index + match[0].length });
95
+ }
96
+ }
97
+ for (const match of [...rest.matchAll(ACCOUNT)]) {
98
+ found.push({
99
+ key: `account:${match[0].toLowerCase()}`,
100
+ start: match.index,
101
+ end: match.index + match[0].length,
102
+ });
103
+ }
104
+ return found;
105
+ }
106
+ /** JSON a tool returned as text has fields too. */
107
+ function parsedJson(text) {
108
+ const first = text.trimStart().charAt(0);
109
+ if (first !== '{' && first !== '[')
110
+ return undefined;
111
+ try {
112
+ return JSON.parse(text);
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ }
118
+ const MAX_DEPTH = 32;
119
+ function eachString(value, visit, depth = 0) {
120
+ if (depth > MAX_DEPTH)
121
+ return;
122
+ if (typeof value === 'string') {
123
+ const parsed = parsedJson(value);
124
+ if (parsed === undefined)
125
+ visit(value);
126
+ else
127
+ eachString(parsed, visit, depth + 1);
128
+ return;
129
+ }
130
+ if (Array.isArray(value)) {
131
+ for (const item of value)
132
+ eachString(item, visit, depth + 1);
133
+ return;
134
+ }
135
+ if (value && typeof value === 'object') {
136
+ for (const item of Object.values(value))
137
+ eachString(item, visit, depth + 1);
138
+ }
139
+ }
140
+ /** Every destination in `value`'s strings; `inProse` leaves out one that is a string's whole value. */
141
+ function destinationKeys(value, inProse = false) {
142
+ const keys = new Set();
143
+ eachString(value, (text) => {
144
+ const trimmed = text.trim();
145
+ const found = destinationsIn(trimmed);
146
+ const [only] = found;
147
+ const whole = found.length === 1 && only?.start === 0 && only.end === trimmed.length;
148
+ if (inProse && whole)
149
+ return;
150
+ for (const { key } of found)
151
+ keys.add(key);
152
+ });
153
+ return keys;
154
+ }
155
+ /** Notes every destination in `value`'s strings as given. */
156
+ function addGivenDestinations(turn, value) {
157
+ for (const key of destinationKeys(value))
158
+ turn.given.add(key);
159
+ }
160
+ /** Notes what the user and the host said in `messages`. */
161
+ function addHistoryDestinations(turn, messages, own) {
162
+ for (const message of messages) {
163
+ // why: An earlier turn's tool result is neither the user's word nor this turn's read.
164
+ if (message.role === 'assistant' || message.role === 'tool' || own.has(message))
165
+ continue;
166
+ addGivenDestinations(turn, textForScan(message).text);
167
+ }
168
+ }
169
+ /** Notes what a provider request gives the model. `own` holds what quotes the model's own words. */
170
+ function addRequestDestinations(turn, request, own) {
171
+ addGivenDestinations(turn, request.system);
172
+ if (!own.has(request.input))
173
+ addGivenDestinations(turn, textForScan(request.input).text);
174
+ addHistoryDestinations(turn, request.history ?? [], own);
175
+ }
176
+ /**
177
+ * Notes what a tool result gives the model. A local tool runs the host's own
178
+ * code, so what it returns is given, as for taint.
179
+ */
180
+ function addResultDestinations(turn, result, provenance) {
181
+ if (!isRemoteOrigin(provenance.origin)) {
182
+ addGivenDestinations(turn, [result.finding, result.data]);
183
+ return;
184
+ }
185
+ const structured = parsedJson(result.finding);
186
+ const prose = new Set([
187
+ ...(structured === undefined
188
+ ? destinationKeys(result.finding)
189
+ : destinationKeys(structured, true)),
190
+ ...destinationKeys(result.data, true),
191
+ ]);
192
+ for (const key of prose) {
193
+ if (!turn.remote.has(key))
194
+ turn.remote.set(key, provenance.tool);
195
+ }
196
+ }
197
+ /**
198
+ * Reported whether or not the profile acts on it, so a host sees how often the
199
+ * rule would hold a call before it turns that on.
200
+ */
201
+ function checkDestinationGate(turn, args, policy, labels) {
202
+ if (!turn || turn.remote.size === 0)
203
+ return { verdict: { action: 'allow' } };
204
+ const found = [...destinationKeys(args)].filter((key) => turn.remote.has(key) && !turn.given.has(key));
205
+ if (found.length === 0)
206
+ return { verdict: { action: 'allow' } };
207
+ const values = found.map((key) => key.slice(key.indexOf(':') + 1));
208
+ const hits = values.map((match) => ({
209
+ rule: TOOL_RULES.remoteDestination,
210
+ severity: 'high',
211
+ match,
212
+ }));
213
+ const said = {
214
+ destination: values.join(', '),
215
+ sources: [...new Set(found.map((key) => turn.remote.get(key) ?? ''))].join(', '),
216
+ };
217
+ const action = policy.taint?.remoteDestination ?? 'off';
218
+ if (action === 'block') {
219
+ return {
220
+ verdict: {
221
+ action: 'block',
222
+ hits,
223
+ rejection: labelText('taint.destination_blocked', said, labels),
224
+ },
225
+ };
226
+ }
227
+ return {
228
+ verdict: { action: 'flag', hits },
229
+ ...(action === 'confirm'
230
+ ? { confirm: labelText('taint.destination_confirm', said, labels) }
231
+ : {}),
232
+ };
233
+ }
234
+ export { addGivenDestinations, addHistoryDestinations, addRequestDestinations, addResultDestinations, checkDestinationGate, turnDestinations, };
@@ -0,0 +1,107 @@
1
+ import { type RedactSpan } from '../observability/spans.js';
2
+ import { type Boundary } from './boundaries.js';
3
+ import { type DetectAction, type Detector, type HostDetector, type ResolvedAllow, type ResolvedDetect } from './detectors.js';
4
+ import { type LeakScope } from './egress.js';
5
+ import type { GuardrailEvent, GuardrailHit } from './event-schemas.js';
6
+ import type { GuardrailContext, GuardrailStage, Provenance, ResolvedGuardrailPolicy } from './types.js';
7
+ /** What happened to text at a boundary: nothing matched, or the strongest action among the matches. */
8
+ type DetectOutcome = 'allow' | Exclude<DetectAction, 'ignore'>;
9
+ /** Text read as it crossed a boundary. */
10
+ interface Detection {
11
+ action: DetectOutcome;
12
+ /** The text to let through: unchanged, or with placeholders. Absent on `block`: nothing crosses. */
13
+ text?: string;
14
+ /** Every match, each named for its detector. */
15
+ hits: GuardrailHit[];
16
+ }
17
+ declare function stronger(left: DetectOutcome, right: DetectOutcome | 'ignore'): DetectOutcome;
18
+ /**
19
+ * What of the turn the detectors of what is the profile's own read: the canary it planted, whether
20
+ * the model was given it besides, the private stretches of its system instruction, and the URLs
21
+ * the model was given, and the names of its tools. A detector whose part is absent reads without
22
+ * it: `canary_leak`, `prompt_leak`, and `tool_leak` find nothing, and to `ungiven_images` and
23
+ * `ungiven_links` no URL was given.
24
+ */
25
+ interface DetectScope extends LeakScope, Pick<GuardrailContext, 'givenUrls' | 'ownTools'> {
26
+ /** The words of the profile's own canary note, when its labels rewords it (`boundaryNote`). */
27
+ note?: string;
28
+ /** What `ungiven_images` and `ungiven_links` let through besides the given URLs. */
29
+ allow?: ResolvedAllow;
30
+ /** The tools the model can call this turn, for `tool_instructions`: a tool's text naming one is a match. */
31
+ callable?: readonly string[];
32
+ }
33
+ /**
34
+ * The {@linkcode LeakScope} of a turn under `detect`: each part only while its detector is above
35
+ * `ignore` somewhere, so a profile that reads for neither binds nothing to read for.
36
+ */
37
+ declare function leakScopeOf(detect: ResolvedDetect, turn: LeakScope): LeakScope;
38
+ /** The {@linkcode DetectScope} of a turn under `policy`: each part only while a detector reads it. */
39
+ declare function scopeOf(policy: Pick<ResolvedGuardrailPolicy, 'detect' | 'allow'>, turn: LeakScope & Pick<GuardrailContext, 'givenUrls' | 'labels' | 'ownTools'>): DetectScope;
40
+ /** The detectors a stream gate reads itself, as the text grows. */
41
+ declare const SCOPED: readonly ["canary_leak", "prompt_leak"];
42
+ declare function isScoped(detector: Detector): detector is (typeof SCOPED)[number];
43
+ /** The host's own detectors that read `boundary`. */
44
+ declare function hostAt(boundary: Boundary, detect: ResolvedDetect): HostDetector[];
45
+ /** Refuses a text the person or host sent that is over `MAX_INBOUND_CHARS`; `where` names it for the log. */
46
+ declare function refuseOverlong(text: string, where: string): void;
47
+ /** Reads `text` as it crosses `boundary` under the profile's resolved matrix. */
48
+ declare function detectAt(text: string, boundary: Boundary, detect: ResolvedDetect, scope?: DetectScope): Detection;
49
+ /** The detectors that read `boundary`: every one not set to `ignore`. */
50
+ declare function detectorsAt(boundary: Boundary, detect: ResolvedDetect): Detector[];
51
+ /**
52
+ * Whether any detector reads one of `boundaries`. Given the turn's `scope`, a
53
+ * detector whose part is absent does not count: it has nothing to find.
54
+ */
55
+ declare function detectReads(boundaries: readonly Boundary[], detect: ResolvedDetect, scope?: DetectScope): boolean;
56
+ /** A stretch of streamed text released at a boundary, and how much of the stretch it covers. */
57
+ interface Release extends Detection {
58
+ taken: number;
59
+ }
60
+ /** A stretch of a streamed text, and the detectors the stream settled a match of inside it. */
61
+ interface Stretch {
62
+ from: number;
63
+ to: number;
64
+ settled: readonly string[];
65
+ }
66
+ /** What a stream reads a released stretch for: its detectors, Theorem's and the host's, in a turn of `scope`. */
67
+ interface StreamRead {
68
+ detectors: readonly string[];
69
+ scope: DetectScope;
70
+ }
71
+ /**
72
+ * Reads the stretch `[from, to)` of `window`, a text released as it streams. A match is reported
73
+ * with the stretch it starts in. One being replaced is released whole: `to` is pulled back to its
74
+ * start when the stretch would cut it, and `taken` is how far the release got. A detector set to
75
+ * `block` that the stream settled a match of blocks even when this reading finds none: the two
76
+ * are then out of step, and the stream's finding stands.
77
+ */
78
+ declare function detectRelease(window: string, { from, to, settled }: Stretch, boundary: Boundary, detect: ResolvedDetect, { detectors, scope }: StreamRead): Release;
79
+ /** `text` with every match of `detectors` replaced by its placeholder, whatever a profile sets. */
80
+ declare function redactDetectors(text: string, detectors: readonly Detector[]): string;
81
+ /** Whose patterns clean a stored trace: what the turn reads with (`true`), or the sides named. */
82
+ type StoredSides = true | {
83
+ theorem: boolean;
84
+ host: boolean;
85
+ };
86
+ /**
87
+ * What `detectors` find in a text a trace stores, whatever action a profile sets. `detect` is
88
+ * the profile's, for the patterns a host added to each.
89
+ */
90
+ declare function storedSpans(text: string, detectors: readonly Detector[], sides: StoredSides, detect?: ResolvedDetect): RedactSpan[];
91
+ /** What a host's own detectors find in a text a trace stores. A `find` that fails covers it all. */
92
+ declare function storedHostSpans(text: string, detect?: ResolvedDetect): RedactSpan[];
93
+ /** Reads several texts crossing one boundary and keeps what was found across them. */
94
+ interface BoundaryReader {
95
+ /** The text to let through, or `''` once a match blocks: the caller reads `found().action`. */
96
+ read(text: string): string;
97
+ found(): Pick<Detection, 'action' | 'hits'>;
98
+ }
99
+ /** A reader for everything crossing `boundary` in one request. */
100
+ declare function boundaryReader(boundary: Boundary, detect: ResolvedDetect): BoundaryReader;
101
+ /**
102
+ * The guardrail event for what was found at a boundary, or `undefined` when nothing matched.
103
+ * `stage` is the boundary's own unless the text was read as it streamed.
104
+ */
105
+ declare function detectEvent(boundary: Boundary, found: Pick<Detection, 'action' | 'hits'>, provenance?: Provenance, stage?: GuardrailStage): GuardrailEvent | undefined;
106
+ export type { BoundaryReader, Detection, DetectOutcome, DetectScope, Release, StoredSides, StreamRead, Stretch, };
107
+ export { boundaryReader, detectAt, detectEvent, detectorsAt, detectReads, detectRelease, hostAt, isScoped, leakScopeOf, redactDetectors, refuseOverlong, scopeOf, storedHostSpans, storedSpans, stronger, };