@theoremjs/agents 0.0.0-stage → 0.3.0

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 (514) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1264 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +65 -0
  6. package/esm/mod.js +42 -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 +458 -0
  12. package/esm/src/cli/commands/egress-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/egress-compile.js +25 -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 +202 -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 +25 -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 +72 -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 +4 -0
  35. package/esm/src/evals/attachments.js +53 -0
  36. package/esm/src/evals/breakdown.d.ts +28 -0
  37. package/esm/src/evals/breakdown.js +68 -0
  38. package/esm/src/evals/graders/answer.d.ts +13 -0
  39. package/esm/src/evals/graders/answer.js +133 -0
  40. package/esm/src/evals/graders/code.d.ts +64 -0
  41. package/esm/src/evals/graders/code.js +205 -0
  42. package/esm/src/evals/graders/judge.d.ts +20 -0
  43. package/esm/src/evals/graders/judge.js +365 -0
  44. package/esm/src/evals/graders/latency.d.ts +5 -0
  45. package/esm/src/evals/graders/latency.js +81 -0
  46. package/esm/src/evals/graders/live.d.ts +11 -0
  47. package/esm/src/evals/graders/live.js +40 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +92 -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 +17 -0
  53. package/esm/src/evals/graders/transcript.js +200 -0
  54. package/esm/src/evals/mod.d.ts +42 -0
  55. package/esm/src/evals/mod.js +30 -0
  56. package/esm/src/evals/record.d.ts +35 -0
  57. package/esm/src/evals/record.js +105 -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 +118 -0
  67. package/esm/src/evals/run.js +452 -0
  68. package/esm/src/evals/suite.d.ts +19 -0
  69. package/esm/src/evals/suite.js +92 -0
  70. package/esm/src/evals/summary.d.ts +32 -0
  71. package/esm/src/evals/summary.js +30 -0
  72. package/esm/src/evals/trial.d.ts +27 -0
  73. package/esm/src/evals/trial.js +158 -0
  74. package/esm/src/evals/types.d.ts +260 -0
  75. package/esm/src/evals/types.js +126 -0
  76. package/esm/src/evals/verdict.d.ts +18 -0
  77. package/esm/src/evals/verdict.js +45 -0
  78. package/esm/src/guardrails/canary-gate.d.ts +21 -0
  79. package/esm/src/guardrails/canary-gate.js +40 -0
  80. package/esm/src/guardrails/canary.d.ts +112 -0
  81. package/esm/src/guardrails/canary.js +901 -0
  82. package/esm/src/guardrails/compile-egress.d.ts +11 -0
  83. package/esm/src/guardrails/compile-egress.js +11 -0
  84. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +22 -0
  85. package/esm/src/guardrails/corpus/canary-egress-attacks.js +303 -0
  86. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  87. package/esm/src/guardrails/corpus/fuzz-inbound.js +202 -0
  88. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +3 -0
  89. package/esm/src/guardrails/corpus/inbound-payloads.js +118 -0
  90. package/esm/src/guardrails/corpus/live-attacks.d.ts +13 -0
  91. package/esm/src/guardrails/corpus/live-attacks.js +224 -0
  92. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  93. package/esm/src/guardrails/corpus/mod.js +4 -0
  94. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  95. package/esm/src/guardrails/corpus/secrets.js +16 -0
  96. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  97. package/esm/src/guardrails/corpus/strings.js +29 -0
  98. package/esm/src/guardrails/corpus/types.d.ts +32 -0
  99. package/esm/src/guardrails/corpus/types.js +1 -0
  100. package/esm/src/guardrails/egress-automata.d.ts +14 -0
  101. package/esm/src/guardrails/egress-automata.js +6059 -0
  102. package/esm/src/guardrails/egress-compiler.d.ts +33 -0
  103. package/esm/src/guardrails/egress-compiler.js +237 -0
  104. package/esm/src/guardrails/egress-patterns.d.ts +24 -0
  105. package/esm/src/guardrails/egress-patterns.js +32 -0
  106. package/esm/src/guardrails/egress-policy.d.ts +27 -0
  107. package/esm/src/guardrails/egress-policy.js +76 -0
  108. package/esm/src/guardrails/egress-rules.d.ts +54 -0
  109. package/esm/src/guardrails/egress-rules.js +49 -0
  110. package/esm/src/guardrails/egress-stream.d.ts +105 -0
  111. package/esm/src/guardrails/egress-stream.js +645 -0
  112. package/esm/src/guardrails/egress-urls.d.ts +83 -0
  113. package/esm/src/guardrails/egress-urls.js +917 -0
  114. package/esm/src/guardrails/egress.d.ts +106 -0
  115. package/esm/src/guardrails/egress.js +374 -0
  116. package/esm/src/guardrails/error.d.ts +26 -0
  117. package/esm/src/guardrails/error.js +91 -0
  118. package/esm/src/guardrails/event-schemas.d.ts +57 -0
  119. package/esm/src/guardrails/event-schemas.js +41 -0
  120. package/esm/src/guardrails/events.d.ts +9 -0
  121. package/esm/src/guardrails/events.js +42 -0
  122. package/esm/src/guardrails/hits.d.ts +8 -0
  123. package/esm/src/guardrails/hits.js +19 -0
  124. package/esm/src/guardrails/injection-patterns.d.ts +15 -0
  125. package/esm/src/guardrails/injection-patterns.js +94 -0
  126. package/esm/src/guardrails/injection.d.ts +14 -0
  127. package/esm/src/guardrails/injection.js +237 -0
  128. package/esm/src/guardrails/lexicon.d.ts +30 -0
  129. package/esm/src/guardrails/lexicon.js +478 -0
  130. package/esm/src/guardrails/live-outbound-gate.d.ts +54 -0
  131. package/esm/src/guardrails/live-outbound-gate.js +305 -0
  132. package/esm/src/guardrails/mod.d.ts +46 -0
  133. package/esm/src/guardrails/mod.js +29 -0
  134. package/esm/src/guardrails/network.d.ts +42 -0
  135. package/esm/src/guardrails/network.js +328 -0
  136. package/esm/src/guardrails/normalize.d.ts +6 -0
  137. package/esm/src/guardrails/normalize.js +132 -0
  138. package/esm/src/guardrails/policy.d.ts +19 -0
  139. package/esm/src/guardrails/policy.js +50 -0
  140. package/esm/src/guardrails/progressive-yield.d.ts +69 -0
  141. package/esm/src/guardrails/progressive-yield.js +237 -0
  142. package/esm/src/guardrails/prompt-echo.d.ts +38 -0
  143. package/esm/src/guardrails/prompt-echo.js +225 -0
  144. package/esm/src/guardrails/quota.d.ts +20 -0
  145. package/esm/src/guardrails/quota.js +80 -0
  146. package/esm/src/guardrails/rules.d.ts +56 -0
  147. package/esm/src/guardrails/rules.js +54 -0
  148. package/esm/src/guardrails/sanitize.d.ts +23 -0
  149. package/esm/src/guardrails/sanitize.js +184 -0
  150. package/esm/src/guardrails/sensitive.d.ts +29 -0
  151. package/esm/src/guardrails/sensitive.js +113 -0
  152. package/esm/src/guardrails/serialize.d.ts +14 -0
  153. package/esm/src/guardrails/serialize.js +37 -0
  154. package/esm/src/guardrails/testing.d.ts +9 -0
  155. package/esm/src/guardrails/testing.js +8 -0
  156. package/esm/src/guardrails/theorem-error.d.ts +18 -0
  157. package/esm/src/guardrails/theorem-error.js +53 -0
  158. package/esm/src/guardrails/thought-guard.d.ts +55 -0
  159. package/esm/src/guardrails/thought-guard.js +464 -0
  160. package/esm/src/guardrails/tool-directives.d.ts +19 -0
  161. package/esm/src/guardrails/tool-directives.js +109 -0
  162. package/esm/src/guardrails/tool-result.d.ts +61 -0
  163. package/esm/src/guardrails/tool-result.js +248 -0
  164. package/esm/src/guardrails/types.d.ts +242 -0
  165. package/esm/src/guardrails/types.js +54 -0
  166. package/esm/src/host/client-turn.d.ts +9 -0
  167. package/esm/src/host/client-turn.js +38 -0
  168. package/esm/src/host/mint-trace.d.ts +28 -0
  169. package/esm/src/host/mint-trace.js +59 -0
  170. package/esm/src/host/mod.d.ts +13 -0
  171. package/esm/src/host/mod.js +11 -0
  172. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  173. package/esm/src/host/readStreamingJsonStringField.js +68 -0
  174. package/esm/src/host/reply.d.ts +7 -0
  175. package/esm/src/host/reply.js +35 -0
  176. package/esm/src/interface/blocks.d.ts +8 -0
  177. package/esm/src/interface/blocks.js +213 -0
  178. package/esm/src/interface/composer-actions.d.ts +20 -0
  179. package/esm/src/interface/composer-actions.js +31 -0
  180. package/esm/src/interface/draft.d.ts +14 -0
  181. package/esm/src/interface/draft.js +28 -0
  182. package/esm/src/interface/from-profile.d.ts +12 -0
  183. package/esm/src/interface/from-profile.js +144 -0
  184. package/esm/src/interface/history.d.ts +40 -0
  185. package/esm/src/interface/history.js +269 -0
  186. package/esm/src/interface/inputs.d.ts +10 -0
  187. package/esm/src/interface/inputs.js +64 -0
  188. package/esm/src/interface/mod.d.ts +31 -0
  189. package/esm/src/interface/mod.js +21 -0
  190. package/esm/src/interface/models.d.ts +19 -0
  191. package/esm/src/interface/models.js +45 -0
  192. package/esm/src/interface/pending.d.ts +48 -0
  193. package/esm/src/interface/pending.js +146 -0
  194. package/esm/src/interface/profile-interface.d.ts +4 -0
  195. package/esm/src/interface/profile-interface.js +223 -0
  196. package/esm/src/interface/session.d.ts +64 -0
  197. package/esm/src/interface/session.js +121 -0
  198. package/esm/src/interface/tool-calls.d.ts +20 -0
  199. package/esm/src/interface/tool-calls.js +73 -0
  200. package/esm/src/interface/tool-invoke.d.ts +4 -0
  201. package/esm/src/interface/tool-invoke.js +20 -0
  202. package/esm/src/interface/tool-media.d.ts +9 -0
  203. package/esm/src/interface/tool-media.js +112 -0
  204. package/esm/src/interface/types.d.ts +213 -0
  205. package/esm/src/interface/types.js +4 -0
  206. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  207. package/esm/src/kernel/auth/credential-source.js +11 -0
  208. package/esm/src/kernel/auth/crypto.d.ts +51 -0
  209. package/esm/src/kernel/auth/crypto.js +161 -0
  210. package/esm/src/kernel/auth/mod.d.ts +5 -0
  211. package/esm/src/kernel/auth/mod.js +5 -0
  212. package/esm/src/kernel/auth/oauth.d.ts +17 -0
  213. package/esm/src/kernel/auth/oauth.js +438 -0
  214. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  215. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  216. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  217. package/esm/src/kernel/auth/typed-secret.js +23 -0
  218. package/esm/src/kernel/auth/types.d.ts +139 -0
  219. package/esm/src/kernel/auth/types.js +1 -0
  220. package/esm/src/kernel/default-scope.d.ts +34 -0
  221. package/esm/src/kernel/default-scope.js +72 -0
  222. package/esm/src/kernel/engine/compaction.d.ts +70 -0
  223. package/esm/src/kernel/engine/compaction.js +202 -0
  224. package/esm/src/kernel/engine/decision.d.ts +41 -0
  225. package/esm/src/kernel/engine/decision.js +412 -0
  226. package/esm/src/kernel/engine/hash.d.ts +6 -0
  227. package/esm/src/kernel/engine/hash.js +22 -0
  228. package/esm/src/kernel/engine/live-inbound.d.ts +9 -0
  229. package/esm/src/kernel/engine/live-inbound.js +19 -0
  230. package/esm/src/kernel/engine/live-ingress.d.ts +9 -0
  231. package/esm/src/kernel/engine/live-ingress.js +37 -0
  232. package/esm/src/kernel/engine/media-probe/audio.d.ts +7 -0
  233. package/esm/src/kernel/engine/media-probe/audio.js +342 -0
  234. package/esm/src/kernel/engine/media-probe/bytes.d.ts +6 -0
  235. package/esm/src/kernel/engine/media-probe/bytes.js +26 -0
  236. package/esm/src/kernel/engine/media-probe/image.d.ts +5 -0
  237. package/esm/src/kernel/engine/media-probe/image.js +171 -0
  238. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +19 -0
  239. package/esm/src/kernel/engine/media-probe/iso-bmff.js +48 -0
  240. package/esm/src/kernel/engine/media-probe/matroska.d.ts +35 -0
  241. package/esm/src/kernel/engine/media-probe/matroska.js +226 -0
  242. package/esm/src/kernel/engine/media-probe/mp4.d.ts +22 -0
  243. package/esm/src/kernel/engine/media-probe/mp4.js +279 -0
  244. package/esm/src/kernel/engine/media-probe/opus.d.ts +4 -0
  245. package/esm/src/kernel/engine/media-probe/opus.js +23 -0
  246. package/esm/src/kernel/engine/media-probe/pdf.d.ts +5 -0
  247. package/esm/src/kernel/engine/media-probe/pdf.js +117 -0
  248. package/esm/src/kernel/engine/media-probe/video.d.ts +15 -0
  249. package/esm/src/kernel/engine/media-probe/video.js +49 -0
  250. package/esm/src/kernel/engine/record.d.ts +3 -0
  251. package/esm/src/kernel/engine/record.js +11 -0
  252. package/esm/src/kernel/engine/repair.d.ts +7 -0
  253. package/esm/src/kernel/engine/repair.js +36 -0
  254. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  255. package/esm/src/kernel/engine/runner/gates.js +322 -0
  256. package/esm/src/kernel/engine/runner/mod.d.ts +15 -0
  257. package/esm/src/kernel/engine/runner/mod.js +574 -0
  258. package/esm/src/kernel/engine/runner/schema-validation.d.ts +14 -0
  259. package/esm/src/kernel/engine/runner/schema-validation.js +105 -0
  260. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  261. package/esm/src/kernel/engine/runner/stages.js +48 -0
  262. package/esm/src/kernel/engine/runner/state.d.ts +76 -0
  263. package/esm/src/kernel/engine/runner/state.js +40 -0
  264. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  265. package/esm/src/kernel/engine/runner/steps.js +360 -0
  266. package/esm/src/kernel/engine/runner/stream.d.ts +40 -0
  267. package/esm/src/kernel/engine/runner/stream.js +225 -0
  268. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  269. package/esm/src/kernel/engine/runner/usage.js +150 -0
  270. package/esm/src/kernel/engine/session/mod.d.ts +31 -0
  271. package/esm/src/kernel/engine/session/mod.js +951 -0
  272. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  273. package/esm/src/kernel/engine/session/session-trace.js +489 -0
  274. package/esm/src/kernel/engine/token-estimate.d.ts +77 -0
  275. package/esm/src/kernel/engine/token-estimate.js +218 -0
  276. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  277. package/esm/src/kernel/engine/tool-trace.js +131 -0
  278. package/esm/src/kernel/engine/tree.d.ts +2 -0
  279. package/esm/src/kernel/engine/tree.js +17 -0
  280. package/esm/src/kernel/engine/turn-trace.d.ts +118 -0
  281. package/esm/src/kernel/engine/turn-trace.js +863 -0
  282. package/esm/src/kernel/engine/usage.d.ts +30 -0
  283. package/esm/src/kernel/engine/usage.js +134 -0
  284. package/esm/src/kernel/interaction-parts.d.ts +10 -0
  285. package/esm/src/kernel/interaction-parts.js +22 -0
  286. package/esm/src/kernel/mod.d.ts +47 -0
  287. package/esm/src/kernel/mod.js +30 -0
  288. package/esm/src/kernel/profile-graph.d.ts +140 -0
  289. package/esm/src/kernel/profile-graph.js +151 -0
  290. package/esm/src/kernel/profile-presence.d.ts +9 -0
  291. package/esm/src/kernel/profile-presence.js +143 -0
  292. package/esm/src/kernel/profile-scope.d.ts +36 -0
  293. package/esm/src/kernel/profile-scope.js +262 -0
  294. package/esm/src/kernel/registry/attachments.d.ts +35 -0
  295. package/esm/src/kernel/registry/attachments.js +211 -0
  296. package/esm/src/kernel/registry/catalog.d.ts +19 -0
  297. package/esm/src/kernel/registry/catalog.js +78 -0
  298. package/esm/src/kernel/registry/ingress.d.ts +8 -0
  299. package/esm/src/kernel/registry/ingress.js +134 -0
  300. package/esm/src/kernel/registry/kernel-registry.d.ts +12 -0
  301. package/esm/src/kernel/registry/kernel-registry.js +8 -0
  302. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  303. package/esm/src/kernel/registry/profile-outputs.js +7 -0
  304. package/esm/src/kernel/registry/profiles.d.ts +92 -0
  305. package/esm/src/kernel/registry/profiles.js +698 -0
  306. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  307. package/esm/src/kernel/registry/provider-request.js +42 -0
  308. package/esm/src/kernel/registry/resolve.d.ts +14 -0
  309. package/esm/src/kernel/registry/resolve.js +237 -0
  310. package/esm/src/kernel/registry/schemas.d.ts +9 -0
  311. package/esm/src/kernel/registry/schemas.js +25 -0
  312. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  313. package/esm/src/kernel/registry/sole-model.js +4 -0
  314. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  315. package/esm/src/kernel/registry/system-prompt.js +33 -0
  316. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  317. package/esm/src/kernel/registry/system-role.js +9 -0
  318. package/esm/src/kernel/registry/vault.d.ts +13 -0
  319. package/esm/src/kernel/registry/vault.js +14 -0
  320. package/esm/src/kernel/schema.d.ts +172 -0
  321. package/esm/src/kernel/schema.js +653 -0
  322. package/esm/src/kernel/scope.d.ts +22 -0
  323. package/esm/src/kernel/scope.js +25 -0
  324. package/esm/src/kernel/stages.d.ts +141 -0
  325. package/esm/src/kernel/stages.js +388 -0
  326. package/esm/src/kernel/stop.d.ts +93 -0
  327. package/esm/src/kernel/stop.js +125 -0
  328. package/esm/src/kernel/system-parts.d.ts +26 -0
  329. package/esm/src/kernel/system-parts.js +98 -0
  330. package/esm/src/kernel/tools/activity-label.d.ts +16 -0
  331. package/esm/src/kernel/tools/activity-label.js +209 -0
  332. package/esm/src/kernel/tools/events.d.ts +51 -0
  333. package/esm/src/kernel/tools/events.js +149 -0
  334. package/esm/src/kernel/tools/execute.d.ts +64 -0
  335. package/esm/src/kernel/tools/execute.js +801 -0
  336. package/esm/src/kernel/tools/gate-answer.d.ts +50 -0
  337. package/esm/src/kernel/tools/gate-answer.js +54 -0
  338. package/esm/src/kernel/tools/harness.d.ts +16 -0
  339. package/esm/src/kernel/tools/harness.js +42 -0
  340. package/esm/src/kernel/tools/invoke.d.ts +10 -0
  341. package/esm/src/kernel/tools/invoke.js +129 -0
  342. package/esm/src/kernel/tools/mcp-sessions.d.ts +20 -0
  343. package/esm/src/kernel/tools/mcp-sessions.js +64 -0
  344. package/esm/src/kernel/tools/mod.d.ts +9 -0
  345. package/esm/src/kernel/tools/mod.js +6 -0
  346. package/esm/src/kernel/tools/model-text.d.ts +11 -0
  347. package/esm/src/kernel/tools/model-text.js +25 -0
  348. package/esm/src/kernel/tools/permission.d.ts +6 -0
  349. package/esm/src/kernel/tools/permission.js +38 -0
  350. package/esm/src/kernel/tools/project.d.ts +8 -0
  351. package/esm/src/kernel/tools/project.js +25 -0
  352. package/esm/src/kernel/tools/registry.d.ts +20 -0
  353. package/esm/src/kernel/tools/registry.js +84 -0
  354. package/esm/src/kernel/tools/remote.d.ts +110 -0
  355. package/esm/src/kernel/tools/remote.js +998 -0
  356. package/esm/src/kernel/tools/resolve.d.ts +28 -0
  357. package/esm/src/kernel/tools/resolve.js +259 -0
  358. package/esm/src/kernel/tools/schema.d.ts +10 -0
  359. package/esm/src/kernel/tools/schema.js +174 -0
  360. package/esm/src/kernel/tools/signed-in-fetch.d.ts +18 -0
  361. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  362. package/esm/src/kernel/tools/stage-run.d.ts +93 -0
  363. package/esm/src/kernel/tools/stage-run.js +140 -0
  364. package/esm/src/kernel/tools/types.d.ts +287 -0
  365. package/esm/src/kernel/tools/types.js +1 -0
  366. package/esm/src/kernel/turn-events.d.ts +599 -0
  367. package/esm/src/kernel/turn-events.js +425 -0
  368. package/esm/src/kernel/types.d.ts +884 -0
  369. package/esm/src/kernel/types.js +1 -0
  370. package/esm/src/kernel/util/base64.d.ts +2 -0
  371. package/esm/src/kernel/util/base64.js +13 -0
  372. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  373. package/esm/src/kernel/util/exact-type.js +1 -0
  374. package/esm/src/kernel/util/find-last.d.ts +3 -0
  375. package/esm/src/kernel/util/find-last.js +9 -0
  376. package/esm/src/kernel/util/mime.d.ts +2 -0
  377. package/esm/src/kernel/util/mime.js +4 -0
  378. package/esm/src/kernel/util/record.d.ts +1 -0
  379. package/esm/src/kernel/util/record.js +3 -0
  380. package/esm/src/observability/destinations.d.ts +9 -0
  381. package/esm/src/observability/destinations.js +38 -0
  382. package/esm/src/observability/jsonl.d.ts +18 -0
  383. package/esm/src/observability/jsonl.js +117 -0
  384. package/esm/src/observability/mod.d.ts +22 -0
  385. package/esm/src/observability/mod.js +16 -0
  386. package/esm/src/observability/openinference.d.ts +11 -0
  387. package/esm/src/observability/openinference.js +205 -0
  388. package/esm/src/observability/otlp.d.ts +68 -0
  389. package/esm/src/observability/otlp.js +98 -0
  390. package/esm/src/observability/phoenix.d.ts +29 -0
  391. package/esm/src/observability/phoenix.js +71 -0
  392. package/esm/src/observability/policy.d.ts +14 -0
  393. package/esm/src/observability/policy.js +69 -0
  394. package/esm/src/observability/resolve-policy.d.ts +8 -0
  395. package/esm/src/observability/resolve-policy.js +58 -0
  396. package/esm/src/observability/spans.d.ts +16 -0
  397. package/esm/src/observability/spans.js +56 -0
  398. package/esm/src/observability/trace-catalog.d.ts +111 -0
  399. package/esm/src/observability/trace-catalog.js +865 -0
  400. package/esm/src/observability/trace-record.d.ts +23 -0
  401. package/esm/src/observability/trace-record.js +223 -0
  402. package/esm/src/observability/trace-schema.d.ts +54 -0
  403. package/esm/src/observability/trace-schema.js +59 -0
  404. package/esm/src/observability/trace-sink.d.ts +13 -0
  405. package/esm/src/observability/trace-sink.js +3 -0
  406. package/esm/src/observability/trace-span.d.ts +92 -0
  407. package/esm/src/observability/trace-span.js +199 -0
  408. package/esm/src/observability/trace.d.ts +11 -0
  409. package/esm/src/observability/trace.js +35 -0
  410. package/esm/src/observability/types.d.ts +85 -0
  411. package/esm/src/observability/types.js +3 -0
  412. package/esm/src/presets/google/speech-voices.d.ts +8 -0
  413. package/esm/src/presets/google/speech-voices.js +38 -0
  414. package/esm/src/presets/google-limits.d.ts +12 -0
  415. package/esm/src/presets/google-limits.js +18 -0
  416. package/esm/src/presets/google.d.ts +104 -0
  417. package/esm/src/presets/google.js +188 -0
  418. package/esm/src/presets/mod.d.ts +10 -0
  419. package/esm/src/presets/mod.js +9 -0
  420. package/esm/src/presets/openrouter.d.ts +13 -0
  421. package/esm/src/presets/openrouter.js +13 -0
  422. package/esm/src/presets/typesafe.d.ts +2 -0
  423. package/esm/src/presets/typesafe.js +2 -0
  424. package/esm/src/providers/create-provider.d.ts +21 -0
  425. package/esm/src/providers/create-provider.js +90 -0
  426. package/esm/src/providers/decision/usage.d.ts +3 -0
  427. package/esm/src/providers/decision/usage.js +25 -0
  428. package/esm/src/providers/google/api-error.d.ts +8 -0
  429. package/esm/src/providers/google/api-error.js +123 -0
  430. package/esm/src/providers/google/grounding.d.ts +5 -0
  431. package/esm/src/providers/google/grounding.js +226 -0
  432. package/esm/src/providers/google/interactions/framing.d.ts +15 -0
  433. package/esm/src/providers/google/interactions/framing.js +263 -0
  434. package/esm/src/providers/google/interactions/mod.d.ts +2 -0
  435. package/esm/src/providers/google/interactions/mod.js +2 -0
  436. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  437. package/esm/src/providers/google/interactions/steps.js +200 -0
  438. package/esm/src/providers/google/interactions/stream.d.ts +24 -0
  439. package/esm/src/providers/google/interactions/stream.js +297 -0
  440. package/esm/src/providers/google/keys.d.ts +20 -0
  441. package/esm/src/providers/google/keys.js +87 -0
  442. package/esm/src/providers/google/live/framing.d.ts +51 -0
  443. package/esm/src/providers/google/live/framing.js +597 -0
  444. package/esm/src/providers/google/live/mod.d.ts +7 -0
  445. package/esm/src/providers/google/live/mod.js +7 -0
  446. package/esm/src/providers/google/live/openapi-schema.d.ts +1 -0
  447. package/esm/src/providers/google/live/openapi-schema.js +42 -0
  448. package/esm/src/providers/google/live/session.d.ts +14 -0
  449. package/esm/src/providers/google/live/session.js +150 -0
  450. package/esm/src/providers/google/live/stream.d.ts +51 -0
  451. package/esm/src/providers/google/live/stream.js +263 -0
  452. package/esm/src/providers/google/thinking.d.ts +3 -0
  453. package/esm/src/providers/google/thinking.js +8 -0
  454. package/esm/src/providers/google/urls.d.ts +6 -0
  455. package/esm/src/providers/google/urls.js +6 -0
  456. package/esm/src/providers/google/usage.d.ts +7 -0
  457. package/esm/src/providers/google/usage.js +49 -0
  458. package/esm/src/providers/local/local.d.ts +12 -0
  459. package/esm/src/providers/local/local.js +186 -0
  460. package/esm/src/providers/local/mod.d.ts +8 -0
  461. package/esm/src/providers/local/mod.js +8 -0
  462. package/esm/src/providers/mod.d.ts +11 -0
  463. package/esm/src/providers/mod.js +7 -0
  464. package/esm/src/providers/openrouter/cache-control.d.ts +5 -0
  465. package/esm/src/providers/openrouter/cache-control.js +4 -0
  466. package/esm/src/providers/openrouter/chat.d.ts +64 -0
  467. package/esm/src/providers/openrouter/chat.js +490 -0
  468. package/esm/src/providers/openrouter/image.d.ts +24 -0
  469. package/esm/src/providers/openrouter/image.js +187 -0
  470. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  471. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  472. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  473. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  474. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +10 -0
  475. package/esm/src/providers/openrouter/openai/sdk-messages.js +99 -0
  476. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  477. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  478. package/esm/src/providers/openrouter/resolve-api-key.d.ts +3 -0
  479. package/esm/src/providers/openrouter/resolve-api-key.js +8 -0
  480. package/esm/src/providers/openrouter/speech.d.ts +18 -0
  481. package/esm/src/providers/openrouter/speech.js +109 -0
  482. package/esm/src/providers/probe.d.ts +5 -0
  483. package/esm/src/providers/probe.js +15 -0
  484. package/esm/src/providers/shared/builtin-wire.d.ts +4 -0
  485. package/esm/src/providers/shared/builtin-wire.js +9 -0
  486. package/esm/src/providers/shared/pcm.d.ts +14 -0
  487. package/esm/src/providers/shared/pcm.js +78 -0
  488. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  489. package/esm/src/providers/shared/response-identity.js +12 -0
  490. package/esm/src/providers/shared/sse.d.ts +10 -0
  491. package/esm/src/providers/shared/sse.js +79 -0
  492. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  493. package/esm/src/providers/shared/structured-output.js +11 -0
  494. package/esm/src/providers/shared/tool-args.d.ts +25 -0
  495. package/esm/src/providers/shared/tool-args.js +84 -0
  496. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  497. package/esm/src/providers/shared/upstream-tap.js +85 -0
  498. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  499. package/esm/src/providers/shared/upstream-tape.js +88 -0
  500. package/esm/src/providers/shared/vault.d.ts +13 -0
  501. package/esm/src/providers/shared/vault.js +41 -0
  502. package/esm/src/providers/types.d.ts +19 -0
  503. package/esm/src/providers/types.js +1 -0
  504. package/esm/src/surface/formats.d.ts +28 -0
  505. package/esm/src/surface/formats.js +139 -0
  506. package/esm/src/surface/mod.d.ts +14 -0
  507. package/esm/src/surface/mod.js +10 -0
  508. package/esm/src/surface/runtime.d.ts +40 -0
  509. package/esm/src/surface/runtime.js +439 -0
  510. package/esm/src/surface/tools.d.ts +15 -0
  511. package/esm/src/surface/tools.js +80 -0
  512. package/esm/src/surface/types.d.ts +104 -0
  513. package/esm/src/surface/types.js +4 -0
  514. package/package.json +108 -4
@@ -0,0 +1,190 @@
1
+ import { groupSummaries } from '../../evals/breakdown.js';
2
+ import { runSuite } from '../../evals/run.js';
3
+ import { loadSuite, readTraceRecords } from '../../evals/suite.js';
4
+ import { summarizeRun } from '../../evals/summary.js';
5
+ import { jsonlSink } from '../../observability/jsonl.js';
6
+ const GREEN = '\x1b[32m';
7
+ const RED = '\x1b[31m';
8
+ const DIM = '\x1b[2m';
9
+ const YELLOW = '\x1b[33m';
10
+ const RESET = '\x1b[0m';
11
+ function failed(message) {
12
+ console.error(`\n${RED}Eval Failed${RESET}: ${message}\n`);
13
+ return false;
14
+ }
15
+ /** Passed over decided cases: a case every trial of which errored is not a failure. */
16
+ function fraction(run) {
17
+ const decided = run.verdicts.filter((verdict) => verdict.decided);
18
+ if (decided.length === 0)
19
+ return 0;
20
+ return decided.filter((verdict) => verdict.passed).length / decided.length;
21
+ }
22
+ /** `part/whole pct`, with what the pass rate leaves out after it. */
23
+ function rate(part, whole, left, what) {
24
+ return `${part}/${whole} ${percent(part, whole)}${left > 0 ? ` (+${left} ${what})` : ''}`;
25
+ }
26
+ function blame(report) {
27
+ return report.results.flatMap((result) => {
28
+ if (result.passed === true)
29
+ return [];
30
+ if (result.errorType) {
31
+ const why = result.explanation ? ` (${result.explanation})` : '';
32
+ return [`${result.name}: ${result.errorType}${why}`];
33
+ }
34
+ if (result.passed === false)
35
+ return [`${result.name}: ${result.explanation ?? 'failed'}`];
36
+ return [];
37
+ });
38
+ }
39
+ /** The run's cost, never a zero standing in for calls whose provider reported none. */
40
+ function costLine(run) {
41
+ if (run.unpriced === 0)
42
+ return `cost $${run.costUsd.toFixed(4)}`;
43
+ const calls = `${run.unpriced} call${run.unpriced === 1 ? '' : 's'}`;
44
+ if (run.priced === 0)
45
+ return `cost not reported (${calls})`;
46
+ return `cost $${run.costUsd.toFixed(4)}, plus ${calls} whose cost went unreported`;
47
+ }
48
+ /** What a case passing means under the rule, over `k` trials. */
49
+ function ruleName(rule) {
50
+ if (rule === 'all')
51
+ return 'pass^k';
52
+ if (rule === 'any')
53
+ return 'pass@k';
54
+ return `>=${rule.atLeast}/k`;
55
+ }
56
+ function percent(part, whole) {
57
+ return whole === 0 ? '-' : `${Math.round((part / whole) * 100)}%`;
58
+ }
59
+ function spreadText(spread, unit = '') {
60
+ return spread ? `${spread.median}${unit} / ${spread.p90}${unit}` : '-';
61
+ }
62
+ /** Every cased trial, then each tag's: how often right, how consistently, how long, how many loops. */
63
+ function printGroups(run) {
64
+ const groups = groupSummaries(run);
65
+ const rows = groups.map((group) => [
66
+ group.group,
67
+ rate(group.casesPassed, group.cases - group.casesUndecided, group.casesUndecided, 'undecided'),
68
+ rate(group.trialsPassed, group.trials - group.trialsErrored, group.trialsErrored, 'errored'),
69
+ group.answers
70
+ ? `${group.answers.accepted}/${group.answers.partial}/${group.answers.wrong}${group.answers.none > 0 ? ` (+${group.answers.none} none)` : ''}`
71
+ : '-',
72
+ spreadText(group.durationMs, 'ms'),
73
+ spreadText(group.modelCalls),
74
+ spreadText(group.toolCalls),
75
+ Object.entries(group.stops)
76
+ .toSorted(([a], [b]) => a.localeCompare(b))
77
+ .map(([stop, count]) => `${stop} ${count}`)
78
+ .join(', ') || '-',
79
+ ]);
80
+ const header = [
81
+ 'group',
82
+ `cases ${ruleName(run.passRule)}`,
83
+ 'trials passed',
84
+ 'accepted/partial/wrong',
85
+ 'turn median / p90',
86
+ 'model calls',
87
+ 'tool calls',
88
+ 'stops',
89
+ ];
90
+ const widths = header.map((title, column) => Math.max(title.length, ...rows.map((row) => row[column]?.length ?? 0)));
91
+ const line = (cells) => ` ${cells.map((cell, column) => cell.padEnd(widths[column] ?? 0)).join(' ')}`;
92
+ console.log('');
93
+ console.log(line(header));
94
+ for (const row of rows)
95
+ console.log(line(row));
96
+ }
97
+ function printTable(run) {
98
+ const width = Math.max(4, ...run.verdicts.map((verdict) => verdict.case.length));
99
+ console.log(`\n▶ [EVAL] Suite: ${run.suite} (${run.mode}, ${run.repeat} trials per case)\n`);
100
+ console.log(` ${'case'.padEnd(width)} kind passed result`);
101
+ for (const verdict of run.verdicts) {
102
+ const mark = verdict.passed
103
+ ? `${GREEN}pass${RESET}`
104
+ : verdict.decided
105
+ ? `${RED}fail${RESET}`
106
+ : `${YELLOW}undecided${RESET}`;
107
+ const counts = `${verdict.trialsPassed}/${verdict.trials - verdict.trialsErrored}`;
108
+ const extra = [
109
+ verdict.trialsErrored > 0 ? `${verdict.trialsErrored} errored` : '',
110
+ verdict.trialsUngraded > 0 ? `${verdict.trialsUngraded} ungraded` : '',
111
+ ]
112
+ .filter(Boolean)
113
+ .join(', ');
114
+ console.log(` ${verdict.case.padEnd(width)} ${verdict.kind.padEnd(10)} ${counts.padEnd(6)} ${mark}${extra ? ` ${DIM}(${extra})${RESET}` : ''}`);
115
+ }
116
+ for (const verdict of run.verdicts) {
117
+ if (verdict.passed)
118
+ continue;
119
+ const reports = run.trials.filter((report) => report.case?.id === verdict.case);
120
+ for (const report of reports) {
121
+ const reasons = blame(report);
122
+ if (reasons.length === 0)
123
+ continue;
124
+ console.log(`\n ${verdict.case} trial ${report.index}:`);
125
+ for (const reason of reasons)
126
+ console.log(` ${DIM}·${RESET} ${reason}`);
127
+ }
128
+ }
129
+ if (run.caseless.length > 0) {
130
+ console.log(`\n ${DIM}${run.caseless.length} trace(s) carried no case stamp for this suite; graded without a case, no verdict.${RESET}`);
131
+ }
132
+ printGroups(run);
133
+ const passed = run.verdicts.filter((verdict) => verdict.passed).length;
134
+ const decided = run.verdicts.filter((verdict) => verdict.decided).length;
135
+ const undecided = run.verdicts.length - decided;
136
+ console.log(`\n ${passed}/${decided} cases passed${undecided > 0 ? ` (+${undecided} undecided)` : ''}; ${costLine(run)}`);
137
+ if (run.stopped)
138
+ console.log(` ${YELLOW}stopped on ${run.stopped}${RESET}`);
139
+ for (const warning of run.warnings)
140
+ console.log(` ${YELLOW}warning${RESET}: ${warning}`);
141
+ console.log('');
142
+ }
143
+ function printJson(run) {
144
+ console.log(JSON.stringify(summarizeRun(run), null, 2));
145
+ }
146
+ /**
147
+ * Returns whether the run met the threshold; a run stopped on budget never does. The CLI never
148
+ * creates a provider or reads a key: the host passes them or the suite module exports them.
149
+ */
150
+ export async function evalCommand(options, host = {}) {
151
+ const { provider, judgeProvider, judgeDecision, media } = host;
152
+ const threshold = options.threshold ?? 1;
153
+ if (!(threshold >= 0 && threshold <= 1))
154
+ return failed('--threshold is a fraction from 0 to 1.');
155
+ if (options.trials !== undefined && !(Number.isInteger(options.trials) && options.trials > 0)) {
156
+ return failed('--trials is a whole number of trials per case, 1 or more.');
157
+ }
158
+ if (options.concurrency !== undefined &&
159
+ !(Number.isInteger(options.concurrency) && options.concurrency > 0)) {
160
+ return failed('--concurrency is a whole number of trials in flight, 1 or more.');
161
+ }
162
+ let run;
163
+ try {
164
+ const loaded = await loadSuite(options.suite);
165
+ const recorded = options.recorded ? await readTraceRecords(options.recorded) : undefined;
166
+ const live = provider ?? loaded.provider;
167
+ if (!recorded && !live) {
168
+ return failed('Theorem CLI does not create providers or read keys. Export `provider` from the suite module, or pass --recorded <traces>.');
169
+ }
170
+ run = await runSuite(loaded, {
171
+ ...(recorded ? { recorded } : {}),
172
+ ...(live ? { provider: live } : {}),
173
+ ...(judgeProvider ? { judgeProvider } : {}),
174
+ ...(judgeDecision ? { judgeDecision } : {}),
175
+ ...(media ? { media } : {}),
176
+ ...(options.trials !== undefined ? { repeat: options.trials } : {}),
177
+ ...(options.concurrency !== undefined ? { concurrency: options.concurrency } : {}),
178
+ ...(options.maxCostUsd !== undefined ? { maxCostUsd: options.maxCostUsd } : {}),
179
+ ...(options.traceDir?.trim() ? { sink: jsonlSink(options.traceDir.trim()) } : {}),
180
+ });
181
+ }
182
+ catch (error) {
183
+ return failed(error instanceof Error ? error.message : String(error));
184
+ }
185
+ if (options.json)
186
+ printJson(run);
187
+ else
188
+ printTable(run);
189
+ return run.stopped === undefined && fraction(run) >= threshold;
190
+ }
@@ -0,0 +1,15 @@
1
+ import { type CanaryEgressAttack } from '../../guardrails/corpus/canary-egress-attacks.js';
2
+ export interface ChannelResult {
3
+ attack: CanaryEgressAttack;
4
+ channel: string;
5
+ blocked: boolean;
6
+ bypassed: boolean;
7
+ falseAlarm: boolean;
8
+ clientWire: string;
9
+ }
10
+ /** One result per attack per channel (runTurn stream, Live batch). */
11
+ export declare function runCanaryFuzz(canary?: string): Promise<ChannelResult[]>;
12
+ /** Run adversarial canary fuzz; returns true when no bypasses or false alarms. */
13
+ export declare function fuzzCanaryCommand(options?: {
14
+ canary?: string;
15
+ }): Promise<boolean>;
@@ -0,0 +1,202 @@
1
+ // A bypass is judged from the attack's own encoded canary, not from the detector under test.
2
+ import { bindCanary, isStreamedCanaryEvent, mintCanary, scanTextForCanaryLeak, } from '../../guardrails/canary.js';
3
+ import { buildCanaryEgressAttacks, FIXED_CANARY, FUZZ_SYSTEM, } from '../../guardrails/corpus/canary-egress-attacks.js';
4
+ import { givenUrlSets } from '../../guardrails/egress-urls.js';
5
+ import { createLiveOutboundGateSession, finalizeLiveOutboundTurn, processLiveOutboundBatch, } from '../../guardrails/live-outbound-gate.js';
6
+ import { scanTextOf } from '../../guardrails/serialize.js';
7
+ import { clearProfiles, getProfile, registerProfile, resolveTurn, } from '../../kernel/default-scope.js';
8
+ import { yieldProviderEvents, } from '../../kernel/engine/runner/stream.js';
9
+ import { providerCompleteRequest } from '../../kernel/registry/provider-request.js';
10
+ import { defaultKernelScope } from '../../kernel/scope.js';
11
+ const FUZZ_PROFILE_ID = '__fuzz_canary__';
12
+ function registerFuzzCanaryProfile() {
13
+ registerProfile({
14
+ type: 'text',
15
+ id: FUZZ_PROFILE_ID,
16
+ identity: { handle: 'fuzz-canary', system: 'Canary fuzz profile.' },
17
+ models: {
18
+ 'fuzz-model': {
19
+ protocol: 'openAi',
20
+ provider: 'openrouter',
21
+ apiId: 'fuzz-model',
22
+ key: 'fuzz',
23
+ efforts: { normal: 'none' },
24
+ summaries: false,
25
+ maxOutputTokens: 4096,
26
+ temperature: 0,
27
+ builtInTools: [],
28
+ },
29
+ },
30
+ defaultModel: 'fuzz-model',
31
+ tools: { allow: [] },
32
+ inputs: { text: true },
33
+ guardrails: { canary: true },
34
+ });
35
+ }
36
+ function resolveFuzzGeneration(canary) {
37
+ const { generation } = resolveTurn({
38
+ profile: FUZZ_PROFILE_ID,
39
+ input: { text: 'fuzz' },
40
+ });
41
+ return { ...generation, canary };
42
+ }
43
+ async function collectEvents(gen) {
44
+ const out = [];
45
+ for await (const event of gen) {
46
+ out.push(event);
47
+ }
48
+ return out;
49
+ }
50
+ function clientVisible(events) {
51
+ return events.filter((event) => event.type !== 'error');
52
+ }
53
+ function clientVisibleWire(events) {
54
+ return JSON.stringify(clientVisible(events));
55
+ }
56
+ /**
57
+ * Whether the attack's encoded canary reached the client: in the reply as the
58
+ * client assembles it across chunks and turns, or in any other event.
59
+ */
60
+ function leakReachedClient(attack, events) {
61
+ if (!attack.shouldBlock) {
62
+ return false;
63
+ }
64
+ const visible = clientVisible(events);
65
+ const reply = visible
66
+ .filter(isStreamedCanaryEvent)
67
+ .map((event) => event.text ?? '')
68
+ .join('');
69
+ return (reply.includes(attack.leak) ||
70
+ visible.some((event) => !isStreamedCanaryEvent(event) && scanTextOf(event).includes(attack.leak)));
71
+ }
72
+ function channelResult(attack, channel, blocked, events) {
73
+ const bypassed = leakReachedClient(attack, events);
74
+ return {
75
+ attack,
76
+ channel,
77
+ blocked,
78
+ bypassed,
79
+ falseAlarm: !attack.shouldBlock && blocked,
80
+ clientWire: clientVisibleWire(events),
81
+ };
82
+ }
83
+ async function* replay(turn) {
84
+ await Promise.resolve();
85
+ yield* turn;
86
+ }
87
+ async function runStreamChannel(attack, generation, canary) {
88
+ const events = [];
89
+ // Every provider call of one turn shares its canary: each attack turn is a step.
90
+ const control = { withholdVisible: false };
91
+ for (const turn of attack.turns) {
92
+ const streamed = await collectEvents(yieldProviderEvents({
93
+ profile: getProfile(FUZZ_PROFILE_ID),
94
+ generation,
95
+ request: providerCompleteRequest(defaultKernelScope.tools, generation, bindCanary(FUZZ_SYSTEM, canary)),
96
+ privateSystem: [bindCanary(FUZZ_SYSTEM, canary)],
97
+ provider: { complete: () => replay(turn) },
98
+ // The fuzz reads what reaches the client, not the trace.
99
+ call: { tap: () => { }, observe: () => { } },
100
+ control,
101
+ givenUrls: givenUrlSets(),
102
+ }));
103
+ // The runner reads the call's `done`; the client never receives it.
104
+ const turnEvents = streamed.flatMap((event) => (event.type === 'done' ? [] : [event]));
105
+ events.push(...turnEvents);
106
+ if (turnEvents.some((event) => event.type === 'error')) {
107
+ return channelResult(attack, 'runTurn.stream', true, events);
108
+ }
109
+ }
110
+ return channelResult(attack, 'runTurn.stream', false, events);
111
+ }
112
+ /** One Live session; each turn is a cycle the provider finishes before the next. */
113
+ async function runLiveBatchChannel(attack, canary) {
114
+ const session = createLiveOutboundGateSession(getProfile(FUZZ_PROFILE_ID), canary, [
115
+ bindCanary(FUZZ_SYSTEM, canary),
116
+ ]);
117
+ const events = [];
118
+ for (const turn of attack.turns) {
119
+ for (const result of [
120
+ await processLiveOutboundBatch(session, turn),
121
+ await finalizeLiveOutboundTurn(session),
122
+ ]) {
123
+ if (result.action === 'withhold') {
124
+ return channelResult(attack, 'live.batch', true, events);
125
+ }
126
+ if (result.action === 'emit') {
127
+ events.push(...result.events);
128
+ }
129
+ }
130
+ }
131
+ return channelResult(attack, 'live.batch', false, events);
132
+ }
133
+ function truncate(s, max) {
134
+ if (s.length <= max)
135
+ return s;
136
+ return `${s.slice(0, max - 3)}...`;
137
+ }
138
+ function printResults(results) {
139
+ const bypassed = results.filter((r) => r.bypassed);
140
+ const falseAlarms = results.filter((r) => r.falseAlarm);
141
+ const caught = results.filter((r) => r.attack.shouldBlock && r.blocked && !r.bypassed);
142
+ console.log(`\n${'═'.repeat(72)}`);
143
+ console.log(` TOTAL: ${results.length} | CAUGHT: ${caught.length} | BYPASSED: ${bypassed.length} | FALSE ALARM: ${falseAlarms.length}`);
144
+ console.log(`${'═'.repeat(72)}`);
145
+ if (bypassed.length > 0) {
146
+ console.log('\n\x1b[31mBYPASSED (canary reached client-visible output):\x1b[0m\n');
147
+ for (const r of bypassed) {
148
+ console.log(` ✗ ${r.attack.category}/${r.attack.name} [${r.channel}]`);
149
+ console.log(` \x1b[2m${truncate(r.clientWire, 90)}\x1b[0m`);
150
+ }
151
+ }
152
+ if (falseAlarms.length > 0) {
153
+ console.log('\n\x1b[33mFALSE ALARMS (benign payload blocked):\x1b[0m\n');
154
+ for (const r of falseAlarms) {
155
+ console.log(` ⚠ ${r.attack.category}/${r.attack.name} [${r.channel}]`);
156
+ }
157
+ }
158
+ if (bypassed.length === 0 && falseAlarms.length === 0) {
159
+ console.log('\n\x1b[32mAll leak attempts blocked; benign controls passed.\x1b[0m\n');
160
+ }
161
+ return bypassed.length === 0 && falseAlarms.length === 0;
162
+ }
163
+ /** One result per attack per channel (runTurn stream, Live batch). */
164
+ export async function runCanaryFuzz(canary = FIXED_CANARY) {
165
+ clearProfiles();
166
+ registerFuzzCanaryProfile();
167
+ try {
168
+ const generation = resolveFuzzGeneration(canary);
169
+ const results = [];
170
+ for (const attack of buildCanaryEgressAttacks(canary)) {
171
+ results.push(await runStreamChannel(attack, generation, canary));
172
+ results.push(await runLiveBatchChannel(attack, canary));
173
+ }
174
+ return results;
175
+ }
176
+ finally {
177
+ clearProfiles();
178
+ }
179
+ }
180
+ /** Run adversarial canary fuzz; returns true when no bypasses or false alarms. */
181
+ export async function fuzzCanaryCommand(options) {
182
+ console.log('\n🔐 Theorem Canary Egress Adversarial Fuzzer\n');
183
+ const canary = options?.canary ?? FIXED_CANARY;
184
+ if (!/^[0-9a-f]{32}$/.test(canary)) {
185
+ console.error(`Invalid canary shape (expected 32 hex): ${canary}`);
186
+ return false;
187
+ }
188
+ const minted = mintCanary();
189
+ if (!/^[0-9a-f]{32}$/.test(minted)) {
190
+ console.error(`mintCanary produced unexpected shape: ${minted}`);
191
+ return false;
192
+ }
193
+ if (!scanTextForCanaryLeak(canary, canary)) {
194
+ console.error('scanTextForCanaryLeak failed to detect literal canary');
195
+ return false;
196
+ }
197
+ const results = await runCanaryFuzz(canary);
198
+ console.log(`Canary: ${canary.slice(0, 12)}… (${results.length / 2} attacks × 2 channels)`);
199
+ const ok = printResults(results);
200
+ console.log('');
201
+ return ok;
202
+ }
@@ -0,0 +1,2 @@
1
+ /** Run inbound fuzz; returns true when no expected catches are missed. */
2
+ export declare function fuzzGuardrailsCommand(): boolean;
@@ -0,0 +1,5 @@
1
+ import { runInboundGuardrailFuzz } from '../../guardrails/corpus/fuzz-inbound.js';
2
+ /** Run inbound fuzz; returns true when no expected catches are missed. */
3
+ export function fuzzGuardrailsCommand() {
4
+ return runInboundGuardrailFuzz();
5
+ }
@@ -0,0 +1,2 @@
1
+ export declare function listProfilesCommand(): void;
2
+ export declare function showProfileCommand(profileId: string): void;
@@ -0,0 +1,80 @@
1
+ import { getProfile, listProfiles } from '../../kernel/default-scope.js';
2
+ import { profileToolAllow } from '../../kernel/tools/resolve.js';
3
+ function formatProfileInputs(p) {
4
+ if (p.type === 'speech') {
5
+ return 'text (speech)';
6
+ }
7
+ if (p.type === 'live') {
8
+ return 'audio/video (live)';
9
+ }
10
+ const inputs = [];
11
+ const { inputs: spec } = p;
12
+ if (!spec) {
13
+ return 'none';
14
+ }
15
+ if (spec.text !== false)
16
+ inputs.push('text');
17
+ if (p.type !== 'image' && p.inputs?.voice)
18
+ inputs.push('voice');
19
+ if (spec.attachments) {
20
+ inputs.push(`attachments [${spec.attachments.accept?.join(', ')}]`);
21
+ }
22
+ return inputs.join(' | ') || 'none';
23
+ }
24
+ function formatProfileTools(p) {
25
+ return profileToolAllow(p).join(', ') || 'none';
26
+ }
27
+ function printProfileCard(p) {
28
+ const tools = formatProfileTools(p);
29
+ if (p.type === 'host') {
30
+ console.log(` • Profile: ${p.id.padEnd(16)} [host]`);
31
+ console.log(` - Tools: ${tools}`);
32
+ console.log('-'.repeat(70));
33
+ return;
34
+ }
35
+ if (p.type === 'decision') {
36
+ console.log(` • Profile: ${p.id.padEnd(16)} (handle: ${p.identity.handle}) [decision]`);
37
+ console.log(` - Model: ${Object.keys(p.models).join(', ')}`);
38
+ console.log(` - Inputs: JSON state`);
39
+ console.log(` - Contract: ${p.decision.contract}`);
40
+ console.log(` - Key Slot: ${p.key ?? '(unset)'}`);
41
+ console.log('-'.repeat(70));
42
+ return;
43
+ }
44
+ const models = Object.keys(p.models).join(', ') || 'default';
45
+ const structured = p.type === 'live' || p.type === 'speech' ? undefined : p.outputs?.structured;
46
+ const structuredLabel = typeof structured === 'string' ? structured : structured ? 'custom' : 'none';
47
+ console.log(` • Profile: ${p.id.padEnd(16)} (handle: ${p.identity.handle}) [${p.type}]`);
48
+ console.log(` - Models: ${models}`);
49
+ console.log(` - Inputs: ${formatProfileInputs(p)}`);
50
+ console.log(` - Tools: ${tools}`);
51
+ console.log(` - Structured: ${structuredLabel}`);
52
+ console.log(` - Key Slot: ${p.key ?? '(unset)'}`);
53
+ console.log('-'.repeat(70));
54
+ }
55
+ export function listProfilesCommand() {
56
+ const profiles = listProfiles();
57
+ console.log('\n Registered Theorem Profiles:');
58
+ console.log('='.repeat(70));
59
+ if (profiles.length === 0) {
60
+ console.log(' (No profiles registered in runtime)');
61
+ console.log(`${'='.repeat(70)}\n`);
62
+ return;
63
+ }
64
+ for (const p of profiles) {
65
+ printProfileCard(p);
66
+ }
67
+ console.log(`Total: ${profiles.length} profiles registered.\n`);
68
+ }
69
+ export function showProfileCommand(profileId) {
70
+ try {
71
+ const profile = getProfile(profileId);
72
+ console.log(`\n Profile Details: ${profileId}`);
73
+ console.log('='.repeat(70));
74
+ console.log(JSON.stringify(profile, null, 2));
75
+ console.log(`${'='.repeat(70)}\n`);
76
+ }
77
+ catch (err) {
78
+ console.error(`\n Error: ${err instanceof Error ? err.message : String(err)}\n`);
79
+ }
80
+ }
@@ -0,0 +1,13 @@
1
+ import type { ModelProvider } from '../../kernel/types.js';
2
+ export interface RunOptions {
3
+ profile: string;
4
+ prompt?: string;
5
+ mode?: string;
6
+ search?: boolean;
7
+ map?: boolean;
8
+ provider?: ModelProvider;
9
+ verbose?: boolean;
10
+ trace?: boolean;
11
+ traceDir?: string;
12
+ }
13
+ export declare function runCommand(options: RunOptions): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { getProfile, runTurn } from '../../kernel/default-scope.js';
2
+ import { requireModelProfile } from '../../kernel/registry/resolve.js';
3
+ import { createCliTraceCapture, printRunEvent, printTraceRecord } from '../event-log.js';
4
+ export async function runCommand(options) {
5
+ requireModelProfile(getProfile(options.profile), 'agents run');
6
+ const provider = options.provider;
7
+ if (!provider) {
8
+ console.error('\n\x1b[31mExecution Failed\x1b[0m: Theorem CLI does not create providers or read keys. Run turns from a host app with an explicit ModelProvider.\n');
9
+ return;
10
+ }
11
+ const prompt = options.prompt || 'Hello! Please introduce your capabilities.';
12
+ if (options.search || options.map) {
13
+ const profile = requireModelProfile(getProfile(options.profile), 'agents run');
14
+ const selected = options.mode ?? profile.defaultModel;
15
+ const builtins = new Set(profile.models[selected]?.builtInTools ?? []);
16
+ if (options.search && !builtins.has('googleSearch')) {
17
+ console.error('\n\x1b[31mExecution Failed\x1b[0m: --search requires googleSearch on models.*.builtInTools for the selected model.\n');
18
+ return;
19
+ }
20
+ if (options.map && !builtins.has('googleMaps')) {
21
+ console.error('\n\x1b[31mExecution Failed\x1b[0m: --map requires googleMaps on models.*.builtInTools for the selected model.\n');
22
+ return;
23
+ }
24
+ }
25
+ const req = {
26
+ profile: options.profile,
27
+ model: options.mode,
28
+ input: { text: prompt },
29
+ };
30
+ console.log(`\n▶ [RUNNING TURN] Profile: ${options.profile} (${options.mode ?? 'default'})`);
31
+ console.log(`Prompt: "${prompt}"\n`);
32
+ const traceCapture = options.trace ? createCliTraceCapture(options.traceDir) : undefined;
33
+ try {
34
+ for await (const event of runTurn(req, provider, traceCapture?.sink)) {
35
+ printRunEvent(event, { verbose: options.verbose });
36
+ }
37
+ console.log('\n');
38
+ if (options.trace) {
39
+ printTraceRecord(traceCapture?.records.at(-1), options.verbose === true);
40
+ }
41
+ }
42
+ catch (err) {
43
+ console.error(`\n\x1b[31mExecution Failed\x1b[0m: ${err instanceof Error ? err.message : String(err)}\n`);
44
+ }
45
+ }
@@ -0,0 +1,25 @@
1
+ import type { ModelProvider, TurnRequest, TurnTokens } from '../../kernel/types.js';
2
+ import { type MatrixOptions } from '../matrix/synthesizer.js';
3
+ export interface TestRunResult {
4
+ passed: boolean;
5
+ name: string;
6
+ durationSec: number;
7
+ /** The turn's usage, summed over every model call (`sumTokens`). */
8
+ tokens?: TurnTokens;
9
+ error?: string;
10
+ }
11
+ interface CliTestOptions {
12
+ verbose?: boolean;
13
+ trace?: boolean;
14
+ traceDir?: string;
15
+ }
16
+ export declare function executeSingleTest(req: TurnRequest, testName: string, provider?: ModelProvider, cliOptions?: CliTestOptions): Promise<TestRunResult>;
17
+ export declare function testProfileCommand(profileId?: string, options?: MatrixOptions & {
18
+ all?: boolean;
19
+ matrix?: boolean;
20
+ provider?: ModelProvider;
21
+ verbose?: boolean;
22
+ trace?: boolean;
23
+ traceDir?: string;
24
+ }): Promise<boolean>;
25
+ export {};