@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,158 @@
1
+ /**
2
+ * Records → `Trial`. A live run hands the runner what its memory sink caught;
3
+ * a recorded run hands it what a file held. Both build the same trial, so the
4
+ * same graders give the same results.
5
+ *
6
+ * The root is the `invoke_agent` span with no agent above it in the set; a host
7
+ * span above it (the host's request, when the host nests the turn under its own
8
+ * span) does not hide it, and the topmost span above it is the trial's `top`. It
9
+ * is never assumed to be the first record: a compaction turn's record can be
10
+ * written before its parent's (P9).
11
+ *
12
+ * @module
13
+ */
14
+ import { TheoremError } from '../guardrails/error.js';
15
+ import { contentOf, inlineContent } from '../observability/trace-record.js';
16
+ function byStart(a, b) {
17
+ const left = BigInt(a.startTimeUnixNano);
18
+ const right = BigInt(b.startTimeUnixNano);
19
+ return left < right ? -1 : left > right ? 1 : 0;
20
+ }
21
+ function operationOf(span) {
22
+ const value = span.attributes['gen_ai.operation.name'];
23
+ return typeof value === 'string' ? value : undefined;
24
+ }
25
+ /** Every span of every record, in start order. */
26
+ function allSpans(records) {
27
+ return records.flatMap((record) => record.spans).sort(byStart);
28
+ }
29
+ /** The spans above `span` in the set, nearest first; a parent outside the set ends the walk. */
30
+ function ancestorsOf(span, byId) {
31
+ const above = [];
32
+ const seen = new Set([span.spanId]);
33
+ let parent = span.parentSpanId === undefined ? undefined : byId.get(span.parentSpanId);
34
+ while (parent && !seen.has(parent.spanId)) {
35
+ above.push(parent);
36
+ seen.add(parent.spanId);
37
+ parent = parent.parentSpanId === undefined ? undefined : byId.get(parent.parentSpanId);
38
+ }
39
+ return above;
40
+ }
41
+ /**
42
+ * The `invoke_agent` span with no `invoke_agent` above it in the set; the
43
+ * earliest when several qualify (a session root before its responses).
44
+ */
45
+ function rootOf(spans, byId) {
46
+ const roots = spans.filter((span) => operationOf(span) === 'invoke_agent' &&
47
+ !ancestorsOf(span, byId).some((above) => operationOf(above) === 'invoke_agent'));
48
+ const [root] = roots;
49
+ if (!root) {
50
+ throw new TheoremError('config', 'trial records hold no invoke_agent root span'); // lexicon-exempt: developer contract error
51
+ }
52
+ return root;
53
+ }
54
+ /** One record whose `content` is every record's, so a reference from any span resolves. */
55
+ function mergedRecord(records) {
56
+ const [first] = records;
57
+ if (!first) {
58
+ throw new TheoremError('config', 'a trial needs at least one trace record'); // lexicon-exempt: developer contract error
59
+ }
60
+ return { ...first, content: Object.assign({}, ...records.map((record) => record.content)) };
61
+ }
62
+ function numberAttribute(span, key) {
63
+ const value = span.attributes[key];
64
+ return typeof value === 'number' ? value : undefined;
65
+ }
66
+ function isObject(value) {
67
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
68
+ }
69
+ function isMessageList(value) {
70
+ return Array.isArray(value) && value.every(isObject);
71
+ }
72
+ /** The root's usage attributes as `TurnTokens`; zero when the root recorded none. */
73
+ function usageOf(root) {
74
+ const input = numberAttribute(root, 'gen_ai.usage.input_tokens') ?? 0;
75
+ const output = numberAttribute(root, 'gen_ai.usage.output_tokens') ?? 0;
76
+ const thinking = numberAttribute(root, 'gen_ai.usage.reasoning.output_tokens');
77
+ const cached = numberAttribute(root, 'gen_ai.usage.cache_read.input_tokens');
78
+ const cacheWrite = numberAttribute(root, 'gen_ai.usage.cache_write.input_tokens');
79
+ const toolUse = numberAttribute(root, 'theorem.usage.tool_use.input_tokens');
80
+ const costUsd = numberAttribute(root, 'theorem.usage.cost_usd');
81
+ const partial = root.attributes['theorem.usage.cost_partial'] === true;
82
+ const estimated = root.attributes['theorem.usage.estimated'];
83
+ const tokens = {
84
+ input,
85
+ output,
86
+ total: input + output,
87
+ ...(thinking === undefined ? {} : { thinking }),
88
+ ...(cached === undefined ? {} : { cached }),
89
+ ...(cacheWrite === undefined ? {} : { cacheWrite }),
90
+ ...(toolUse === undefined ? {} : { toolUse }),
91
+ ...(costUsd === undefined
92
+ ? {}
93
+ : { cost: { usd: costUsd, ...(partial ? { partial: true } : {}) } }),
94
+ ...(Array.isArray(estimated)
95
+ ? {
96
+ estimated: estimated.flatMap((side) => side === 'input' || side === 'output' ? [side] : []),
97
+ }
98
+ : {}),
99
+ };
100
+ return costUsd === undefined ? { tokens } : { tokens, costUsd };
101
+ }
102
+ /**
103
+ * What the host received. A turn's root carries `gen_ai.output.messages`; a
104
+ * Live session's root carries none, and each response span carries its own
105
+ * `theorem.output.delivered`, taken in start order.
106
+ */
107
+ function deliveredOf(root, spans) {
108
+ const own = root.attributes['gen_ai.output.messages'];
109
+ if (isMessageList(own))
110
+ return own;
111
+ return spans
112
+ .filter((span) => 'theorem.request.live' in span.attributes)
113
+ .flatMap((span) => {
114
+ const delivered = span.attributes['theorem.output.delivered'];
115
+ return isMessageList(delivered) ? delivered : [];
116
+ });
117
+ }
118
+ /** Build the trial every grader receives from the records that share one trace. */
119
+ function buildTrial(args) {
120
+ const merged = mergedRecord(args.records);
121
+ const spans = allSpans(args.records);
122
+ const byId = new Map(spans.map((span) => [span.spanId, span]));
123
+ const root = rootOf(spans, byId);
124
+ return {
125
+ suite: args.suite,
126
+ ...(args.case ? { case: args.case } : {}),
127
+ index: args.index,
128
+ records: args.records,
129
+ root,
130
+ top: ancestorsOf(root, byId).at(-1) ?? root,
131
+ spans: (operation) => spans.filter((span) => operationOf(span) === operation),
132
+ children: (parent) => spans.filter((span) => span.parentSpanId === parent.spanId),
133
+ content: (value) => inlineContent(merged, value),
134
+ text: (value) => (isObject(value) ? contentOf(merged, value) : undefined),
135
+ delivered: () => deliveredOf(root, spans),
136
+ usage: () => usageOf(root),
137
+ };
138
+ }
139
+ /** Group records by trace id, in first-seen order. */
140
+ function groupByTrace(records) {
141
+ const groups = new Map();
142
+ for (const record of records) {
143
+ const traceId = record.spans[0]?.traceId;
144
+ if (traceId === undefined)
145
+ continue;
146
+ const group = groups.get(traceId);
147
+ if (group)
148
+ group.push(record);
149
+ else
150
+ groups.set(traceId, [record]);
151
+ }
152
+ return groups;
153
+ }
154
+ /** Whether these records hold a turn at all: an `invoke_agent` span. An eval run record does not. */
155
+ function hasTurn(records) {
156
+ return records.some((record) => record.spans.some((span) => operationOf(span) === 'invoke_agent'));
157
+ }
158
+ export { buildTrial, groupByTrace, hasTurn };
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Eval shapes: the suite a host writes, the cases it keeps in JSONL,
3
+ * and the result every grader returns. Each is a documented type and a zod
4
+ * schema checked against it (`Equals`): the type is what graders read; the
5
+ * schema is what the runner runs on a file.
6
+ *
7
+ * Vocabulary follows Anthropic's evals guide so a host can read both: a
8
+ * **suite** of **cases**, each run as k **trials**; a **grader** reads a
9
+ * trial's transcript (its trace) and returns a **result**; the suite's pass
10
+ * rule turns k results into one **verdict**.
11
+ *
12
+ * @module
13
+ */
14
+ import { z } from 'zod';
15
+ import type { RunDecisionOptions } from '../kernel/engine/decision.js';
16
+ import type { TurnTokens } from '../kernel/turn-events.js';
17
+ import type { ModelProvider } from '../kernel/types.js';
18
+ import type { TraceRecord } from '../observability/trace-record.js';
19
+ import type { TraceAttributeValue, TraceSpan } from '../observability/trace-span.js';
20
+ /** Anthropic's split: does the agent *do* the thing (capability), or *still* do it (regression)? */
21
+ export type EvalCaseKind = 'capability' | 'regression';
22
+ /** A file the case attaches to its turn, inline, as `TurnBlob` takes it. */
23
+ export interface EvalInlineAttachment {
24
+ mimeType: string;
25
+ /** Base64 bytes. */
26
+ data: string;
27
+ name?: string;
28
+ }
29
+ /**
30
+ * A file the case attaches to its turn, kept beside the cases file and pinned
31
+ * by the hex SHA-256 of its bytes; a file whose bytes hash otherwise is refused.
32
+ */
33
+ export interface EvalFileAttachment {
34
+ mimeType: string;
35
+ /** Relative to the cases file, or absolute; the loaded case holds it absolute. */
36
+ path: string;
37
+ sha256: string;
38
+ name?: string;
39
+ }
40
+ /** A file the case attaches to its turn: its bytes inline, or a file beside the cases. */
41
+ export type EvalAttachment = EvalInlineAttachment | EvalFileAttachment;
42
+ /** One turn's input (`mode: 'turn'`). */
43
+ export interface EvalTurnInput {
44
+ text?: string;
45
+ attachments?: EvalAttachment[];
46
+ }
47
+ /** One scripted step of a Live session: send text, wait for the boundary it names. */
48
+ export interface EvalSessionStep {
49
+ text: string;
50
+ until: 'turn_complete';
51
+ }
52
+ /** A scripted Live session (`mode: 'session'`): text steps in order. Audio steps are not in this slice. */
53
+ export interface EvalSessionInput {
54
+ session: {
55
+ steps: EvalSessionStep[];
56
+ };
57
+ }
58
+ /** What the case sends: a turn's input or a session script. */
59
+ export type EvalCaseInput = EvalTurnInput | EvalSessionInput;
60
+ /**
61
+ * A dataset case's right answer. Only an `accepted` name passes; a `partial`
62
+ * one is close but not enough (the genus, the broader condition); a `rejected`
63
+ * one is a wrong answer the dataset records for the case (a confuser, an
64
+ * identification it superseded).
65
+ */
66
+ export interface EvalAnswer {
67
+ /** Every name that counts: scientific name, synonyms, common names. */
68
+ accepted: string[];
69
+ partial?: string[];
70
+ /** A reply that names one beside an accepted name hedged: `partial`, not a pass. */
71
+ rejected?: string[];
72
+ /** Grounding notes for the person reading a miss; no grader reads them. */
73
+ reference?: string;
74
+ }
75
+ /** What the transcript should contain; graders that need it are skipped when it is absent. */
76
+ export interface EvalExpect {
77
+ /** Tools the agent should call, in order (`toolTrajectory` reads it). Empty = no tool. */
78
+ tools?: string[];
79
+ /** Fields the delivered JSON should carry, each compared whole (`delivered.json` reads it). */
80
+ json?: Record<string, unknown>;
81
+ /** What the Live reply's transcript should say (`transcription.*` read it). */
82
+ transcription?: {
83
+ includes?: string;
84
+ regex?: string;
85
+ };
86
+ /** The right answer to a dataset question (`answer` reads it). */
87
+ answer?: EvalAnswer;
88
+ /** For the human reading the case; no grader reads it. */
89
+ notes?: string;
90
+ }
91
+ /** Perplexity's 1–5 difficulty; results are reported per bucket when set. */
92
+ export type EvalDifficulty = 1 | 2 | 3 | 4 | 5;
93
+ /** One line of `cases.jsonl`. */
94
+ export interface EvalCase {
95
+ id: string;
96
+ kind: EvalCaseKind;
97
+ difficulty?: EvalDifficulty;
98
+ input: EvalCaseInput;
99
+ expect?: EvalExpect;
100
+ tags?: string[];
101
+ }
102
+ /** What the runner runs on each line of a cases file. */
103
+ export declare const evalCaseSchema: z.ZodType<EvalCase>;
104
+ /** The `gen_ai.operation.name` values a trial's spans carry. */
105
+ export type TraceOperation = 'invoke_agent' | 'chat' | 'generate_content' | 'execute_tool';
106
+ /** A message as the trace stores it: `{ role, parts: [...] }`, parts by hash; resolve them with `text` / `content`. */
107
+ export type TrialMessage = Record<string, TraceAttributeValue>;
108
+ /** What the root span reports the trial cost, as the kernel's `TurnTokens`. */
109
+ export interface TrialUsage {
110
+ tokens: TurnTokens;
111
+ costUsd?: number;
112
+ }
113
+ /**
114
+ * One run of one case, as every grader receives it: the trace records that
115
+ * share the trial's trace id and nothing else. If a grader needs a fact the
116
+ * trace does not hold, the trace is wrong, not the grader.
117
+ */
118
+ export interface Trial {
119
+ suite: string;
120
+ /** Absent in caseless recorded mode (a production trace with no `metadata.eval`). */
121
+ case?: EvalCase;
122
+ /** 0..k-1. */
123
+ index: number;
124
+ records: TraceRecord[];
125
+ /** The `invoke_agent` span with no agent above it in the set; never assumed to be first. */
126
+ root: TraceSpan;
127
+ /**
128
+ * The topmost span above `root` in the set: the host's own span when the host
129
+ * nested the turn under it, else `root`. Its length is the trial's time.
130
+ */
131
+ top: TraceSpan;
132
+ /** Spans by operation, in start order, across every record. */
133
+ spans: (operation: TraceOperation) => TraceSpan[];
134
+ /** The spans one span parents, in start order (a model call's HTTP tries, a response's tool calls). */
135
+ children: (span: TraceSpan) => TraceSpan[];
136
+ /** A value with every `{ content_sha256 }` / `{ json_sha256 }` reference replaced by its stored content. */
137
+ content: (value: unknown) => unknown;
138
+ /** The stored text one reference names; `undefined` for any other value. */
139
+ text: (value: unknown) => string | undefined;
140
+ /** What the host received: the root's output messages, or each Live response's, as stored. */
141
+ delivered: () => TrialMessage[];
142
+ /** Tokens and cost from the root's usage attributes. */
143
+ usage: () => TrialUsage;
144
+ }
145
+ /** Who produced a result: a code grader, or a judge model. */
146
+ export type EvalResultSource = 'code' | 'model';
147
+ /**
148
+ * One grader's reading of one trial: the semconv `gen_ai.evaluation.result`
149
+ * event, before it is written. `passed` is the grader's yes/no when it has one;
150
+ * absent means the result informs but does not decide the verdict.
151
+ */
152
+ export interface EvalResult {
153
+ /** The grader's name, e.g. `tool_trajectory`, `faithfulness`. */
154
+ name: string;
155
+ source: EvalResultSource;
156
+ /** `value` is 0–1 unless the grader says otherwise; `label` is one of the grader's labels. */
157
+ score?: {
158
+ value?: number;
159
+ label?: string;
160
+ };
161
+ /** Why, in the grader's words. */
162
+ explanation?: string;
163
+ /** Whether this result counts as a pass. Absent: informational only. */
164
+ passed?: boolean;
165
+ /** Why no score could be produced; the result is then a failed one. */
166
+ errorType?: string;
167
+ /** Judge turns this result was drawn from (`traceparent` each); model graders only. */
168
+ judgeTraceparents?: string[];
169
+ }
170
+ /** A result as a reader validates it, e.g. one rebuilt from a written event. */
171
+ export declare const evalResultSchema: z.ZodType<EvalResult>;
172
+ /** How k trials become one verdict: every trial (pass^k), any trial (pass@k), or at least n. */
173
+ export type EvalPassRule = 'all' | 'any' | {
174
+ atLeast: number;
175
+ };
176
+ /** How many times each case runs, and what counts as passing. */
177
+ export interface EvalTrials {
178
+ /** Trials per case. No default: it is a cost decision, so the suite states it. `1` cannot tell noise from change. */
179
+ repeat: number;
180
+ /** Default `all`. */
181
+ pass?: EvalPassRule;
182
+ }
183
+ /**
184
+ * What the runner hands every grader beside the trial. Code graders ignore it;
185
+ * a model grader runs its judge through it and reports each judge call's
186
+ * records through `traced`, so the runner can count their cost and write them
187
+ * to the sink.
188
+ */
189
+ export interface EvalGradeContext {
190
+ /** The suite's judge profile, when it names one; a grader may name its own. */
191
+ judge?: string;
192
+ /** The host's provider for text judge profiles. */
193
+ judgeProvider?: ModelProvider;
194
+ /** The host's vault for decision judge profiles. */
195
+ judgeDecision?: Omit<RunDecisionOptions, 'sink'>;
196
+ /**
197
+ * The trial span as a W3C `traceparent`: a judge call runs under it, so it
198
+ * lands in the judged trace beneath the trial. Absent, each judge call
199
+ * starts a trace of its own.
200
+ */
201
+ traceparent?: string;
202
+ /**
203
+ * The host's store for media a trace names only by hash. A judge that must
204
+ * see media the case did not attach asks here; absent, only the case's own
205
+ * attachments can be shown.
206
+ */
207
+ media?: EvalMediaResolver;
208
+ /** Every record a grader's own judge call produced. */
209
+ traced: (records: TraceRecord[]) => void | Promise<void>;
210
+ signal?: AbortSignal;
211
+ }
212
+ /** Media a trace names by the sha256 (hex) of its raw bytes. */
213
+ export interface EvalMediaRef {
214
+ sha256: string;
215
+ mimeType: string;
216
+ }
217
+ /** The media's bytes as base64, or `undefined` when the host does not have them. */
218
+ export type EvalMediaResolver = (ref: EvalMediaRef) => string | undefined | Promise<string | undefined>;
219
+ /** Code or model logic that reads a trial and returns a result. */
220
+ export interface EvalGrader {
221
+ /** The result's `gen_ai.evaluation.name`. */
222
+ name: string;
223
+ /**
224
+ * Stable text naming exactly what this grader checks (its options, its
225
+ * rubric). Its sha256 is written as `theorem.evaluation.grader.version`, so
226
+ * a later reader can tell which rubric produced which score.
227
+ */
228
+ identity: string;
229
+ source: EvalResultSource;
230
+ /** Reads the case's `expect`; skipped when a trial has no case (caseless recorded mode). */
231
+ needsExpect: boolean;
232
+ /**
233
+ * Model graders: every judge profile this grader may run, given the suite's
234
+ * `judge.profile`: its judge first, then any it escalates to. Throws when
235
+ * there is none, or a profile cannot run this grader, so a suite fails
236
+ * before its first trial.
237
+ */
238
+ judgeProfiles?: (suiteJudge: string | undefined) => string[];
239
+ grade: (trial: Trial, context: EvalGradeContext) => EvalResult | Promise<EvalResult>;
240
+ }
241
+ /** A named set of cases against one profile, with graders and a pass rule. */
242
+ export interface EvalSuite {
243
+ id: string;
244
+ /** The profile under test; any type but `host`. */
245
+ profile: string;
246
+ mode: 'turn' | 'session';
247
+ /** Path to `cases.jsonl`, relative to the suite module. */
248
+ cases: string;
249
+ trials: EvalTrials;
250
+ graders: EvalGrader[];
251
+ /**
252
+ * The judge profile model graders run unless they name their own: a text
253
+ * profile that answers through `evalJudgment`, or a decision profile (Jev).
254
+ */
255
+ judge?: {
256
+ profile: string;
257
+ };
258
+ }
259
+ /** What the runner runs on a suite module's default export. */
260
+ export declare const evalSuiteSchema: z.ZodType<EvalSuite>;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Eval shapes: the suite a host writes, the cases it keeps in JSONL,
3
+ * and the result every grader returns. Each is a documented type and a zod
4
+ * schema checked against it (`Equals`): the type is what graders read; the
5
+ * schema is what the runner runs on a file.
6
+ *
7
+ * Vocabulary follows Anthropic's evals guide so a host can read both: a
8
+ * **suite** of **cases**, each run as k **trials**; a **grader** reads a
9
+ * trial's transcript (its trace) and returns a **result**; the suite's pass
10
+ * rule turns k results into one **verdict**.
11
+ *
12
+ * @module
13
+ */
14
+ import { z } from 'zod';
15
+ import { isRecord } from '../kernel/util/record.js';
16
+ const evalCaseKind = z.enum(['capability', 'regression']);
17
+ true;
18
+ const evalInlineAttachment = z.object({
19
+ mimeType: z.string(),
20
+ data: z.string(),
21
+ name: z.string().optional(),
22
+ });
23
+ true;
24
+ const evalFileAttachment = z.object({
25
+ mimeType: z.string(),
26
+ path: z.string().min(1),
27
+ sha256: z.string().regex(/^[0-9a-f]{64}$/, 'must be a lowercase hex SHA-256'),
28
+ name: z.string().optional(),
29
+ });
30
+ true;
31
+ const evalAttachment = z.union([evalInlineAttachment, evalFileAttachment]);
32
+ true;
33
+ const evalTurnInput = z.object({
34
+ text: z.string().optional(),
35
+ attachments: z.array(evalAttachment).optional(),
36
+ });
37
+ true;
38
+ const evalSessionStep = z.object({ text: z.string(), until: z.literal('turn_complete') });
39
+ true;
40
+ const evalSessionInput = z.object({ session: z.object({ steps: z.array(evalSessionStep) }) });
41
+ true;
42
+ const evalCaseInput = z.union([evalSessionInput, evalTurnInput]);
43
+ true;
44
+ const evalAnswer = z.object({
45
+ accepted: z.array(z.string().min(1)).min(1),
46
+ partial: z.array(z.string().min(1)).optional(),
47
+ rejected: z.array(z.string().min(1)).optional(),
48
+ reference: z.string().optional(),
49
+ });
50
+ true;
51
+ const evalExpect = z.object({
52
+ tools: z.array(z.string()).optional(),
53
+ json: z.record(z.string(), z.unknown()).optional(),
54
+ transcription: z
55
+ .object({ includes: z.string().optional(), regex: z.string().optional() })
56
+ .optional(),
57
+ answer: evalAnswer.optional(),
58
+ notes: z.string().optional(),
59
+ });
60
+ true;
61
+ const evalDifficulty = z.union([
62
+ z.literal(1),
63
+ z.literal(2),
64
+ z.literal(3),
65
+ z.literal(4),
66
+ z.literal(5),
67
+ ]);
68
+ true;
69
+ const evalCase = z.object({
70
+ id: z.string().min(1),
71
+ kind: evalCaseKind,
72
+ difficulty: evalDifficulty.optional(),
73
+ input: evalCaseInput,
74
+ expect: evalExpect.optional(),
75
+ tags: z.array(z.string()).optional(),
76
+ });
77
+ true;
78
+ /** What the runner runs on each line of a cases file. */
79
+ export const evalCaseSchema = evalCase;
80
+ const evalResultSource = z.enum(['code', 'model']);
81
+ true;
82
+ const evalResult = z.object({
83
+ name: z.string().min(1),
84
+ source: evalResultSource,
85
+ score: z.object({ value: z.number().optional(), label: z.string().optional() }).optional(),
86
+ explanation: z.string().optional(),
87
+ passed: z.boolean().optional(),
88
+ errorType: z.string().optional(),
89
+ judgeTraceparents: z.array(z.string()).optional(),
90
+ });
91
+ true;
92
+ /** A result as a reader validates it, e.g. one rebuilt from a written event. */
93
+ export const evalResultSchema = evalResult;
94
+ const evalPassRule = z.union([
95
+ z.literal('all'),
96
+ z.literal('any'),
97
+ z.object({ atLeast: z.number().int().min(1) }),
98
+ ]);
99
+ true;
100
+ const evalTrials = z.object({
101
+ repeat: z.number().int().min(1),
102
+ pass: evalPassRule.optional(),
103
+ });
104
+ true;
105
+ function isGrader(value) {
106
+ return (isRecord(value) &&
107
+ typeof value.name === 'string' &&
108
+ typeof value.identity === 'string' &&
109
+ (value.source === 'code' || value.source === 'model') &&
110
+ typeof value.needsExpect === 'boolean' &&
111
+ (value.judgeProfiles === undefined || typeof value.judgeProfiles === 'function') &&
112
+ typeof value.grade === 'function');
113
+ }
114
+ const evalGrader = z.custom(isGrader);
115
+ const evalSuite = z.object({
116
+ id: z.string().min(1),
117
+ profile: z.string().min(1),
118
+ mode: z.enum(['turn', 'session']),
119
+ cases: z.string().min(1),
120
+ trials: evalTrials,
121
+ graders: z.array(evalGrader),
122
+ judge: z.object({ profile: z.string().min(1) }).optional(),
123
+ });
124
+ true;
125
+ /** What the runner runs on a suite module's default export. */
126
+ export const evalSuiteSchema = evalSuite;
@@ -0,0 +1,18 @@
1
+ import type { EvalCase, EvalPassRule, EvalResult } from './types.js';
2
+ type TrialOutcome = 'passed' | 'failed' | 'errored' | 'ungraded';
3
+ declare function trialOutcome(results: readonly EvalResult[]): TrialOutcome;
4
+ interface CaseVerdict {
5
+ case: string;
6
+ kind: EvalCase['kind'];
7
+ difficulty?: EvalCase['difficulty'];
8
+ passed: boolean;
9
+ decided: boolean;
10
+ trials: number;
11
+ trialsPassed: number;
12
+ trialsErrored: number;
13
+ trialsUngraded: number;
14
+ }
15
+ declare function passRuleName(rule: EvalPassRule): 'all' | 'any' | 'at_least';
16
+ declare function caseVerdict(evalCase: EvalCase, trials: readonly (readonly EvalResult[])[], rule?: EvalPassRule): CaseVerdict;
17
+ export type { CaseVerdict, TrialOutcome };
18
+ export { caseVerdict, passRuleName, trialOutcome };
@@ -0,0 +1,45 @@
1
+ function trialOutcome(results) {
2
+ if (results.some((result) => result.errorType !== undefined))
3
+ return 'errored';
4
+ const decided = results.filter((result) => result.passed !== undefined);
5
+ if (decided.length === 0)
6
+ return 'ungraded';
7
+ return decided.every((result) => result.passed) ? 'passed' : 'failed';
8
+ }
9
+ function ruleMet(rule, passed, trials) {
10
+ if (trials === 0)
11
+ return false;
12
+ if (rule === 'all')
13
+ return passed === trials;
14
+ if (rule === 'any')
15
+ return passed >= 1;
16
+ return passed >= rule.atLeast;
17
+ }
18
+ function trialsNeeded(rule) {
19
+ return typeof rule === 'object' ? rule.atLeast : 1;
20
+ }
21
+ function passRuleName(rule) {
22
+ return typeof rule === 'string' ? rule : 'at_least';
23
+ }
24
+ // An errored trial is one that could not be graded (a provider error, a judge that failed), so the rule reads it as a trial that never ran: a rate limit never counts against the agent.
25
+ function caseVerdict(evalCase, trials, rule = 'all') {
26
+ const outcomes = trials.map(trialOutcome);
27
+ const count = (outcome) => outcomes.filter((o) => o === outcome).length;
28
+ const trialsPassed = count('passed');
29
+ const trialsErrored = count('errored');
30
+ const trialsUngraded = count('ungraded');
31
+ const ran = outcomes.length - trialsErrored;
32
+ const passed = trialsUngraded < ran && ruleMet(rule, trialsPassed, ran);
33
+ return {
34
+ case: evalCase.id,
35
+ kind: evalCase.kind,
36
+ ...(evalCase.difficulty === undefined ? {} : { difficulty: evalCase.difficulty }),
37
+ passed,
38
+ decided: passed || trialsErrored === 0 || ran >= trialsNeeded(rule),
39
+ trials: outcomes.length,
40
+ trialsPassed,
41
+ trialsErrored,
42
+ trialsUngraded,
43
+ };
44
+ }
45
+ export { caseVerdict, passRuleName, trialOutcome };
@@ -0,0 +1,21 @@
1
+ import type { TurnEvent } from '../kernel/types.js';
2
+ import { type CanaryStreamGate } from './canary.js';
3
+ export interface CanaryGateSession {
4
+ canary: string;
5
+ /** The system prompt as sent, when replies echoing it are leaks too. */
6
+ privateSystem?: readonly string[];
7
+ gate: CanaryStreamGate;
8
+ }
9
+ /** Pass the system prompt as sent to catch replies that echo it, as `runTurn` and Live do. */
10
+ declare function createCanaryGateSession(canary: string, privateSystem?: readonly string[]): CanaryGateSession;
11
+ /**
12
+ * Canary-only batch filter for hosts that need stream lookback without full egress. Stops at the
13
+ * first leak, so no unsafe event is returned; thoughts are unguarded (`isGuardedOutput`).
14
+ */
15
+ declare function filterCanaryGatedEvents(session: CanaryGateSession, events: TurnEvent[]): {
16
+ leaked: true;
17
+ } | {
18
+ leaked: false;
19
+ events: TurnEvent[];
20
+ };
21
+ export { createCanaryGateSession, filterCanaryGatedEvents };
@@ -0,0 +1,40 @@
1
+ import { createCanaryStreamGate, eventHasCanary, guardedEventTexts, isStreamedCanaryEvent, } from './canary.js';
2
+ import { scanTextForPromptEcho } from './prompt-echo.js';
3
+ /** Pass the system prompt as sent to catch replies that echo it, as `runTurn` and Live do. */
4
+ function createCanaryGateSession(canary, privateSystem) {
5
+ return {
6
+ canary,
7
+ ...(privateSystem ? { privateSystem } : {}),
8
+ gate: createCanaryStreamGate(canary, privateSystem),
9
+ };
10
+ }
11
+ function echoesPrompt(event, canary, privateSystem) {
12
+ return (privateSystem !== undefined &&
13
+ guardedEventTexts(event).some((text) => scanTextForPromptEcho(text, privateSystem, canary)));
14
+ }
15
+ /**
16
+ * Canary-only batch filter for hosts that need stream lookback without full egress. Stops at the
17
+ * first leak, so no unsafe event is returned; thoughts are unguarded (`isGuardedOutput`).
18
+ */
19
+ function filterCanaryGatedEvents(session, events) {
20
+ const out = [];
21
+ for (const event of events) {
22
+ if (isStreamedCanaryEvent(event)) {
23
+ const result = session.gate.process(event.text ?? '');
24
+ if (result.leak) {
25
+ return { leaked: true };
26
+ }
27
+ if (result.emit) {
28
+ out.push({ ...event, text: result.emit });
29
+ }
30
+ continue;
31
+ }
32
+ if (eventHasCanary(event, session.canary) ||
33
+ echoesPrompt(event, session.canary, session.privateSystem)) {
34
+ return { leaked: true };
35
+ }
36
+ out.push(event);
37
+ }
38
+ return { leaked: false, events: out };
39
+ }
40
+ export { createCanaryGateSession, filterCanaryGatedEvents };