@theoremjs/agents 0.0.0-stage → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +545 -2
  3. package/esm/_dnt.polyfills.d.ts +66 -0
  4. package/esm/_dnt.polyfills.js +51 -0
  5. package/esm/mod.d.ts +79 -0
  6. package/esm/mod.js +49 -0
  7. package/esm/package.json +3 -0
  8. package/esm/src/cli/bin.d.ts +7 -0
  9. package/esm/src/cli/bin.js +9 -0
  10. package/esm/src/cli/commands/bench.d.ts +6 -0
  11. package/esm/src/cli/commands/bench.js +480 -0
  12. package/esm/src/cli/commands/detect-compile.d.ts +17 -0
  13. package/esm/src/cli/commands/detect-compile.js +22 -0
  14. package/esm/src/cli/commands/eval.d.ts +37 -0
  15. package/esm/src/cli/commands/eval.js +190 -0
  16. package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
  17. package/esm/src/cli/commands/fuzz-canary.js +241 -0
  18. package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
  19. package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
  20. package/esm/src/cli/commands/profile.d.ts +2 -0
  21. package/esm/src/cli/commands/profile.js +80 -0
  22. package/esm/src/cli/commands/run.d.ts +13 -0
  23. package/esm/src/cli/commands/run.js +45 -0
  24. package/esm/src/cli/commands/test.d.ts +26 -0
  25. package/esm/src/cli/commands/test.js +143 -0
  26. package/esm/src/cli/event-log.d.ts +15 -0
  27. package/esm/src/cli/event-log.js +136 -0
  28. package/esm/src/cli/index.d.ts +10 -0
  29. package/esm/src/cli/index.js +267 -0
  30. package/esm/src/cli/matrix/fixtures.d.ts +10 -0
  31. package/esm/src/cli/matrix/fixtures.js +67 -0
  32. package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
  33. package/esm/src/cli/matrix/synthesizer.js +103 -0
  34. package/esm/src/evals/attachments.d.ts +5 -0
  35. package/esm/src/evals/attachments.js +55 -0
  36. package/esm/src/evals/breakdown.d.ts +30 -0
  37. package/esm/src/evals/breakdown.js +69 -0
  38. package/esm/src/evals/graders/answer.d.ts +16 -0
  39. package/esm/src/evals/graders/answer.js +134 -0
  40. package/esm/src/evals/graders/code.d.ts +40 -0
  41. package/esm/src/evals/graders/code.js +184 -0
  42. package/esm/src/evals/graders/judge.d.ts +24 -0
  43. package/esm/src/evals/graders/judge.js +367 -0
  44. package/esm/src/evals/graders/latency.d.ts +6 -0
  45. package/esm/src/evals/graders/latency.js +82 -0
  46. package/esm/src/evals/graders/live.d.ts +14 -0
  47. package/esm/src/evals/graders/live.js +42 -0
  48. package/esm/src/evals/graders/media.d.ts +18 -0
  49. package/esm/src/evals/graders/media.js +91 -0
  50. package/esm/src/evals/graders/shared.d.ts +11 -0
  51. package/esm/src/evals/graders/shared.js +62 -0
  52. package/esm/src/evals/graders/transcript.d.ts +19 -0
  53. package/esm/src/evals/graders/transcript.js +202 -0
  54. package/esm/src/evals/mod.d.ts +34 -0
  55. package/esm/src/evals/mod.js +22 -0
  56. package/esm/src/evals/record.d.ts +41 -0
  57. package/esm/src/evals/record.js +107 -0
  58. package/esm/src/evals/rubrics/catalog.d.ts +148 -0
  59. package/esm/src/evals/rubrics/catalog.js +846 -0
  60. package/esm/src/evals/rubrics/mod.d.ts +24 -0
  61. package/esm/src/evals/rubrics/mod.js +55 -0
  62. package/esm/src/evals/rubrics/mustache.d.ts +23 -0
  63. package/esm/src/evals/rubrics/mustache.js +154 -0
  64. package/esm/src/evals/rubrics/types.d.ts +54 -0
  65. package/esm/src/evals/rubrics/types.js +74 -0
  66. package/esm/src/evals/run.d.ts +75 -0
  67. package/esm/src/evals/run.js +418 -0
  68. package/esm/src/evals/suite.d.ts +28 -0
  69. package/esm/src/evals/suite.js +97 -0
  70. package/esm/src/evals/summary.d.ts +35 -0
  71. package/esm/src/evals/summary.js +31 -0
  72. package/esm/src/evals/trial.d.ts +14 -0
  73. package/esm/src/evals/trial.js +135 -0
  74. package/esm/src/evals/types.d.ts +169 -0
  75. package/esm/src/evals/types.js +113 -0
  76. package/esm/src/evals/verdict.d.ts +23 -0
  77. package/esm/src/evals/verdict.js +48 -0
  78. package/esm/src/guardrails/boundaries.d.ts +41 -0
  79. package/esm/src/guardrails/boundaries.js +103 -0
  80. package/esm/src/guardrails/canary-gate.d.ts +22 -0
  81. package/esm/src/guardrails/canary-gate.js +40 -0
  82. package/esm/src/guardrails/canary.d.ts +146 -0
  83. package/esm/src/guardrails/canary.js +974 -0
  84. package/esm/src/guardrails/compile-egress.d.ts +12 -0
  85. package/esm/src/guardrails/compile-egress.js +12 -0
  86. package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
  87. package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
  88. package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
  89. package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
  90. package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
  91. package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
  92. package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
  93. package/esm/src/guardrails/corpus/live-attacks.js +229 -0
  94. package/esm/src/guardrails/corpus/mod.d.ts +7 -0
  95. package/esm/src/guardrails/corpus/mod.js +4 -0
  96. package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
  97. package/esm/src/guardrails/corpus/secrets.js +16 -0
  98. package/esm/src/guardrails/corpus/strings.d.ts +23 -0
  99. package/esm/src/guardrails/corpus/strings.js +29 -0
  100. package/esm/src/guardrails/corpus/types.d.ts +36 -0
  101. package/esm/src/guardrails/corpus/types.js +1 -0
  102. package/esm/src/guardrails/credential-rules.d.ts +36 -0
  103. package/esm/src/guardrails/credential-rules.js +3001 -0
  104. package/esm/src/guardrails/credential-scan.d.ts +45 -0
  105. package/esm/src/guardrails/credential-scan.js +172 -0
  106. package/esm/src/guardrails/destinations.d.ts +45 -0
  107. package/esm/src/guardrails/destinations.js +234 -0
  108. package/esm/src/guardrails/detect-at.d.ts +107 -0
  109. package/esm/src/guardrails/detect-at.js +434 -0
  110. package/esm/src/guardrails/detect-reply.d.ts +61 -0
  111. package/esm/src/guardrails/detect-reply.js +95 -0
  112. package/esm/src/guardrails/detect-stream.d.ts +33 -0
  113. package/esm/src/guardrails/detect-stream.js +77 -0
  114. package/esm/src/guardrails/detectors.d.ts +216 -0
  115. package/esm/src/guardrails/detectors.js +503 -0
  116. package/esm/src/guardrails/egress-automata.d.ts +12 -0
  117. package/esm/src/guardrails/egress-automata.js +25582 -0
  118. package/esm/src/guardrails/egress-compiler.d.ts +55 -0
  119. package/esm/src/guardrails/egress-compiler.js +431 -0
  120. package/esm/src/guardrails/egress-patterns.d.ts +26 -0
  121. package/esm/src/guardrails/egress-patterns.js +36 -0
  122. package/esm/src/guardrails/egress-stream.d.ts +123 -0
  123. package/esm/src/guardrails/egress-stream.js +774 -0
  124. package/esm/src/guardrails/egress-urls.d.ts +86 -0
  125. package/esm/src/guardrails/egress-urls.js +909 -0
  126. package/esm/src/guardrails/egress.d.ts +46 -0
  127. package/esm/src/guardrails/egress.js +124 -0
  128. package/esm/src/guardrails/error.d.ts +31 -0
  129. package/esm/src/guardrails/error.js +96 -0
  130. package/esm/src/guardrails/event-schemas.d.ts +100 -0
  131. package/esm/src/guardrails/event-schemas.js +48 -0
  132. package/esm/src/guardrails/events.d.ts +13 -0
  133. package/esm/src/guardrails/events.js +45 -0
  134. package/esm/src/guardrails/hints.d.ts +14 -0
  135. package/esm/src/guardrails/hints.js +57 -0
  136. package/esm/src/guardrails/hits.d.ts +14 -0
  137. package/esm/src/guardrails/hits.js +30 -0
  138. package/esm/src/guardrails/host-patterns.d.ts +85 -0
  139. package/esm/src/guardrails/host-patterns.js +173 -0
  140. package/esm/src/guardrails/injection-patterns.d.ts +20 -0
  141. package/esm/src/guardrails/injection-patterns.js +126 -0
  142. package/esm/src/guardrails/injection-reversed.d.ts +9 -0
  143. package/esm/src/guardrails/injection-reversed.js +49 -0
  144. package/esm/src/guardrails/injection.d.ts +30 -0
  145. package/esm/src/guardrails/injection.js +460 -0
  146. package/esm/src/guardrails/labels.d.ts +40 -0
  147. package/esm/src/guardrails/labels.js +874 -0
  148. package/esm/src/guardrails/live-outbound-gate.d.ts +55 -0
  149. package/esm/src/guardrails/live-outbound-gate.js +298 -0
  150. package/esm/src/guardrails/mod.d.ts +54 -0
  151. package/esm/src/guardrails/mod.js +34 -0
  152. package/esm/src/guardrails/network.d.ts +46 -0
  153. package/esm/src/guardrails/network.js +330 -0
  154. package/esm/src/guardrails/normalize.d.ts +20 -0
  155. package/esm/src/guardrails/normalize.js +165 -0
  156. package/esm/src/guardrails/policy.d.ts +4 -0
  157. package/esm/src/guardrails/policy.js +21 -0
  158. package/esm/src/guardrails/progressive-yield.d.ts +110 -0
  159. package/esm/src/guardrails/progressive-yield.js +281 -0
  160. package/esm/src/guardrails/prompt-echo.d.ts +40 -0
  161. package/esm/src/guardrails/prompt-echo.js +306 -0
  162. package/esm/src/guardrails/quota.d.ts +21 -0
  163. package/esm/src/guardrails/quota.js +80 -0
  164. package/esm/src/guardrails/rules.d.ts +47 -0
  165. package/esm/src/guardrails/rules.js +47 -0
  166. package/esm/src/guardrails/sanitize.d.ts +40 -0
  167. package/esm/src/guardrails/sanitize.js +160 -0
  168. package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
  169. package/esm/src/guardrails/sensitive-groups.js +12 -0
  170. package/esm/src/guardrails/sensitive.d.ts +22 -0
  171. package/esm/src/guardrails/sensitive.js +234 -0
  172. package/esm/src/guardrails/serialize.d.ts +15 -0
  173. package/esm/src/guardrails/serialize.js +37 -0
  174. package/esm/src/guardrails/testing.d.ts +11 -0
  175. package/esm/src/guardrails/testing.js +10 -0
  176. package/esm/src/guardrails/theorem-error.d.ts +21 -0
  177. package/esm/src/guardrails/theorem-error.js +54 -0
  178. package/esm/src/guardrails/thought-guard.d.ts +76 -0
  179. package/esm/src/guardrails/thought-guard.js +664 -0
  180. package/esm/src/guardrails/tool-directives.d.ts +38 -0
  181. package/esm/src/guardrails/tool-directives.js +195 -0
  182. package/esm/src/guardrails/tool-leak.d.ts +26 -0
  183. package/esm/src/guardrails/tool-leak.js +45 -0
  184. package/esm/src/guardrails/tool-result.d.ts +92 -0
  185. package/esm/src/guardrails/tool-result.js +272 -0
  186. package/esm/src/guardrails/types.d.ts +250 -0
  187. package/esm/src/guardrails/types.js +58 -0
  188. package/esm/src/host/client-turn.d.ts +36 -0
  189. package/esm/src/host/client-turn.js +80 -0
  190. package/esm/src/host/mint-trace.d.ts +29 -0
  191. package/esm/src/host/mint-trace.js +60 -0
  192. package/esm/src/host/mod.d.ts +13 -0
  193. package/esm/src/host/mod.js +11 -0
  194. package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
  195. package/esm/src/host/readStreamingJsonStringField.js +27 -0
  196. package/esm/src/host/reply.d.ts +13 -0
  197. package/esm/src/host/reply.js +41 -0
  198. package/esm/src/interface/blocks.d.ts +11 -0
  199. package/esm/src/interface/blocks.js +283 -0
  200. package/esm/src/interface/composer-actions.d.ts +24 -0
  201. package/esm/src/interface/composer-actions.js +33 -0
  202. package/esm/src/interface/draft.d.ts +20 -0
  203. package/esm/src/interface/draft.js +39 -0
  204. package/esm/src/interface/from-profile.d.ts +24 -0
  205. package/esm/src/interface/from-profile.js +179 -0
  206. package/esm/src/interface/history.d.ts +46 -0
  207. package/esm/src/interface/history.js +278 -0
  208. package/esm/src/interface/inputs.d.ts +11 -0
  209. package/esm/src/interface/inputs.js +67 -0
  210. package/esm/src/interface/mod.d.ts +33 -0
  211. package/esm/src/interface/mod.js +22 -0
  212. package/esm/src/interface/models.d.ts +26 -0
  213. package/esm/src/interface/models.js +50 -0
  214. package/esm/src/interface/pending.d.ts +57 -0
  215. package/esm/src/interface/pending.js +152 -0
  216. package/esm/src/interface/profile-interface.d.ts +4 -0
  217. package/esm/src/interface/profile-interface.js +237 -0
  218. package/esm/src/interface/session.d.ts +71 -0
  219. package/esm/src/interface/session.js +128 -0
  220. package/esm/src/interface/stop.d.ts +13 -0
  221. package/esm/src/interface/stop.js +28 -0
  222. package/esm/src/interface/tool-calls.d.ts +32 -0
  223. package/esm/src/interface/tool-calls.js +127 -0
  224. package/esm/src/interface/tool-invoke.d.ts +6 -0
  225. package/esm/src/interface/tool-invoke.js +22 -0
  226. package/esm/src/interface/tool-media.d.ts +11 -0
  227. package/esm/src/interface/tool-media.js +113 -0
  228. package/esm/src/interface/types.d.ts +278 -0
  229. package/esm/src/interface/types.js +5 -0
  230. package/esm/src/kernel/api-catalog.d.ts +85 -0
  231. package/esm/src/kernel/api-catalog.js +229 -0
  232. package/esm/src/kernel/auth/credential-source.d.ts +23 -0
  233. package/esm/src/kernel/auth/credential-source.js +11 -0
  234. package/esm/src/kernel/auth/crypto.d.ts +56 -0
  235. package/esm/src/kernel/auth/crypto.js +163 -0
  236. package/esm/src/kernel/auth/mod.d.ts +5 -0
  237. package/esm/src/kernel/auth/mod.js +5 -0
  238. package/esm/src/kernel/auth/oauth.d.ts +18 -0
  239. package/esm/src/kernel/auth/oauth.js +439 -0
  240. package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
  241. package/esm/src/kernel/auth/scope-refusal.js +8 -0
  242. package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
  243. package/esm/src/kernel/auth/typed-secret.js +23 -0
  244. package/esm/src/kernel/auth/types.d.ts +152 -0
  245. package/esm/src/kernel/auth/types.js +1 -0
  246. package/esm/src/kernel/checkpoint.d.ts +43 -0
  247. package/esm/src/kernel/checkpoint.js +58 -0
  248. package/esm/src/kernel/default-scope.d.ts +72 -0
  249. package/esm/src/kernel/default-scope.js +121 -0
  250. package/esm/src/kernel/engine/call-trace.d.ts +19 -0
  251. package/esm/src/kernel/engine/call-trace.js +29 -0
  252. package/esm/src/kernel/engine/compaction.d.ts +71 -0
  253. package/esm/src/kernel/engine/compaction.js +203 -0
  254. package/esm/src/kernel/engine/decision.d.ts +43 -0
  255. package/esm/src/kernel/engine/decision.js +439 -0
  256. package/esm/src/kernel/engine/embedding.d.ts +8 -0
  257. package/esm/src/kernel/engine/embedding.js +118 -0
  258. package/esm/src/kernel/engine/hash.d.ts +6 -0
  259. package/esm/src/kernel/engine/hash.js +22 -0
  260. package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
  261. package/esm/src/kernel/engine/live-inbound.js +44 -0
  262. package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
  263. package/esm/src/kernel/engine/live-ingress.js +42 -0
  264. package/esm/src/kernel/engine/record.d.ts +3 -0
  265. package/esm/src/kernel/engine/record.js +11 -0
  266. package/esm/src/kernel/engine/repair.d.ts +7 -0
  267. package/esm/src/kernel/engine/repair.js +36 -0
  268. package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
  269. package/esm/src/kernel/engine/runner/gates.js +508 -0
  270. package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
  271. package/esm/src/kernel/engine/runner/mod.js +625 -0
  272. package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
  273. package/esm/src/kernel/engine/runner/nested.js +134 -0
  274. package/esm/src/kernel/engine/runner/schema-validation.d.ts +35 -0
  275. package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
  276. package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
  277. package/esm/src/kernel/engine/runner/stages.js +41 -0
  278. package/esm/src/kernel/engine/runner/state.d.ts +97 -0
  279. package/esm/src/kernel/engine/runner/state.js +50 -0
  280. package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
  281. package/esm/src/kernel/engine/runner/step-order.js +165 -0
  282. package/esm/src/kernel/engine/runner/steps.d.ts +14 -0
  283. package/esm/src/kernel/engine/runner/steps.js +519 -0
  284. package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
  285. package/esm/src/kernel/engine/runner/stream.js +376 -0
  286. package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
  287. package/esm/src/kernel/engine/runner/usage.js +148 -0
  288. package/esm/src/kernel/engine/session/mod.d.ts +33 -0
  289. package/esm/src/kernel/engine/session/mod.js +1182 -0
  290. package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
  291. package/esm/src/kernel/engine/session/session-trace.js +500 -0
  292. package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
  293. package/esm/src/kernel/engine/token-estimate.js +38 -0
  294. package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
  295. package/esm/src/kernel/engine/tool-trace.js +132 -0
  296. package/esm/src/kernel/engine/tree.d.ts +2 -0
  297. package/esm/src/kernel/engine/tree.js +17 -0
  298. package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
  299. package/esm/src/kernel/engine/turn-trace.js +855 -0
  300. package/esm/src/kernel/engine/usage.d.ts +36 -0
  301. package/esm/src/kernel/engine/usage.js +151 -0
  302. package/esm/src/kernel/interaction-parts.d.ts +13 -0
  303. package/esm/src/kernel/interaction-parts.js +40 -0
  304. package/esm/src/kernel/json.d.ts +10 -0
  305. package/esm/src/kernel/json.js +3 -0
  306. package/esm/src/kernel/mod.d.ts +74 -0
  307. package/esm/src/kernel/mod.js +45 -0
  308. package/esm/src/kernel/profile-graph.d.ts +145 -0
  309. package/esm/src/kernel/profile-graph.js +158 -0
  310. package/esm/src/kernel/profile-presence.d.ts +18 -0
  311. package/esm/src/kernel/profile-presence.js +158 -0
  312. package/esm/src/kernel/profile-scope.d.ts +40 -0
  313. package/esm/src/kernel/profile-scope.js +274 -0
  314. package/esm/src/kernel/protocols/binding.d.ts +65 -0
  315. package/esm/src/kernel/protocols/binding.js +125 -0
  316. package/esm/src/kernel/protocols/limits.d.ts +15 -0
  317. package/esm/src/kernel/protocols/limits.js +28 -0
  318. package/esm/src/kernel/protocols/mod.d.ts +5 -0
  319. package/esm/src/kernel/protocols/mod.js +5 -0
  320. package/esm/src/kernel/protocols/prices.d.ts +36 -0
  321. package/esm/src/kernel/protocols/prices.js +37 -0
  322. package/esm/src/kernel/protocols/protocol.d.ts +253 -0
  323. package/esm/src/kernel/protocols/protocol.js +253 -0
  324. package/esm/src/kernel/protocols/provider.d.ts +108 -0
  325. package/esm/src/kernel/protocols/provider.js +143 -0
  326. package/esm/src/kernel/protocols/runtime.d.ts +55 -0
  327. package/esm/src/kernel/protocols/runtime.js +534 -0
  328. package/esm/src/kernel/provider-budget.d.ts +32 -0
  329. package/esm/src/kernel/provider-budget.js +262 -0
  330. package/esm/src/kernel/provider-dispatch.d.ts +13 -0
  331. package/esm/src/kernel/provider-dispatch.js +36 -0
  332. package/esm/src/kernel/provider-live.d.ts +7 -0
  333. package/esm/src/kernel/provider-live.js +189 -0
  334. package/esm/src/kernel/provider-runtime.d.ts +57 -0
  335. package/esm/src/kernel/provider-runtime.js +524 -0
  336. package/esm/src/kernel/registry/attachments.d.ts +46 -0
  337. package/esm/src/kernel/registry/attachments.js +220 -0
  338. package/esm/src/kernel/registry/catalog.d.ts +25 -0
  339. package/esm/src/kernel/registry/catalog.js +85 -0
  340. package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
  341. package/esm/src/kernel/registry/embedding-rules.js +66 -0
  342. package/esm/src/kernel/registry/ingress.d.ts +12 -0
  343. package/esm/src/kernel/registry/ingress.js +179 -0
  344. package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
  345. package/esm/src/kernel/registry/kernel-registry.js +15 -0
  346. package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
  347. package/esm/src/kernel/registry/profile-outputs.js +10 -0
  348. package/esm/src/kernel/registry/profiles.d.ts +116 -0
  349. package/esm/src/kernel/registry/profiles.js +773 -0
  350. package/esm/src/kernel/registry/provider-request.d.ts +6 -0
  351. package/esm/src/kernel/registry/provider-request.js +34 -0
  352. package/esm/src/kernel/registry/resolve.d.ts +17 -0
  353. package/esm/src/kernel/registry/resolve.js +238 -0
  354. package/esm/src/kernel/registry/schemas.d.ts +12 -0
  355. package/esm/src/kernel/registry/schemas.js +27 -0
  356. package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
  357. package/esm/src/kernel/registry/slot-fill.js +22 -0
  358. package/esm/src/kernel/registry/sole-model.d.ts +2 -0
  359. package/esm/src/kernel/registry/sole-model.js +4 -0
  360. package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
  361. package/esm/src/kernel/registry/system-prompt.js +32 -0
  362. package/esm/src/kernel/registry/system-role.d.ts +3 -0
  363. package/esm/src/kernel/registry/system-role.js +9 -0
  364. package/esm/src/kernel/registry/vault.d.ts +14 -0
  365. package/esm/src/kernel/registry/vault.js +1 -0
  366. package/esm/src/kernel/schema.d.ts +226 -0
  367. package/esm/src/kernel/schema.js +895 -0
  368. package/esm/src/kernel/scope.d.ts +29 -0
  369. package/esm/src/kernel/scope.js +45 -0
  370. package/esm/src/kernel/stages.d.ts +176 -0
  371. package/esm/src/kernel/stages.js +431 -0
  372. package/esm/src/kernel/stop.d.ts +116 -0
  373. package/esm/src/kernel/stop.js +137 -0
  374. package/esm/src/kernel/system-parts.d.ts +26 -0
  375. package/esm/src/kernel/system-parts.js +98 -0
  376. package/esm/src/kernel/tools/activity-label.d.ts +22 -0
  377. package/esm/src/kernel/tools/activity-label.js +435 -0
  378. package/esm/src/kernel/tools/agent.d.ts +66 -0
  379. package/esm/src/kernel/tools/agent.js +212 -0
  380. package/esm/src/kernel/tools/coordinate.d.ts +4 -0
  381. package/esm/src/kernel/tools/coordinate.js +165 -0
  382. package/esm/src/kernel/tools/events.d.ts +66 -0
  383. package/esm/src/kernel/tools/events.js +184 -0
  384. package/esm/src/kernel/tools/execute.d.ts +100 -0
  385. package/esm/src/kernel/tools/execute.js +1173 -0
  386. package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
  387. package/esm/src/kernel/tools/gate-answer.js +65 -0
  388. package/esm/src/kernel/tools/handler-events.d.ts +45 -0
  389. package/esm/src/kernel/tools/handler-events.js +106 -0
  390. package/esm/src/kernel/tools/harness.d.ts +17 -0
  391. package/esm/src/kernel/tools/harness.js +43 -0
  392. package/esm/src/kernel/tools/http-limit.d.ts +27 -0
  393. package/esm/src/kernel/tools/http-limit.js +85 -0
  394. package/esm/src/kernel/tools/invoke.d.ts +32 -0
  395. package/esm/src/kernel/tools/invoke.js +282 -0
  396. package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
  397. package/esm/src/kernel/tools/mcp-sessions.js +69 -0
  398. package/esm/src/kernel/tools/mod.d.ts +10 -0
  399. package/esm/src/kernel/tools/mod.js +7 -0
  400. package/esm/src/kernel/tools/model-text.d.ts +16 -0
  401. package/esm/src/kernel/tools/model-text.js +31 -0
  402. package/esm/src/kernel/tools/operation.d.ts +76 -0
  403. package/esm/src/kernel/tools/operation.js +100 -0
  404. package/esm/src/kernel/tools/page-answer.d.ts +8 -0
  405. package/esm/src/kernel/tools/page-answer.js +19 -0
  406. package/esm/src/kernel/tools/permission.d.ts +15 -0
  407. package/esm/src/kernel/tools/permission.js +38 -0
  408. package/esm/src/kernel/tools/project.d.ts +11 -0
  409. package/esm/src/kernel/tools/project.js +55 -0
  410. package/esm/src/kernel/tools/registry.d.ts +27 -0
  411. package/esm/src/kernel/tools/registry.js +143 -0
  412. package/esm/src/kernel/tools/remote.d.ts +144 -0
  413. package/esm/src/kernel/tools/remote.js +1125 -0
  414. package/esm/src/kernel/tools/resolve.d.ts +31 -0
  415. package/esm/src/kernel/tools/resolve.js +267 -0
  416. package/esm/src/kernel/tools/run.d.ts +28 -0
  417. package/esm/src/kernel/tools/run.js +86 -0
  418. package/esm/src/kernel/tools/schema.d.ts +10 -0
  419. package/esm/src/kernel/tools/schema.js +95 -0
  420. package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
  421. package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
  422. package/esm/src/kernel/tools/stage-run.d.ts +116 -0
  423. package/esm/src/kernel/tools/stage-run.js +198 -0
  424. package/esm/src/kernel/tools/types.d.ts +497 -0
  425. package/esm/src/kernel/tools/types.js +1 -0
  426. package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
  427. package/esm/src/kernel/tools/unchecked-output.js +18 -0
  428. package/esm/src/kernel/turn-events.d.ts +776 -0
  429. package/esm/src/kernel/turn-events.js +543 -0
  430. package/esm/src/kernel/types.d.ts +1025 -0
  431. package/esm/src/kernel/types.js +1 -0
  432. package/esm/src/kernel/util/base64.d.ts +4 -0
  433. package/esm/src/kernel/util/base64.js +15 -0
  434. package/esm/src/kernel/util/exact-type.d.ts +31 -0
  435. package/esm/src/kernel/util/exact-type.js +1 -0
  436. package/esm/src/kernel/util/find-last.d.ts +3 -0
  437. package/esm/src/kernel/util/find-last.js +9 -0
  438. package/esm/src/kernel/util/mime.d.ts +2 -0
  439. package/esm/src/kernel/util/mime.js +4 -0
  440. package/esm/src/kernel/util/partial-json.d.ts +23 -0
  441. package/esm/src/kernel/util/partial-json.js +128 -0
  442. package/esm/src/kernel/util/record.d.ts +2 -0
  443. package/esm/src/kernel/util/record.js +4 -0
  444. package/esm/src/observability/destinations.d.ts +14 -0
  445. package/esm/src/observability/destinations.js +43 -0
  446. package/esm/src/observability/jsonl.d.ts +18 -0
  447. package/esm/src/observability/jsonl.js +110 -0
  448. package/esm/src/observability/mod.d.ts +22 -0
  449. package/esm/src/observability/mod.js +16 -0
  450. package/esm/src/observability/openinference.d.ts +11 -0
  451. package/esm/src/observability/openinference.js +205 -0
  452. package/esm/src/observability/otlp.d.ts +71 -0
  453. package/esm/src/observability/otlp.js +98 -0
  454. package/esm/src/observability/phoenix.d.ts +30 -0
  455. package/esm/src/observability/phoenix.js +71 -0
  456. package/esm/src/observability/policy.d.ts +17 -0
  457. package/esm/src/observability/policy.js +73 -0
  458. package/esm/src/observability/resolve-policy.d.ts +8 -0
  459. package/esm/src/observability/resolve-policy.js +64 -0
  460. package/esm/src/observability/spans.d.ts +22 -0
  461. package/esm/src/observability/spans.js +72 -0
  462. package/esm/src/observability/trace-catalog.d.ts +128 -0
  463. package/esm/src/observability/trace-catalog.js +906 -0
  464. package/esm/src/observability/trace-record.d.ts +23 -0
  465. package/esm/src/observability/trace-record.js +228 -0
  466. package/esm/src/observability/trace-schema.d.ts +57 -0
  467. package/esm/src/observability/trace-schema.js +59 -0
  468. package/esm/src/observability/trace-sink.d.ts +14 -0
  469. package/esm/src/observability/trace-sink.js +3 -0
  470. package/esm/src/observability/trace-span.d.ts +98 -0
  471. package/esm/src/observability/trace-span.js +201 -0
  472. package/esm/src/observability/trace.d.ts +13 -0
  473. package/esm/src/observability/trace.js +37 -0
  474. package/esm/src/observability/types.d.ts +109 -0
  475. package/esm/src/observability/types.js +3 -0
  476. package/esm/src/presets/google/speech-voices.d.ts +9 -0
  477. package/esm/src/presets/google/speech-voices.js +38 -0
  478. package/esm/src/presets/google-limits.d.ts +13 -0
  479. package/esm/src/presets/google-limits.js +18 -0
  480. package/esm/src/presets/google.d.ts +119 -0
  481. package/esm/src/presets/google.js +197 -0
  482. package/esm/src/presets/local.d.ts +26 -0
  483. package/esm/src/presets/local.js +30 -0
  484. package/esm/src/presets/mod.d.ts +11 -0
  485. package/esm/src/presets/mod.js +9 -0
  486. package/esm/src/presets/openrouter.d.ts +26 -0
  487. package/esm/src/presets/openrouter.js +31 -0
  488. package/esm/src/providers/embedding-limits.d.ts +7 -0
  489. package/esm/src/providers/embedding-limits.js +12 -0
  490. package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
  491. package/esm/src/providers/gemini/embedding-protocol.js +125 -0
  492. package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
  493. package/esm/src/providers/gemini/interactions-protocol.js +105 -0
  494. package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
  495. package/esm/src/providers/gemini/live-protocol.js +191 -0
  496. package/esm/src/providers/gemini/prices.d.ts +3 -0
  497. package/esm/src/providers/gemini/prices.js +63 -0
  498. package/esm/src/providers/gemini/provider.d.ts +7 -0
  499. package/esm/src/providers/gemini/provider.js +39 -0
  500. package/esm/src/providers/google/api-error.d.ts +8 -0
  501. package/esm/src/providers/google/api-error.js +123 -0
  502. package/esm/src/providers/google/builtins.d.ts +14 -0
  503. package/esm/src/providers/google/builtins.js +57 -0
  504. package/esm/src/providers/google/grounding.d.ts +5 -0
  505. package/esm/src/providers/google/grounding.js +226 -0
  506. package/esm/src/providers/google/interactions/framing.d.ts +27 -0
  507. package/esm/src/providers/google/interactions/framing.js +304 -0
  508. package/esm/src/providers/google/interactions/steps.d.ts +12 -0
  509. package/esm/src/providers/google/interactions/steps.js +200 -0
  510. package/esm/src/providers/google/interactions/stream.d.ts +23 -0
  511. package/esm/src/providers/google/interactions/stream.js +230 -0
  512. package/esm/src/providers/google/live/framing.d.ts +61 -0
  513. package/esm/src/providers/google/live/framing.js +597 -0
  514. package/esm/src/providers/google/live/stream.d.ts +13 -0
  515. package/esm/src/providers/google/live/stream.js +57 -0
  516. package/esm/src/providers/google/thinking.d.ts +3 -0
  517. package/esm/src/providers/google/thinking.js +8 -0
  518. package/esm/src/providers/google/urls.d.ts +4 -0
  519. package/esm/src/providers/google/urls.js +4 -0
  520. package/esm/src/providers/google/usage.d.ts +7 -0
  521. package/esm/src/providers/google/usage.js +49 -0
  522. package/esm/src/providers/live.d.ts +6 -0
  523. package/esm/src/providers/live.js +6 -0
  524. package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
  525. package/esm/src/providers/local/embedding-protocol.js +60 -0
  526. package/esm/src/providers/local/provider.d.ts +7 -0
  527. package/esm/src/providers/local/provider.js +28 -0
  528. package/esm/src/providers/mod.d.ts +32 -0
  529. package/esm/src/providers/mod.js +23 -0
  530. package/esm/src/providers/open-ai/protocol.d.ts +3 -0
  531. package/esm/src/providers/open-ai/protocol.js +189 -0
  532. package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
  533. package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
  534. package/esm/src/providers/openrouter/image.d.ts +15 -0
  535. package/esm/src/providers/openrouter/image.js +34 -0
  536. package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
  537. package/esm/src/providers/openrouter/images-protocol.js +82 -0
  538. package/esm/src/providers/openrouter/openai/compat.d.ts +19 -0
  539. package/esm/src/providers/openrouter/openai/compat.js +162 -0
  540. package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
  541. package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
  542. package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
  543. package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
  544. package/esm/src/providers/openrouter/openai/usage.d.ts +8 -0
  545. package/esm/src/providers/openrouter/openai/usage.js +56 -0
  546. package/esm/src/providers/openrouter/protocol.d.ts +8 -0
  547. package/esm/src/providers/openrouter/protocol.js +171 -0
  548. package/esm/src/providers/openrouter/provider.d.ts +10 -0
  549. package/esm/src/providers/openrouter/provider.js +50 -0
  550. package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
  551. package/esm/src/providers/shared/carried-tool-files.js +43 -0
  552. package/esm/src/providers/shared/pcm.d.ts +14 -0
  553. package/esm/src/providers/shared/pcm.js +78 -0
  554. package/esm/src/providers/shared/protocol-events.d.ts +8 -0
  555. package/esm/src/providers/shared/protocol-events.js +20 -0
  556. package/esm/src/providers/shared/response-identity.d.ts +11 -0
  557. package/esm/src/providers/shared/response-identity.js +12 -0
  558. package/esm/src/providers/shared/retry.d.ts +17 -0
  559. package/esm/src/providers/shared/retry.js +90 -0
  560. package/esm/src/providers/shared/sse.d.ts +6 -0
  561. package/esm/src/providers/shared/sse.js +93 -0
  562. package/esm/src/providers/shared/structured-output.d.ts +4 -0
  563. package/esm/src/providers/shared/structured-output.js +11 -0
  564. package/esm/src/providers/shared/tool-args.d.ts +24 -0
  565. package/esm/src/providers/shared/tool-args.js +88 -0
  566. package/esm/src/providers/shared/tool-draft.d.ts +16 -0
  567. package/esm/src/providers/shared/tool-draft.js +14 -0
  568. package/esm/src/providers/shared/upstream-tap.d.ts +8 -0
  569. package/esm/src/providers/shared/upstream-tap.js +85 -0
  570. package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
  571. package/esm/src/providers/shared/upstream-tape.js +88 -0
  572. package/esm/src/providers/system-one/protocol.d.ts +8 -0
  573. package/esm/src/providers/system-one/protocol.js +93 -0
  574. package/esm/src/providers/types.d.ts +51 -0
  575. package/esm/src/providers/types.js +2 -0
  576. package/esm/src/providers/typesafe/provider.d.ts +7 -0
  577. package/esm/src/providers/typesafe/provider.js +24 -0
  578. package/esm/src/surface/formats.d.ts +46 -0
  579. package/esm/src/surface/formats.js +178 -0
  580. package/esm/src/surface/mod.d.ts +16 -0
  581. package/esm/src/surface/mod.js +12 -0
  582. package/esm/src/surface/runtime.d.ts +44 -0
  583. package/esm/src/surface/runtime.js +441 -0
  584. package/esm/src/surface/tools.d.ts +9 -0
  585. package/esm/src/surface/tools.js +62 -0
  586. package/esm/src/surface/types.d.ts +110 -0
  587. package/esm/src/surface/types.js +4 -0
  588. package/package.json +100 -4
@@ -0,0 +1,367 @@
1
+ import { errorKind, TheoremError } from '../../guardrails/error.js';
2
+ import { getProfile, registerStructured, runDecision, runTurn, } from '../../kernel/default-scope.js';
3
+ import { mimeAllowed, profileAccept } from '../../kernel/registry/catalog.js';
4
+ import { isRecord } from '../../kernel/util/record.js';
5
+ import { memorySink } from '../../observability/trace.js';
6
+ import { formatTraceparent } from '../../observability/trace-span.js';
7
+ import { fillRubric } from '../rubrics/types.js';
8
+ import { buildTrial } from '../trial.js';
9
+ import { resolveMedia, trialMedia } from './media.js';
10
+ import { deliveredJson, deliveredText } from './shared.js';
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. */
13
+ const EVAL_JUDGMENT = 'evalJudgment';
14
+ const UNKNOWN = 'unknown';
15
+ const UNKNOWN_CRITERION = 'The record does not show enough to decide.';
16
+ const VERDICT = 'verdict';
17
+ const FAILED_STOPS = new Set([
18
+ 'provider_error',
19
+ 'cancelled',
20
+ 'stream_incomplete',
21
+ 'interrupted',
22
+ ]);
23
+ function turnFailure(trial) {
24
+ const stop = trial.root.attributes['theorem.stop.kind'];
25
+ if (typeof stop === 'string' && FAILED_STOPS.has(stop))
26
+ return `the turn stopped with ${stop}`;
27
+ if (deliveredText(trial, undefined) === '' && deliveredJson(trial) === undefined) {
28
+ return `the turn delivered nothing${typeof stop === 'string' ? ` (stopped ${stop})` : ''}`;
29
+ }
30
+ return undefined;
31
+ }
32
+ const JUDGMENT_SCHEMA = {
33
+ jsonSchema: {
34
+ type: 'object',
35
+ properties: {
36
+ label: {
37
+ type: 'string',
38
+ description: `One of the labels the rubric names, exactly as written, or "${UNKNOWN}" when the record does not let you decide.`,
39
+ },
40
+ explanation: {
41
+ type: 'string',
42
+ description: 'Why, in a few sentences, citing what the record shows.',
43
+ },
44
+ },
45
+ required: ['label', 'explanation'],
46
+ },
47
+ };
48
+ // why: Importing this module registers the schema, so a host's judge profile can name it at registration.
49
+ registerStructured(EVAL_JUDGMENT, JUDGMENT_SCHEMA);
50
+ function configError(grader, message) {
51
+ return new TheoremError('config', `judge ${grader}: ${message}`); // labels-exempt: developer contract error
52
+ }
53
+ function judgeKind(grader, rubric, profileId) {
54
+ const profile = getProfile(profileId);
55
+ if (profile.type === 'decision') {
56
+ if (!rubric.question) {
57
+ throw configError(grader, `rubric ${rubric.name} has no question for decision profile ${profileId}`);
58
+ }
59
+ return 'decision';
60
+ }
61
+ if (profile.type !== 'text') {
62
+ throw configError(grader, `judge profile ${profileId} is neither a text nor a decision profile`);
63
+ }
64
+ if (profile.outputs?.structured !== EVAL_JUDGMENT) {
65
+ throw configError(grader, `judge profile ${profileId} must set outputs.structured to '${EVAL_JUDGMENT}'`);
66
+ }
67
+ if (rubric.template === undefined) {
68
+ throw configError(grader, `rubric ${rubric.name} has no prompt for text profile ${profileId}`);
69
+ }
70
+ return 'text';
71
+ }
72
+ function traceparentsOf(records) {
73
+ const spans = records[0]?.spans ?? [];
74
+ const ids = new Set(spans.map((span) => span.spanId));
75
+ const root = spans.find((span) => span.parentSpanId === undefined || !ids.has(span.parentSpanId));
76
+ return root ? [formatTraceparent(root.traceId, root.spanId)] : [];
77
+ }
78
+ function judgeStamp(trial, grader) {
79
+ return {
80
+ eval: {
81
+ suite: trial.suite,
82
+ ...(trial.case ? { case: trial.case.id } : {}),
83
+ trial: trial.index,
84
+ judge: { grader },
85
+ },
86
+ };
87
+ }
88
+ function judgeCall(trial, grader, context) {
89
+ return {
90
+ metadata: judgeStamp(trial, grader),
91
+ ...(context.traceparent ? { traceparent: context.traceparent } : {}),
92
+ ...(context.signal ? { signal: context.signal } : {}),
93
+ };
94
+ }
95
+ function parseJudgment(value) {
96
+ if (!isRecord(value))
97
+ return undefined;
98
+ const { label, explanation } = value;
99
+ if (typeof label !== 'string' || typeof explanation !== 'string')
100
+ return undefined;
101
+ return { label, explanation };
102
+ }
103
+ async function askText(args) {
104
+ const { context } = args;
105
+ if (!context.judgeProvider) {
106
+ throw configError(args.grader, `no provider for text judge profile ${args.profile}`);
107
+ }
108
+ const records = [];
109
+ let error;
110
+ const request = {
111
+ profile: args.profile,
112
+ input: {
113
+ text: args.prompt,
114
+ ...(args.attachments.length > 0 ? { attachments: args.attachments } : {}),
115
+ },
116
+ ...judgeCall(args.trial, args.grader, context),
117
+ };
118
+ try {
119
+ for await (const _event of runTurn(request, context.judgeProvider, memorySink(records))) {
120
+ // why: The judge's trace is its record; its events are not read.
121
+ }
122
+ }
123
+ catch (thrown) {
124
+ error = errorKind(thrown);
125
+ }
126
+ await context.traced(records);
127
+ if (records.length === 0)
128
+ return { traceparents: [], error: error ?? 'internal' };
129
+ const judged = buildTrial({ suite: args.trial.suite, index: 0, records });
130
+ const traceparents = [formatTraceparent(judged.root.traceId, judged.root.spanId)];
131
+ const failure = judged.root.attributes['error.type'];
132
+ if (error === undefined && typeof failure === 'string')
133
+ error = failure;
134
+ if (error !== undefined)
135
+ return { traceparents, error };
136
+ const judgment = parseJudgment(deliveredJson(judged));
137
+ return judgment ? { traceparents, judgment } : { traceparents, error: 'bad_response' };
138
+ }
139
+ function percent(value) {
140
+ return `${Math.round(value * 100)}%`;
141
+ }
142
+ function choiceJudgment(answer, rule) {
143
+ if (answer?.type !== 'choice')
144
+ return undefined;
145
+ const p = answer.probabilities;
146
+ const odds = Object.entries(p)
147
+ .sort((a, b) => b[1] - a[1])
148
+ .map(([label, value]) => `${label} ${percent(value)}`)
149
+ .join(', ');
150
+ const { pass } = rule;
151
+ if (!pass)
152
+ return { label: answer.choice, explanation: `Jev chose ${answer.choice} (${odds}).` };
153
+ const mass = (labels) => labels.reduce((sum, l) => sum + (p[l] ?? 0), 0);
154
+ const likeliest = (labels) => labels.reduce((best, l) => ((p[l] ?? 0) > (p[best] ?? 0) ? l : best));
155
+ const failing = rule.labels.filter((label) => !pass.includes(label));
156
+ const needs = `passing needs ${pass.join(' or ')} above ${percent(rule.line)}`;
157
+ if (mass(pass) > rule.line) {
158
+ return { label: likeliest(pass), explanation: `Jev: ${odds}; ${needs}.` };
159
+ }
160
+ if (failing.length > 0 && mass(failing) > 0.5) {
161
+ return { label: likeliest(failing), explanation: `Jev: ${odds}; ${needs}.` };
162
+ }
163
+ return { label: UNKNOWN, explanation: `Jev was unsure: ${odds}; ${needs}.` };
164
+ }
165
+ async function askDecision(args) {
166
+ const { context, rubric } = args;
167
+ if (!context.judgeDecision) {
168
+ throw configError(args.grader, `no key for decision judge profile ${args.profile}`);
169
+ }
170
+ if (!rubric.question) {
171
+ throw configError(args.grader, `rubric ${rubric.name} has no question`);
172
+ }
173
+ const question = {
174
+ type: 'choice',
175
+ instructions: rubric.question.instructions,
176
+ criteria: { ...rubric.question.criteria, [UNKNOWN]: UNKNOWN_CRITERION },
177
+ };
178
+ const records = [];
179
+ try {
180
+ const result = await runDecision({
181
+ profile: args.profile,
182
+ state: args.state,
183
+ questions: { [VERDICT]: question },
184
+ ...judgeCall(args.trial, args.grader, context),
185
+ }, { ...context.judgeDecision, sink: memorySink(records) });
186
+ await context.traced(records);
187
+ const traceparents = traceparentsOf(records);
188
+ const judgment = choiceJudgment(result.answers[VERDICT], args.rule);
189
+ return judgment ? { traceparents, judgment } : { traceparents, error: 'bad_response' };
190
+ }
191
+ catch (thrown) {
192
+ await context.traced(records);
193
+ return { traceparents: traceparentsOf(records), error: errorKind(thrown) };
194
+ }
195
+ }
196
+ function escalated(decision, text) {
197
+ const traceparents = [...decision.traceparents, ...text.traceparents];
198
+ if (!text.judgment)
199
+ return { traceparents, error: text.error ?? 'internal' };
200
+ return {
201
+ traceparents,
202
+ judgment: {
203
+ label: text.judgment.label,
204
+ explanation: `${decision.judgment?.explanation ?? ''} The text judge decided: ${text.judgment.explanation}`,
205
+ },
206
+ };
207
+ }
208
+ function stateOf(rubric, view) {
209
+ const state = {};
210
+ for (const variable of rubric.variables) {
211
+ const value = view[variable];
212
+ if (value === undefined) {
213
+ throw new TheoremError('config', `rubric ${rubric.name}: no value for ${variable}`); // labels-exempt: developer contract error
214
+ }
215
+ state[variable] = value;
216
+ }
217
+ return state;
218
+ }
219
+ // why: Models echo the prompt's headings (`CORRECT -`), so a text judge's label is read case-insensitively.
220
+ function declaredLabel(label, allowed) {
221
+ const wanted = label.trim().toLowerCase();
222
+ return [...allowed].find((declared) => declared.toLowerCase() === wanted);
223
+ }
224
+ function resultOf(run, rubric, name, pass) {
225
+ const base = {
226
+ name,
227
+ source: 'model',
228
+ ...(run.traceparents.length > 0 ? { judgeTraceparents: run.traceparents } : {}),
229
+ };
230
+ if (!run.judgment) {
231
+ return {
232
+ ...base,
233
+ errorType: run.error ?? 'internal',
234
+ explanation: `the judge gave no judgment (${run.error ?? 'internal'})`,
235
+ };
236
+ }
237
+ const allowed = new Set([...Object.keys(rubric.labels), UNKNOWN]);
238
+ const label = declaredLabel(run.judgment.label, allowed);
239
+ if (label === undefined) {
240
+ return {
241
+ ...base,
242
+ errorType: 'bad_response',
243
+ explanation: `the judge answered ${JSON.stringify(run.judgment.label)}, not one of ${[...allowed].join(', ')}`,
244
+ };
245
+ }
246
+ const value = rubric.labels[label];
247
+ return {
248
+ ...base,
249
+ score: { ...(value === undefined ? {} : { value }), label },
250
+ explanation: run.judgment.explanation,
251
+ ...(pass ? { passed: pass.includes(label) } : {}),
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. */
255
+ function judge(options) {
256
+ const { rubric } = options;
257
+ const name = options.name ?? rubric.name;
258
+ const pass = options.pass ?? rubric.pass;
259
+ const unknownPass = (pass ?? []).filter((label) => !(label in rubric.labels));
260
+ if (unknownPass.length > 0) {
261
+ throw configError(name, `pass names labels the rubric lacks: ${unknownPass.join(', ')}`);
262
+ }
263
+ const unfillable = rubric.variables.filter((variable) => !TRIAL_VARIABLES.includes(variable));
264
+ if (unfillable.length > 0 && !options.variables) {
265
+ throw configError(name, `the rubric needs ${unfillable.join(', ')}, which the trace cannot fill; pass variables`);
266
+ }
267
+ const wrongPassCost = options.wrongPassCost ?? 1;
268
+ if (!(Number.isFinite(wrongPassCost) && wrongPassCost > 0)) {
269
+ throw configError(name, `wrongPassCost must be a positive number, not ${wrongPassCost}`);
270
+ }
271
+ if (options.wrongPassCost !== undefined && !pass) {
272
+ throw configError(name, `wrongPassCost needs labels that pass, and rubric ${rubric.name} names none`);
273
+ }
274
+ const rule = {
275
+ pass,
276
+ labels: Object.keys(rubric.labels),
277
+ line: wrongPassCost / (1 + wrongPassCost),
278
+ };
279
+ const judgeProfile = (suiteJudge) => {
280
+ const profile = options.profile ?? suiteJudge;
281
+ if (!profile)
282
+ throw configError(name, 'names no judge profile, and neither does the suite');
283
+ const kind = judgeKind(name, rubric, profile);
284
+ const decisionOnly = [
285
+ ...(options.wrongPassCost === undefined ? [] : ['wrongPassCost']),
286
+ ...(options.escalate === undefined ? [] : ['escalate']),
287
+ ];
288
+ if (kind === 'text' && decisionOnly.length > 0) {
289
+ throw configError(name, `${decisionOnly.join(' and ')} ${decisionOnly.length > 1 ? 'need' : 'needs'} a decision judge, and ${profile} is a text profile`);
290
+ }
291
+ if (options.escalate !== undefined && judgeKind(name, rubric, options.escalate) !== 'text') {
292
+ throw configError(name, `escalate names ${options.escalate}, which is not a text profile`);
293
+ }
294
+ return profile;
295
+ };
296
+ const identity = [
297
+ `judge:${name}`,
298
+ `labels=${Object.entries(rubric.labels)
299
+ .map(([label, value]) => `${label}:${value}`)
300
+ .join(',')}`,
301
+ `pass=${pass ? [...pass].join(',') : 'none'}`,
302
+ ...(options.profile ? [`profile=${options.profile}`] : []),
303
+ ...(options.wrongPassCost === undefined ? [] : [`wrongPassCost=${options.wrongPassCost}`]),
304
+ ...(options.escalate ? [`escalate=${options.escalate}`] : []),
305
+ `template=${rubric.template ?? ''}`,
306
+ `question=${rubric.question ? JSON.stringify(rubric.question) : ''}`,
307
+ ].join('\n');
308
+ const grade = async (trial, context) => {
309
+ const notJudged = (why) => ({
310
+ name,
311
+ source: 'model',
312
+ explanation: `${why}; not judged`,
313
+ });
314
+ const failure = turnFailure(trial);
315
+ if (failure)
316
+ return notJudged(failure);
317
+ const profile = judgeProfile(context.judge);
318
+ const view = rubricView(rubric, trial, options.variables?.(trial) ?? {});
319
+ const read = JSON.stringify(view);
320
+ const media = trialMedia(trial).filter((item) => read.includes(item.label));
321
+ const resolved = await resolveMedia(trial, media, context);
322
+ if ('missing' in resolved) {
323
+ return notJudged(`the judge could not be shown ${resolved.missing.join(', ')}`);
324
+ }
325
+ const { attachments } = resolved;
326
+ const text = (textProfile) => {
327
+ const refused = attachments.filter((item) => !mimeAllowed(profileAccept(getProfile(textProfile), 'attachments') ?? [], item.mimeType));
328
+ if (refused.length > 0) {
329
+ throw configError(name, `judge profile ${textProfile} must accept ${[...new Set(refused.map((item) => item.mimeType))].join(', ')} to see the media it judges`);
330
+ }
331
+ return askText({
332
+ trial,
333
+ prompt: fillRubric(rubric, view),
334
+ profile: textProfile,
335
+ grader: name,
336
+ context,
337
+ attachments,
338
+ });
339
+ };
340
+ if (judgeKind(name, rubric, profile) === 'text')
341
+ return resultOf(await text(profile), rubric, name, pass);
342
+ if (attachments.length > 0) {
343
+ if (!options.escalate) {
344
+ return notJudged(`decision judge ${profile} cannot see ${media.map((item) => item.label).join(', ')} and no escalate judge can`);
345
+ }
346
+ return resultOf(await text(options.escalate), rubric, name, pass);
347
+ }
348
+ const run = await askDecision({
349
+ trial,
350
+ rubric,
351
+ rule,
352
+ state: stateOf(rubric, view),
353
+ profile,
354
+ grader: name,
355
+ context,
356
+ });
357
+ if (!options.escalate || run.judgment?.label !== UNKNOWN)
358
+ return resultOf(run, rubric, name, pass);
359
+ return resultOf(escalated(run, await text(options.escalate)), rubric, name, pass);
360
+ };
361
+ const judgeProfiles = (suiteJudge) => [
362
+ judgeProfile(suiteJudge),
363
+ ...(options.escalate === undefined ? [] : [options.escalate]),
364
+ ];
365
+ return { name, identity, source: 'model', needsExpect: false, judgeProfiles, grade };
366
+ }
367
+ export { EVAL_JUDGMENT, judge };
@@ -0,0 +1,6 @@
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. */
3
+ declare function turnLatency(options: {
4
+ maxMs: number;
5
+ }): EvalGrader;
6
+ export { turnLatency };
@@ -0,0 +1,82 @@
1
+ import { codeGrader, passFail } from './shared.js';
2
+ const MS_PER_S = 1000;
3
+ const NANOS_PER_MS = 1000000n;
4
+ const ACTIVITY_END = 'ACTIVITY_END';
5
+ function msBetween(fromUnixNano, toUnixNano) {
6
+ return Number((toUnixNano - fromUnixNano) / NANOS_PER_MS);
7
+ }
8
+ function numberAttribute(span, key) {
9
+ const value = span.attributes[key];
10
+ return typeof value === 'number' ? value : undefined;
11
+ }
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
+ function firstChunkAt(trial, call) {
14
+ const seconds = numberAttribute(call, 'gen_ai.response.time_to_first_chunk');
15
+ if (seconds === undefined)
16
+ return undefined;
17
+ const tries = trial.children(call).filter((span) => 'http.request.method' in span.attributes);
18
+ const from = tries.at(-1) ?? call;
19
+ return BigInt(from.startTimeUnixNano) + BigInt(Math.round(seconds * MS_PER_S)) * NANOS_PER_MS;
20
+ }
21
+ // invariant: Speech that prompted an earlier reply never anchors a later one.
22
+ function speechEndedAt(root, afterUnixNano, beforeUnixNano) {
23
+ let latest;
24
+ for (const event of root.events) {
25
+ if (event.name !== 'theorem.session')
26
+ continue;
27
+ if (event.attributes.kind !== 'voice_activity' || event.attributes.activity !== ACTIVITY_END) {
28
+ continue;
29
+ }
30
+ const at = BigInt(event.timeUnixNano);
31
+ if (afterUnixNano !== undefined && at <= afterUnixNano)
32
+ continue;
33
+ if (at <= beforeUnixNano && (latest === undefined || at > latest))
34
+ latest = at;
35
+ }
36
+ return latest;
37
+ }
38
+ function reading(span, from, chunk) {
39
+ if (chunk === undefined)
40
+ return { span, missing: 'first chunk not recorded' };
41
+ return { span, ms: msBetween(from, chunk) };
42
+ }
43
+ function latencyReadings(trial) {
44
+ const responses = trial.spans('generate_content');
45
+ if (responses.length > 0) {
46
+ return responses.map((response, index) => {
47
+ const chunk = firstChunkAt(trial, response);
48
+ const start = BigInt(response.startTimeUnixNano);
49
+ const previous = responses[index - 1];
50
+ const after = previous ? BigInt(previous.startTimeUnixNano) : undefined;
51
+ const from = chunk === undefined ? start : (speechEndedAt(trial.root, after, chunk) ?? start);
52
+ return reading(response, from, chunk);
53
+ });
54
+ }
55
+ const [firstCall] = trial.spans('chat');
56
+ if (!firstCall)
57
+ return [];
58
+ return [
59
+ reading(trial.root, BigInt(trial.root.startTimeUnixNano), firstChunkAt(trial, firstCall)),
60
+ ];
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. */
63
+ function turnLatency(options) {
64
+ return codeGrader('turn_latency', `turnLatency:${options.maxMs}`, false, (trial) => {
65
+ const readings = latencyReadings(trial);
66
+ if (readings.length === 0)
67
+ return passFail('turn_latency', false, 'no model call recorded');
68
+ const over = readings.flatMap((entry, index) => {
69
+ const name = readings.length === 1 ? 'reply' : `reply ${index + 1}`;
70
+ if (entry.ms === undefined)
71
+ return [`${name}: ${entry.missing}`];
72
+ return entry.ms > options.maxMs ? [`${name}: ${entry.ms} ms over ${options.maxMs}`] : [];
73
+ });
74
+ const measured = readings.flatMap((entry) => entry.ms ?? []);
75
+ const summary = measured.length === 1
76
+ ? `reply began after ${measured[0]} ms`
77
+ : `${measured.length} replies began within ${Math.max(...measured)} ms`;
78
+ const passed = over.length === 0;
79
+ return passFail('turn_latency', passed, passed ? summary : over.join('; '));
80
+ });
81
+ }
82
+ export { turnLatency };
@@ -0,0 +1,14 @@
1
+ import type { EvalGrader } from '../types.js';
2
+ /** Graders for the transcript of a live model's spoken output. */
3
+ interface TranscriptionGraders {
4
+ includes: (text?: string) => EvalGrader;
5
+ regex: (pattern?: string, flags?: string) => EvalGrader;
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`. */
8
+ declare const transcription: TranscriptionGraders;
9
+ /** A grader that passes when the model was interrupted at most `max` times in the trial. */
10
+ declare function interruptions(options: {
11
+ max: number;
12
+ }): EvalGrader;
13
+ export type { TranscriptionGraders };
14
+ export { interruptions, transcription };
@@ -0,0 +1,42 @@
1
+ import { codeGrader, deliveredText, passFail } from './shared.js';
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`. */
4
+ const transcription = {
5
+ includes(text) {
6
+ const identity = `transcription.includes:${text ?? 'case'}`;
7
+ return codeGrader('transcription_includes', identity, text === undefined, (trial) => {
8
+ const want = text ?? trial.case?.expect?.transcription?.includes;
9
+ if (want === undefined) {
10
+ return passFail('transcription_includes', false, 'case has no expect.transcription.includes');
11
+ }
12
+ const passed = deliveredText(trial, OUTPUT_TRANSCRIPTION).includes(want);
13
+ return passFail('transcription_includes', passed, passed
14
+ ? `transcript includes ${JSON.stringify(want)}`
15
+ : `transcript lacks ${JSON.stringify(want)}`);
16
+ });
17
+ },
18
+ regex(pattern, flags = '') {
19
+ const identity = `transcription.regex:${pattern === undefined ? 'case' : `/${pattern}/${flags}`}`;
20
+ return codeGrader('transcription_regex', identity, pattern === undefined, (trial) => {
21
+ const source = pattern ?? trial.case?.expect?.transcription?.regex;
22
+ if (source === undefined) {
23
+ return passFail('transcription_regex', false, 'case has no expect.transcription.regex');
24
+ }
25
+ const passed = new RegExp(source, flags).test(deliveredText(trial, OUTPUT_TRANSCRIPTION));
26
+ return passFail('transcription_regex', passed, passed
27
+ ? `transcript matches /${source}/${flags}`
28
+ : `transcript does not match /${source}/${flags}`);
29
+ });
30
+ },
31
+ };
32
+ /** A grader that passes when the model was interrupted at most `max` times in the trial. */
33
+ function interruptions(options) {
34
+ return codeGrader('interruptions', `interruptions:${options.max}`, false, (trial) => {
35
+ const count = trial
36
+ .spans('generate_content')
37
+ .filter((span) => span.attributes['theorem.stop.kind'] === 'interrupted').length;
38
+ const passed = count <= options.max;
39
+ return passFail('interruptions', passed, `${count} interruption(s); at most ${options.max} allowed`);
40
+ });
41
+ }
42
+ export { interruptions, transcription };
@@ -0,0 +1,18 @@
1
+ import type { TurnBlob, TurnMediaRef } from '../../kernel/types.js';
2
+ import type { EvalGradeContext, Trial } from '../types.js';
3
+ interface TrialMedia {
4
+ label: string;
5
+ mimeType: string;
6
+ from: 'input' | 'output';
7
+ sha256?: string;
8
+ uri?: string;
9
+ }
10
+ declare function trialMedia(trial: Trial): TrialMedia[];
11
+ declare function mediaLabeler(trial: Trial): (part: Record<string, unknown>) => string;
12
+ declare function resolveMedia(trial: Trial, media: readonly TrialMedia[], context: EvalGradeContext): Promise<{
13
+ attachments: Array<TurnBlob | TurnMediaRef>;
14
+ } | {
15
+ missing: string[];
16
+ }>;
17
+ export type { TrialMedia };
18
+ export { mediaLabeler, resolveMedia, trialMedia };
@@ -0,0 +1,91 @@
1
+ import { sha256Base64 } from '../../kernel/engine/hash.js';
2
+ import { isRecord } from '../../kernel/util/record.js';
3
+ import { attachmentData } from '../attachments.js';
4
+ import { modelCalls } from './shared.js';
5
+ function mediaKey(part) {
6
+ if (part.type === 'blob' && typeof part.content_sha256 === 'string')
7
+ return part.content_sha256;
8
+ if (part.type === 'uri' && typeof part.uri === 'string')
9
+ return part.uri;
10
+ return undefined;
11
+ }
12
+ function messageParts(messages) {
13
+ if (!Array.isArray(messages))
14
+ return [];
15
+ return messages.flatMap((message) => isRecord(message) && Array.isArray(message.parts) ? message.parts.filter(isRecord) : []);
16
+ }
17
+ function trialMedia(trial) {
18
+ const parts = [
19
+ ...messageParts(trial.content(trial.root.attributes['gen_ai.input.messages'])).map((part) => ({
20
+ part,
21
+ from: 'input',
22
+ })),
23
+ ...modelCalls(trial).flatMap((span) => messageParts(trial.content(span.attributes['gen_ai.output.messages'])).map((part) => ({
24
+ part,
25
+ from: 'output',
26
+ }))),
27
+ ];
28
+ const media = new Map();
29
+ for (const { part, from } of parts) {
30
+ const key = mediaKey(part);
31
+ if (key === undefined || media.has(key))
32
+ continue;
33
+ const mimeType = typeof part.mime_type === 'string' ? part.mime_type : 'application/octet-stream';
34
+ const kind = typeof part.modality === 'string' ? part.modality : 'file';
35
+ media.set(key, {
36
+ label: `[${kind} ${media.size + 1}: ${mimeType}]`,
37
+ mimeType,
38
+ from,
39
+ ...(part.type === 'blob' ? { sha256: key } : { uri: key }),
40
+ });
41
+ }
42
+ return [...media.values()];
43
+ }
44
+ function mediaLabeler(trial) {
45
+ const byKey = new Map(trialMedia(trial).map((media) => [media.sha256 ?? media.uri ?? '', media.label]));
46
+ return (part) => byKey.get(mediaKey(part) ?? '') ?? `[${String(part.type)}]`;
47
+ }
48
+ async function caseAttachments(trial) {
49
+ const byHash = new Map();
50
+ const input = trial.case?.input;
51
+ const attachments = input && 'attachments' in input ? (input.attachments ?? []) : [];
52
+ for (const attachment of attachments) {
53
+ if (!('data' in attachment)) {
54
+ byHash.set(attachment.sha256, attachment);
55
+ continue;
56
+ }
57
+ const digest = await sha256Base64(attachment.data);
58
+ if (digest)
59
+ byHash.set(digest.hash, attachment);
60
+ }
61
+ return byHash;
62
+ }
63
+ // why: The host's bytes for a hash, only when they are the bytes the trace hashed.
64
+ async function fromHost(sha256, mimeType, context) {
65
+ const data = await context.media?.({ sha256, mimeType });
66
+ if (data === undefined)
67
+ return undefined;
68
+ return (await sha256Base64(data))?.hash === sha256 ? data : undefined;
69
+ }
70
+ async function resolveMedia(trial, media, context) {
71
+ const fromCase = await caseAttachments(trial);
72
+ const attachments = [];
73
+ const missing = [];
74
+ for (const item of media) {
75
+ if (item.uri !== undefined) {
76
+ attachments.push({ mimeType: item.mimeType, uri: item.uri });
77
+ continue;
78
+ }
79
+ const sha256 = item.sha256 ?? '';
80
+ const attachment = fromCase.get(sha256);
81
+ const data = attachment
82
+ ? await attachmentData(attachment)
83
+ : await fromHost(sha256, item.mimeType, context);
84
+ if (data === undefined)
85
+ missing.push(item.label);
86
+ else
87
+ attachments.push({ mimeType: item.mimeType, data });
88
+ }
89
+ return missing.length > 0 ? { missing } : { attachments };
90
+ }
91
+ export { mediaLabeler, resolveMedia, trialMedia };
@@ -0,0 +1,11 @@
1
+ import type { TraceSpan } from '../../observability/trace-span.js';
2
+ import type { EvalGrader, EvalResult, Trial } from '../types.js';
3
+ declare function passFail(name: string, passed: boolean, explanation: string): EvalResult;
4
+ declare function codeGrader(name: string, identity: string, needsExpect: boolean, grade: (trial: Trial) => EvalResult | Promise<EvalResult>): EvalGrader;
5
+ declare function deliveredText(trial: Trial, source: string | undefined): string;
6
+ declare function deliveredJson(trial: Trial): unknown;
7
+ declare function startOf(span: TraceSpan): bigint;
8
+ declare function modelCalls(trial: Trial): TraceSpan[];
9
+ declare function spanDurationMs(span: TraceSpan): number;
10
+ declare function listOf(items: readonly string[]): string;
11
+ export { codeGrader, deliveredJson, deliveredText, listOf, modelCalls, passFail, spanDurationMs, startOf, };