@theoremjs/agents 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (570) hide show
  1. package/README.md +277 -995
  2. package/esm/mod.d.ts +34 -20
  3. package/esm/mod.js +19 -12
  4. package/esm/src/cli/commands/bench.js +36 -14
  5. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  6. package/esm/src/cli/commands/detect-compile.js +22 -0
  7. package/esm/src/cli/commands/eval.d.ts +3 -3
  8. package/esm/src/cli/commands/fuzz-canary.js +55 -16
  9. package/esm/src/cli/commands/profile.js +4 -4
  10. package/esm/src/cli/commands/run.d.ts +2 -2
  11. package/esm/src/cli/commands/run.js +1 -1
  12. package/esm/src/cli/commands/test.d.ts +4 -3
  13. package/esm/src/cli/commands/test.js +2 -2
  14. package/esm/src/cli/index.js +9 -9
  15. package/esm/src/cli/matrix/fixtures.js +25 -30
  16. package/esm/src/evals/attachments.d.ts +1 -0
  17. package/esm/src/evals/attachments.js +4 -2
  18. package/esm/src/evals/breakdown.d.ts +2 -0
  19. package/esm/src/evals/breakdown.js +1 -0
  20. package/esm/src/evals/graders/answer.d.ts +3 -0
  21. package/esm/src/evals/graders/answer.js +1 -0
  22. package/esm/src/evals/graders/code.d.ts +7 -31
  23. package/esm/src/evals/graders/code.js +4 -25
  24. package/esm/src/evals/graders/judge.d.ts +4 -0
  25. package/esm/src/evals/graders/judge.js +7 -5
  26. package/esm/src/evals/graders/latency.d.ts +1 -0
  27. package/esm/src/evals/graders/latency.js +3 -2
  28. package/esm/src/evals/graders/live.d.ts +3 -0
  29. package/esm/src/evals/graders/live.js +2 -0
  30. package/esm/src/evals/graders/media.js +1 -2
  31. package/esm/src/evals/graders/shared.js +1 -1
  32. package/esm/src/evals/graders/transcript.d.ts +2 -0
  33. package/esm/src/evals/graders/transcript.js +5 -3
  34. package/esm/src/evals/mod.d.ts +1 -9
  35. package/esm/src/evals/mod.js +1 -9
  36. package/esm/src/evals/record.d.ts +6 -0
  37. package/esm/src/evals/record.js +4 -2
  38. package/esm/src/evals/rubrics/mod.d.ts +1 -1
  39. package/esm/src/evals/rubrics/mod.js +1 -1
  40. package/esm/src/evals/rubrics/mustache.js +1 -1
  41. package/esm/src/evals/rubrics/types.js +1 -1
  42. package/esm/src/evals/run.d.ts +9 -52
  43. package/esm/src/evals/run.js +12 -46
  44. package/esm/src/evals/suite.d.ts +12 -3
  45. package/esm/src/evals/suite.js +9 -4
  46. package/esm/src/evals/summary.d.ts +3 -0
  47. package/esm/src/evals/summary.js +1 -0
  48. package/esm/src/evals/trial.d.ts +3 -16
  49. package/esm/src/evals/trial.js +7 -30
  50. package/esm/src/evals/types.d.ts +30 -121
  51. package/esm/src/evals/types.js +3 -16
  52. package/esm/src/evals/verdict.d.ts +5 -0
  53. package/esm/src/evals/verdict.js +4 -1
  54. package/esm/src/guardrails/boundaries.d.ts +41 -0
  55. package/esm/src/guardrails/boundaries.js +103 -0
  56. package/esm/src/guardrails/canary-gate.d.ts +1 -0
  57. package/esm/src/guardrails/canary.d.ts +49 -15
  58. package/esm/src/guardrails/canary.js +103 -30
  59. package/esm/src/guardrails/compile-egress.d.ts +6 -5
  60. package/esm/src/guardrails/compile-egress.js +6 -5
  61. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
  62. package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
  63. package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
  64. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
  65. package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
  66. package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
  67. package/esm/src/guardrails/corpus/live-attacks.js +6 -1
  68. package/esm/src/guardrails/corpus/mod.d.ts +1 -1
  69. package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
  70. package/esm/src/guardrails/corpus/secrets.js +2 -2
  71. package/esm/src/guardrails/corpus/strings.d.ts +1 -1
  72. package/esm/src/guardrails/corpus/strings.js +1 -1
  73. package/esm/src/guardrails/corpus/types.d.ts +5 -1
  74. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  75. package/esm/src/guardrails/credential-rules.js +3001 -0
  76. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  77. package/esm/src/guardrails/credential-scan.js +172 -0
  78. package/esm/src/guardrails/destinations.d.ts +45 -0
  79. package/esm/src/guardrails/destinations.js +234 -0
  80. package/esm/src/guardrails/detect-at.d.ts +107 -0
  81. package/esm/src/guardrails/detect-at.js +434 -0
  82. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  83. package/esm/src/guardrails/detect-reply.js +95 -0
  84. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  85. package/esm/src/guardrails/detect-stream.js +77 -0
  86. package/esm/src/guardrails/detectors.d.ts +216 -0
  87. package/esm/src/guardrails/detectors.js +503 -0
  88. package/esm/src/guardrails/egress-automata.d.ts +4 -6
  89. package/esm/src/guardrails/egress-automata.js +24095 -4572
  90. package/esm/src/guardrails/egress-compiler.d.ts +38 -16
  91. package/esm/src/guardrails/egress-compiler.js +254 -60
  92. package/esm/src/guardrails/egress-patterns.d.ts +4 -2
  93. package/esm/src/guardrails/egress-patterns.js +6 -2
  94. package/esm/src/guardrails/egress-stream.d.ts +54 -36
  95. package/esm/src/guardrails/egress-stream.js +253 -124
  96. package/esm/src/guardrails/egress-urls.d.ts +6 -3
  97. package/esm/src/guardrails/egress-urls.js +14 -22
  98. package/esm/src/guardrails/egress.d.ts +26 -86
  99. package/esm/src/guardrails/egress.js +59 -309
  100. package/esm/src/guardrails/error.d.ts +13 -8
  101. package/esm/src/guardrails/error.js +25 -18
  102. package/esm/src/guardrails/event-schemas.d.ts +46 -3
  103. package/esm/src/guardrails/event-schemas.js +12 -5
  104. package/esm/src/guardrails/events.d.ts +5 -1
  105. package/esm/src/guardrails/events.js +4 -1
  106. package/esm/src/guardrails/hints.d.ts +14 -0
  107. package/esm/src/guardrails/hints.js +57 -0
  108. package/esm/src/guardrails/hits.d.ts +7 -1
  109. package/esm/src/guardrails/hits.js +12 -1
  110. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  111. package/esm/src/guardrails/host-patterns.js +173 -0
  112. package/esm/src/guardrails/injection-patterns.d.ts +6 -1
  113. package/esm/src/guardrails/injection-patterns.js +33 -1
  114. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  115. package/esm/src/guardrails/injection-reversed.js +49 -0
  116. package/esm/src/guardrails/injection.d.ts +17 -1
  117. package/esm/src/guardrails/injection.js +259 -36
  118. package/esm/src/guardrails/labels.d.ts +40 -0
  119. package/esm/src/guardrails/labels.js +881 -0
  120. package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
  121. package/esm/src/guardrails/live-outbound-gate.js +100 -107
  122. package/esm/src/guardrails/mod.d.ts +30 -22
  123. package/esm/src/guardrails/mod.js +19 -14
  124. package/esm/src/guardrails/network.d.ts +4 -0
  125. package/esm/src/guardrails/network.js +21 -19
  126. package/esm/src/guardrails/normalize.d.ts +15 -1
  127. package/esm/src/guardrails/normalize.js +34 -1
  128. package/esm/src/guardrails/policy.d.ts +2 -17
  129. package/esm/src/guardrails/policy.js +12 -41
  130. package/esm/src/guardrails/progressive-yield.d.ts +65 -24
  131. package/esm/src/guardrails/progressive-yield.js +191 -147
  132. package/esm/src/guardrails/prompt-echo.d.ts +4 -2
  133. package/esm/src/guardrails/prompt-echo.js +87 -6
  134. package/esm/src/guardrails/quota.d.ts +4 -1
  135. package/esm/src/guardrails/quota.js +7 -2
  136. package/esm/src/guardrails/rules.d.ts +20 -29
  137. package/esm/src/guardrails/rules.js +23 -30
  138. package/esm/src/guardrails/sanitize.d.ts +32 -15
  139. package/esm/src/guardrails/sanitize.js +100 -124
  140. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  141. package/esm/src/guardrails/sensitive-groups.js +12 -0
  142. package/esm/src/guardrails/sensitive.d.ts +16 -23
  143. package/esm/src/guardrails/sensitive.js +168 -47
  144. package/esm/src/guardrails/serialize.d.ts +1 -0
  145. package/esm/src/guardrails/testing.d.ts +4 -2
  146. package/esm/src/guardrails/testing.js +4 -2
  147. package/esm/src/guardrails/theorem-error.d.ts +5 -2
  148. package/esm/src/guardrails/theorem-error.js +6 -3
  149. package/esm/src/guardrails/thought-guard.d.ts +34 -13
  150. package/esm/src/guardrails/thought-guard.js +264 -64
  151. package/esm/src/guardrails/tool-directives.d.ts +29 -10
  152. package/esm/src/guardrails/tool-directives.js +133 -47
  153. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  154. package/esm/src/guardrails/tool-leak.js +45 -0
  155. package/esm/src/guardrails/tool-result.d.ts +45 -14
  156. package/esm/src/guardrails/tool-result.js +94 -70
  157. package/esm/src/guardrails/types.d.ts +79 -71
  158. package/esm/src/guardrails/types.js +11 -7
  159. package/esm/src/host/client-turn.d.ts +29 -2
  160. package/esm/src/host/client-turn.js +46 -4
  161. package/esm/src/host/mint-trace.d.ts +1 -0
  162. package/esm/src/host/mint-trace.js +3 -2
  163. package/esm/src/host/mod.d.ts +2 -2
  164. package/esm/src/host/mod.js +1 -1
  165. package/esm/src/host/readStreamingJsonStringField.js +2 -43
  166. package/esm/src/host/reply.d.ts +6 -0
  167. package/esm/src/host/reply.js +8 -1
  168. package/esm/src/interface/blocks.d.ts +3 -0
  169. package/esm/src/interface/blocks.js +84 -14
  170. package/esm/src/interface/composer-actions.d.ts +4 -0
  171. package/esm/src/interface/composer-actions.js +5 -3
  172. package/esm/src/interface/draft.d.ts +6 -0
  173. package/esm/src/interface/draft.js +22 -11
  174. package/esm/src/interface/from-profile.d.ts +13 -1
  175. package/esm/src/interface/from-profile.js +66 -31
  176. package/esm/src/interface/history.d.ts +9 -3
  177. package/esm/src/interface/history.js +33 -24
  178. package/esm/src/interface/inputs.d.ts +1 -0
  179. package/esm/src/interface/inputs.js +3 -0
  180. package/esm/src/interface/mod.d.ts +4 -2
  181. package/esm/src/interface/mod.js +3 -2
  182. package/esm/src/interface/models.d.ts +7 -0
  183. package/esm/src/interface/models.js +5 -0
  184. package/esm/src/interface/pending.d.ts +9 -0
  185. package/esm/src/interface/pending.js +9 -3
  186. package/esm/src/interface/profile-interface.js +54 -40
  187. package/esm/src/interface/session.d.ts +12 -5
  188. package/esm/src/interface/session.js +17 -10
  189. package/esm/src/interface/stop.d.ts +13 -0
  190. package/esm/src/interface/stop.js +28 -0
  191. package/esm/src/interface/tool-calls.d.ts +14 -2
  192. package/esm/src/interface/tool-calls.js +64 -10
  193. package/esm/src/interface/tool-invoke.d.ts +2 -0
  194. package/esm/src/interface/tool-invoke.js +3 -1
  195. package/esm/src/interface/tool-media.d.ts +2 -0
  196. package/esm/src/interface/tool-media.js +2 -1
  197. package/esm/src/interface/types.d.ts +105 -40
  198. package/esm/src/interface/types.js +1 -0
  199. package/esm/src/kernel/api-catalog.d.ts +85 -0
  200. package/esm/src/kernel/api-catalog.js +229 -0
  201. package/esm/src/kernel/auth/crypto.d.ts +7 -2
  202. package/esm/src/kernel/auth/crypto.js +12 -10
  203. package/esm/src/kernel/auth/oauth.d.ts +2 -1
  204. package/esm/src/kernel/auth/oauth.js +23 -22
  205. package/esm/src/kernel/auth/typed-secret.js +2 -2
  206. package/esm/src/kernel/auth/types.d.ts +13 -0
  207. package/esm/src/kernel/checkpoint.d.ts +43 -0
  208. package/esm/src/kernel/checkpoint.js +58 -0
  209. package/esm/src/kernel/default-scope.d.ts +43 -5
  210. package/esm/src/kernel/default-scope.js +54 -5
  211. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  212. package/esm/src/kernel/engine/call-trace.js +29 -0
  213. package/esm/src/kernel/engine/compaction.d.ts +6 -5
  214. package/esm/src/kernel/engine/compaction.js +12 -11
  215. package/esm/src/kernel/engine/decision.d.ts +10 -8
  216. package/esm/src/kernel/engine/decision.js +174 -146
  217. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  218. package/esm/src/kernel/engine/embedding.js +118 -0
  219. package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
  220. package/esm/src/kernel/engine/live-inbound.js +36 -11
  221. package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
  222. package/esm/src/kernel/engine/live-ingress.js +6 -1
  223. package/esm/src/kernel/engine/repair.js +12 -12
  224. package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
  225. package/esm/src/kernel/engine/runner/gates.js +287 -101
  226. package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
  227. package/esm/src/kernel/engine/runner/mod.js +107 -56
  228. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  229. package/esm/src/kernel/engine/runner/nested.js +134 -0
  230. package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
  231. package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
  232. package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
  233. package/esm/src/kernel/engine/runner/stages.js +1 -8
  234. package/esm/src/kernel/engine/runner/state.d.ts +33 -12
  235. package/esm/src/kernel/engine/runner/state.js +11 -1
  236. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  237. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  238. package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
  239. package/esm/src/kernel/engine/runner/steps.js +329 -169
  240. package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
  241. package/esm/src/kernel/engine/runner/stream.js +197 -46
  242. package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
  243. package/esm/src/kernel/engine/runner/usage.js +12 -14
  244. package/esm/src/kernel/engine/session/mod.d.ts +8 -6
  245. package/esm/src/kernel/engine/session/mod.js +360 -129
  246. package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
  247. package/esm/src/kernel/engine/session/session-trace.js +41 -30
  248. package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
  249. package/esm/src/kernel/engine/token-estimate.js +14 -194
  250. package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
  251. package/esm/src/kernel/engine/tool-trace.js +2 -1
  252. package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
  253. package/esm/src/kernel/engine/turn-trace.js +28 -36
  254. package/esm/src/kernel/engine/usage.d.ts +6 -0
  255. package/esm/src/kernel/engine/usage.js +17 -0
  256. package/esm/src/kernel/interaction-parts.d.ts +3 -0
  257. package/esm/src/kernel/interaction-parts.js +18 -0
  258. package/esm/src/kernel/json.d.ts +10 -0
  259. package/esm/src/kernel/json.js +3 -0
  260. package/esm/src/kernel/mod.d.ts +38 -11
  261. package/esm/src/kernel/mod.js +22 -7
  262. package/esm/src/kernel/profile-graph.d.ts +11 -6
  263. package/esm/src/kernel/profile-graph.js +14 -7
  264. package/esm/src/kernel/profile-presence.d.ts +10 -1
  265. package/esm/src/kernel/profile-presence.js +90 -75
  266. package/esm/src/kernel/profile-scope.d.ts +7 -3
  267. package/esm/src/kernel/profile-scope.js +67 -55
  268. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  269. package/esm/src/kernel/protocols/binding.js +125 -0
  270. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  271. package/esm/src/kernel/protocols/limits.js +28 -0
  272. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  273. package/esm/src/kernel/protocols/mod.js +5 -0
  274. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  275. package/esm/src/kernel/protocols/prices.js +37 -0
  276. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  277. package/esm/src/kernel/protocols/protocol.js +253 -0
  278. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  279. package/esm/src/kernel/protocols/provider.js +143 -0
  280. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  281. package/esm/src/kernel/protocols/runtime.js +534 -0
  282. package/esm/src/kernel/provider-budget.d.ts +32 -0
  283. package/esm/src/kernel/provider-budget.js +262 -0
  284. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  285. package/esm/src/kernel/provider-dispatch.js +36 -0
  286. package/esm/src/kernel/provider-live.d.ts +7 -0
  287. package/esm/src/kernel/provider-live.js +189 -0
  288. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  289. package/esm/src/kernel/provider-runtime.js +524 -0
  290. package/esm/src/kernel/registry/attachments.d.ts +15 -4
  291. package/esm/src/kernel/registry/attachments.js +31 -22
  292. package/esm/src/kernel/registry/catalog.d.ts +6 -0
  293. package/esm/src/kernel/registry/catalog.js +9 -2
  294. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  295. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  296. package/esm/src/kernel/registry/ingress.d.ts +6 -2
  297. package/esm/src/kernel/registry/ingress.js +55 -10
  298. package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
  299. package/esm/src/kernel/registry/kernel-registry.js +9 -2
  300. package/esm/src/kernel/registry/profile-outputs.js +4 -1
  301. package/esm/src/kernel/registry/profiles.d.ts +38 -14
  302. package/esm/src/kernel/registry/profiles.js +280 -205
  303. package/esm/src/kernel/registry/provider-request.d.ts +3 -3
  304. package/esm/src/kernel/registry/provider-request.js +5 -13
  305. package/esm/src/kernel/registry/resolve.d.ts +4 -1
  306. package/esm/src/kernel/registry/resolve.js +59 -58
  307. package/esm/src/kernel/registry/schemas.d.ts +3 -0
  308. package/esm/src/kernel/registry/schemas.js +3 -1
  309. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  310. package/esm/src/kernel/registry/slot-fill.js +22 -0
  311. package/esm/src/kernel/registry/system-prompt.js +7 -8
  312. package/esm/src/kernel/registry/vault.d.ts +14 -13
  313. package/esm/src/kernel/registry/vault.js +1 -14
  314. package/esm/src/kernel/schema.d.ts +100 -46
  315. package/esm/src/kernel/schema.js +499 -257
  316. package/esm/src/kernel/scope.d.ts +12 -5
  317. package/esm/src/kernel/scope.js +23 -3
  318. package/esm/src/kernel/stages.d.ts +38 -3
  319. package/esm/src/kernel/stages.js +82 -39
  320. package/esm/src/kernel/stop.d.ts +29 -6
  321. package/esm/src/kernel/stop.js +16 -4
  322. package/esm/src/kernel/system-parts.js +6 -6
  323. package/esm/src/kernel/tools/activity-label.d.ts +12 -6
  324. package/esm/src/kernel/tools/activity-label.js +258 -32
  325. package/esm/src/kernel/tools/agent.d.ts +66 -0
  326. package/esm/src/kernel/tools/agent.js +212 -0
  327. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  328. package/esm/src/kernel/tools/coordinate.js +165 -0
  329. package/esm/src/kernel/tools/events.d.ts +21 -6
  330. package/esm/src/kernel/tools/events.js +53 -18
  331. package/esm/src/kernel/tools/execute.d.ts +47 -11
  332. package/esm/src/kernel/tools/execute.js +508 -136
  333. package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
  334. package/esm/src/kernel/tools/gate-answer.js +17 -6
  335. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  336. package/esm/src/kernel/tools/handler-events.js +106 -0
  337. package/esm/src/kernel/tools/harness.d.ts +1 -0
  338. package/esm/src/kernel/tools/harness.js +2 -1
  339. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  340. package/esm/src/kernel/tools/http-limit.js +85 -0
  341. package/esm/src/kernel/tools/invoke.d.ts +27 -5
  342. package/esm/src/kernel/tools/invoke.js +223 -70
  343. package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
  344. package/esm/src/kernel/tools/mcp-sessions.js +13 -8
  345. package/esm/src/kernel/tools/mod.d.ts +4 -3
  346. package/esm/src/kernel/tools/mod.js +3 -2
  347. package/esm/src/kernel/tools/model-text.d.ts +10 -5
  348. package/esm/src/kernel/tools/model-text.js +18 -12
  349. package/esm/src/kernel/tools/operation.d.ts +76 -0
  350. package/esm/src/kernel/tools/operation.js +100 -0
  351. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  352. package/esm/src/kernel/tools/page-answer.js +19 -0
  353. package/esm/src/kernel/tools/permission.d.ts +11 -2
  354. package/esm/src/kernel/tools/permission.js +12 -12
  355. package/esm/src/kernel/tools/project.d.ts +4 -1
  356. package/esm/src/kernel/tools/project.js +32 -2
  357. package/esm/src/kernel/tools/registry.d.ts +9 -2
  358. package/esm/src/kernel/tools/registry.js +69 -10
  359. package/esm/src/kernel/tools/remote.d.ts +40 -6
  360. package/esm/src/kernel/tools/remote.js +219 -92
  361. package/esm/src/kernel/tools/resolve.d.ts +3 -0
  362. package/esm/src/kernel/tools/resolve.js +12 -4
  363. package/esm/src/kernel/tools/run.d.ts +28 -0
  364. package/esm/src/kernel/tools/run.js +86 -0
  365. package/esm/src/kernel/tools/schema.d.ts +3 -3
  366. package/esm/src/kernel/tools/schema.js +21 -100
  367. package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
  368. package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
  369. package/esm/src/kernel/tools/stage-run.d.ts +27 -4
  370. package/esm/src/kernel/tools/stage-run.js +75 -17
  371. package/esm/src/kernel/tools/types.d.ts +235 -25
  372. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  373. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  374. package/esm/src/kernel/turn-events.d.ts +208 -31
  375. package/esm/src/kernel/turn-events.js +127 -9
  376. package/esm/src/kernel/types.d.ts +302 -161
  377. package/esm/src/kernel/util/base64.d.ts +2 -0
  378. package/esm/src/kernel/util/base64.js +2 -0
  379. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  380. package/esm/src/kernel/util/partial-json.js +128 -0
  381. package/esm/src/kernel/util/record.d.ts +1 -0
  382. package/esm/src/kernel/util/record.js +1 -0
  383. package/esm/src/observability/destinations.d.ts +5 -0
  384. package/esm/src/observability/destinations.js +7 -2
  385. package/esm/src/observability/jsonl.d.ts +2 -2
  386. package/esm/src/observability/jsonl.js +15 -22
  387. package/esm/src/observability/mod.d.ts +3 -3
  388. package/esm/src/observability/mod.js +2 -2
  389. package/esm/src/observability/openinference.d.ts +1 -1
  390. package/esm/src/observability/openinference.js +3 -3
  391. package/esm/src/observability/otlp.d.ts +3 -0
  392. package/esm/src/observability/otlp.js +3 -3
  393. package/esm/src/observability/phoenix.d.ts +1 -0
  394. package/esm/src/observability/policy.d.ts +3 -0
  395. package/esm/src/observability/policy.js +5 -1
  396. package/esm/src/observability/resolve-policy.js +11 -5
  397. package/esm/src/observability/spans.d.ts +8 -2
  398. package/esm/src/observability/spans.js +21 -5
  399. package/esm/src/observability/trace-catalog.d.ts +19 -2
  400. package/esm/src/observability/trace-catalog.js +130 -88
  401. package/esm/src/observability/trace-record.js +22 -17
  402. package/esm/src/observability/trace-schema.d.ts +3 -0
  403. package/esm/src/observability/trace-schema.js +1 -1
  404. package/esm/src/observability/trace-sink.d.ts +1 -0
  405. package/esm/src/observability/trace-sink.js +1 -1
  406. package/esm/src/observability/trace-span.d.ts +7 -1
  407. package/esm/src/observability/trace-span.js +3 -1
  408. package/esm/src/observability/trace.d.ts +2 -0
  409. package/esm/src/observability/trace.js +4 -2
  410. package/esm/src/observability/types.d.ts +35 -11
  411. package/esm/src/observability/types.js +1 -1
  412. package/esm/src/presets/google/speech-voices.d.ts +1 -0
  413. package/esm/src/presets/google-limits.d.ts +1 -0
  414. package/esm/src/presets/google.d.ts +27 -12
  415. package/esm/src/presets/google.js +34 -25
  416. package/esm/src/presets/local.d.ts +26 -0
  417. package/esm/src/presets/local.js +30 -0
  418. package/esm/src/presets/mod.d.ts +5 -4
  419. package/esm/src/presets/mod.js +4 -4
  420. package/esm/src/presets/openrouter.d.ts +14 -1
  421. package/esm/src/presets/openrouter.js +19 -1
  422. package/esm/src/providers/embedding-limits.d.ts +7 -0
  423. package/esm/src/providers/embedding-limits.js +12 -0
  424. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  425. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  426. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  427. package/esm/src/providers/gemini/interactions-protocol.js +102 -0
  428. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  429. package/esm/src/providers/gemini/live-protocol.js +191 -0
  430. package/esm/src/providers/gemini/prices.d.ts +3 -0
  431. package/esm/src/providers/gemini/prices.js +63 -0
  432. package/esm/src/providers/gemini/provider.d.ts +7 -0
  433. package/esm/src/providers/gemini/provider.js +39 -0
  434. package/esm/src/providers/google/api-error.d.ts +2 -0
  435. package/esm/src/providers/google/api-error.js +26 -18
  436. package/esm/src/providers/google/builtins.d.ts +14 -0
  437. package/esm/src/providers/google/builtins.js +57 -0
  438. package/esm/src/providers/google/grounding.d.ts +4 -4
  439. package/esm/src/providers/google/interactions/framing.d.ts +20 -8
  440. package/esm/src/providers/google/interactions/framing.js +85 -44
  441. package/esm/src/providers/google/interactions/steps.d.ts +5 -5
  442. package/esm/src/providers/google/interactions/steps.js +4 -4
  443. package/esm/src/providers/google/interactions/stream.d.ts +10 -11
  444. package/esm/src/providers/google/interactions/stream.js +33 -100
  445. package/esm/src/providers/google/live/framing.d.ts +15 -5
  446. package/esm/src/providers/google/live/framing.js +25 -25
  447. package/esm/src/providers/google/live/stream.d.ts +6 -44
  448. package/esm/src/providers/google/live/stream.js +4 -210
  449. package/esm/src/providers/google/urls.d.ts +1 -3
  450. package/esm/src/providers/google/urls.js +1 -3
  451. package/esm/src/providers/google/usage.js +2 -2
  452. package/esm/src/providers/live.d.ts +6 -0
  453. package/esm/src/providers/live.js +6 -0
  454. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  455. package/esm/src/providers/local/embedding-protocol.js +60 -0
  456. package/esm/src/providers/local/provider.d.ts +7 -0
  457. package/esm/src/providers/local/provider.js +28 -0
  458. package/esm/src/providers/mod.d.ts +28 -7
  459. package/esm/src/providers/mod.js +19 -3
  460. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  461. package/esm/src/providers/open-ai/protocol.js +189 -0
  462. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  463. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  464. package/esm/src/providers/openrouter/image.d.ts +0 -9
  465. package/esm/src/providers/openrouter/image.js +0 -153
  466. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  467. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  468. package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
  469. package/esm/src/providers/openrouter/openai/compat.js +6 -6
  470. package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
  471. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  472. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  473. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  474. package/esm/src/providers/openrouter/protocol.js +171 -0
  475. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  476. package/esm/src/providers/openrouter/provider.js +50 -0
  477. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  478. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  479. package/esm/src/providers/shared/pcm.js +2 -2
  480. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  481. package/esm/src/providers/shared/protocol-events.js +20 -0
  482. package/esm/src/providers/shared/response-identity.d.ts +2 -2
  483. package/esm/src/providers/shared/retry.d.ts +18 -0
  484. package/esm/src/providers/shared/retry.js +89 -0
  485. package/esm/src/providers/shared/sse.d.ts +0 -4
  486. package/esm/src/providers/shared/sse.js +50 -36
  487. package/esm/src/providers/shared/tool-args.d.ts +6 -7
  488. package/esm/src/providers/shared/tool-args.js +10 -6
  489. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  490. package/esm/src/providers/shared/tool-draft.js +14 -0
  491. package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
  492. package/esm/src/providers/shared/upstream-tape.js +1 -1
  493. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  494. package/esm/src/providers/system-one/protocol.js +93 -0
  495. package/esm/src/providers/types.d.ts +48 -16
  496. package/esm/src/providers/types.js +2 -1
  497. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  498. package/esm/src/providers/typesafe/provider.js +24 -0
  499. package/esm/src/surface/formats.d.ts +19 -1
  500. package/esm/src/surface/formats.js +68 -29
  501. package/esm/src/surface/mod.d.ts +4 -2
  502. package/esm/src/surface/mod.js +4 -2
  503. package/esm/src/surface/runtime.d.ts +4 -0
  504. package/esm/src/surface/runtime.js +2 -0
  505. package/esm/src/surface/tools.d.ts +2 -8
  506. package/esm/src/surface/tools.js +4 -22
  507. package/esm/src/surface/types.d.ts +6 -0
  508. package/package.json +5 -13
  509. package/esm/src/cli/commands/egress-compile.d.ts +0 -17
  510. package/esm/src/cli/commands/egress-compile.js +0 -25
  511. package/esm/src/guardrails/egress-policy.d.ts +0 -27
  512. package/esm/src/guardrails/egress-policy.js +0 -76
  513. package/esm/src/guardrails/egress-rules.d.ts +0 -54
  514. package/esm/src/guardrails/egress-rules.js +0 -49
  515. package/esm/src/guardrails/lexicon.d.ts +0 -30
  516. package/esm/src/guardrails/lexicon.js +0 -478
  517. package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
  518. package/esm/src/kernel/engine/media-probe/audio.js +0 -342
  519. package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
  520. package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
  521. package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
  522. package/esm/src/kernel/engine/media-probe/image.js +0 -171
  523. package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
  524. package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
  525. package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
  526. package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
  527. package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
  528. package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
  529. package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
  530. package/esm/src/kernel/engine/media-probe/opus.js +0 -23
  531. package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
  532. package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
  533. package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
  534. package/esm/src/kernel/engine/media-probe/video.js +0 -49
  535. package/esm/src/presets/typesafe.d.ts +0 -2
  536. package/esm/src/presets/typesafe.js +0 -2
  537. package/esm/src/providers/create-provider.d.ts +0 -21
  538. package/esm/src/providers/create-provider.js +0 -90
  539. package/esm/src/providers/decision/usage.d.ts +0 -3
  540. package/esm/src/providers/decision/usage.js +0 -25
  541. package/esm/src/providers/google/interactions/mod.d.ts +0 -2
  542. package/esm/src/providers/google/interactions/mod.js +0 -2
  543. package/esm/src/providers/google/keys.d.ts +0 -20
  544. package/esm/src/providers/google/keys.js +0 -87
  545. package/esm/src/providers/google/live/mod.d.ts +0 -7
  546. package/esm/src/providers/google/live/mod.js +0 -7
  547. package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
  548. package/esm/src/providers/google/live/openapi-schema.js +0 -42
  549. package/esm/src/providers/google/live/session.d.ts +0 -14
  550. package/esm/src/providers/google/live/session.js +0 -150
  551. package/esm/src/providers/local/local.d.ts +0 -12
  552. package/esm/src/providers/local/local.js +0 -186
  553. package/esm/src/providers/local/mod.d.ts +0 -8
  554. package/esm/src/providers/local/mod.js +0 -8
  555. package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
  556. package/esm/src/providers/openrouter/cache-control.js +0 -4
  557. package/esm/src/providers/openrouter/chat.d.ts +0 -64
  558. package/esm/src/providers/openrouter/chat.js +0 -490
  559. package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
  560. package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
  561. package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
  562. package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
  563. package/esm/src/providers/openrouter/speech.d.ts +0 -18
  564. package/esm/src/providers/openrouter/speech.js +0 -109
  565. package/esm/src/providers/probe.d.ts +0 -5
  566. package/esm/src/providers/probe.js +0 -15
  567. package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
  568. package/esm/src/providers/shared/builtin-wire.js +0 -9
  569. package/esm/src/providers/shared/vault.d.ts +0 -13
  570. package/esm/src/providers/shared/vault.js +0 -41
@@ -8,7 +8,7 @@
8
8
  import "../../_dnt.polyfills.js";
9
9
  import { argv, exit } from 'node:process';
10
10
  import { benchCommand } from './commands/bench.js';
11
- import { egressCompileCommand } from './commands/egress-compile.js';
11
+ import { detectCompileCommand } from './commands/detect-compile.js';
12
12
  import { evalCommand } from './commands/eval.js';
13
13
  import { fuzzCanaryCommand } from './commands/fuzz-canary.js';
14
14
  import { fuzzGuardrailsCommand } from './commands/fuzz-guardrails.js';
@@ -28,8 +28,8 @@ COMMANDS:
28
28
  --iterations <n> Measurement iterations (default: 50)
29
29
  --warmup <n> Warmup iterations (default: 5)
30
30
 
31
- egress-compile <module> Compile a module's egress rules for egressPolicy
32
- --export <name> The export holding the rules (default: rules)
31
+ detect-compile <module> Compile the patterns in a module's detect setting
32
+ --export <name> The export holding the setting (default: detect)
33
33
  --out <path> Where to write the compiled module
34
34
 
35
35
  eval <suite> Run an eval suite live or over recorded traces
@@ -204,19 +204,19 @@ function handleProfile(flags) {
204
204
  }
205
205
  showProfileCommand(id);
206
206
  }
207
- async function handleEgressCompile(flags) {
207
+ async function handleDetectCompile(flags) {
208
208
  const module = flags._[1];
209
209
  if (!module || typeof flags.out !== 'string') {
210
- console.error('Error: usage `agents egress-compile <module> --out <path> [--export <name>]`');
210
+ console.error('Error: usage `agents detect-compile <module> --out <path> [--export <name>]`');
211
211
  exit(1);
212
212
  }
213
213
  try {
214
- const count = await egressCompileCommand({
214
+ const detectors = await detectCompileCommand({
215
215
  module,
216
216
  exportName: typeof flags.export === 'string' ? flags.export : undefined,
217
217
  out: flags.out,
218
218
  });
219
- console.log(`Compiled ${count} egress rule${count === 1 ? '' : 's'} to ${flags.out}`);
219
+ console.log(`Compiled the patterns of ${detectors.join(', ') || 'no detector'} to ${flags.out}`);
220
220
  }
221
221
  catch (err) {
222
222
  console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
@@ -239,8 +239,8 @@ export async function main(cliArgs = argv.slice(2)) {
239
239
  exit(1);
240
240
  }
241
241
  }
242
- else if (command === 'egress-compile') {
243
- await handleEgressCompile(flags);
242
+ else if (command === 'detect-compile') {
243
+ await handleDetectCompile(flags);
244
244
  }
245
245
  else if (command === 'bench') {
246
246
  await benchCommand({
@@ -1,39 +1,34 @@
1
- // 1x1 pixel PNG (base64)
2
1
  export const FIXTURE_PNG_BASE64 = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
3
2
  export const FIXTURE_PDF_BASE64 = btoa('%PDF-1.4\n1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj\n2 0 obj<</Type/Pages/Count 1/Kids[3 0 R]>>endobj\n3 0 obj<</Type/Page/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<<>>>>endobj\nxref\n0 4\n0000000000 65535 f \n0000000009 00000 n \n0000000056 00000 n \n0000000111 00000 n \ntrailer<</Size 4/Root 1 0 R>>\nstartxref\n188\n%%EOF\n');
4
- // 16kHz 16-bit mono PCM WAV
5
3
  export function createSyntheticWavBase64(durationSec = 0.1, sampleRate = 16000) {
6
4
  const numSamples = Math.floor(sampleRate * durationSec);
7
- const dataSize = numSamples * 2; // 16-bit = 2 bytes per sample
5
+ const dataSize = numSamples * 2;
8
6
  const buffer = new ArrayBuffer(44 + dataSize);
9
7
  const view = new DataView(buffer);
10
- // RIFF identifier
11
- view.setUint8(0, 0x52); // R
12
- view.setUint8(1, 0x49); // I
13
- view.setUint8(2, 0x46); // F
14
- view.setUint8(3, 0x46); // F
15
- view.setUint32(4, 36 + dataSize, true); // file size - 8
16
- view.setUint8(8, 0x57); // W
17
- view.setUint8(9, 0x41); // A
18
- view.setUint8(10, 0x56); // V
19
- view.setUint8(11, 0x45); // E
20
- // fmt subchunk
21
- view.setUint8(12, 0x66); // f
22
- view.setUint8(13, 0x6d); // m
23
- view.setUint8(14, 0x74); // t
24
- view.setUint8(15, 0x20); // ' '
25
- view.setUint32(16, 16, true); // Subchunk1Size (16 for PCM)
26
- view.setUint16(20, 1, true); // AudioFormat (1 = PCM)
27
- view.setUint16(22, 1, true); // NumChannels (1 = Mono)
28
- view.setUint32(24, sampleRate, true); // SampleRate
29
- view.setUint32(28, sampleRate * 2, true); // ByteRate (SampleRate * NumChannels * BitsPerSample/8)
30
- view.setUint16(32, 2, true); // BlockAlign (NumChannels * BitsPerSample/8)
31
- view.setUint16(34, 16, true); // BitsPerSample (16 bits)
32
- // data subchunk
33
- view.setUint8(36, 0x64); // d
34
- view.setUint8(37, 0x61); // a
35
- view.setUint8(38, 0x74); // t
36
- view.setUint8(39, 0x61); // a
8
+ view.setUint8(0, 0x52);
9
+ view.setUint8(1, 0x49);
10
+ view.setUint8(2, 0x46);
11
+ view.setUint8(3, 0x46);
12
+ view.setUint32(4, 36 + dataSize, true);
13
+ view.setUint8(8, 0x57);
14
+ view.setUint8(9, 0x41);
15
+ view.setUint8(10, 0x56);
16
+ view.setUint8(11, 0x45);
17
+ view.setUint8(12, 0x66);
18
+ view.setUint8(13, 0x6d);
19
+ view.setUint8(14, 0x74);
20
+ view.setUint8(15, 0x20);
21
+ view.setUint32(16, 16, true);
22
+ view.setUint16(20, 1, true);
23
+ view.setUint16(22, 1, true);
24
+ view.setUint32(24, sampleRate, true);
25
+ view.setUint32(28, sampleRate * 2, true);
26
+ view.setUint16(32, 2, true);
27
+ view.setUint16(34, 16, true);
28
+ view.setUint8(36, 0x64);
29
+ view.setUint8(37, 0x61);
30
+ view.setUint8(38, 0x74);
31
+ view.setUint8(39, 0x61);
37
32
  view.setUint32(40, dataSize, true);
38
33
  const freq = 440;
39
34
  for (let i = 0; i < numSamples; i++) {
@@ -1,4 +1,5 @@
1
1
  import type { EvalAttachment, EvalCase } from './types.js';
2
+ /** An attachment's content as base64, read from the file when the attachment is a path. */
2
3
  declare function attachmentData(attachment: EvalAttachment): Promise<string>;
3
4
  declare function pinCaseFiles(cases: EvalCase[], casesPath: string): Promise<EvalCase[]>;
4
5
  export { attachmentData, pinCaseFiles };
@@ -1,8 +1,9 @@
1
- // A file attachment is read when its trial runs, not when the suite loads, so thousands of photos are never held at once.
1
+ // why: A file attachment is read when its trial runs, not when the suite loads, so thousands of photos are never held at once.
2
2
  import { createHash } from 'node:crypto';
3
3
  import { readFile } from 'node:fs/promises';
4
4
  import { dirname, resolve } from 'node:path';
5
5
  import { TheoremError } from '../guardrails/error.js';
6
+ import { bytesToBase64 } from '../kernel/util/base64.js';
6
7
  async function hashedFile(path) {
7
8
  let bytes;
8
9
  try {
@@ -20,8 +21,9 @@ async function fileBytes(attachment) {
20
21
  }
21
22
  return bytes;
22
23
  }
24
+ /** An attachment's content as base64, read from the file when the attachment is a path. */
23
25
  async function attachmentData(attachment) {
24
- return 'data' in attachment ? attachment.data : (await fileBytes(attachment)).toString('base64');
26
+ return 'data' in attachment ? attachment.data : bytesToBase64(await fileBytes(attachment));
25
27
  }
26
28
  async function pinCaseFiles(cases, casesPath) {
27
29
  const pinned = [];
@@ -4,6 +4,7 @@ interface Spread {
4
4
  median: number;
5
5
  p90: number;
6
6
  }
7
+ /** The results of one group of cases: all cases, or the cases with one tag. It counts cases and trials by outcome and, where they apply, the answers by grade, the stop kinds, and the spread of duration, model calls, and tool calls. */
7
8
  interface GroupSummary {
8
9
  group: string;
9
10
  cases: number;
@@ -23,6 +24,7 @@ interface GroupSummary {
23
24
  modelCalls?: Spread;
24
25
  toolCalls?: Spread;
25
26
  }
27
+ /** Summarizes a run as one group for all cases and one for each tag its cases carry. */
26
28
  declare function groupSummaries(run: Pick<SuiteRun, 'trials' | 'verdicts'>): GroupSummary[];
27
29
  export type { GroupSummary, Spread };
28
30
  export { groupSummaries };
@@ -49,6 +49,7 @@ function groupOf(group, verdicts, trials, gradesAnswers) {
49
49
  ...(toolCalls ? { toolCalls } : {}),
50
50
  };
51
51
  }
52
+ /** Summarizes a run as one group for all cases and one for each tag its cases carry. */
52
53
  function groupSummaries(run) {
53
54
  const gradesAnswers = run.trials.some((report) => report.results.some((result) => result.name === 'answer'));
54
55
  const tags = [...new Set(run.trials.flatMap((report) => report.case?.tags ?? []))].sort();
@@ -1,11 +1,14 @@
1
1
  import type { EvalGrader } from '../types.js';
2
+ /** Where `answer` reads the agent's answer: a key of the reply's JSON, or an argument of a tool call. */
2
3
  type AnswerSource = {
3
4
  json: string;
4
5
  } | {
5
6
  tool: string;
6
7
  arg: string;
7
8
  };
9
+ /** How an answer was graded: `accepted` passes, `partial` and `wrong` fail. */
8
10
  type AnswerLabel = 'accepted' | 'partial' | 'wrong';
11
+ /** A code grader that checks the agent's answer against the case's `expect.answer` lists of accepted, partial, and rejected names, normalizing both sides; with `from` it compares the named JSON key or tool argument exactly, otherwise it looks for the names in the reply text. A provider error before an answer errors the trial instead. */
9
12
  declare function answer(options?: {
10
13
  from?: AnswerSource;
11
14
  }): EvalGrader;
@@ -82,6 +82,7 @@ function unanswered(trial, why) {
82
82
  explanation: `${why}; the turn stopped provider_error${kind} before it answered`,
83
83
  };
84
84
  }
85
+ /** A code grader that checks the agent's answer against the case's `expect.answer` lists of accepted, partial, and rejected names, normalizing both sides; with `from` it compares the named JSON key or tool argument exactly, otherwise it looks for the names in the reply text. A provider error before an answer errors the trial instead. */
85
86
  function answer(options = {}) {
86
87
  const { from } = options;
87
88
  const identity = `answer:${from ? JSON.stringify(from) : 'reply'}`;
@@ -1,50 +1,29 @@
1
- /**
2
- * Code graders: deterministic checks over a trial's trace. Each returns one
3
- * pass/fail result with the reason in plain words. Outcome first: what was
4
- * delivered and what it cost matter more than the path taken.
5
- *
6
- * @module
7
- */
8
1
  import type { EvalGrader, EvalResult, Trial } from '../types.js';
9
- /** Graders over what the host received: the model's own text and JSON. */
2
+ /** Graders over the text the turn delivered to the user. */
10
3
  interface DeliveredGraders {
11
- /** The delivered text contains `text`. */
12
4
  includes: (text: string) => EvalGrader;
13
- /** The delivered text matches `pattern` (a JavaScript regular expression source). */
14
5
  regex: (pattern: string, flags?: string) => EvalGrader;
15
- /** The delivered text equals `text` exactly. */
16
6
  equals: (text: string) => EvalGrader;
17
- /**
18
- * The delivered JSON validates against a JSON Schema object (required
19
- * fields present, recursively). The structured part is read when the
20
- * profile has one; otherwise the text is parsed.
21
- */
22
7
  jsonSchema: (schema: Record<string, unknown>) => EvalGrader;
23
- /** Every field of the case's `expect.json` is present in the delivered JSON with the same value. */
24
8
  json: () => EvalGrader;
25
9
  }
10
+ /** Graders over the text the turn delivered to the user. */
26
11
  declare const delivered: DeliveredGraders;
27
- /**
28
- * How the called tools are compared with the expected list:
29
- * - `exact`: the same tools in the same order, nothing more;
30
- * - `in_order`: the expected tools appear in that order, others may interleave;
31
- * - `any_order`: the same tools, order ignored;
32
- * - `subset`: every tool called is one that was expected (none unexpected; some may be missing).
33
- */
12
+ /** `in_order` lets other tools interleave; `subset` means none unexpected, though some expected may be missing. */
34
13
  type TrajectoryMode = 'exact' | 'in_order' | 'any_order' | 'subset';
35
- /** The tools the agent called, in start order, against `expect` or the case's `expect.tools`. */
14
+ /** Grades the tools a turn called against the expected ones, by order or by set. */
36
15
  declare function toolTrajectory(options: {
37
16
  expect?: string[];
38
17
  mode: TrajectoryMode;
39
18
  }): EvalGrader;
40
- /** The turn stopped for one of these reasons (`theorem.stop.kind`). */
19
+ /** Grades that the turn stopped with one of the given kinds. */
41
20
  declare function stopKind(kind: string | string[]): EvalGrader;
42
21
  /** A guardrail did (`fired: true`) or did not (`fired: false`) act on any span; `allow` does not count as acting. */
43
22
  declare function guardrail(options: {
44
23
  fired: boolean;
45
24
  action?: 'redact' | 'flag' | 'block';
46
25
  }): EvalGrader;
47
- /** Ceilings the trial must stay under; every one that is crossed is named. */
26
+ /** Limits a trial must stay under: cost, tokens, steps, and time. */
48
27
  interface BudgetOptions {
49
28
  maxCostUsd?: number;
50
29
  maxTokens?: number;
@@ -55,10 +34,7 @@ interface BudgetOptions {
55
34
  }
56
35
  /** The trial stayed within every ceiling given; a ceiling with no reading in the trace fails, since it cannot be shown. */
57
36
  declare function budget(options: BudgetOptions): EvalGrader;
58
- /**
59
- * The host's own check of the end state (a booking exists, a row changed):
60
- * "host decides". Return a boolean, or a full result to score and explain.
61
- */
37
+ /** A grader that passes when `check` accepts the trial. */
62
38
  declare function outcome(name: string, check: (trial: Trial) => boolean | EvalResult | Promise<boolean | EvalResult>): EvalGrader;
63
39
  export type { BudgetOptions, DeliveredGraders, TrajectoryMode };
64
40
  export { budget, delivered, guardrail, outcome, stopKind, toolTrajectory };
@@ -1,10 +1,3 @@
1
- /**
2
- * Code graders: deterministic checks over a trial's trace. Each returns one
3
- * pass/fail result with the reason in plain words. Outcome first: what was
4
- * delivered and what it cost matter more than the path taken.
5
- *
6
- * @module
7
- */
8
1
  import { collectValidationFailures } from '../../kernel/engine/runner/schema-validation.js';
9
2
  import { isRecord } from '../../kernel/util/record.js';
10
3
  import { codeGrader, deliveredJson, deliveredText, listOf, modelCalls, passFail, spanDurationMs, } from './shared.js';
@@ -17,15 +10,14 @@ function numberAttribute(span, key) {
17
10
  const value = span.attributes[key];
18
11
  return typeof value === 'number' ? value : undefined;
19
12
  }
20
- /** Deep structural equality over JSON values. */
21
13
  function sameJson(left, right) {
22
14
  return JSON.stringify(left) === JSON.stringify(right);
23
15
  }
24
16
  function quote(text) {
25
17
  return JSON.stringify(text);
26
18
  }
19
+ /** Graders over the text the turn delivered to the user. */
27
20
  const delivered = {
28
- /** The delivered text contains `text`. */
29
21
  includes(text) {
30
22
  return codeGrader('delivered_includes', `delivered.includes:${text}`, false, (trial) => {
31
23
  const actual = deliveredText(trial, undefined);
@@ -33,7 +25,6 @@ const delivered = {
33
25
  return passFail('delivered_includes', passed, passed ? `delivered text includes ${quote(text)}` : `delivered text lacks ${quote(text)}`);
34
26
  });
35
27
  },
36
- /** The delivered text matches `pattern` (a JavaScript regular expression source). */
37
28
  regex(pattern, flags = '') {
38
29
  const re = new RegExp(pattern, flags);
39
30
  return codeGrader('delivered_regex', `delivered.regex:/${pattern}/${flags}`, false, (trial) => {
@@ -43,7 +34,6 @@ const delivered = {
43
34
  : `delivered text does not match /${pattern}/${flags}`);
44
35
  });
45
36
  },
46
- /** The delivered text equals `text` exactly. */
47
37
  equals(text) {
48
38
  return codeGrader('delivered_equals', `delivered.equals:${text}`, false, (trial) => {
49
39
  const actual = deliveredText(trial, undefined);
@@ -51,11 +41,6 @@ const delivered = {
51
41
  return passFail('delivered_equals', passed, passed ? 'delivered text is exactly as expected' : `delivered text was ${quote(actual)}`);
52
42
  });
53
43
  },
54
- /**
55
- * The delivered JSON validates against a JSON Schema object (required
56
- * fields present, recursively). The structured part is read when the
57
- * profile has one; otherwise the text is parsed.
58
- */
59
44
  jsonSchema(schema) {
60
45
  return codeGrader('delivered_json_schema', `delivered.jsonSchema:${JSON.stringify(schema)}`, false, async (trial) => {
61
46
  const value = deliveredJson(trial);
@@ -67,7 +52,6 @@ const delivered = {
67
52
  return passFail('delivered_json_schema', passed, passed ? 'delivered JSON fits the schema' : failures.map((f) => f.error).join('; '));
68
53
  });
69
54
  },
70
- /** Every field of the case's `expect.json` is present in the delivered JSON with the same value. */
71
55
  json() {
72
56
  return codeGrader('delivered_json', 'delivered.json', true, (trial) => {
73
57
  const expected = trial.case?.expect?.json;
@@ -111,7 +95,7 @@ function trajectoryMatches(mode, expected, actual) {
111
95
  return false;
112
96
  }
113
97
  }
114
- /** The tools the agent called, in start order, against `expect` or the case's `expect.tools`. */
98
+ /** Grades the tools a turn called against the expected ones, by order or by set. */
115
99
  function toolTrajectory(options) {
116
100
  const identity = `toolTrajectory:${options.mode}:${options.expect ? JSON.stringify(options.expect) : 'case'}`;
117
101
  return codeGrader('tool_trajectory', identity, options.expect === undefined, (trial) => {
@@ -126,8 +110,7 @@ function toolTrajectory(options) {
126
110
  return passFail('tool_trajectory', passed, `called ${listOf(actual)}; expected ${listOf(expected)} (${options.mode})`);
127
111
  });
128
112
  }
129
- // ── stop, guardrail, budget ─────────────────────────
130
- /** The turn stopped for one of these reasons (`theorem.stop.kind`). */
113
+ /** Grades that the turn stopped with one of the given kinds. */
131
114
  function stopKind(kind) {
132
115
  const kinds = Array.isArray(kind) ? kind : [kind];
133
116
  return codeGrader('stop_kind', `stopKind:${kinds.join('|')}`, false, (trial) => {
@@ -188,11 +171,7 @@ function budget(options) {
188
171
  return passFail('budget', passed, passed ? 'within budget' : over.join('; '));
189
172
  });
190
173
  }
191
- // ── outcome ─────────────────────────────────────────
192
- /**
193
- * The host's own check of the end state (a booking exists, a row changed):
194
- * "host decides". Return a boolean, or a full result to score and explain.
195
- */
174
+ /** A grader that passes when `check` accepts the trial. */
196
175
  function outcome(name, check) {
197
176
  return codeGrader(name, `outcome:${name}`, false, async (trial) => {
198
177
  const verdict = await check(trial);
@@ -1,10 +1,13 @@
1
1
  import { type EvalRubric } from '../rubrics/types.js';
2
2
  import type { EvalGrader, Trial } from '../types.js';
3
+ /** The id of the structured schema a text judge answers with, registered when this module loads. */
3
4
  declare const EVAL_JUDGMENT = "evalJudgment";
5
+ /** A judge's answer: one of the rubric's labels, or `unknown`, and why. */
4
6
  interface Judgment {
5
7
  label: string;
6
8
  explanation: string;
7
9
  }
10
+ /** Options for `judge`: the rubric and, optionally, a name, the labels that pass, a judge profile, the rubric's variables, the cost of a wrong pass and an escalation profile. */
8
11
  interface JudgeOptions {
9
12
  rubric: EvalRubric;
10
13
  name?: string;
@@ -15,6 +18,7 @@ interface JudgeOptions {
15
18
  wrongPassCost?: number;
16
19
  escalate?: string;
17
20
  }
21
+ /** A grader in which a model judges the trial against a rubric: a text profile answers directly, a decision profile answers the rubric's question, and an `escalate` text profile takes trials with media a decision judge cannot see. A turn that failed or delivered nothing is not judged; a misconfiguration throws. */
18
22
  declare function judge(options: JudgeOptions): EvalGrader;
19
23
  export type { JudgeOptions, Judgment };
20
24
  export { EVAL_JUDGMENT, judge };
@@ -9,6 +9,7 @@ import { buildTrial } from '../trial.js';
9
9
  import { resolveMedia, trialMedia } from './media.js';
10
10
  import { deliveredJson, deliveredText } from './shared.js';
11
11
  import { rubricView, TRIAL_VARIABLES } from './transcript.js';
12
+ /** The id of the structured schema a text judge answers with, registered when this module loads. */
12
13
  const EVAL_JUDGMENT = 'evalJudgment';
13
14
  const UNKNOWN = 'unknown';
14
15
  const UNKNOWN_CRITERION = 'The record does not show enough to decide.';
@@ -44,10 +45,10 @@ const JUDGMENT_SCHEMA = {
44
45
  required: ['label', 'explanation'],
45
46
  },
46
47
  };
47
- // Importing this module registers the schema, so a host's judge profile can name it at registration.
48
+ // why: Importing this module registers the schema, so a host's judge profile can name it at registration.
48
49
  registerStructured(EVAL_JUDGMENT, JUDGMENT_SCHEMA);
49
50
  function configError(grader, message) {
50
- return new TheoremError('config', `judge ${grader}: ${message}`); // lexicon-exempt: developer contract error
51
+ return new TheoremError('config', `judge ${grader}: ${message}`); // labels-exempt: developer contract error
51
52
  }
52
53
  function judgeKind(grader, rubric, profileId) {
53
54
  const profile = getProfile(profileId);
@@ -116,7 +117,7 @@ async function askText(args) {
116
117
  };
117
118
  try {
118
119
  for await (const _event of runTurn(request, context.judgeProvider, memorySink(records))) {
119
- // The judge's trace is its record; its events are not read.
120
+ // why: The judge's trace is its record; its events are not read.
120
121
  }
121
122
  }
122
123
  catch (thrown) {
@@ -209,13 +210,13 @@ function stateOf(rubric, view) {
209
210
  for (const variable of rubric.variables) {
210
211
  const value = view[variable];
211
212
  if (value === undefined) {
212
- throw new TheoremError('config', `rubric ${rubric.name}: no value for ${variable}`); // lexicon-exempt: developer contract error
213
+ throw new TheoremError('config', `rubric ${rubric.name}: no value for ${variable}`); // labels-exempt: developer contract error
213
214
  }
214
215
  state[variable] = value;
215
216
  }
216
217
  return state;
217
218
  }
218
- // Models echo the prompt's headings (`CORRECT -`), so a text judge's label is read case-insensitively.
219
+ // why: Models echo the prompt's headings (`CORRECT -`), so a text judge's label is read case-insensitively.
219
220
  function declaredLabel(label, allowed) {
220
221
  const wanted = label.trim().toLowerCase();
221
222
  return [...allowed].find((declared) => declared.toLowerCase() === wanted);
@@ -250,6 +251,7 @@ function resultOf(run, rubric, name, pass) {
250
251
  ...(pass ? { passed: pass.includes(label) } : {}),
251
252
  };
252
253
  }
254
+ /** A grader in which a model judges the trial against a rubric: a text profile answers directly, a decision profile answers the rubric's question, and an `escalate` text profile takes trials with media a decision judge cannot see. A turn that failed or delivered nothing is not judged; a misconfiguration throws. */
253
255
  function judge(options) {
254
256
  const { rubric } = options;
255
257
  const name = options.name ?? rubric.name;
@@ -1,4 +1,5 @@
1
1
  import type { EvalGrader } from '../types.js';
2
+ /** A grader that passes when each reply began within `maxMs`, measured from the start of the response or, for a live reply, from the end of the user's speech; a reply with no reading fails it. */
2
3
  declare function turnLatency(options: {
3
4
  maxMs: number;
4
5
  }): EvalGrader;
@@ -9,7 +9,7 @@ function numberAttribute(span, key) {
9
9
  const value = span.attributes[key];
10
10
  return typeof value === 'number' ? value : undefined;
11
11
  }
12
- // The successful (last) HTTP try's start plus its time to first chunk, or the call's own start when the call streamed over a socket (Live).
12
+ // why: The successful (last) HTTP try's start plus its time to first chunk, or the call's own start when the call streamed over a socket (Live).
13
13
  function firstChunkAt(trial, call) {
14
14
  const seconds = numberAttribute(call, 'gen_ai.response.time_to_first_chunk');
15
15
  if (seconds === undefined)
@@ -18,7 +18,7 @@ function firstChunkAt(trial, call) {
18
18
  const from = tries.at(-1) ?? call;
19
19
  return BigInt(from.startTimeUnixNano) + BigInt(Math.round(seconds * MS_PER_S)) * NANOS_PER_MS;
20
20
  }
21
- // Speech that prompted an earlier reply never anchors a later one.
21
+ // invariant: Speech that prompted an earlier reply never anchors a later one.
22
22
  function speechEndedAt(root, afterUnixNano, beforeUnixNano) {
23
23
  let latest;
24
24
  for (const event of root.events) {
@@ -59,6 +59,7 @@ function latencyReadings(trial) {
59
59
  reading(trial.root, BigInt(trial.root.startTimeUnixNano), firstChunkAt(trial, firstCall)),
60
60
  ];
61
61
  }
62
+ /** A grader that passes when each reply began within `maxMs`, measured from the start of the response or, for a live reply, from the end of the user's speech; a reply with no reading fails it. */
62
63
  function turnLatency(options) {
63
64
  return codeGrader('turn_latency', `turnLatency:${options.maxMs}`, false, (trial) => {
64
65
  const readings = latencyReadings(trial);
@@ -1,9 +1,12 @@
1
1
  import type { EvalGrader } from '../types.js';
2
+ /** Graders for the transcript of a live model's spoken output. */
2
3
  interface TranscriptionGraders {
3
4
  includes: (text?: string) => EvalGrader;
4
5
  regex: (pattern?: string, flags?: string) => EvalGrader;
5
6
  }
7
+ /** Graders for a live reply's output transcription: `includes` (a substring) and `regex`, each taking its pattern as an argument or from the case's `expect.transcription`. */
6
8
  declare const transcription: TranscriptionGraders;
9
+ /** A grader that passes when the model was interrupted at most `max` times in the trial. */
7
10
  declare function interruptions(options: {
8
11
  max: number;
9
12
  }): EvalGrader;
@@ -1,5 +1,6 @@
1
1
  import { codeGrader, deliveredText, passFail } from './shared.js';
2
2
  const OUTPUT_TRANSCRIPTION = 'output_transcription';
3
+ /** Graders for a live reply's output transcription: `includes` (a substring) and `regex`, each taking its pattern as an argument or from the case's `expect.transcription`. */
3
4
  const transcription = {
4
5
  includes(text) {
5
6
  const identity = `transcription.includes:${text ?? 'case'}`;
@@ -28,6 +29,7 @@ const transcription = {
28
29
  });
29
30
  },
30
31
  };
32
+ /** A grader that passes when the model was interrupted at most `max` times in the trial. */
31
33
  function interruptions(options) {
32
34
  return codeGrader('interruptions', `interruptions:${options.max}`, false, (trial) => {
33
35
  const count = trial
@@ -45,7 +45,6 @@ function mediaLabeler(trial) {
45
45
  const byKey = new Map(trialMedia(trial).map((media) => [media.sha256 ?? media.uri ?? '', media.label]));
46
46
  return (part) => byKey.get(mediaKey(part) ?? '') ?? `[${String(part.type)}]`;
47
47
  }
48
- // A file's hash is the one its case pins.
49
48
  async function caseAttachments(trial) {
50
49
  const byHash = new Map();
51
50
  const input = trial.case?.input;
@@ -61,7 +60,7 @@ async function caseAttachments(trial) {
61
60
  }
62
61
  return byHash;
63
62
  }
64
- // The host's bytes for a hash, only when they are the bytes the trace hashed.
63
+ // why: The host's bytes for a hash, only when they are the bytes the trace hashed.
65
64
  async function fromHost(sha256, mimeType, context) {
66
65
  const data = await context.media?.({ sha256, mimeType });
67
66
  if (data === undefined)
@@ -25,7 +25,7 @@ function deliveredParts(trial) {
25
25
  return Array.isArray(parts) ? parts.filter(isObject) : [];
26
26
  });
27
27
  }
28
- // Interim transcripts are skipped; the final one holds the whole.
28
+ // why: Interim transcripts are skipped; the final one holds the whole.
29
29
  function deliveredText(trial, source) {
30
30
  return deliveredParts(trial)
31
31
  .filter((part) => part.type === 'text' &&
@@ -2,6 +2,7 @@ import type { DecisionJson } from '../../kernel/types.js';
2
2
  import type { TraceSpan } from '../../observability/trace-span.js';
3
3
  import type { EvalRubric } from '../rubrics/types.js';
4
4
  import type { Trial } from '../types.js';
5
+ /** The variables a judge rubric may use, each filled from the trial by `trialVariables`. */
5
6
  declare const TRIAL_VARIABLES: readonly ["input", "output", "context", "conversation", "user_message", "tool_call", "tool_result", "text"];
6
7
  interface ToolStep {
7
8
  span: TraceSpan;
@@ -11,6 +12,7 @@ interface ToolStep {
11
12
  outcome: string;
12
13
  }
13
14
  declare function toolSteps(trial: Trial): ToolStep[];
15
+ /** Fills each rubric variable from a trial: the last user message, the reply, the tool activity, and the conversation as text. */
14
16
  declare function trialVariables(trial: Trial): Record<(typeof TRIAL_VARIABLES)[number], string>;
15
17
  declare function rubricView(rubric: EvalRubric, trial: Trial, host: Readonly<Record<string, string>>): Record<string, DecisionJson>;
16
18
  export type { ToolStep };
@@ -2,6 +2,7 @@ import { isRecord } from '../../kernel/util/record.js';
2
2
  import { templatePaths } from '../rubrics/mustache.js';
3
3
  import { mediaLabeler, trialMedia } from './media.js';
4
4
  import { deliveredJson, deliveredText, modelCalls, startOf } from './shared.js';
5
+ /** The variables a judge rubric may use, each filled from the trial by `trialVariables`. */
5
6
  const TRIAL_VARIABLES = [
6
7
  'input',
7
8
  'output',
@@ -54,7 +55,7 @@ function toolCallText(part) {
54
55
  args = JSON.parse(args);
55
56
  }
56
57
  catch {
57
- // Not JSON: the arguments stand as the model sent them.
58
+ // why: Not JSON: the arguments stand as the model sent them.
58
59
  }
59
60
  }
60
61
  return JSON.stringify({ name: part.name, arguments: args });
@@ -96,7 +97,7 @@ function availableTools(trial) {
96
97
  return parsed.map((tool) => JSON.stringify(tool));
97
98
  }
98
99
  catch {
99
- // Not JSON: the definitions stand as one entry, as sent.
100
+ // why: Not JSON: the definitions stand as one entry, as sent.
100
101
  }
101
102
  return [text];
102
103
  }
@@ -147,6 +148,7 @@ function transcript(messages, steps, output) {
147
148
  `[assistant]\n${output}`,
148
149
  ].join('\n\n');
149
150
  }
151
+ /** Fills each rubric variable from a trial: the last user message, the reply, the tool activity, and the conversation as text. */
150
152
  function trialVariables(trial) {
151
153
  const messages = inputMessages(trial);
152
154
  const input = messages.findLast((message) => message.role === 'user')?.text ?? '';
@@ -170,7 +172,7 @@ function trialVariables(trial) {
170
172
  text: output,
171
173
  };
172
174
  }
173
- // A rubric that reads `user_message` gets `conversation` as what came before that message, as Phoenix's user-friction prompt asks.
175
+ // why: A rubric that reads `user_message` gets `conversation` as what came before that message, as Phoenix's user-friction prompt asks.
174
176
  function rubricView(rubric, trial, host) {
175
177
  const values = { ...trialVariables(trial) };
176
178
  const paths = rubric.template === undefined ? [] : templatePaths(rubric.template);
@@ -1,13 +1,5 @@
1
1
  /**
2
- * Evals over traces. A host says, for any profile: here are the cases, here is
3
- * what "good" means, run it k times and tell me, from the trace alone, whether
4
- * it passed. Graders read the v3 `TraceRecord` and nothing else; results are
5
- * trace records too, written through the same `TraceSink`.
6
- *
7
- * Hosts own the cases, the judge (a text model, Jev, or both) and the pass
8
- * rule. THEOREM owns the runner, the code graders and the result record;
9
- * viewing, labelling and comparing runs belong to the trace tool the host
10
- * already uses.
2
+ * Evals over traces: graders read the v3 `TraceRecord` and nothing else; results are trace records too, written through the same `TraceSink`.
11
3
  *
12
4
  * @module
13
5
  */
@@ -1,13 +1,5 @@
1
1
  /**
2
- * Evals over traces. A host says, for any profile: here are the cases, here is
3
- * what "good" means, run it k times and tell me, from the trace alone, whether
4
- * it passed. Graders read the v3 `TraceRecord` and nothing else; results are
5
- * trace records too, written through the same `TraceSink`.
6
- *
7
- * Hosts own the cases, the judge (a text model, Jev, or both) and the pass
8
- * rule. THEOREM owns the runner, the code graders and the result record;
9
- * viewing, labelling and comparing runs belong to the trace tool the host
10
- * already uses.
2
+ * Evals over traces: graders read the v3 `TraceRecord` and nothing else; results are trace records too, written through the same `TraceSink`.
11
3
  *
12
4
  * @module
13
5
  */