@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,664 @@
1
+ /**
2
+ * Thought guarding, under `guardrails.detect` at `thought`. A host that renders `thought` events shows the user what
3
+ * they say and loads what they link, as it does a reply: the canary, the
4
+ * system prompt and the user-data markers leak through a thought, and a URL
5
+ * the model was not given carries data out. Nothing in a thought stops a turn
6
+ * (`isGuardedOutput`); each leak is omitted and the rest of the thought
7
+ * released, or under `block` omitted with the rest of the thought.
8
+ *
9
+ * @module
10
+ */
11
+ import { CANARY_LEAK_REACH, canaryHoldFrom, canaryLeakRanges, canaryOpeningFrom, createCanaryScanner, promptLeakCarry, RELEASED_LOOKBACK, wordStartAcross, } from './canary.js';
12
+ import { detectReads, scopeOf, stronger, } from './detect-at.js';
13
+ import { createDetectStream } from './detect-stream.js';
14
+ import { boundaryNote } from './egress.js';
15
+ import { notePattern, SYSTEM_BOUNDARY } from './egress-patterns.js';
16
+ import { createEgressStream, loadEgressAutomata } from './egress-stream.js';
17
+ import { imageLeakSpans, linkLeakSpans } from './egress-urls.js';
18
+ import { CANARY_HIT, PROMPT_ECHO_HIT } from './hits.js';
19
+ import { labelText } from './labels.js';
20
+ import { promptEchoHoldFrom, promptEchoRanges, promptEchoScanFrom } from './prompt-echo.js';
21
+ import { DETECT_RULES } from './rules.js';
22
+ const OMIT_KEYS = {
23
+ image: 'thought.omitted_image',
24
+ link: 'thought.omitted_link',
25
+ instructions: 'thought.omitted_instructions',
26
+ };
27
+ const IMAGE_HIT = { rule: DETECT_RULES.ungiven_images, severity: 'high' };
28
+ const LINK_HIT = { rule: DETECT_RULES.ungiven_links, severity: 'high' };
29
+ const MARKER_HIT = { rule: DETECT_RULES.marker_leak, severity: 'high' };
30
+ /** Where `raw`, an offset into `view.text`, stands in the thought: a placeholder's start, or with `end` its end. */
31
+ function shownAt(view, raw, end = false) {
32
+ let piece = view.pieces[0];
33
+ for (const next of view.pieces) {
34
+ if (next.raw > raw || (end && next.raw === raw && raw > 0))
35
+ break;
36
+ piece = next;
37
+ }
38
+ if (!piece)
39
+ return raw;
40
+ if (piece.mark)
41
+ return end ? piece.mark.end : piece.mark.start;
42
+ return piece.shown + raw - piece.raw;
43
+ }
44
+ /** Sorted, with overlapping leaks as one: an image's URL is a bare link too. */
45
+ function merged(spans) {
46
+ const out = [];
47
+ for (const span of [...spans].sort((a, b) => a.start - b.start)) {
48
+ const last = out.at(-1);
49
+ if (last && span.start < last.end)
50
+ last.end = Math.max(last.end, span.end);
51
+ else
52
+ out.push({ ...span });
53
+ }
54
+ return out;
55
+ }
56
+ /** Omitting one leak can join what was around it into another; past this many rounds, the rest goes. */
57
+ const MAX_ROUNDS = 8;
58
+ /** Each leak rereads the thought; a thought still writing them past this many loses the rest. */
59
+ const MAX_LEAKS = 16;
60
+ /**
61
+ * The guard reads the thought as it will be shown, placeholders in: text
62
+ * released is final, and what is held changes only by omission. The canary
63
+ * and prompt echo are read a second time with each placeholder as the text it
64
+ * replaced, so a leak running on past one, or across one longer than its
65
+ * text, is omitted too.
66
+ */
67
+ function createThoughtGuard(options) {
68
+ const { omit = {}, canary, privateSystem, ends, given, labels } = options;
69
+ /** The detectors whose matches the guard omits as the thought streams. */
70
+ const streamed = [
71
+ ...(omit.markers ? ['marker_leak'] : []),
72
+ ...(omit.images ? ['ungiven_images'] : []),
73
+ ...(omit.links ? ['ungiven_links'] : []),
74
+ ];
75
+ const skipImages = omit.imagesRead ?? omit.images !== undefined;
76
+ /** The canary as the echo and the note read it: planted, whether or not a thought is read for it. */
77
+ const slot = canary ?? options.planted;
78
+ const note = boundaryNote({ canary: slot, labels });
79
+ const scope = (check) => ({ ...check, ...(given ? { given } : {}) });
80
+ /** The placeholder for `kind` after `before`, without a second space. */
81
+ function placeholder(kind, before) {
82
+ const text = labelText(OMIT_KEYS[kind], {}, labels);
83
+ return /\s$/.test(before) ? text.trimStart() : text;
84
+ }
85
+ let out = canary || privateSystem ? (options.carry ?? '') : '';
86
+ let held = '';
87
+ let stream;
88
+ let scanner;
89
+ /** How far the prompt echo has read `out + held` clean. */
90
+ let echoed = 0;
91
+ /** How much of `out + held` the readers have read. */
92
+ let readTo = 0;
93
+ /** Where a leak still growing at the end of the held text starts; held until it ends. */
94
+ let open;
95
+ /** The placeholders in `out + held` a leak reaching the held text could run through, in order. */
96
+ let marks = [];
97
+ /**
98
+ * No canary opening starts in `out + held` before this while the held text
99
+ * only grows and is released: a point further back than `RELEASED_LOOKBACK`
100
+ * that is no opening cannot become one. An omission rewrites the held text,
101
+ * and the hold is read whole again.
102
+ */
103
+ let openingFrom = 0;
104
+ /** Set once the rest of the thought is omitted: nothing more is read until the flush. */
105
+ let cut = false;
106
+ let leaks = 0;
107
+ let hits = new Map();
108
+ /** Fresh readers over `text`, as if it had streamed: true when it already holds a leak. */
109
+ function restart(text) {
110
+ stream =
111
+ streamed.length > 0
112
+ ? createEgressStream({
113
+ detect: streamed,
114
+ allow: { ungiven_images: omit.images ?? {}, ungiven_links: omit.links ?? {} },
115
+ skipImages,
116
+ ...(given ? { given } : {}),
117
+ ...(note ? { note } : {}),
118
+ })
119
+ : undefined;
120
+ scanner = canary ? createCanaryScanner(canary) : undefined;
121
+ echoed = 0;
122
+ readTo = 0;
123
+ return read(text);
124
+ }
125
+ /** Read `text`, what follows the read part of `out + held`; true when a leak has settled. */
126
+ function read(text) {
127
+ readTo += text.length;
128
+ const urlHit = (stream?.push(text).length ?? 0) > 0;
129
+ const canaryHit = scanner?.push(text) ?? false;
130
+ let echoHit = false;
131
+ if (privateSystem) {
132
+ const whole = (out + held).slice(0, readTo);
133
+ const from = promptEchoScanFrom(whole, echoed);
134
+ echoHit = promptEchoRanges(whole.slice(from), privateSystem, slot).length > 0;
135
+ echoed = whole.length;
136
+ }
137
+ return urlHit || canaryHit || echoHit;
138
+ }
139
+ function leakSpans(text) {
140
+ const spans = [];
141
+ if (omit.images) {
142
+ for (const span of imageLeakSpans(text, scope(omit.images))) {
143
+ spans.push({ ...span, kind: 'image', hit: IMAGE_HIT });
144
+ }
145
+ }
146
+ if (omit.links) {
147
+ for (const span of linkLeakSpans(text, scope(omit.links), skipImages)) {
148
+ spans.push({ ...span, kind: 'link', hit: LINK_HIT });
149
+ }
150
+ }
151
+ if (omit.markers) {
152
+ const patterns = [
153
+ new RegExp(SYSTEM_BOUNDARY.source, 'gi'),
154
+ ...(note ? [notePattern(note)] : []),
155
+ ];
156
+ for (const match of patterns.flatMap((pattern) => [...text.matchAll(pattern)])) {
157
+ const start = match.index;
158
+ spans.push({
159
+ start,
160
+ end: start + match[0].length,
161
+ kind: 'instructions',
162
+ hit: MARKER_HIT,
163
+ });
164
+ }
165
+ }
166
+ if (canary) {
167
+ for (const [start, end] of canaryLeakRanges(text, canary)) {
168
+ spans.push({ start, end, kind: 'instructions', hit: CANARY_HIT });
169
+ }
170
+ }
171
+ if (privateSystem) {
172
+ for (const [start, end] of promptEchoRanges(text, privateSystem, slot)) {
173
+ spans.push({ start, end, kind: 'instructions', hit: PROMPT_ECHO_HIT });
174
+ }
175
+ }
176
+ return spans;
177
+ }
178
+ /** The mark `at` falls inside, if any. */
179
+ function markAt(at) {
180
+ return marks.find((mark) => mark.start < at && at < mark.end);
181
+ }
182
+ /** `out + held` from `from` to `to`, mark boundaries both, each placeholder as the text it replaced. */
183
+ function rawOf(from, to) {
184
+ const whole = out + held;
185
+ let text = '';
186
+ let at = from;
187
+ for (const mark of marks) {
188
+ if (mark.end <= from || mark.start >= to)
189
+ continue;
190
+ text += whole.slice(at, mark.start) + mark.raw;
191
+ at = mark.end;
192
+ }
193
+ return text + whole.slice(at, to);
194
+ }
195
+ /**
196
+ * The thought from far enough back that a leak reaching the held text
197
+ * starts inside, placeholders read as what they replaced; none when no
198
+ * placeholder is that close, as it then reads as the thought does.
199
+ */
200
+ function rawView() {
201
+ const whole = out + held;
202
+ for (let reach = CANARY_LEAK_REACH;; reach *= 2) {
203
+ let from = out.length;
204
+ let length = 0;
205
+ for (let i = marks.length - 1; from > 0 && length < reach;) {
206
+ const mark = marks[i];
207
+ if (mark && mark.end > from) {
208
+ i--;
209
+ }
210
+ else if (mark && mark.end === from) {
211
+ length += mark.raw.length;
212
+ from = mark.start;
213
+ i--;
214
+ }
215
+ else {
216
+ const stop = Math.max(mark?.end ?? 0, from - (reach - length));
217
+ length += from - stop;
218
+ from = stop;
219
+ }
220
+ }
221
+ marks = marks.filter((mark) => mark.end > from);
222
+ if (marks.length === 0)
223
+ return undefined;
224
+ const view = { text: '', held: 0, pieces: [] };
225
+ let at = from;
226
+ for (const mark of [...marks, undefined]) {
227
+ const plain = mark ? mark.start : whole.length;
228
+ if (plain > at)
229
+ view.pieces.push({ raw: view.text.length, shown: at });
230
+ if (at <= out.length && out.length <= plain)
231
+ view.held = view.text.length + out.length - at;
232
+ view.text += whole.slice(at, plain);
233
+ if (!mark)
234
+ break;
235
+ view.pieces.push({ raw: view.text.length, shown: mark.start, mark });
236
+ view.text += mark.raw;
237
+ at = mark.end;
238
+ }
239
+ // why: An echo run is counted in words: read back until it fits, or the thought starts.
240
+ if (!privateSystem || from === 0 || promptEchoScanFrom(view.text, view.held) > 0)
241
+ return view;
242
+ }
243
+ }
244
+ /** The leaks the raw view finds that leave something held still shown, as spans of the thought. */
245
+ function rawLeaks() {
246
+ const view = rawView();
247
+ if (!view)
248
+ return [];
249
+ const ranges = [];
250
+ if (canary) {
251
+ for (const [start, end] of canaryLeakRanges(view.text, canary)) {
252
+ ranges.push([start, end, CANARY_HIT]);
253
+ }
254
+ }
255
+ if (privateSystem) {
256
+ for (const [start, end] of promptEchoRanges(view.text, privateSystem, slot)) {
257
+ ranges.push([start, end, PROMPT_ECHO_HIT]);
258
+ }
259
+ }
260
+ const spans = [];
261
+ for (const [rawStart, rawEnd, hit] of ranges) {
262
+ if (rawEnd <= view.held)
263
+ continue;
264
+ const start = shownAt(view, rawStart);
265
+ const end = shownAt(view, rawEnd, true);
266
+ let shows = false;
267
+ for (let at = Math.max(start, out.length); at < end && !shows; at++) {
268
+ shows = !marks.some((mark) => mark.start <= at && at < mark.end);
269
+ }
270
+ if (shows)
271
+ spans.push({ start, end, kind: 'instructions', hit });
272
+ }
273
+ return spans;
274
+ }
275
+ /** Every leak in the thought, as shown and as written, overlapping ones as one. */
276
+ function allLeaks() {
277
+ return merged([...leakSpans(out + held), ...rawLeaks()]);
278
+ }
279
+ /** The leaks reaching into the held text, in order. */
280
+ function heldLeaks() {
281
+ return allLeaks().filter(({ end }) => end > out.length);
282
+ }
283
+ /** `at` moved off the inside of a placeholder: back to its start, or with `end` on to its end. */
284
+ function offMark(at, end = false) {
285
+ const mark = markAt(at);
286
+ return mark ? (end ? mark.end : mark.start) : at;
287
+ }
288
+ /**
289
+ * Replace each leak reaching into the held text with its placeholder, but
290
+ * for one reaching its end, which the next chunk could continue: that one is
291
+ * held whole (`open`) unless the thought has ended. False when nothing was replaced.
292
+ */
293
+ function omitHeld(ended) {
294
+ const spans = heldLeaks();
295
+ const whole = out + held;
296
+ const tail = spans.at(-1);
297
+ const growing = !ended && tail !== undefined && tail.end >= whole.length ? tail : undefined;
298
+ const closed = growing ? spans.slice(0, -1) : spans;
299
+ const kept = marks.filter((mark) => mark.end <= out.length);
300
+ let next = '';
301
+ let at = out.length;
302
+ /** Copy `whole` up to `to`, and the marks in it. */
303
+ const copy = (to) => {
304
+ const shift = out.length + next.length - at;
305
+ for (const mark of marks) {
306
+ if (mark.start >= at && mark.end <= to) {
307
+ kept.push({ ...mark, start: mark.start + shift, end: mark.end + shift });
308
+ }
309
+ }
310
+ next += whole.slice(at, Math.max(at, to));
311
+ at = Math.max(at, to);
312
+ };
313
+ for (const { start, end, kind, hit } of closed) {
314
+ copy(offMark(start));
315
+ // why: A leak set to `block` takes the rest of the thought with it.
316
+ cut = ends?.has(hit.rule) ?? false;
317
+ const to = cut ? whole.length : Math.max(at, offMark(end, true));
318
+ const text = placeholder(kind, out + next);
319
+ const begin = out.length + next.length;
320
+ kept.push({ start: begin, end: begin + text.length, raw: rawOf(at, to) });
321
+ next += text;
322
+ hits.set(hit.rule, hit);
323
+ at = to;
324
+ if (cut)
325
+ break;
326
+ }
327
+ open = undefined;
328
+ if (growing && !cut) {
329
+ copy(offMark(growing.start));
330
+ open = out.length + next.length;
331
+ }
332
+ copy(whole.length);
333
+ marks = kept;
334
+ held = next;
335
+ openingFrom = 0;
336
+ return closed.length > 0;
337
+ }
338
+ /** Omit the held text from the first leak on; all of it when the leak is in what was shown. */
339
+ function cutRest() {
340
+ const first = allLeaks()[0];
341
+ const from = first ? Math.max(0, offMark(first.start) - out.length) : 0;
342
+ const kept = held.slice(0, from);
343
+ const text = placeholder(first?.kind ?? 'instructions', out + kept);
344
+ const begin = out.length + from;
345
+ const raw = rawOf(begin, out.length + held.length);
346
+ marks = marks.filter((mark) => mark.end <= begin);
347
+ marks.push({ start: begin, end: begin + text.length, raw });
348
+ held = kept + text;
349
+ openingFrom = 0;
350
+ if (first)
351
+ hits.set(first.hit.rule, first.hit);
352
+ open = undefined;
353
+ cut = true;
354
+ }
355
+ /** What the readers read: the thought up to a leak still growing. */
356
+ function readable() {
357
+ const whole = out + held;
358
+ return open === undefined ? whole : whole.slice(0, open);
359
+ }
360
+ /** Omit leaks until fresh readers over the thought settle none; failing that, the rest. */
361
+ function settle() {
362
+ for (let round = 0; round < MAX_ROUNDS; round++) {
363
+ if (leaks >= MAX_LEAKS)
364
+ break;
365
+ const before = new Set(marks.map((mark) => mark.start));
366
+ if (!omitHeld(false)) {
367
+ // why: A leak the readers settled that no span covers is cut, not shown.
368
+ if (open === undefined)
369
+ break;
370
+ return;
371
+ }
372
+ if (cut)
373
+ return;
374
+ // why: A leak running on past its placeholder only grows it.
375
+ if (marks.some((mark) => !before.has(mark.start)))
376
+ leaks++;
377
+ if (!restart(readable()))
378
+ return;
379
+ }
380
+ cutRest();
381
+ }
382
+ /** The earliest index of `out + held` a leak could still start at, moved back to the start of a word it cuts. */
383
+ function holdFrom() {
384
+ const end = out.length + held.length;
385
+ const url = stream ? stream.holdFrom() : end;
386
+ const leak = canary ? canaryFrom(canary) : end;
387
+ const echo = privateSystem ? out.length + promptEchoHoldFrom(held, privateSystem, slot) : end;
388
+ const from = Math.min(url, leak, echo, rawHoldFrom() ?? end, open ?? end);
389
+ return offMark(from < out.length ? from : out.length + wordStartAcross(held, from - out.length));
390
+ }
391
+ /** `canaryHoldFrom` on the held text, as an index of `out + held`, read from where an opening could start. */
392
+ function canaryFrom(canary) {
393
+ const from = Math.max(out.length, openingFrom);
394
+ const lead = Math.max(0, from - RELEASED_LOOKBACK);
395
+ let at = lead + canaryOpeningFrom(textFrom(lead), canary);
396
+ if (at < from && from > out.length) {
397
+ const whole = Math.max(0, out.length - RELEASED_LOOKBACK);
398
+ at = whole + canaryOpeningFrom(textFrom(whole), canary);
399
+ }
400
+ openingFrom = Math.min(at, out.length + held.length - RELEASED_LOOKBACK);
401
+ return Math.max(out.length, at);
402
+ }
403
+ /** `out + held` from `from` on. */
404
+ function textFrom(from) {
405
+ return from < out.length ? out.slice(from) + held : held.slice(from - out.length);
406
+ }
407
+ /** The hold as the raw view reads it: an opening a placeholder spent may not be spent. */
408
+ function rawHoldFrom() {
409
+ const view = rawView();
410
+ if (!view)
411
+ return undefined;
412
+ const rest = view.text.slice(view.held);
413
+ const leak = canary ? canaryHoldFrom(rest, canary, view.text.slice(0, view.held)) : rest.length;
414
+ const echo = privateSystem ? promptEchoHoldFrom(rest, privateSystem, slot) : rest.length;
415
+ return shownAt(view, view.held + Math.min(leak, echo));
416
+ }
417
+ function release(text) {
418
+ const shown = { text, hits: [...hits.values()] };
419
+ hits = new Map();
420
+ return shown;
421
+ }
422
+ restart(out);
423
+ return {
424
+ push(text) {
425
+ if (cut || !text)
426
+ return release('');
427
+ held += text;
428
+ if (open !== undefined || read(text) || rawLeaks().length > 0)
429
+ settle();
430
+ if (cut)
431
+ return release('');
432
+ const clear = Math.max(0, holdFrom() - out.length);
433
+ const shown = held.slice(0, clear);
434
+ out += shown;
435
+ held = held.slice(clear);
436
+ return release(shown);
437
+ },
438
+ flush() {
439
+ if (!cut) {
440
+ for (let round = 0; round < MAX_ROUNDS && !cut && omitHeld(true); round++)
441
+ ;
442
+ // why: A leak left is one the text shown already takes part in, such as a definition an image opener held here could use.
443
+ if (!cut && held && (leakSpans(out + held).length > 0 || rawLeaks().length > 0))
444
+ cutRest();
445
+ }
446
+ const shown = held;
447
+ const whole = out + held;
448
+ out = canary || privateSystem ? promptLeakCarry(whole, canary, privateSystem) : '';
449
+ const shift = out.length - whole.length;
450
+ marks = marks
451
+ .filter((mark) => mark.start + shift >= 0)
452
+ .map((mark) => ({ ...mark, start: mark.start + shift, end: mark.end + shift }));
453
+ held = '';
454
+ openingFrom = 0;
455
+ open = undefined;
456
+ cut = false;
457
+ leaks = 0;
458
+ restart(out);
459
+ return release(shown);
460
+ },
461
+ carryOut: () => out,
462
+ };
463
+ }
464
+ /** What several readers of one stretch of a thought found: every hit, once a rule, at the strongest action. */
465
+ function foundBy(...founds) {
466
+ const all = founds.filter((found) => found !== undefined);
467
+ if (all.length === 0)
468
+ return {};
469
+ return {
470
+ found: {
471
+ action: all.reduce((action, found) => stronger(action, found.action), 'allow'),
472
+ hits: [...new Map(all.flatMap(({ hits }) => hits).map((hit) => [hit.rule, hit])).values()],
473
+ },
474
+ };
475
+ }
476
+ /**
477
+ * `guard` with `guardrails.detect` read at `thought` in front of it: the guard
478
+ * reads the thought as the detectors let it through. A match set to `block`
479
+ * ends what is shown of the thought there. The detectors in `leave` are the
480
+ * guard's own. `guard` unchanged when no other detector reads a thought.
481
+ */
482
+ function detectingThoughts(guard, detect, scope, leave) {
483
+ const open = () => createDetectStream('thought', detect, scope, leave);
484
+ let reader = open();
485
+ if (!reader)
486
+ return guard;
487
+ /** How much of the thought has been written, and how much of that released. */
488
+ let written = 0;
489
+ let read = 0;
490
+ let stopped = false;
491
+ /** The text now through the detectors, and what they found in it. */
492
+ function through(ended) {
493
+ if (stopped || !reader)
494
+ return { text: '' };
495
+ const to = ended ? written : Math.max(read, reader.holdFrom());
496
+ const { action, text = '', hits, taken } = reader.take(read, to, ended);
497
+ stopped = action === 'block';
498
+ read += taken;
499
+ return { text, ...(action === 'allow' ? {} : { found: { action, hits } }) };
500
+ }
501
+ return {
502
+ push(text) {
503
+ written += text.length;
504
+ reader?.push(text);
505
+ const { text: clear, found } = through(false);
506
+ const shown = guard ? guard.push(clear) : { text: clear, hits: [] };
507
+ return { text: shown.text, hits: shown.hits, ...foundBy(found, shown.found) };
508
+ },
509
+ flush() {
510
+ const { text: clear, found } = through(true);
511
+ const last = guard?.push(clear);
512
+ const rest = guard ? guard.flush() : { text: clear, hits: [] };
513
+ reader = open();
514
+ written = 0;
515
+ read = 0;
516
+ stopped = false;
517
+ return {
518
+ text: (last?.text ?? '') + rest.text,
519
+ hits: [
520
+ ...new Map([...(last?.hits ?? []), ...rest.hits].map((hit) => [hit.rule, hit])).values(),
521
+ ],
522
+ ...foundBy(found, last?.found, rest.found),
523
+ };
524
+ },
525
+ carryOut: () => guard?.carryOut() ?? '',
526
+ };
527
+ }
528
+ /** The detectors a thought guard omits a match of, and the hit it reports for each. */
529
+ const LEAK_DETECTORS = {
530
+ canary_leak: CANARY_HIT,
531
+ prompt_leak: PROMPT_ECHO_HIT,
532
+ marker_leak: MARKER_HIT,
533
+ ungiven_images: IMAGE_HIT,
534
+ ungiven_links: LINK_HIT,
535
+ };
536
+ /** The detectors among them the guard reads a thought's own text for; the gate has the other two. */
537
+ const TEXT_LEAKS = ['marker_leak', 'ungiven_images', 'ungiven_links'];
538
+ /**
539
+ * Reads a thought for the leaks set to `flag`: each is reported once a thought
540
+ * and the thought shown as written, so nothing is held for it.
541
+ */
542
+ function flaggedLeaks(scope, planted) {
543
+ const { canary, privateSystem } = scope;
544
+ let scanner = canary ? createCanaryScanner(canary) : undefined;
545
+ let seen = '';
546
+ let reported = new Set();
547
+ return {
548
+ read(text) {
549
+ const from = promptEchoScanFrom(seen + text, seen.length);
550
+ seen += text;
551
+ const hits = [];
552
+ if (scanner?.push(text))
553
+ hits.push(CANARY_HIT);
554
+ if (privateSystem && promptEchoRanges(seen.slice(from), privateSystem, planted).length > 0) {
555
+ hits.push(PROMPT_ECHO_HIT);
556
+ }
557
+ const fresh = hits.filter((hit) => !reported.has(hit.rule));
558
+ for (const hit of fresh)
559
+ reported.add(hit.rule);
560
+ return fresh;
561
+ },
562
+ reset() {
563
+ scanner = canary ? createCanaryScanner(canary) : undefined;
564
+ seen = '';
565
+ reported = new Set();
566
+ },
567
+ };
568
+ }
569
+ /**
570
+ * `guard` with what it omitted reported as its detector's finding at `thought`,
571
+ * beside the leaks `flagged` reads for.
572
+ */
573
+ function reportingLeaks(guard, detect, flagged, planted) {
574
+ const flags = flaggedLeaks(flagged, planted);
575
+ const actions = new Map(Object.entries(LEAK_DETECTORS).map(([detector, hit]) => [
576
+ hit.rule,
577
+ detect[detector].thought,
578
+ ]));
579
+ function report(release, noted) {
580
+ const ours = [...noted, ...release.hits.filter((hit) => actions.has(hit.rule))];
581
+ if (ours.length === 0)
582
+ return release;
583
+ const action = ours.reduce((found, hit) => stronger(found, actions.get(hit.rule) ?? 'ignore'), release.found?.action ?? 'allow');
584
+ return {
585
+ text: release.text,
586
+ hits: release.hits.filter((hit) => !actions.has(hit.rule)),
587
+ found: { action, hits: [...(release.found?.hits ?? []), ...ours] },
588
+ };
589
+ }
590
+ return {
591
+ push: (text) => report(guard.push(text), flags.read(text)),
592
+ flush() {
593
+ flags.reset();
594
+ return report(guard.flush(), []);
595
+ },
596
+ carryOut: () => guard.carryOut(),
597
+ };
598
+ }
599
+ /**
600
+ * A guard for a turn's thoughts: the detectors `guardrails.detect` sets at
601
+ * `thought`. `context` carries the canary and the system instruction only
602
+ * while their detectors read somewhere (`leakScopeOf`); at `thought`, `redact`
603
+ * omits a match, `block` ends what is shown of the thought there, and `flag`
604
+ * reports it and shows it.
605
+ */
606
+ async function thoughtGuardFor(policy, context, carry) {
607
+ const { detect } = policy;
608
+ const own = TEXT_LEAKS.filter((detector) => omitsThought(detect, detector));
609
+ const omitted = leakScopeAt(detect, context, omitsThought);
610
+ const flagged = leakScopeAt(detect, context, (set, detector) => set[detector].thought === 'flag');
611
+ const guarded = own.length > 0 || scoped(omitted) || scoped(flagged);
612
+ const scope = scopeOf(policy, context);
613
+ if (guarded || detectReads(['thought'], detect, scope))
614
+ await loadEgressAutomata();
615
+ const guard = guarded
616
+ ? createThoughtGuard({
617
+ omit: thoughtOmits(policy),
618
+ ...omitted,
619
+ ...thoughtEnds(detect),
620
+ ...thoughtTurn(context),
621
+ ...(carry ? { carry } : {}),
622
+ })
623
+ : undefined;
624
+ const leaks = guard && reportingLeaks(guard, detect, flagged, context.canary);
625
+ return detectingThoughts(leaks, detect, scope, own);
626
+ }
627
+ /** Whether `detector` takes its matches out of a thought. */
628
+ function omitsThought(detect, detector) {
629
+ return detect[detector].thought === 'redact' || detect[detector].thought === 'block';
630
+ }
631
+ /** What `guardrails.detect` omits from a thought by its marker, image, and link detectors. */
632
+ function thoughtOmits({ detect, allow, }) {
633
+ return {
634
+ ...(omitsThought(detect, 'marker_leak') ? { markers: true } : {}),
635
+ ...(omitsThought(detect, 'ungiven_images') ? { images: allow.ungiven_images } : {}),
636
+ ...(omitsThought(detect, 'ungiven_links') ? { links: allow.ungiven_links } : {}),
637
+ imagesRead: detect.ungiven_images.thought !== 'ignore',
638
+ };
639
+ }
640
+ /** The canary and the system instruction, each while `applies` to its detector and the turn has it to read. */
641
+ function leakScopeAt(detect, context, applies) {
642
+ const canary = applies(detect, 'canary_leak') && !context.canaryGiven && context.canary;
643
+ const privateSystem = applies(detect, 'prompt_leak') && context.privateSystem;
644
+ return { ...(canary ? { canary } : {}), ...(privateSystem ? { privateSystem } : {}) };
645
+ }
646
+ function scoped(scope) {
647
+ return scope.canary !== undefined || scope.privateSystem !== undefined;
648
+ }
649
+ /** The rules whose match ends what is shown of a thought. */
650
+ function thoughtEnds(detect) {
651
+ const ends = new Set(Object.entries(LEAK_DETECTORS)
652
+ .filter(([detector]) => detect[detector].thought === 'block')
653
+ .map(([, hit]) => hit.rule));
654
+ return ends.size > 0 ? { ends } : {};
655
+ }
656
+ /** What the turn gives a thought guard to read against. */
657
+ function thoughtTurn({ canary, givenUrls, labels, }) {
658
+ return {
659
+ ...(canary ? { planted: canary } : {}),
660
+ ...(givenUrls ? { given: givenUrls } : {}),
661
+ ...(labels ? { labels } : {}),
662
+ };
663
+ }
664
+ export { createThoughtGuard, thoughtGuardFor };