@hona/openeval 0.2.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 (580) hide show
  1. package/JUDGING.md +123 -0
  2. package/LICENSE +21 -0
  3. package/README.md +133 -0
  4. package/package.json +39 -0
  5. package/src/app/add-models.ts +18 -0
  6. package/src/app/context.ts +15 -0
  7. package/src/app/cost-plan.ts +118 -0
  8. package/src/app/eval-state.ts +10 -0
  9. package/src/app/execution-budget.ts +65 -0
  10. package/src/app/execution-runtime.ts +63 -0
  11. package/src/app/input-fingerprints.ts +67 -0
  12. package/src/app/judge-evidence.ts +71 -0
  13. package/src/app/judge-run.ts +89 -0
  14. package/src/app/load-benchmark.ts +267 -0
  15. package/src/app/merge-runs.ts +117 -0
  16. package/src/app/monitor-policy.ts +49 -0
  17. package/src/app/plan-benchmark.ts +127 -0
  18. package/src/app/read-results.ts +524 -0
  19. package/src/app/read-run.ts +43 -0
  20. package/src/app/rejudge.ts +127 -0
  21. package/src/app/retry-run.ts +87 -0
  22. package/src/app/run-benchmark.ts +401 -0
  23. package/src/app/run-eval-pipeline.ts +333 -0
  24. package/src/app/run-eval.ts +93 -0
  25. package/src/app/scores.ts +54 -0
  26. package/src/app/serve-results.ts +252 -0
  27. package/src/app/snapshot-run.ts +42 -0
  28. package/src/app/watch-evidence.ts +61 -0
  29. package/src/cli.ts +145 -0
  30. package/src/evidence.ts +40 -0
  31. package/src/index.ts +53 -0
  32. package/src/infra/containers/candidate.ts +218 -0
  33. package/src/infra/containers/docker.ts +31 -0
  34. package/src/infra/containers/oci.ts +335 -0
  35. package/src/infra/containers/runtime/.dockerignore +7 -0
  36. package/src/infra/containers/runtime/Dockerfile +19 -0
  37. package/src/infra/containers/runtime/development-container +19 -0
  38. package/src/infra/containers/runtime/noninteractive/index.mjs +7 -0
  39. package/src/infra/containers/runtime/noninteractive/package.json +6 -0
  40. package/src/infra/containers/runtime/package.json +10 -0
  41. package/src/infra/containers/runtime/server.mjs +32 -0
  42. package/src/infra/containers/transfer.ts +144 -0
  43. package/src/infra/containers/workspace.ts +304 -0
  44. package/src/infra/evidence/index.ts +783 -0
  45. package/src/infra/evidence/tool-calls.ts +49 -0
  46. package/src/infra/files.ts +74 -0
  47. package/src/infra/judging/agent.ts +61 -0
  48. package/src/infra/judging/contract.ts +207 -0
  49. package/src/infra/judging/evidence-tool.ts +79 -0
  50. package/src/infra/judging/index.ts +115 -0
  51. package/src/infra/judging/judge-agent.md +80 -0
  52. package/src/infra/judging/observer.ts +168 -0
  53. package/src/infra/judging/submission.ts +138 -0
  54. package/src/infra/judging/tools.ts +145 -0
  55. package/src/infra/opencode/archive.ts +81 -0
  56. package/src/infra/opencode/auth.ts +119 -0
  57. package/src/infra/opencode/checkpoint.ts +68 -0
  58. package/src/infra/opencode/host.ts +40 -0
  59. package/src/infra/opencode/read-recording.ts +42 -0
  60. package/src/infra/opencode/session.ts +321 -0
  61. package/src/infra/sqlite/index.ts +636 -0
  62. package/src/infra/sqlite/schema.ts +57 -0
  63. package/src/judgment.ts +40 -0
  64. package/src/runtime.ts +60 -0
  65. package/src/session-replay.ts +245 -0
  66. package/src/types.ts +302 -0
  67. package/src/view.ts +269 -0
  68. package/viewer/THIRD_PARTY_LICENSES.md +3039 -0
  69. package/viewer/assets/Inter-c8O0ljhh.ttf +0 -0
  70. package/viewer/assets/JetBrainsMonoNerdFontMono-Regular-BmWcHh8R.woff2 +0 -0
  71. package/viewer/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  72. package/viewer/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  73. package/viewer/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  74. package/viewer/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  75. package/viewer/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  76. package/viewer/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  77. package/viewer/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  78. package/viewer/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  79. package/viewer/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  80. package/viewer/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  81. package/viewer/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  82. package/viewer/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  83. package/viewer/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  84. package/viewer/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  85. package/viewer/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  86. package/viewer/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  87. package/viewer/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  88. package/viewer/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  89. package/viewer/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  90. package/viewer/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  91. package/viewer/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  92. package/viewer/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  93. package/viewer/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  94. package/viewer/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  95. package/viewer/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  96. package/viewer/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  97. package/viewer/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  98. package/viewer/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  99. package/viewer/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  100. package/viewer/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  101. package/viewer/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  102. package/viewer/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  103. package/viewer/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  104. package/viewer/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  105. package/viewer/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  106. package/viewer/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  107. package/viewer/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  108. package/viewer/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  109. package/viewer/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  110. package/viewer/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  111. package/viewer/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  112. package/viewer/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  113. package/viewer/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  114. package/viewer/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  115. package/viewer/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  116. package/viewer/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  117. package/viewer/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  118. package/viewer/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  119. package/viewer/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  120. package/viewer/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  121. package/viewer/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  122. package/viewer/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  123. package/viewer/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  124. package/viewer/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  125. package/viewer/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  126. package/viewer/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  127. package/viewer/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  128. package/viewer/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  129. package/viewer/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  130. package/viewer/assets/abap-CLvhMVsD.js +1 -0
  131. package/viewer/assets/abnfDiagram-VCTEODGH-B1kcYgQG.js +1 -0
  132. package/viewer/assets/actionscript-3-Cs6JJXT5.js +1 -0
  133. package/viewer/assets/ada-C5qYipkI.js +1 -0
  134. package/viewer/assets/ahk-CA9gdOdF.js +1 -0
  135. package/viewer/assets/ahk2-_6rzW9BS.js +1 -0
  136. package/viewer/assets/amoled-DB5yy8ad.js +1 -0
  137. package/viewer/assets/andromeeda-vGVdxbeo.js +1 -0
  138. package/viewer/assets/angular-html-DrYCUiZv.js +1 -0
  139. package/viewer/assets/angular-ts-BgjwQn-Z.js +1 -0
  140. package/viewer/assets/apache-U0d_L8uA.js +1 -0
  141. package/viewer/assets/apex-KFGFyKwG.js +1 -0
  142. package/viewer/assets/apl-DlHqe8o4.js +1 -0
  143. package/viewer/assets/applescript-CCn79oCD.js +1 -0
  144. package/viewer/assets/ara-4CJ0cIlV.js +1 -0
  145. package/viewer/assets/arc-C4nf7ZoY.js +1 -0
  146. package/viewer/assets/architecture-7GRP2DOG-Be250VKZ.js +1 -0
  147. package/viewer/assets/architectureDiagram-5GKGNRK7-BIWoe0fO.js +36 -0
  148. package/viewer/assets/array-BifhSqXX.js +1 -0
  149. package/viewer/assets/asciidoc-SCjQUq34.js +1 -0
  150. package/viewer/assets/asm-Cmm7eHzH.js +1 -0
  151. package/viewer/assets/astro-BrlHnIh9.js +1 -0
  152. package/viewer/assets/aura-BpwPh8WE.js +1 -0
  153. package/viewer/assets/aurora-x-CDeNXAV0.js +1 -0
  154. package/viewer/assets/awk-BWXHIvNe.js +1 -0
  155. package/viewer/assets/ayu-BkUPVVqh.js +1 -0
  156. package/viewer/assets/ayu-dark-DluEY0Gj.js +1 -0
  157. package/viewer/assets/ayu-light-C3h-C4tm.js +1 -0
  158. package/viewer/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  159. package/viewer/assets/ballerina-B7ZEbQpA.js +1 -0
  160. package/viewer/assets/bat-qdxAdBWQ.js +1 -0
  161. package/viewer/assets/beancount-D-usSTwE.js +1 -0
  162. package/viewer/assets/berry-DKpUyyne.js +1 -0
  163. package/viewer/assets/bibtex-Ci_nEsc7.js +1 -0
  164. package/viewer/assets/bicep-CUHmPFLl.js +1 -0
  165. package/viewer/assets/bird2-CYIUgYqB.js +1 -0
  166. package/viewer/assets/blade-DOcerOiW.js +1 -0
  167. package/viewer/assets/blockDiagram-I7D4REHJ-C3x13a9m.js +129 -0
  168. package/viewer/assets/bsl-_VjlB9mv.js +1 -0
  169. package/viewer/assets/c-BMbThxEo.js +1 -0
  170. package/viewer/assets/c3-D0apG41V.js +1 -0
  171. package/viewer/assets/c4Diagram-7LVT6UL2-BeWktchx.js +38 -0
  172. package/viewer/assets/cadence-CQ2zXKGN.js +1 -0
  173. package/viewer/assets/cairo-DLTphjLi.js +1 -0
  174. package/viewer/assets/carbonfox-Bo2FTw5U.js +1 -0
  175. package/viewer/assets/catppuccin-DK9M8P0P.js +1 -0
  176. package/viewer/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  177. package/viewer/assets/catppuccin-frappe-DIKI31zD.js +1 -0
  178. package/viewer/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  179. package/viewer/assets/catppuccin-macchiato-DYnJ67qk.js +1 -0
  180. package/viewer/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  181. package/viewer/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  182. package/viewer/assets/channel-DtULXRee.js +1 -0
  183. package/viewer/assets/chapel-k2cjkSmc.js +1 -0
  184. package/viewer/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  185. package/viewer/assets/chunk-4HAMMTFA-o6YtJsqE.js +62 -0
  186. package/viewer/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  187. package/viewer/assets/chunk-75Z2AOVW-KohQa9Nw.js +2 -0
  188. package/viewer/assets/chunk-DU6HZSFF-C88wxc6m.js +127 -0
  189. package/viewer/assets/chunk-F27PBJKO-mO4AP2as.js +1 -0
  190. package/viewer/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  191. package/viewer/assets/chunk-GMAD6QVW-DzQX2Cld.js +72 -0
  192. package/viewer/assets/chunk-GVQU2GXP-CS78RfJD.js +1 -0
  193. package/viewer/assets/chunk-IMKFNOWR-DxS42GUo.js +231 -0
  194. package/viewer/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  195. package/viewer/assets/chunk-L3NEJ4N5-DGo-uYLy.js +1 -0
  196. package/viewer/assets/chunk-OSK3NFVY-BOcXQG16.js +10 -0
  197. package/viewer/assets/chunk-P2QGCYS3-B7GnZdIQ.js +1 -0
  198. package/viewer/assets/chunk-POPQ4Y6H-DgBcYHog.js +1 -0
  199. package/viewer/assets/chunk-PWAF6VOD-DpEq6qHA.js +1 -0
  200. package/viewer/assets/chunk-SHT3W25Y-CrOGxKM2.js +168 -0
  201. package/viewer/assets/chunk-SVP7TREG-4HY7Fljj.js +88 -0
  202. package/viewer/assets/chunk-TICWLB2K-B1Rl31EC.js +206 -0
  203. package/viewer/assets/chunk-XXDRQBXY-CK8giEW-.js +1 -0
  204. package/viewer/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  205. package/viewer/assets/clarity-CtfBBspg.js +1 -0
  206. package/viewer/assets/classDiagram-ZZMXUADV-Bmqu01Xf.js +1 -0
  207. package/viewer/assets/classDiagram-v2-VYDZK3BY-Bmqu01Xf.js +1 -0
  208. package/viewer/assets/clojure-DqKBuwfJ.js +1 -0
  209. package/viewer/assets/cmake-Bj61d0ZC.js +1 -0
  210. package/viewer/assets/cobalt2-DQbhSfAX.js +1 -0
  211. package/viewer/assets/cobol-CupUwvw9.js +1 -0
  212. package/viewer/assets/codeowners-C8r90Shi.js +1 -0
  213. package/viewer/assets/codeql-oeQT6MSM.js +1 -0
  214. package/viewer/assets/coffee-C17pkozF.js +1 -0
  215. package/viewer/assets/common-lisp-Cv5bFMCO.js +1 -0
  216. package/viewer/assets/coq-DuBRPxYg.js +1 -0
  217. package/viewer/assets/cose-bilkent-JH36ORCC-V1OmrmCv.js +1 -0
  218. package/viewer/assets/cpp-BJwVQVXg.js +1 -0
  219. package/viewer/assets/crystal-BF-oCN-L.js +1 -0
  220. package/viewer/assets/csharp-oqKa8noW.js +1 -0
  221. package/viewer/assets/css-BMgkVI3c.js +1 -0
  222. package/viewer/assets/csv-Dx-8-gkx.js +1 -0
  223. package/viewer/assets/cue-CE9AQfxI.js +1 -0
  224. package/viewer/assets/cursor-t2F-UZH_.js +1 -0
  225. package/viewer/assets/cynefin-OW5HDTMX-BEjY_gsc.js +1 -0
  226. package/viewer/assets/cynefinDiagram-5FMLGOSQ-bfSYgr6z.js +62 -0
  227. package/viewer/assets/cypher-ClKdZ_lG.js +1 -0
  228. package/viewer/assets/cytoscape.esm-B-1iW2ft.js +321 -0
  229. package/viewer/assets/d-qD-0Kul2.js +1 -0
  230. package/viewer/assets/dagre-C-rnJpZF.js +1 -0
  231. package/viewer/assets/dagre-GXQ25YYZ-VtwTgGfa.js +4 -0
  232. package/viewer/assets/dark-plus-Cs2F2srj.js +1 -0
  233. package/viewer/assets/dart-CnvKMtbv.js +1 -0
  234. package/viewer/assets/dax-BkyTk9wS.js +1 -0
  235. package/viewer/assets/defaultLocale-BFoDCU3G.js +1 -0
  236. package/viewer/assets/desktop-Dlh5hvp9.js +1 -0
  237. package/viewer/assets/diagram-S7CK7UJ4-CHaAAyW7.js +30 -0
  238. package/viewer/assets/diagram-UQ7AKVKN-CjL65-As.js +41 -0
  239. package/viewer/assets/diagram-VSXAHHWV-Cnxrk1TJ.js +3 -0
  240. package/viewer/assets/diagram-VX7I27RA-D78jPXr7.js +24 -0
  241. package/viewer/assets/diagram-Z3DM3KII-DKjnOaF2.js +24 -0
  242. package/viewer/assets/diff-woXpYk--.js +1 -0
  243. package/viewer/assets/dist-BTYPW0dz.js +1 -0
  244. package/viewer/assets/docker-IyjqRm3v.js +1 -0
  245. package/viewer/assets/dotenv-_5a1GRtc.js +1 -0
  246. package/viewer/assets/dracula-BHWKrbxM.js +1 -0
  247. package/viewer/assets/dracula-C3s659y-.js +1 -0
  248. package/viewer/assets/dracula-soft-5eyTD99u.js +1 -0
  249. package/viewer/assets/dream-maker-DW3nJb8Q.js +1 -0
  250. package/viewer/assets/ebnfDiagram-PWID7BFC-7XiXh5Lx.js +1 -0
  251. package/viewer/assets/edge-B34N_HjN.js +1 -0
  252. package/viewer/assets/elixir-CQzWMyKD.js +1 -0
  253. package/viewer/assets/elm-BNJiG-wg.js +1 -0
  254. package/viewer/assets/emacs-lisp-c_oH4hRZ.js +1 -0
  255. package/viewer/assets/erDiagram-RLTQ6QDP-YPFEgZxU.js +99 -0
  256. package/viewer/assets/erb-D5Rm3UNa.js +1 -0
  257. package/viewer/assets/erlang-Cphh6RMH.js +1 -0
  258. package/viewer/assets/eventmodeling-NTZA5JFV-CJCg5f6p.js +1 -0
  259. package/viewer/assets/everforest-BEfZxV1e.js +1 -0
  260. package/viewer/assets/everforest-dark-sB-x3p7T.js +1 -0
  261. package/viewer/assets/everforest-light-Df2xbC6M.js +1 -0
  262. package/viewer/assets/fennel-DQxkIbk2.js +1 -0
  263. package/viewer/assets/fish-BJitypiv.js +1 -0
  264. package/viewer/assets/flexoki-Dj5gUbwm.js +1 -0
  265. package/viewer/assets/flowDiagram-HODETNUW-BFzq4Zvs.js +1 -0
  266. package/viewer/assets/fluent-C03EYrpw.js +1 -0
  267. package/viewer/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  268. package/viewer/assets/fortran-free-form-CYNrtFtB.js +1 -0
  269. package/viewer/assets/fsharp-D13ZGOAj.js +1 -0
  270. package/viewer/assets/ganttDiagram-EL5Y4UJY-ergSGtTP.js +292 -0
  271. package/viewer/assets/gdresource-xMC7jr7x.js +1 -0
  272. package/viewer/assets/gdscript-DYvRD3hg.js +1 -0
  273. package/viewer/assets/gdshader-CBce3t8t.js +1 -0
  274. package/viewer/assets/genie-CV2tkWYe.js +1 -0
  275. package/viewer/assets/gherkin-DExj1W_8.js +1 -0
  276. package/viewer/assets/git-commit-BSykSTBG.js +1 -0
  277. package/viewer/assets/git-rebase-BpIMZIRG.js +1 -0
  278. package/viewer/assets/gitGraph-4MIJSDKK-CZt4REVj.js +1 -0
  279. package/viewer/assets/gitGraphDiagram-WWUBYQGX-h9QMzC2r.js +106 -0
  280. package/viewer/assets/github-DukYz3BY.js +1 -0
  281. package/viewer/assets/github-dark-C-LZuMrd.js +1 -0
  282. package/viewer/assets/github-dark-default-DXG-b-1a.js +1 -0
  283. package/viewer/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  284. package/viewer/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  285. package/viewer/assets/github-light-EUqPIrTm.js +1 -0
  286. package/viewer/assets/github-light-default-BXViO-2h.js +1 -0
  287. package/viewer/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  288. package/viewer/assets/gleam-CSRkHgEL.js +1 -0
  289. package/viewer/assets/glimmer-js-SeSwns5_.js +1 -0
  290. package/viewer/assets/glimmer-ts-BExI5tTz.js +1 -0
  291. package/viewer/assets/glsl-CXikKw2b.js +1 -0
  292. package/viewer/assets/gn-ilITqXS6.js +1 -0
  293. package/viewer/assets/gnuplot-7GGW24-e.js +1 -0
  294. package/viewer/assets/go-rLFTqkRN.js +1 -0
  295. package/viewer/assets/graphlib-DS17s2tU.js +1 -0
  296. package/viewer/assets/graphql-6GpQIInt.js +1 -0
  297. package/viewer/assets/groovy-CacY0gHj.js +1 -0
  298. package/viewer/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  299. package/viewer/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  300. package/viewer/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  301. package/viewer/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  302. package/viewer/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  303. package/viewer/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  304. package/viewer/assets/gruvbox-mhPG2W60.js +1 -0
  305. package/viewer/assets/hack-i7rizvpB.js +1 -0
  306. package/viewer/assets/haml-C68gmkTf.js +1 -0
  307. package/viewer/assets/handlebars-BBn_c0Xt.js +1 -0
  308. package/viewer/assets/haskell-D8IpX4py.js +1 -0
  309. package/viewer/assets/haxe-C8oCnwJJ.js +1 -0
  310. package/viewer/assets/hcl-Dh228itO.js +1 -0
  311. package/viewer/assets/hjson-CxZEssPk.js +1 -0
  312. package/viewer/assets/hlsl-Cvrh5tZx.js +1 -0
  313. package/viewer/assets/horizon-CE9ld1lL.js +1 -0
  314. package/viewer/assets/horizon-bright-DSNQnXHK.js +1 -0
  315. package/viewer/assets/houston-CsvMBhTu.js +1 -0
  316. package/viewer/assets/html-BObmAZQA.js +1 -0
  317. package/viewer/assets/html-derivative-BjMuR1LM.js +1 -0
  318. package/viewer/assets/http-BJBk8gt0.js +1 -0
  319. package/viewer/assets/hurl-D7obCYfg.js +1 -0
  320. package/viewer/assets/hxml-Dcm88srW.js +1 -0
  321. package/viewer/assets/hy-CZbG8q4J.js +1 -0
  322. package/viewer/assets/imba-DsUTQ-LC.js +1 -0
  323. package/viewer/assets/index-FMtYXcX7.js +793 -0
  324. package/viewer/assets/index-Wz0qQyIk.css +2 -0
  325. package/viewer/assets/info-A6RAGUB7-CrzitQIU.js +1 -0
  326. package/viewer/assets/infoDiagram-27XIBGKW-D2CgRDxu.js +2 -0
  327. package/viewer/assets/ini-B5eOa1yu.js +1 -0
  328. package/viewer/assets/init-C-OQMol4.js +1 -0
  329. package/viewer/assets/ishikawaDiagram-5VMMS53U-BhnQMHOo.js +70 -0
  330. package/viewer/assets/java-5VJU_EW8.js +1 -0
  331. package/viewer/assets/javascript-r8UgndxQ.js +1 -0
  332. package/viewer/assets/jinja-BY2ibHG5.js +1 -0
  333. package/viewer/assets/jison-C_7YxymZ.js +1 -0
  334. package/viewer/assets/journeyDiagram-3NMN7TZE-DSBzKQEa.js +139 -0
  335. package/viewer/assets/json-8e1WlJYD.js +1 -0
  336. package/viewer/assets/json5-BR5RXkoi.js +1 -0
  337. package/viewer/assets/jsonc-CYpm1nAK.js +1 -0
  338. package/viewer/assets/jsonl-CmCQp5Yx.js +1 -0
  339. package/viewer/assets/jsonnet-CJTPZ8u_.js +1 -0
  340. package/viewer/assets/jssm-DXw9l8Rf.js +1 -0
  341. package/viewer/assets/jsx-BYp5GD4Y.js +1 -0
  342. package/viewer/assets/julia-Bkob1uVX.js +1 -0
  343. package/viewer/assets/just-CUnSjty-.js +1 -0
  344. package/viewer/assets/kanagawa-D0YhNhTs.js +1 -0
  345. package/viewer/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  346. package/viewer/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  347. package/viewer/assets/kanagawa-wave-BML5mF2J.js +1 -0
  348. package/viewer/assets/kanban-definition-UXKFOSKX-CotbrQue.js +89 -0
  349. package/viewer/assets/katex-ZlcWpGUi.js +257 -0
  350. package/viewer/assets/kdl-CsD5j6eV.js +1 -0
  351. package/viewer/assets/kotlin-DhhofPvG.js +1 -0
  352. package/viewer/assets/kusto-C7mF5XQf.js +1 -0
  353. package/viewer/assets/laserwave-C_8bwKvT.js +1 -0
  354. package/viewer/assets/latex-UdE3ivqk.js +1 -0
  355. package/viewer/assets/lean-CewbzKMR.js +1 -0
  356. package/viewer/assets/less-DVTAwKKz.js +1 -0
  357. package/viewer/assets/light-plus-DVQuIRkW.js +1 -0
  358. package/viewer/assets/line-DDh6a6hz.js +1 -0
  359. package/viewer/assets/linear-BxMsCbKb.js +1 -0
  360. package/viewer/assets/liquid-WL4MvEIT.js +1 -0
  361. package/viewer/assets/llvm-DqHOMS-s.js +1 -0
  362. package/viewer/assets/log-BNLmms1o.js +1 -0
  363. package/viewer/assets/logo-Cluzi2Zq.js +1 -0
  364. package/viewer/assets/lua-CtOubZta.js +1 -0
  365. package/viewer/assets/luau-C2pBCSgt.js +1 -0
  366. package/viewer/assets/lucent-orng-DLA2Fg5T.js +1 -0
  367. package/viewer/assets/make-Dixweg8N.js +1 -0
  368. package/viewer/assets/markdown-BYOwaDjH.js +1 -0
  369. package/viewer/assets/markdown.worker-DqWDoHOY.js +358 -0
  370. package/viewer/assets/marko-C0GSQJi3.js +1 -0
  371. package/viewer/assets/material-BoIUTXek.js +1 -0
  372. package/viewer/assets/material-theme-Bm3Qr25_.js +1 -0
  373. package/viewer/assets/material-theme-darker-2IIEA8gg.js +1 -0
  374. package/viewer/assets/material-theme-lighter-uhdI0v04.js +1 -0
  375. package/viewer/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  376. package/viewer/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  377. package/viewer/assets/matlab-D7qyCx1q.js +1 -0
  378. package/viewer/assets/matrix-CeUtxxjs.js +1 -0
  379. package/viewer/assets/mdc-DUivddFc.js +1 -0
  380. package/viewer/assets/mdx-DQZ5AkYe.js +1 -0
  381. package/viewer/assets/mercury-DIlqACMb.js +1 -0
  382. package/viewer/assets/mermaid-BxpfTIzt.js +1 -0
  383. package/viewer/assets/mermaid-parser.core-FhKE_uv2.js +7 -0
  384. package/viewer/assets/mermaid.core-BSOWwyvd.js +44 -0
  385. package/viewer/assets/min-dark-BSWPekZh.js +1 -0
  386. package/viewer/assets/min-light-DDpmG2fV.js +1 -0
  387. package/viewer/assets/mindmap-definition-YA3MSWOX-tsLZ_Opn.js +96 -0
  388. package/viewer/assets/mipsasm-BMqwQI7S.js +1 -0
  389. package/viewer/assets/mojo-fg40_ntQ.js +1 -0
  390. package/viewer/assets/monokai-B_bV9PQ9.js +1 -0
  391. package/viewer/assets/monokai-wFuGqe6w.js +1 -0
  392. package/viewer/assets/moonbit-DgjMoLWr.js +1 -0
  393. package/viewer/assets/move-BYnGhZoM.js +1 -0
  394. package/viewer/assets/narrat-_X_XdTYD.js +1 -0
  395. package/viewer/assets/nextflow-BJtWHP5T.js +1 -0
  396. package/viewer/assets/nextflow-groovy-DJMQeKeT.js +1 -0
  397. package/viewer/assets/nginx-B__INAtC.js +1 -0
  398. package/viewer/assets/night-owl-DhmEMT88.js +1 -0
  399. package/viewer/assets/night-owl-light-eJ-hLW7d.js +1 -0
  400. package/viewer/assets/nightowl-D5RifUq0.js +1 -0
  401. package/viewer/assets/nim-UEY12GJF.js +1 -0
  402. package/viewer/assets/nix-IvuFDN5E.js +1 -0
  403. package/viewer/assets/nord-BUnqvSkw.js +1 -0
  404. package/viewer/assets/nord-Cb4Vim4T.js +1 -0
  405. package/viewer/assets/nsis-CjNLYCLg.js +1 -0
  406. package/viewer/assets/nushell-DHYfO66s.js +1 -0
  407. package/viewer/assets/objective-c-D1A_Heim.js +1 -0
  408. package/viewer/assets/objective-cpp-BsSzOQcm.js +1 -0
  409. package/viewer/assets/ocaml-O90oeIOV.js +1 -0
  410. package/viewer/assets/odin-B1RWQWA5.js +1 -0
  411. package/viewer/assets/one-dark-MycZLZtN.js +1 -0
  412. package/viewer/assets/one-dark-pro-CLwyXe_n.js +1 -0
  413. package/viewer/assets/one-light-D7Lr4KcI.js +1 -0
  414. package/viewer/assets/onedarkpro-BWy38d_X.js +1 -0
  415. package/viewer/assets/opencode-Cy-bxafp.js +1 -0
  416. package/viewer/assets/openscad-BUDT5pXO.js +1 -0
  417. package/viewer/assets/ordinal-BDEzSJ7C.js +1 -0
  418. package/viewer/assets/org-DDIZsz95.js +1 -0
  419. package/viewer/assets/orng-D2APmIHg.js +1 -0
  420. package/viewer/assets/osaka-jade-DnfGjKZL.js +1 -0
  421. package/viewer/assets/packet-AYTQ26CC-CqdJnqfo.js +1 -0
  422. package/viewer/assets/palenight-DG9raf7e.js +1 -0
  423. package/viewer/assets/pascal-4ZHwLPI5.js +1 -0
  424. package/viewer/assets/path-fybaL0A-.js +1 -0
  425. package/viewer/assets/pegDiagram-XKGWAZYB-BJs7qu7m.js +1 -0
  426. package/viewer/assets/perl-D5KwNZt7.js +1 -0
  427. package/viewer/assets/php-BEs7d_Dk.js +1 -0
  428. package/viewer/assets/pie-WAS4IAKB-lgzqBWqy.js +1 -0
  429. package/viewer/assets/pieDiagram-E7YTZNPT-Cxe9LnnE.js +39 -0
  430. package/viewer/assets/pierre-dark-sU4Zdns8.js +1 -0
  431. package/viewer/assets/pierre-dark-soft-HXgun5vs.js +1 -0
  432. package/viewer/assets/pierre-dark-vibrant-D4RhcSIK.js +1 -0
  433. package/viewer/assets/pierre-light-DWBk51d8.js +1 -0
  434. package/viewer/assets/pierre-light-soft-CodEzPxf.js +1 -0
  435. package/viewer/assets/pierre-light-vibrant-B76X7i5Y.js +1 -0
  436. package/viewer/assets/pkl-ot-7Btpt.js +1 -0
  437. package/viewer/assets/plastic-DQwYfKfQ.js +1 -0
  438. package/viewer/assets/plsql-DGHpHOYJ.js +1 -0
  439. package/viewer/assets/po-BiJDBrnU.js +1 -0
  440. package/viewer/assets/poimandres-DRFjx7u4.js +1 -0
  441. package/viewer/assets/polar-C7UOKdEL.js +1 -0
  442. package/viewer/assets/postcss-BXeXVLqQ.js +1 -0
  443. package/viewer/assets/powerquery-DNMTfnFr.js +1 -0
  444. package/viewer/assets/powershell-CCSX75yM.js +1 -0
  445. package/viewer/assets/prisma-DMgNhnYS.js +1 -0
  446. package/viewer/assets/prolog-iXnhIJG7.js +1 -0
  447. package/viewer/assets/proto-DB4EqR-F.js +1 -0
  448. package/viewer/assets/pug-B0dsfQOV.js +1 -0
  449. package/viewer/assets/puppet-CDv2pdJW.js +1 -0
  450. package/viewer/assets/purescript-9MfHhQsQ.js +1 -0
  451. package/viewer/assets/python-gzcpVVnB.js +1 -0
  452. package/viewer/assets/qml-XPIhrIzf.js +1 -0
  453. package/viewer/assets/qmldir-DCQb3MpD.js +1 -0
  454. package/viewer/assets/qss-Fe1Jh2GI.js +1 -0
  455. package/viewer/assets/quadrantDiagram-AXDQQJYC-D5JGwC11.js +7 -0
  456. package/viewer/assets/r-C6hQdpIM.js +1 -0
  457. package/viewer/assets/racket-DcIDlBhZ.js +1 -0
  458. package/viewer/assets/radar-RG4KPBEZ-B7JRLhUA.js +1 -0
  459. package/viewer/assets/railroad-74A4TZTK-Df7ZQBLn.js +1 -0
  460. package/viewer/assets/railroad-abnf-HS5TGJTU-Z8q3QVTf.js +1 -0
  461. package/viewer/assets/railroad-ebnf-LZEXJU2U-BWoRkG3W.js +1 -0
  462. package/viewer/assets/railroad-peg-WCYAUIDC-BzoV1cN7.js +1 -0
  463. package/viewer/assets/railroadDiagram-O6MQD6OU-DZJzpmP8.js +1 -0
  464. package/viewer/assets/raku-B3gFvitq.js +1 -0
  465. package/viewer/assets/razor-C3KSUuOw.js +1 -0
  466. package/viewer/assets/rbs-C0MpOrj4.js +1 -0
  467. package/viewer/assets/red-DX1BQOs8.js +1 -0
  468. package/viewer/assets/reg-CRGYupPL.js +1 -0
  469. package/viewer/assets/regexp-n-T936Rk.js +1 -0
  470. package/viewer/assets/rel-BtDbiS_P.js +1 -0
  471. package/viewer/assets/requirementDiagram-BXWQKSXE-Be9lEFrk.js +84 -0
  472. package/viewer/assets/riscv-Ckw8ddFX.js +1 -0
  473. package/viewer/assets/ron-VUp2lXgN.js +1 -0
  474. package/viewer/assets/rose-pine-aMsaMD1D.js +1 -0
  475. package/viewer/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  476. package/viewer/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  477. package/viewer/assets/rosepine-CVx-z9QY.js +1 -0
  478. package/viewer/assets/rosmsg-CAekHB0j.js +1 -0
  479. package/viewer/assets/rough.esm-Dy-Kn_BL.js +1 -0
  480. package/viewer/assets/rst-fVnHDyXD.js +1 -0
  481. package/viewer/assets/ruby-DuRgxlXF.js +1 -0
  482. package/viewer/assets/rust-Cfkwpbl8.js +1 -0
  483. package/viewer/assets/sankeyDiagram-P5KCCOFB-BsgKAEBN.js +40 -0
  484. package/viewer/assets/sas-C0WA2OFa.js +1 -0
  485. package/viewer/assets/sass-DXrisJhu.js +1 -0
  486. package/viewer/assets/scala-BiFt_7mu.js +1 -0
  487. package/viewer/assets/scheme-DQCgrYNe.js +1 -0
  488. package/viewer/assets/scss-CQDZ4smR.js +1 -0
  489. package/viewer/assets/sdbl-bTVj8UrX.js +1 -0
  490. package/viewer/assets/sequenceDiagram-WJ2MYXX4-BkUDWL0D.js +162 -0
  491. package/viewer/assets/shaderlab-TOUzSsQk.js +1 -0
  492. package/viewer/assets/shadesofpurple-dFPspHnY.js +1 -0
  493. package/viewer/assets/shellscript-CE84G0GP.js +1 -0
  494. package/viewer/assets/shellsession-BdJvdaqL.js +1 -0
  495. package/viewer/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  496. package/viewer/assets/slack-dark-DnToyrRv.js +1 -0
  497. package/viewer/assets/slack-ochin-B2OO5cIa.js +1 -0
  498. package/viewer/assets/smalltalk-BHpQb5nM.js +1 -0
  499. package/viewer/assets/smithy-Dgaz7aur.js +1 -0
  500. package/viewer/assets/snazzy-light-4G7pJPwS.js +1 -0
  501. package/viewer/assets/solarized-19OwMz-R.js +1 -0
  502. package/viewer/assets/solarized-dark-UdsmMDCL.js +1 -0
  503. package/viewer/assets/solarized-light-C1IUL_tW.js +1 -0
  504. package/viewer/assets/solidity-Bj7E1mRn.js +1 -0
  505. package/viewer/assets/soy-BSxOREC0.js +1 -0
  506. package/viewer/assets/sparql-D_iOobhT.js +1 -0
  507. package/viewer/assets/splunk-BC2Px7Mm.js +1 -0
  508. package/viewer/assets/sprite-B9ixRF_T.svg +1110 -0
  509. package/viewer/assets/sprite-Fb-TFjRY.svg +11707 -0
  510. package/viewer/assets/sql-D4MN9uRI.js +1 -0
  511. package/viewer/assets/src-BT_kESTA.js +1 -0
  512. package/viewer/assets/ssh-config-BgfXC-Er.js +1 -0
  513. package/viewer/assets/stata-B6nXAaGV.js +1 -0
  514. package/viewer/assets/stateDiagram-D77RDMKH-C80wp8xG.js +1 -0
  515. package/viewer/assets/stateDiagram-v2-MP3YSRHH-CYdsKKlz.js +1 -0
  516. package/viewer/assets/stylus-B6D30XZt.js +1 -0
  517. package/viewer/assets/surrealql-fVjZmhV3.js +1 -0
  518. package/viewer/assets/svelte-DnBQ5p7d.js +1 -0
  519. package/viewer/assets/swift-CyEgAFGc.js +1 -0
  520. package/viewer/assets/swimlanes-42K2YHIH-Cff6yT8e.js +1 -0
  521. package/viewer/assets/swimlanesDiagram-VR7AAH4N-niTUGjMT.js +8 -0
  522. package/viewer/assets/synthwave-84-nFMaYfgc.js +1 -0
  523. package/viewer/assets/synthwave84-D5i2TsvP.js +1 -0
  524. package/viewer/assets/system-verilog-Dh5ihWbf.js +1 -0
  525. package/viewer/assets/systemd-BxMlprV5.js +1 -0
  526. package/viewer/assets/talonscript-CohzipZa.js +1 -0
  527. package/viewer/assets/tasl-DMoTqEGO.js +1 -0
  528. package/viewer/assets/tcl-CZd0xW_V.js +1 -0
  529. package/viewer/assets/templ-TCx51Uts.js +1 -0
  530. package/viewer/assets/terraform-DswuEJGm.js +1 -0
  531. package/viewer/assets/tex-CF6SMAQ_.js +1 -0
  532. package/viewer/assets/timeline-definition-24CTP7MA-Cje7BvaN.js +120 -0
  533. package/viewer/assets/tokyo-night-oM2G3aXe.js +1 -0
  534. package/viewer/assets/tokyonight-DLjt3AtF.js +1 -0
  535. package/viewer/assets/toml-CcmNWLt0.js +1 -0
  536. package/viewer/assets/treeView-Q6P3EWNA-D-QLY3IO.js +1 -0
  537. package/viewer/assets/treemap-WGGIJYW6-BCHcTa4N.js +1 -0
  538. package/viewer/assets/ts-tags-BqLRnADX.js +1 -0
  539. package/viewer/assets/tsv-sltzmVWM.js +1 -0
  540. package/viewer/assets/tsx-D7KpDX0b.js +1 -0
  541. package/viewer/assets/turtle-ByJddavk.js +1 -0
  542. package/viewer/assets/twig-CEZLObpN.js +1 -0
  543. package/viewer/assets/typescript-DAbIDLbf.js +1 -0
  544. package/viewer/assets/typespec-BRdr0IET.js +1 -0
  545. package/viewer/assets/typst-CqN7-whv.js +1 -0
  546. package/viewer/assets/v-DBj4K9d_.js +1 -0
  547. package/viewer/assets/vala-zf12oZj6.js +1 -0
  548. package/viewer/assets/vb-DOwzaHZ0.js +1 -0
  549. package/viewer/assets/vennDiagram-4TSXK5OY-Bz20rx02.js +34 -0
  550. package/viewer/assets/vercel-DiG3Swzk.js +1 -0
  551. package/viewer/assets/verilog-B2gwz-sJ.js +1 -0
  552. package/viewer/assets/vesper-BArq_vZH.js +1 -0
  553. package/viewer/assets/vesper-DdrHHSXu.js +1 -0
  554. package/viewer/assets/vhdl-BroJfC0k.js +1 -0
  555. package/viewer/assets/viml-DvXPmvsu.js +1 -0
  556. package/viewer/assets/vitesse-black-fwtXNY1n.js +1 -0
  557. package/viewer/assets/vitesse-dark-BZCL-v6S.js +1 -0
  558. package/viewer/assets/vitesse-light-VbXTXTou.js +1 -0
  559. package/viewer/assets/vue-html-DQmvvKbd.js +1 -0
  560. package/viewer/assets/vue-kTxN6wdc.js +1 -0
  561. package/viewer/assets/vue-vine-Did3qTVW.js +1 -0
  562. package/viewer/assets/vyper-CgoNMtux.js +1 -0
  563. package/viewer/assets/wardley-WFR3VGLG-CpXaqOit.js +1 -0
  564. package/viewer/assets/wardleyDiagram-VM6X3IG4-Cz06jHpA.js +78 -0
  565. package/viewer/assets/wasm-BnjxR4X6.js +1 -0
  566. package/viewer/assets/wasm-ByWQv1Qj.js +1 -0
  567. package/viewer/assets/wenyan-C8pVoKbM.js +1 -0
  568. package/viewer/assets/wgsl-BsKzXJz4.js +1 -0
  569. package/viewer/assets/wikitext-ClFFjSW2.js +1 -0
  570. package/viewer/assets/wit-DdvCle-K.js +1 -0
  571. package/viewer/assets/wolfram-DLL8P-h_.js +1 -0
  572. package/viewer/assets/worker-DDDBDFQT.js +160 -0
  573. package/viewer/assets/xml-te2hFcAA.js +1 -0
  574. package/viewer/assets/xsl-X4fuKSVl.js +1 -0
  575. package/viewer/assets/xychartDiagram-S5SC5T6Z-BXCw0sfu.js +7 -0
  576. package/viewer/assets/yaml-NHtDSZab.js +1 -0
  577. package/viewer/assets/zenburn-COSjCZYx.js +1 -0
  578. package/viewer/assets/zenscript-BnlCZFoB.js +1 -0
  579. package/viewer/assets/zig-CMLA9XwU.js +1 -0
  580. package/viewer/index.html +14 -0
@@ -0,0 +1,636 @@
1
+ import { Database } from "bun:sqlite";
2
+ import { drizzle } from "drizzle-orm/bun-sqlite";
3
+ import { and, eq, gt, asc } from "drizzle-orm";
4
+ import { mkdirSync, existsSync } from "node:fs";
5
+ import { dirname, resolve } from "node:path";
6
+ import { randomUUID } from "node:crypto";
7
+ import * as tables from "./schema";
8
+ import { isScored, JUDGE_PROTOCOL, metricMean } from "../../judgment";
9
+ import type {
10
+ BenchmarkRun,
11
+ EvalRun,
12
+ EvalRunInput,
13
+ JudgeRun,
14
+ JudgeRunInput,
15
+ Slot,
16
+ RunEvent,
17
+ EvidenceCheckpoint,
18
+ JudgeCheck,
19
+ } from "../../types";
20
+
21
+ const APPLICATION_ID = 0x4f455632;
22
+ const SCHEMA_VERSION = 4;
23
+ const timestamp = () => new Date().toISOString();
24
+
25
+ /** One owner for run selection and append-only finalized execution records. */
26
+ export class Results {
27
+ readonly path: string;
28
+ private sqlite: Database;
29
+ private db;
30
+ private closed = false;
31
+
32
+ constructor(path: string, readonly = false) {
33
+ this.path = path === ":memory:" ? path : resolve(path);
34
+ const existed = this.path !== ":memory:" && existsSync(this.path);
35
+ if (!readonly && this.path !== ":memory:")
36
+ mkdirSync(dirname(this.path), { recursive: true });
37
+ this.sqlite = new Database(
38
+ this.path,
39
+ readonly ? { readonly: true } : { create: true },
40
+ );
41
+ try {
42
+ this.sqlite.exec("PRAGMA busy_timeout=5000; PRAGMA foreign_keys=ON;");
43
+ if (!existed && !readonly)
44
+ this.sqlite.exec(`
45
+ PRAGMA journal_mode=WAL; PRAGMA application_id=${APPLICATION_ID}; PRAGMA user_version=${SCHEMA_VERSION};
46
+ CREATE TABLE benchmark_runs (id TEXT PRIMARY KEY, value TEXT NOT NULL);
47
+ CREATE TABLE revisions (id INTEGER PRIMARY KEY AUTOINCREMENT, value TEXT NOT NULL);
48
+ CREATE TABLE slots (id TEXT PRIMARY KEY, value TEXT NOT NULL);
49
+ CREATE TABLE eval_runs (id TEXT PRIMARY KEY, state TEXT NOT NULL, value TEXT NOT NULL);
50
+ CREATE TABLE judge_runs (id TEXT PRIMARY KEY, state TEXT NOT NULL, value TEXT NOT NULL);
51
+ CREATE TABLE events (execution_id TEXT NOT NULL, sequence INTEGER NOT NULL, value TEXT NOT NULL, PRIMARY KEY (execution_id,sequence));
52
+ CREATE TABLE evidence_checkpoints (id TEXT PRIMARY KEY, eval_run_id TEXT NOT NULL REFERENCES eval_runs(id), value TEXT NOT NULL);
53
+ CREATE TABLE judge_checks (id TEXT PRIMARY KEY, judge_run_id TEXT NOT NULL REFERENCES judge_runs(id), state TEXT NOT NULL, value TEXT NOT NULL);
54
+ CREATE INDEX judge_checks_run ON judge_checks(judge_run_id);
55
+ CREATE TRIGGER checkpoints_immutable_update BEFORE UPDATE ON evidence_checkpoints BEGIN SELECT RAISE(ABORT,'Evidence checkpoints are immutable'); END;
56
+ CREATE TRIGGER checkpoints_immutable_delete BEFORE DELETE ON evidence_checkpoints BEGIN SELECT RAISE(ABORT,'Evidence checkpoints are immutable'); END;
57
+ CREATE TRIGGER checks_immutable_update BEFORE UPDATE ON judge_checks WHEN old.state != 'running' BEGIN SELECT RAISE(ABORT,'Finalized judge checks are immutable'); END;
58
+ CREATE TRIGGER checks_immutable_delete BEFORE DELETE ON judge_checks BEGIN SELECT RAISE(ABORT,'Judge check history is immutable'); END;
59
+ CREATE TRIGGER eval_runs_immutable_update BEFORE UPDATE ON eval_runs WHEN old.state != 'running' BEGIN SELECT RAISE(ABORT,'Finalized eval runs are immutable'); END;
60
+ CREATE TRIGGER eval_runs_immutable_delete BEFORE DELETE ON eval_runs BEGIN SELECT RAISE(ABORT,'Eval run history is immutable'); END;
61
+ CREATE TRIGGER judge_runs_immutable_update BEFORE UPDATE ON judge_runs WHEN old.state != 'running' BEGIN SELECT RAISE(ABORT,'Finalized judge runs are immutable'); END;
62
+ CREATE TRIGGER judge_runs_immutable_delete BEFORE DELETE ON judge_runs BEGIN SELECT RAISE(ABORT,'Judge run history is immutable'); END;
63
+ CREATE TRIGGER revisions_immutable_update BEFORE UPDATE ON revisions BEGIN SELECT RAISE(ABORT,'Definition history is immutable'); END;
64
+ CREATE TRIGGER revisions_immutable_delete BEFORE DELETE ON revisions BEGIN SELECT RAISE(ABORT,'Definition history is immutable'); END;
65
+ `);
66
+ const app = this.sqlite.query("PRAGMA application_id").get() as {
67
+ application_id: number;
68
+ };
69
+ const version = this.sqlite.query("PRAGMA user_version").get() as {
70
+ user_version: number;
71
+ };
72
+ if (
73
+ app.application_id !== APPLICATION_ID ||
74
+ version.user_version !== SCHEMA_VERSION
75
+ )
76
+ throw new Error(
77
+ `OpenEval requires results schema ${SCHEMA_VERSION}; start a new benchmark run`,
78
+ );
79
+ this.sqlite.exec(
80
+ readonly ? "PRAGMA query_only=ON" : "PRAGMA synchronous=NORMAL",
81
+ );
82
+ this.db = drizzle(this.sqlite);
83
+ } catch (error) {
84
+ this.sqlite.close(true);
85
+ throw error;
86
+ }
87
+ }
88
+ get benchmark() {
89
+ return this.db.select().from(tables.benchmarkRuns).get()?.value;
90
+ }
91
+ saveBenchmark(value: BenchmarkRun, revision = false) {
92
+ this.transaction(() => {
93
+ if (revision) this.db.insert(tables.revisions).values({ value }).run();
94
+ this.db
95
+ .insert(tables.benchmarkRuns)
96
+ .values({ id: value.id, value })
97
+ .onConflictDoUpdate({ target: tables.benchmarkRuns.id, set: { value } })
98
+ .run();
99
+ });
100
+ }
101
+ revisions() {
102
+ return this.db
103
+ .select()
104
+ .from(tables.revisions)
105
+ .all()
106
+ .map((row) => row.value);
107
+ }
108
+ async backup(path: string) {
109
+ if (existsSync(path)) throw new Error("Backup already exists");
110
+ mkdirSync(dirname(path), { recursive: true });
111
+ await Bun.write(path, this.sqlite.serialize());
112
+ }
113
+ slots() {
114
+ return this.db
115
+ .select()
116
+ .from(tables.slots)
117
+ .all()
118
+ .map((row) => row.value);
119
+ }
120
+ slot(id: string) {
121
+ return this.db
122
+ .select()
123
+ .from(tables.slots)
124
+ .where(eq(tables.slots.id, id))
125
+ .get()?.value;
126
+ }
127
+ select(slot: Slot) {
128
+ if (slot.evalRunId) {
129
+ const run = this.evalRun(slot.evalRunId);
130
+ if (
131
+ !run ||
132
+ run.slotId !== slot.id ||
133
+ run.input.candidateHash !== slot.candidateHash
134
+ )
135
+ throw new Error("Selected eval run does not match this slot's inputs");
136
+ }
137
+ if (slot.judgeRunId) {
138
+ const run = this.judgeRun(slot.judgeRunId);
139
+ if (
140
+ !run ||
141
+ run.state !== "completed" ||
142
+ run.input.evalRunId !== slot.evalRunId ||
143
+ run.input.judgeHash !== slot.judgeHash
144
+ )
145
+ throw new Error(
146
+ "Selected judgment does not match this slot's evidence and rubric",
147
+ );
148
+ }
149
+ this.db
150
+ .insert(tables.slots)
151
+ .values({ id: slot.id, value: slot })
152
+ .onConflictDoUpdate({ target: tables.slots.id, set: { value: slot } })
153
+ .run();
154
+ }
155
+ evalRuns() {
156
+ return this.db
157
+ .select()
158
+ .from(tables.evalRuns)
159
+ .all()
160
+ .map((row) => row.value);
161
+ }
162
+ judgeRuns() {
163
+ return this.db
164
+ .select()
165
+ .from(tables.judgeRuns)
166
+ .all()
167
+ .map((row) => row.value);
168
+ }
169
+ evalRun(id: string) {
170
+ return this.db
171
+ .select()
172
+ .from(tables.evalRuns)
173
+ .where(eq(tables.evalRuns.id, id))
174
+ .get()?.value;
175
+ }
176
+ judgeRun(id: string) {
177
+ return this.db
178
+ .select()
179
+ .from(tables.judgeRuns)
180
+ .where(eq(tables.judgeRuns.id, id))
181
+ .get()?.value;
182
+ }
183
+ startEval(slot: Slot, input: EvalRunInput) {
184
+ const value: EvalRun = {
185
+ id: `eval_${randomUUID()}`,
186
+ slotId: slot.id,
187
+ input,
188
+ state: "running",
189
+ startedAt: timestamp(),
190
+ replaces: slot.evalRunId ?? slot.previousEvalRunId ?? undefined,
191
+ };
192
+ this.transaction(() => {
193
+ this.db
194
+ .insert(tables.evalRuns)
195
+ .values({ id: value.id, state: value.state, value })
196
+ .run();
197
+ this.select({
198
+ ...slot,
199
+ evalRunId: value.id,
200
+ judgeRunId: null,
201
+ previousEvalRunId: undefined,
202
+ });
203
+ });
204
+ return value;
205
+ }
206
+ finishEval(value: EvalRun) {
207
+ if (
208
+ value.state === "running" ||
209
+ !value.completedAt ||
210
+ value.elapsedMs === undefined ||
211
+ value.elapsedMs < 0
212
+ )
213
+ throw new Error("Expected a finalized eval run");
214
+ const saved = this.evalRun(value.id);
215
+ if (!saved || saved.state !== "running")
216
+ throw new Error("Eval run is not running");
217
+ if (
218
+ saved.stop &&
219
+ JSON.stringify({ ...saved.stop, applied: value.stop?.applied }) !==
220
+ JSON.stringify(value.stop)
221
+ )
222
+ throw new Error("Finalization must preserve the recorded stop request");
223
+ this.db
224
+ .update(tables.evalRuns)
225
+ .set({ state: value.state, value })
226
+ .where(eq(tables.evalRuns.id, value.id))
227
+ .run();
228
+ }
229
+ requestEvalStop(id: string, stop: NonNullable<EvalRun["stop"]>) {
230
+ const saved = this.evalRun(id);
231
+ const check = this.judgeChecks(stop.judgeRunId).find(
232
+ (item) => item.id === stop.checkId,
233
+ );
234
+ if (
235
+ !saved ||
236
+ saved.state !== "running" ||
237
+ !check ||
238
+ check.purpose !== "early" ||
239
+ check.state !== "completed" ||
240
+ check.decision?.kind !== "decided" ||
241
+ check.decision.judgment.value === null
242
+ )
243
+ throw new Error(
244
+ "An early stop requires a running eval and a recorded decisive check",
245
+ );
246
+ if (
247
+ this.judgeRun(stop.judgeRunId)?.input.evalRunId !== id ||
248
+ JSON.stringify(check.checkpoint) !== JSON.stringify(stop.checkpoint)
249
+ )
250
+ throw new Error("Early stop evidence does not belong to this eval run");
251
+ if (saved.stop) throw new Error("An eval stop was already requested");
252
+ this.db
253
+ .update(tables.evalRuns)
254
+ .set({ value: { ...saved, stop } })
255
+ .where(eq(tables.evalRuns.id, id))
256
+ .run();
257
+ }
258
+ startJudge(input: JudgeRunInput) {
259
+ if (
260
+ !input.agent ||
261
+ !input.metrics.length ||
262
+ !input.runtimeHash ||
263
+ input.protocol !== JUDGE_PROTOCOL
264
+ )
265
+ throw new Error(
266
+ "Judge inputs must use the current agent, metrics, runtime, and protocol",
267
+ );
268
+ const value: JudgeRun = {
269
+ id: `judge_${randomUUID()}`,
270
+ input,
271
+ state: "running",
272
+ startedAt: timestamp(),
273
+ ...(input.mode === "monitor" ? { activity: "watching" as const } : {}),
274
+ };
275
+ const candidate = this.evalRun(input.evalRunId);
276
+ if (input.mode === "monitor" && !candidate?.input.earlyStop)
277
+ throw new Error("This eval run did not opt in to early stopping");
278
+ if (
279
+ !candidate ||
280
+ (candidate.evidence?.hash !== input.evidence.hash &&
281
+ !(
282
+ input.mode === "monitor" &&
283
+ this.checkpoint(candidate.id, input.evidence.hash)
284
+ ))
285
+ )
286
+ throw new Error("Judge input does not match saved candidate evidence");
287
+ this.db
288
+ .insert(tables.judgeRuns)
289
+ .values({ id: value.id, state: value.state, value })
290
+ .run();
291
+ return value;
292
+ }
293
+ finishJudge(value: JudgeRun) {
294
+ if (
295
+ value.state === "running" ||
296
+ !value.completedAt ||
297
+ value.elapsedMs === undefined ||
298
+ value.elapsedMs < 0
299
+ )
300
+ throw new Error("Expected a finalized judge run");
301
+ const saved = this.judgeRun(value.id);
302
+ if (!saved || saved.state !== "running")
303
+ throw new Error("Judge run is not running");
304
+ if (
305
+ value.state === "completed" &&
306
+ (!value.judgment ||
307
+ !Array.isArray(value.judgment.metrics) ||
308
+ value.judgment.metrics.length !== value.input.metrics.length ||
309
+ new Set(value.judgment.metrics.map((metric) => metric.id)).size !==
310
+ value.input.metrics.length ||
311
+ value.judgment.metrics.some(
312
+ (metric) =>
313
+ !value.input.metrics.some((declared) => declared.id === metric.id),
314
+ ) ||
315
+ value.judgment.value !== metricMean(value.judgment.metrics) ||
316
+ (value.judgment.value !== null && !isScored(value.judgment.value)))
317
+ )
318
+ throw new Error("A completed judge run requires a valid judgment");
319
+ if (
320
+ value.state === "completed" &&
321
+ this.evalRun(value.input.evalRunId)?.evidence?.hash !==
322
+ value.input.evidence.hash
323
+ )
324
+ throw new Error(
325
+ "A completed judgment must reference the finalized eval evidence",
326
+ );
327
+ const checks = this.judgeChecks(value.id);
328
+ if (checks.some((check) => check.state === "running"))
329
+ throw new Error(
330
+ "Finish pending judge checks before archiving the judge run",
331
+ );
332
+ if (value.state === "completed" && value.decisionCheckId) {
333
+ const basis = checks.find((check) => check.id === value.decisionCheckId);
334
+ if (
335
+ basis?.state !== "completed" ||
336
+ basis.decision?.kind !== "decided" ||
337
+ JSON.stringify(basis.decision.judgment) !==
338
+ JSON.stringify(value.judgment)
339
+ )
340
+ throw new Error(
341
+ "The selected judgment must match its recorded decisive check",
342
+ );
343
+ }
344
+ this.transaction(() => {
345
+ this.db
346
+ .update(tables.judgeRuns)
347
+ .set({ state: value.state, value })
348
+ .where(eq(tables.judgeRuns.id, value.id))
349
+ .run();
350
+ if (value.state !== "completed") return;
351
+ const candidate = this.evalRun(value.input.evalRunId)!;
352
+ const slot = this.slot(candidate.slotId)!;
353
+ if (
354
+ slot.evalRunId === candidate.id &&
355
+ slot.judgeHash === value.input.judgeHash
356
+ )
357
+ this.select({ ...slot, judgeRunId: value.id });
358
+ });
359
+ }
360
+ saveCheckpoint(evalRunId: string, value: EvidenceCheckpoint) {
361
+ if (!this.evalRun(evalRunId)) throw new Error("Unknown eval run");
362
+ const id = `${evalRunId}:${value.hash}`;
363
+ const existing = this.checkpoint(evalRunId, value.hash);
364
+ if (existing) {
365
+ if (JSON.stringify(existing) !== JSON.stringify(value))
366
+ throw new Error("Checkpoint identity conflict");
367
+ return;
368
+ }
369
+ this.db
370
+ .insert(tables.evidenceCheckpoints)
371
+ .values({ id, evalRunId, value })
372
+ .run();
373
+ }
374
+ checkpoint(evalRunId: string, hash: string) {
375
+ return this.db
376
+ .select()
377
+ .from(tables.evidenceCheckpoints)
378
+ .where(eq(tables.evidenceCheckpoints.id, `${evalRunId}:${hash}`))
379
+ .get()?.value;
380
+ }
381
+ judgeActivity(
382
+ id: string,
383
+ activity: JudgeRun["activity"],
384
+ monitorError?: string,
385
+ monitorErrorAt?: string,
386
+ monitorLimit?: string,
387
+ ) {
388
+ const saved = this.judgeRun(id);
389
+ if (!saved || saved.state !== "running")
390
+ throw new Error("Judge run is not running");
391
+ const value = {
392
+ ...saved,
393
+ activity,
394
+ ...(activity === "finalizing"
395
+ ? { archiveStartedAt: saved.archiveStartedAt ?? timestamp() }
396
+ : {}),
397
+ ...(monitorLimit ? { monitorLimit } : {}),
398
+ ...(monitorError
399
+ ? { monitorError, monitorErrorAt: monitorErrorAt ?? timestamp() }
400
+ : {}),
401
+ };
402
+ this.db
403
+ .update(tables.judgeRuns)
404
+ .set({ value })
405
+ .where(eq(tables.judgeRuns.id, id))
406
+ .run();
407
+ }
408
+ startJudgeCheck(
409
+ judgeRunId: string,
410
+ purpose: JudgeCheck["purpose"],
411
+ checkpoint: EvidenceCheckpoint,
412
+ ) {
413
+ const judge = this.judgeRun(judgeRunId);
414
+ if (
415
+ !judge ||
416
+ judge.state !== "running" ||
417
+ !this.checkpoint(judge.input.evalRunId, checkpoint.hash)
418
+ )
419
+ throw new Error(
420
+ "Judge check requires a running judge and a recorded checkpoint",
421
+ );
422
+ if (this.judgeChecks(judgeRunId).some((check) => check.state === "running"))
423
+ throw new Error("Only one check can run in a judge session at a time");
424
+ const value: JudgeCheck = {
425
+ id: `check_${randomUUID()}`,
426
+ judgeRunId,
427
+ purpose,
428
+ checkpoint,
429
+ state: "running",
430
+ startedAt: timestamp(),
431
+ events: { after: this.lastEvent(judgeRunId) },
432
+ };
433
+ this.db
434
+ .insert(tables.judgeChecks)
435
+ .values({ id: value.id, judgeRunId, state: value.state, value })
436
+ .run();
437
+ return value;
438
+ }
439
+ finishJudgeCheck(value: JudgeCheck) {
440
+ const saved = this.judgeChecks(value.judgeRunId).find(
441
+ (check) => check.id === value.id,
442
+ );
443
+ if (
444
+ !saved ||
445
+ saved.state !== "running" ||
446
+ value.state === "running" ||
447
+ !value.completedAt
448
+ )
449
+ throw new Error("Expected a finalized judge check");
450
+ if (
451
+ JSON.stringify(saved.checkpoint) !== JSON.stringify(value.checkpoint) ||
452
+ saved.purpose !== value.purpose ||
453
+ saved.startedAt !== value.startedAt ||
454
+ saved.executionStartedAt !== value.executionStartedAt ||
455
+ saved.events.after !== value.events.after
456
+ )
457
+ throw new Error("A judge check cannot change its inputs");
458
+ if (
459
+ value.state === "completed" &&
460
+ (!value.decision ||
461
+ (value.purpose === "early" &&
462
+ value.decision.kind === "decided" &&
463
+ value.decision.judgment.value === null))
464
+ )
465
+ throw new Error("Invalid judge check decision");
466
+ this.db
467
+ .update(tables.judgeChecks)
468
+ .set({ state: value.state, value })
469
+ .where(eq(tables.judgeChecks.id, value.id))
470
+ .run();
471
+ }
472
+ startJudgeCheckExecution(judgeRunId: string, checkId: string): JudgeCheck {
473
+ const check = this.judgeChecks(judgeRunId).find(
474
+ (item) => item.id === checkId,
475
+ );
476
+ if (!check || check.state !== "running" || check.executionStartedAt)
477
+ throw new Error("Expected a queued judge check");
478
+ const value = { ...check, executionStartedAt: timestamp() };
479
+ this.db
480
+ .update(tables.judgeChecks)
481
+ .set({ value })
482
+ .where(eq(tables.judgeChecks.id, checkId))
483
+ .run();
484
+ return value;
485
+ }
486
+ judgeChecks(judgeRunId: string): JudgeCheck[] {
487
+ return this.db
488
+ .select()
489
+ .from(tables.judgeChecks)
490
+ .where(eq(tables.judgeChecks.judgeRunId, judgeRunId))
491
+ .all()
492
+ .map((row) => row.value);
493
+ }
494
+ append(event: RunEvent) {
495
+ this.sqlite
496
+ .query(
497
+ "INSERT INTO events(execution_id,sequence,value) SELECT ?,coalesce(max(sequence),0)+1,? FROM events WHERE execution_id=?",
498
+ )
499
+ .run(event.executionId, JSON.stringify(event), event.executionId);
500
+ }
501
+ events(id: string, after = 0, limit = 1000) {
502
+ const sequence = tables.events.sequence;
503
+ return this.db
504
+ .select({ sequence, value: tables.events.value })
505
+ .from(tables.events)
506
+ .where(and(eq(tables.events.executionId, id), gt(sequence, after)))
507
+ .orderBy(asc(sequence))
508
+ .limit(limit)
509
+ .all()
510
+ .map((row) => ({
511
+ sequence: row.sequence,
512
+ record: JSON.parse(row.value) as RunEvent,
513
+ }));
514
+ }
515
+ /** Native event time bounds within an execution's event sequence. */
516
+ eventBounds(
517
+ id: string,
518
+ after = 0,
519
+ through = Number.MAX_SAFE_INTEGER,
520
+ ): { first: number; last: number } | undefined {
521
+ const time = "json_extract(value, '$.event.created')";
522
+ const row = this.sqlite
523
+ .query(
524
+ `SELECT min(${time}) AS first, max(${time}) AS last FROM events WHERE execution_id=? AND sequence>? AND sequence<=?`,
525
+ )
526
+ .get(id, after, through) as { first: number | null; last: number | null };
527
+ return row.first === null || row.last === null
528
+ ? undefined
529
+ : { first: Math.round(row.first), last: Math.round(row.last) };
530
+ }
531
+ lastEvent(id: string) {
532
+ return (
533
+ (
534
+ this.sqlite
535
+ .query(
536
+ "SELECT max(sequence) AS last FROM events WHERE execution_id=?",
537
+ )
538
+ .get(id) as { last: number | null }
539
+ ).last ?? 0
540
+ );
541
+ }
542
+ recordedCost(id: string): number | undefined {
543
+ const row = this.sqlite
544
+ .query(
545
+ `
546
+ SELECT sum(cost) AS cost FROM (
547
+ SELECT json_extract(value, '$.event.data.cost') AS cost
548
+ FROM events WHERE execution_id=?
549
+ AND json_extract(value, '$.event.type') IN (
550
+ 'session.step.ended', 'session.step.failed', 'session.usage.recorded'
551
+ )
552
+ GROUP BY json_extract(value, '$.event.id')
553
+ )
554
+ `,
555
+ )
556
+ .get(id) as { cost: number | null };
557
+ return row.cost ?? undefined;
558
+ }
559
+ /** Copy finalized records verbatim; retain source event cursors for checkpoint trace links. */
560
+ mergeFinalized(source: Results) {
561
+ if (
562
+ source.benchmark?.state === "running" ||
563
+ this.benchmark?.state === "running"
564
+ )
565
+ throw new Error("Wait for running work before merging");
566
+ if (
567
+ [...source.evalRuns(), ...source.judgeRuns()].some(
568
+ (run) => run.state === "running",
569
+ )
570
+ )
571
+ throw new Error("Source has unfinished execution records");
572
+ const existing = new Set(
573
+ [...this.evalRuns(), ...this.judgeRuns()].map((run) => run.id),
574
+ );
575
+ this.transaction(() => {
576
+ for (const table of [
577
+ "eval_runs",
578
+ "judge_runs",
579
+ "evidence_checkpoints",
580
+ "judge_checks",
581
+ ]) {
582
+ const rows = source.sqlite
583
+ .query(`SELECT * FROM ${table}`)
584
+ .all() as Record<string, string>[];
585
+ for (const row of rows) {
586
+ const saved = this.sqlite
587
+ .query(`SELECT value FROM ${table} WHERE id=?`)
588
+ .get(row.id) as { value: string } | null;
589
+ if (saved) {
590
+ if (saved.value !== row.value)
591
+ throw new Error(`Conflicting immutable record ${row.id}`);
592
+ continue;
593
+ }
594
+ const columns = Object.keys(row);
595
+ this.sqlite
596
+ .query(
597
+ `INSERT INTO ${table} (${columns.join(",")}) VALUES (${columns.map(() => "?").join(",")})`,
598
+ )
599
+ .run(...columns.map((key) => row[key]));
600
+ }
601
+ }
602
+ const insert = this.sqlite.query(
603
+ "INSERT INTO events(execution_id,sequence,value) VALUES(?,?,?)",
604
+ );
605
+ const events = source.sqlite
606
+ .query("SELECT * FROM events ORDER BY sequence")
607
+ .all() as Array<{
608
+ sequence: number;
609
+ execution_id: string;
610
+ value: string;
611
+ }>;
612
+ for (const event of events)
613
+ if (!existing.has(event.execution_id))
614
+ insert.run(event.execution_id, event.sequence, event.value);
615
+ for (const revision of [...source.revisions(), source.benchmark!])
616
+ this.db.insert(tables.revisions).values({ value: revision }).run();
617
+ for (const slot of source.slots())
618
+ if (!this.slot(slot.id)?.evalRunId) this.select(slot);
619
+ });
620
+ }
621
+ transaction<T>(work: () => T): T {
622
+ return this.sqlite.transaction(work).immediate();
623
+ }
624
+ readSnapshot<T>(work: () => T): T {
625
+ return this.sqlite.transaction(work).deferred();
626
+ }
627
+ close() {
628
+ if (!this.closed) {
629
+ this.closed = true;
630
+ this.sqlite.close(true);
631
+ }
632
+ }
633
+ [Symbol.dispose]() {
634
+ this.close();
635
+ }
636
+ }
@@ -0,0 +1,57 @@
1
+ import {
2
+ sqliteTable,
3
+ text,
4
+ integer,
5
+ primaryKey,
6
+ } from "drizzle-orm/sqlite-core";
7
+ import type {
8
+ BenchmarkRun,
9
+ EvalRun,
10
+ JudgeRun,
11
+ Slot,
12
+ EvidenceCheckpoint,
13
+ JudgeCheck,
14
+ } from "../../types";
15
+
16
+ export const benchmarkRuns = sqliteTable("benchmark_runs", {
17
+ id: text("id").primaryKey(),
18
+ value: text("value", { mode: "json" }).$type<BenchmarkRun>().notNull(),
19
+ });
20
+ export const revisions = sqliteTable("revisions", {
21
+ id: integer("id").primaryKey({ autoIncrement: true }),
22
+ value: text("value", { mode: "json" }).$type<BenchmarkRun>().notNull(),
23
+ });
24
+ export const slots = sqliteTable("slots", {
25
+ id: text("id").primaryKey(),
26
+ value: text("value", { mode: "json" }).$type<Slot>().notNull(),
27
+ });
28
+ export const evalRuns = sqliteTable("eval_runs", {
29
+ id: text("id").primaryKey(),
30
+ state: text("state").notNull(),
31
+ value: text("value", { mode: "json" }).$type<EvalRun>().notNull(),
32
+ });
33
+ export const judgeRuns = sqliteTable("judge_runs", {
34
+ id: text("id").primaryKey(),
35
+ state: text("state").notNull(),
36
+ value: text("value", { mode: "json" }).$type<JudgeRun>().notNull(),
37
+ });
38
+ export const evidenceCheckpoints = sqliteTable("evidence_checkpoints", {
39
+ id: text("id").primaryKey(),
40
+ evalRunId: text("eval_run_id").notNull(),
41
+ value: text("value", { mode: "json" }).$type<EvidenceCheckpoint>().notNull(),
42
+ });
43
+ export const judgeChecks = sqliteTable("judge_checks", {
44
+ id: text("id").primaryKey(),
45
+ judgeRunId: text("judge_run_id").notNull(),
46
+ state: text("state").notNull(),
47
+ value: text("value", { mode: "json" }).$type<JudgeCheck>().notNull(),
48
+ });
49
+ export const events = sqliteTable(
50
+ "events",
51
+ {
52
+ sequence: integer("sequence").notNull(),
53
+ executionId: text("execution_id").notNull(),
54
+ value: text("value").notNull(),
55
+ },
56
+ (table) => [primaryKey({ columns: [table.executionId, table.sequence] })],
57
+ );