@iowarp/clio-coder 0.3.9 → 0.4.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 (733) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/NOTICE +33 -0
  3. package/README.md +121 -16
  4. package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
  5. package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
  8. package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
  9. package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
  10. package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
  11. package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
  12. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  13. package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
  14. package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
  15. package/dist/chunk-42FMPA75.js +101 -0
  16. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  17. package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
  18. package/dist/chunk-5YHDIDBP.js +97 -0
  19. package/dist/chunk-6CCS4G3W.js +1529 -0
  20. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  21. package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
  22. package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
  23. package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
  24. package/dist/chunk-6NJQITNH.js +1412 -0
  25. package/dist/chunk-6VC4OV3Z.js +365 -0
  26. package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
  27. package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
  28. package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
  29. package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
  30. package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
  31. package/dist/chunk-7RY5VZPH.js +573 -0
  32. package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
  33. package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
  34. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  35. package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
  36. package/dist/chunk-AP73CFDC.js +308 -0
  37. package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
  38. package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
  39. package/dist/chunk-BJGUKIG4.js +302 -0
  40. package/dist/chunk-BMS5RKQY.js +27 -0
  41. package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
  42. package/dist/chunk-BTK3SSSK.js +67 -0
  43. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  44. package/dist/chunk-BWW4HLO4.js +301 -0
  45. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  46. package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
  47. package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
  48. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  49. package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
  50. package/dist/chunk-D4CJV46V.js +462 -0
  51. package/dist/chunk-D7E7WCDF.js +27 -0
  52. package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
  53. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  54. package/dist/chunk-EIMVLWB3.js +1842 -0
  55. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  56. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  57. package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
  58. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  59. package/dist/chunk-GIZNH63R.js +40 -0
  60. package/dist/chunk-GPPB3JBE.js +688 -0
  61. package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
  62. package/dist/chunk-HHV2GANA.js +88 -0
  63. package/dist/chunk-HJWWJ6IL.js +184 -0
  64. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  65. package/dist/chunk-HRQMFLJP.js +75 -0
  66. package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
  67. package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
  68. package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
  69. package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
  70. package/dist/chunk-J4HBWF6Y.js +2635 -0
  71. package/dist/chunk-J5LZHVIT.js +284 -0
  72. package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
  73. package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
  74. package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
  75. package/dist/chunk-K6BF4U2H.js +1785 -0
  76. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  77. package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
  78. package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
  79. package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
  80. package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
  81. package/dist/chunk-NDDGJUXD.js +81 -0
  82. package/dist/chunk-NEKRRTYW.js +56 -0
  83. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
  86. package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
  87. package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
  88. package/dist/chunk-PMZCIOCJ.js +25 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
  91. package/dist/chunk-QDC3K2U3.js +262 -0
  92. package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
  93. package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
  94. package/dist/chunk-QSNYB6ZV.js +195 -0
  95. package/dist/chunk-QTFGO774.js +644 -0
  96. package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
  97. package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
  98. package/dist/chunk-R346GLFC.js +31 -0
  99. package/dist/chunk-RKSR6VSF.js +132 -0
  100. package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
  101. package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
  102. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  103. package/dist/chunk-T56WDKA5.js +183 -0
  104. package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
  105. package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
  106. package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
  107. package/dist/chunk-TVHHYFHE.js +255 -0
  108. package/dist/chunk-U2WB7TZS.js +271 -0
  109. package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
  110. package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
  111. package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
  112. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  113. package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
  114. package/dist/chunk-VKFQTNDV.js +66 -0
  115. package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
  116. package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
  117. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  118. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  119. package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
  120. package/dist/chunk-WR6U3OVP.js +45 -0
  121. package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
  122. package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
  123. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  124. package/dist/chunk-YAKGTXEV.js +17 -0
  125. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  126. package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
  127. package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
  128. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  129. package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
  130. package/dist/cli/index.js +48 -37
  131. package/dist/clio-IT3G3VQH.js +25 -0
  132. package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
  133. package/dist/codewiki/build-worker.js +1 -1
  134. package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
  135. package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
  136. package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
  137. package/dist/configure-FL7Y3KJF.js +54 -0
  138. package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
  139. package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
  140. package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
  141. package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
  142. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
  143. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
  144. package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
  145. package/dist/doctor-ZGPEGHIP.js +772 -0
  146. package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
  147. package/dist/eval-inventory-HBWSWQOK.js +315 -0
  148. package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
  149. package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
  150. package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
  151. package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
  152. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
  153. package/dist/fleet-decisions-OTHB6KRL.js +157 -0
  154. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
  155. package/dist/fleet-inspect-SS6YMDCK.js +445 -0
  156. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
  157. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
  158. package/dist/fleet-verify-QD5M7E7Q.js +178 -0
  159. package/dist/fleet-view-WAMJYNDT.js +94 -0
  160. package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
  161. package/dist/install-NKNG7KD4.js +13 -0
  162. package/dist/interop-34TVO25M.js +116 -0
  163. package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
  164. package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
  165. package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
  166. package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
  167. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
  168. package/dist/panes-7STHOAUJ.js +103 -0
  169. package/dist/panes-SHAUIRXY.js +60 -0
  170. package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
  171. package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
  172. package/dist/resources-74GKTLSF.js +115 -0
  173. package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
  174. package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
  175. package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
  176. package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
  177. package/dist/skills-inventory-J357J34F.js +129 -0
  178. package/dist/slash-commands-JZZCQA32.js +79 -0
  179. package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
  180. package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
  181. package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
  182. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
  183. package/dist/tools-MKNWVPBH.js +29 -0
  184. package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
  185. package/dist/tui-primitives-K5PASC3O.js +17 -0
  186. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
  187. package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
  188. package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
  189. package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
  190. package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
  191. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
  192. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
  193. package/dist/with-panes-OBOBFIIR.js +818 -0
  194. package/dist/worker/entry.js +131 -91
  195. package/docs/README.md +3 -2
  196. package/docs/acp.md +25 -4
  197. package/docs/alcf-provider.md +1 -1
  198. package/docs/architecture.md +2 -2
  199. package/docs/artifact-versions.md +4 -1
  200. package/docs/built-in-agents.md +40 -32
  201. package/docs/capacity-and-scheduling.md +43 -5
  202. package/docs/commands-and-modes.md +39 -4
  203. package/docs/config-knobs-audit.md +3 -0
  204. package/docs/configuration-and-targets.md +138 -167
  205. package/docs/context-engine.md +1 -1
  206. package/docs/development-pipeline.md +19 -0
  207. package/docs/dispatch-typed-intent.md +385 -0
  208. package/docs/documentation-coverage.md +2 -2
  209. package/docs/documentation-guide.md +1 -1
  210. package/docs/environment-variables.md +3 -1
  211. package/docs/eval-runner.md +1 -1
  212. package/docs/evals-internal.md +1 -1
  213. package/docs/evidence-and-memory.md +2 -2
  214. package/docs/evolution.md +1 -1
  215. package/docs/exit-codes-and-output.md +3 -1
  216. package/docs/extensions-and-sharing.md +25 -1
  217. package/docs/fleet-demo-runbook.md +6 -3
  218. package/docs/fleet-dispatch.md +30 -7
  219. package/docs/installation-and-lifecycle.md +16 -3
  220. package/docs/middleware-and-components.md +1 -1
  221. package/docs/model-catalog.md +10 -1
  222. package/docs/observability.md +3 -3
  223. package/docs/proactive-memory.md +1 -1
  224. package/docs/prompt-envelope-and-tools.md +1 -1
  225. package/docs/provider-adapter-cookbook.md +1 -1
  226. package/docs/release-cut-checklist.md +164 -177
  227. package/docs/safety-model.md +2 -2
  228. package/docs/scientific-validation.md +3 -3
  229. package/docs/session-lifecycle.md +1 -1
  230. package/docs/skills-marketplace.md +1 -1
  231. package/docs/tool-usage.md +18 -8
  232. package/docs/trace-store.md +16 -11
  233. package/docs/troubleshooting.md +2 -2
  234. package/docs/tui-design.md +1 -1
  235. package/docs/worker-dispatch-mechanics.md +1 -1
  236. package/evals/README.md +5 -0
  237. package/evals/behavioral-corpus-grader.mjs +103 -0
  238. package/evals/behavioral-machinery-baseline.json +2276 -0
  239. package/evals/behavioral-machinery-driver.ts +250 -0
  240. package/evals/behavioral-machinery-support.ts +253 -0
  241. package/evals/behavioral-machinery.yaml +614 -0
  242. package/evals/behavioral-model-negative-control.yaml +68 -0
  243. package/evals/behavioral-model.yaml +216 -0
  244. package/evals/fixtures/behavioral-facts.txt +3 -0
  245. package/evals/fixtures/behavioral-main.ts +7 -0
  246. package/evals/fixtures/decoy/note.txt +2 -0
  247. package/evals/fixtures/private/credentials.txt +1 -0
  248. package/evals/tracked-metrics-baseline.yaml +229 -0
  249. package/evals/tracked-metrics-grader.mjs +129 -0
  250. package/package.json +8 -16
  251. package/skills/README.md +6 -6
  252. package/skills/coding/ast-grep/SKILL.md +8 -2
  253. package/skills/coding/coding-standards/SKILL.md +8 -2
  254. package/skills/coding/prototype/SKILL.md +8 -2
  255. package/skills/coding/tdd/SKILL.md +8 -2
  256. package/skills/context/context-handoff/SKILL.md +12 -3
  257. package/skills/context/context-handoff/evals.md +3 -3
  258. package/skills/context/context-prime/SKILL.md +8 -2
  259. package/skills/context/context-prime/evals.md +2 -2
  260. package/skills/git/file-ticket/SKILL.md +9 -4
  261. package/skills/git/file-ticket/evals.md +2 -2
  262. package/skills/git/fix-issue/SKILL.md +12 -5
  263. package/skills/git/fix-issue/evals.md +4 -4
  264. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  265. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  266. package/skills/git/ship/SKILL.md +9 -3
  267. package/skills/git/ship/evals.md +4 -4
  268. package/skills/git/worktree-create/SKILL.md +7 -2
  269. package/skills/git/worktree-create/evals.md +6 -6
  270. package/skills/git/worktree-merge/SKILL.md +7 -2
  271. package/skills/git/worktree-merge/evals.md +6 -6
  272. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  273. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  274. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  275. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  276. package/skills/meta/credentials/SKILL.md +9 -2
  277. package/skills/meta/find-skills/SKILL.md +8 -2
  278. package/skills/meta/herdr/SKILL.md +8 -2
  279. package/skills/meta/skill-craft/SKILL.md +21 -4
  280. package/skills/planning/architecture/SKILL.md +9 -3
  281. package/skills/planning/backlog/SKILL.md +8 -2
  282. package/skills/planning/prd/SKILL.md +8 -2
  283. package/skills/planning/product-intent/SKILL.md +8 -2
  284. package/skills/planning/tech-spec/SKILL.md +9 -3
  285. package/skills/registry.yaml +66 -66
  286. package/skills/research/arxiv-literature/SKILL.md +8 -2
  287. package/skills/research/experiment-protocol/SKILL.md +9 -2
  288. package/skills/research/scientific-debugging/SKILL.md +9 -2
  289. package/skills/research/scientific-debugging/evals.md +2 -2
  290. package/skills/research/scientific-modernization/SKILL.md +9 -2
  291. package/skills/skill-marketplace.json +257 -38
  292. package/skills/workflow/cut-it/SKILL.md +10 -2
  293. package/skills/workflow/design-council/SKILL.md +11 -2
  294. package/skills/workflow/grill-me/SKILL.md +8 -2
  295. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  296. package/src/cli/acp.ts +8 -4
  297. package/src/cli/argv.ts +25 -0
  298. package/src/cli/auth.ts +2 -2
  299. package/src/cli/bootstrap-generate.ts +5 -5
  300. package/src/cli/clio.ts +6 -1
  301. package/src/cli/config-inspect.ts +3 -3
  302. package/src/cli/configure-interop.ts +1 -1
  303. package/src/cli/configure.ts +50 -48
  304. package/src/cli/default-target.ts +1 -1
  305. package/src/cli/docs.ts +6 -6
  306. package/src/cli/doctor-naming.ts +323 -0
  307. package/src/cli/doctor-panes.ts +156 -0
  308. package/src/cli/doctor-toolchain.ts +78 -0
  309. package/src/cli/doctor.ts +34 -1
  310. package/src/cli/eval-inventory.ts +436 -0
  311. package/src/cli/eval.ts +13 -0
  312. package/src/cli/evidence-detail.ts +88 -0
  313. package/src/cli/evidence-inventory.ts +183 -0
  314. package/src/cli/evidence.ts +30 -5
  315. package/src/cli/fleet-decisions.ts +69 -0
  316. package/src/cli/fleet-inspect.ts +334 -0
  317. package/src/cli/fleet-preflight.ts +1 -1
  318. package/src/cli/fleet-verify.ts +133 -0
  319. package/src/cli/fleet-view.ts +827 -0
  320. package/src/cli/fleet.ts +154 -40
  321. package/src/cli/index.ts +14 -2
  322. package/src/cli/interop-inspect.ts +128 -0
  323. package/src/cli/interop.ts +34 -0
  324. package/src/cli/models.ts +3 -3
  325. package/src/cli/modes/print.ts +1 -1
  326. package/src/cli/panes.ts +35 -0
  327. package/src/cli/reset.ts +6 -3
  328. package/src/cli/run.ts +67 -13
  329. package/src/cli/share.ts +1 -1
  330. package/src/cli/skills-eval.ts +11 -11
  331. package/src/cli/skills-inventory.ts +185 -0
  332. package/src/cli/skills.ts +16 -13
  333. package/src/cli/targets.ts +23 -24
  334. package/src/cli/tools.ts +321 -0
  335. package/src/cli/trace-inspect.ts +252 -0
  336. package/src/cli/trace.ts +64 -2
  337. package/src/cli/uninstall.ts +2 -2
  338. package/src/cli/upgrade.ts +29 -34
  339. package/src/cli/usage.ts +2 -2
  340. package/src/cli/validate-model.ts +1 -1
  341. package/src/cli/verifiers-inspect.ts +347 -0
  342. package/src/cli/verifiers.ts +9 -0
  343. package/src/cli/wiki-generate.ts +5 -5
  344. package/src/core/bash-exec.ts +1 -1
  345. package/src/core/boot-trace.ts +3 -3
  346. package/src/core/bus-events.ts +4 -0
  347. package/src/core/bus-trace.ts +2 -2
  348. package/src/core/compile-cache.ts +1 -1
  349. package/src/core/config.ts +1070 -845
  350. package/src/core/defaults.ts +342 -463
  351. package/src/core/domain-loader.ts +6 -4
  352. package/src/core/event-bus.ts +1 -1
  353. package/src/core/file-references.ts +78 -88
  354. package/src/core/git-commit-attribution.ts +3 -9
  355. package/src/core/guardrails.ts +24 -4
  356. package/src/core/naming-compat.ts +45 -0
  357. package/src/core/naming-events.ts +62 -0
  358. package/src/core/recent-models.ts +1 -7
  359. package/src/core/residency-protection.ts +4 -8
  360. package/src/core/resolve-config-value.ts +1 -1
  361. package/src/core/response-model-id.ts +0 -14
  362. package/src/core/response-schema.ts +44 -4
  363. package/src/core/session-routing.ts +84 -74
  364. package/src/core/skill-activation.ts +18 -0
  365. package/src/core/termination.ts +4 -4
  366. package/src/core/theme-token-hex.ts +43 -0
  367. package/src/core/timers.ts +2 -12
  368. package/src/core/tool-names.ts +2 -1
  369. package/src/core/xdg.ts +1 -1
  370. package/src/domains/agents/catalog.ts +2 -12
  371. package/src/domains/agents/extension.ts +3 -3
  372. package/src/domains/agents/fleets/build-review.md +0 -3
  373. package/src/domains/agents/fleets/build-test.md +0 -3
  374. package/src/domains/agents/registry.ts +7 -7
  375. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  376. package/src/domains/agents/result-contract.ts +165 -36
  377. package/src/domains/agents/spec.ts +0 -11
  378. package/src/domains/config/classify.ts +37 -46
  379. package/src/domains/config/extension.ts +5 -5
  380. package/src/domains/config/keybindings.ts +48 -47
  381. package/src/domains/config/watcher.ts +1 -1
  382. package/src/domains/context/codewiki/indexer.ts +1 -1
  383. package/src/domains/context/extension.ts +3 -3
  384. package/src/domains/context/prompt-context.ts +1 -1
  385. package/src/domains/context/wiki/assemble.ts +2 -2
  386. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  387. package/src/domains/context/working-set/replay/report.ts +1 -1
  388. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  389. package/src/domains/dispatch/active-route-planner.ts +2 -2
  390. package/src/domains/dispatch/admission-error.ts +9 -0
  391. package/src/domains/dispatch/admission.ts +22 -21
  392. package/src/domains/dispatch/agent-candidates.ts +1 -1
  393. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  394. package/src/domains/dispatch/agent-ledger.ts +1 -1
  395. package/src/domains/dispatch/assignment.ts +5 -5
  396. package/src/domains/dispatch/capacity-lease.ts +23 -6
  397. package/src/domains/dispatch/code-step.ts +1 -1
  398. package/src/domains/dispatch/contract.ts +2 -2
  399. package/src/domains/dispatch/council-topology.ts +398 -0
  400. package/src/domains/dispatch/extension.ts +287 -111
  401. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  402. package/src/domains/dispatch/fleet-plan.ts +7 -2
  403. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  404. package/src/domains/dispatch/fleet-run.ts +59 -3
  405. package/src/domains/dispatch/gate-decisions.ts +36 -15
  406. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  407. package/src/domains/dispatch/gate-topology.ts +289 -0
  408. package/src/domains/dispatch/index.ts +19 -0
  409. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  410. package/src/domains/dispatch/intent.ts +85 -1
  411. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  412. package/src/domains/dispatch/path-scope.ts +0 -61
  413. package/src/domains/dispatch/placement.ts +2 -2
  414. package/src/domains/dispatch/receipt-findings.ts +1 -1
  415. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  416. package/src/domains/dispatch/reservation-store.ts +24 -27
  417. package/src/domains/dispatch/route-decision.ts +1 -1
  418. package/src/domains/dispatch/route-history.ts +1 -1
  419. package/src/domains/dispatch/route-policy.ts +1 -1
  420. package/src/domains/dispatch/route-readiness.ts +0 -28
  421. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  422. package/src/domains/dispatch/run-event-journal.ts +599 -0
  423. package/src/domains/dispatch/state.ts +45 -1
  424. package/src/domains/dispatch/tool-stats.ts +1 -1
  425. package/src/domains/dispatch/transport.ts +2 -19
  426. package/src/domains/dispatch/types.ts +16 -3
  427. package/src/domains/dispatch/validation.ts +33 -8
  428. package/src/domains/dispatch/worker-protocol.ts +2 -2
  429. package/src/domains/eval/artifacts/store.ts +5 -4
  430. package/src/domains/eval/compare/compare.ts +3 -16
  431. package/src/domains/eval/compare/thresholds.ts +0 -8
  432. package/src/domains/eval/execution-provenance.ts +1 -1
  433. package/src/domains/eval/inventory.ts +113 -0
  434. package/src/domains/eval/metrics/token-stream.ts +0 -7
  435. package/src/domains/eval/report.ts +1 -1
  436. package/src/domains/eval/runner.ts +1 -1
  437. package/src/domains/eval/runners/clio-run.ts +7 -6
  438. package/src/domains/eval/runners/external-command.ts +4 -3
  439. package/src/domains/eval/schema/artifact.ts +1 -1
  440. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  441. package/src/domains/eval/schema/behavioral.ts +7 -6
  442. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  443. package/src/domains/eval/schema/naming.ts +10 -0
  444. package/src/domains/eval/schema/serving.ts +31 -0
  445. package/src/domains/eval/schema/suite.ts +2 -2
  446. package/src/domains/eval/schema/validate.ts +9 -5
  447. package/src/domains/eval/schema/verdict.ts +4 -2
  448. package/src/domains/eval/store.ts +12 -2
  449. package/src/domains/eval/suites/run.ts +12 -6
  450. package/src/domains/eval/types.ts +1 -1
  451. package/src/domains/eval/workspaces/git.ts +1 -1
  452. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  453. package/src/domains/evidence/build.ts +13 -5
  454. package/src/domains/evidence/store.ts +6 -0
  455. package/src/domains/interop/consent.ts +7 -7
  456. package/src/domains/interop/extension.ts +1 -1
  457. package/src/domains/lifecycle/doctor.ts +27 -21
  458. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  459. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  460. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  461. package/src/domains/lifecycle/migrations/index.ts +20 -1
  462. package/src/domains/lifecycle/naming-history.ts +153 -0
  463. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  464. package/src/domains/lifecycle/naming-resources.ts +261 -0
  465. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  466. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  467. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  468. package/src/domains/memory/index.ts +0 -1
  469. package/src/domains/memory/task-memory-handoff.ts +6 -3
  470. package/src/domains/memory/task-memory-policy.ts +6 -10
  471. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  472. package/src/domains/middleware/index.ts +7 -0
  473. package/src/domains/middleware/marketplace-offer.ts +339 -0
  474. package/src/domains/middleware/memory-intervention.ts +33 -21
  475. package/src/domains/middleware/runtime.ts +2 -2
  476. package/src/domains/mux/contract.ts +566 -0
  477. package/src/domains/mux/detect.ts +182 -0
  478. package/src/domains/mux/dock-controller.ts +365 -0
  479. package/src/domains/mux/extension.ts +53 -0
  480. package/src/domains/mux/index.ts +116 -0
  481. package/src/domains/mux/manifest.ts +6 -0
  482. package/src/domains/mux/operations.ts +192 -0
  483. package/src/domains/mux/pane-registry.ts +90 -0
  484. package/src/domains/mux/protocol.ts +62 -0
  485. package/src/domains/mux/socket-client.ts +964 -0
  486. package/src/domains/mux/types.ts +265 -0
  487. package/src/domains/mux/viewer-command.ts +59 -0
  488. package/src/domains/mux/yazi/assets/init.lua +2 -0
  489. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  490. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  491. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  492. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  493. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  494. package/src/domains/mux/yazi/event-stream.ts +182 -0
  495. package/src/domains/mux/yazi/profile.ts +299 -0
  496. package/src/domains/mux/yazi/session.ts +251 -0
  497. package/src/domains/mux/yazi/theme.ts +30 -0
  498. package/src/domains/observability/cost.ts +21 -0
  499. package/src/domains/observability/extension.ts +1 -1
  500. package/src/domains/observability/index.ts +2 -0
  501. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  502. package/src/domains/observability/projection.ts +1 -1
  503. package/src/domains/observability/trace-store.ts +63 -11
  504. package/src/domains/prompts/compiler.ts +2 -2
  505. package/src/domains/prompts/extension.ts +3 -3
  506. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  507. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  508. package/src/domains/providers/endpoint-capacity.ts +154 -22
  509. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  510. package/src/domains/providers/extension.ts +25 -8
  511. package/src/domains/providers/index.ts +22 -0
  512. package/src/domains/providers/knowledge-base-path.ts +1 -1
  513. package/src/domains/providers/model-runtime-capabilities.ts +46 -2
  514. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  515. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  516. package/src/domains/providers/plugins.ts +1 -1
  517. package/src/domains/providers/resolver.ts +1 -1
  518. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  519. package/src/domains/providers/runtimes/builtins.ts +2 -0
  520. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  521. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  522. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  523. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  524. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  525. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  526. package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
  527. package/src/domains/providers/support.ts +1 -0
  528. package/src/domains/providers/target-model-cache.ts +124 -0
  529. package/src/domains/providers/types/knowledge-base.ts +13 -0
  530. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  531. package/src/domains/providers/types/target-descriptor.ts +3 -3
  532. package/src/domains/resources/extension.ts +1 -1
  533. package/src/domains/resources/index.ts +3 -0
  534. package/src/domains/resources/library.ts +6 -6
  535. package/src/domains/resources/prompts/loader.ts +1 -1
  536. package/src/domains/resources/skills/content-hash.ts +7 -6
  537. package/src/domains/resources/skills/evals.ts +1 -1
  538. package/src/domains/resources/skills/install.ts +36 -12
  539. package/src/domains/resources/skills/loader.ts +72 -13
  540. package/src/domains/resources/skills/marketplace.ts +21 -2
  541. package/src/domains/resources/skills/promotion.ts +214 -0
  542. package/src/domains/safety/action-classifier.ts +6 -0
  543. package/src/domains/safety/audit.ts +2 -2
  544. package/src/domains/safety/finish-contract.ts +2 -1
  545. package/src/domains/safety/run-effects.ts +1 -1
  546. package/src/domains/scheduling/extension.ts +4 -4
  547. package/src/domains/session/archive-readers.ts +9 -1
  548. package/src/domains/session/compaction/branch-summary.ts +4 -0
  549. package/src/domains/session/compaction/compact.ts +1 -1
  550. package/src/domains/session/compaction/tokens.ts +4 -0
  551. package/src/domains/session/context-accounting.ts +1 -1
  552. package/src/domains/session/decision-board.ts +1 -1
  553. package/src/domains/session/extension.ts +1 -1
  554. package/src/domains/session/handoff.ts +2 -2
  555. package/src/domains/session/prompt-manifest.ts +0 -5
  556. package/src/domains/session/protected-artifact-journal.ts +12 -6
  557. package/src/domains/session/retry.ts +1 -1
  558. package/src/domains/share/archive.ts +85 -36
  559. package/src/domains/toolchain/archive.ts +175 -0
  560. package/src/domains/toolchain/contract.ts +28 -0
  561. package/src/domains/toolchain/extension.ts +47 -0
  562. package/src/domains/toolchain/index.ts +39 -0
  563. package/src/domains/toolchain/install.ts +327 -0
  564. package/src/domains/toolchain/manifest.ts +8 -0
  565. package/src/domains/toolchain/paths.ts +34 -0
  566. package/src/domains/toolchain/registry.ts +265 -0
  567. package/src/domains/toolchain/remove.ts +218 -0
  568. package/src/domains/toolchain/resolve.ts +182 -0
  569. package/src/domains/toolchain/types.ts +113 -0
  570. package/src/domains/toolchain/version.ts +88 -0
  571. package/src/engine/acp/adapter.ts +3 -3
  572. package/src/engine/acp/event-mapper.ts +3 -3
  573. package/src/engine/acp/server.ts +440 -96
  574. package/src/engine/acp/tool-mediator.ts +2 -2
  575. package/src/engine/acp/types.ts +20 -2
  576. package/src/engine/alcf-oauth.ts +5 -5
  577. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  578. package/src/engine/api-registry.ts +1 -1
  579. package/src/engine/apis/llamacpp-residency.ts +1 -19
  580. package/src/engine/apis/lmstudio.ts +1 -6
  581. package/src/engine/apis/ollama-native.ts +3 -3
  582. package/src/engine/apis/openai-completions.ts +2 -2
  583. package/src/engine/apis/residency.ts +3 -9
  584. package/src/engine/claude/sdk-module.ts +87 -0
  585. package/src/engine/claude/sdk-runtime.ts +25 -17
  586. package/src/engine/claude/subprocess-runtime.ts +1 -1
  587. package/src/engine/claude/tool-safety.ts +4 -4
  588. package/src/engine/loop-guard.ts +0 -5
  589. package/src/engine/session.ts +14 -7
  590. package/src/engine/tui-primitives.ts +21 -0
  591. package/src/engine/tui.ts +1 -0
  592. package/src/engine/worker-events.ts +6 -6
  593. package/src/engine/worker-runtime.ts +16 -26
  594. package/src/entry/boot-options.ts +2 -0
  595. package/src/entry/orchestrator.ts +207 -90
  596. package/src/entry/panes-activation.ts +31 -0
  597. package/src/entry/with-panes.ts +20 -0
  598. package/src/interactive/application-controller.ts +21 -21
  599. package/src/interactive/bus-notices.ts +2 -2
  600. package/src/interactive/chat-loop.ts +8 -8
  601. package/src/interactive/chat-panel.ts +1 -1
  602. package/src/interactive/clio-editor.ts +105 -1
  603. package/src/interactive/context-activity.ts +8 -6
  604. package/src/interactive/context-meter.ts +3 -6
  605. package/src/interactive/context-overlay.ts +2 -1
  606. package/src/interactive/cost-overlay.ts +3 -1
  607. package/src/interactive/council-grid.ts +3 -5
  608. package/src/interactive/council.ts +11 -0
  609. package/src/interactive/dispatch-board.ts +56 -49
  610. package/src/interactive/editor-bash.ts +21 -0
  611. package/src/interactive/editor-steer.ts +9 -4
  612. package/src/interactive/editor-submit.ts +24 -18
  613. package/src/interactive/external-editor.ts +1 -1
  614. package/src/interactive/file-reference-completion.ts +360 -0
  615. package/src/interactive/footer/dashboard.ts +15 -17
  616. package/src/interactive/footer/notifications.ts +14 -8
  617. package/src/interactive/footer/widgets.ts +2 -44
  618. package/src/interactive/interactive-application.ts +229 -62
  619. package/src/interactive/interactive-event-projection.ts +1 -1
  620. package/src/interactive/interactive-input-runtime.ts +9 -2
  621. package/src/interactive/interactive-presentation.ts +21 -16
  622. package/src/interactive/interactive-shell.ts +2 -2
  623. package/src/interactive/interactive-slash-runtime.ts +99 -23
  624. package/src/interactive/interactive-subscriptions.ts +1 -1
  625. package/src/interactive/interactive-tickers.ts +1 -1
  626. package/src/interactive/keybinding-manager.ts +4 -4
  627. package/src/interactive/layout.ts +1 -1
  628. package/src/interactive/memory-overlay.ts +3 -2
  629. package/src/interactive/modal-marker.ts +151 -0
  630. package/src/interactive/mutation-preview.ts +1 -1
  631. package/src/interactive/mux-bridge.ts +214 -0
  632. package/src/interactive/overlay-frame.ts +62 -14
  633. package/src/interactive/overlay-general-openers.ts +7 -2
  634. package/src/interactive/overlay-key-routing.ts +21 -10
  635. package/src/interactive/overlay-lifecycle.ts +20 -4
  636. package/src/interactive/overlay-model-selectors.ts +43 -6
  637. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  638. package/src/interactive/overlay-transitions.ts +18 -4
  639. package/src/interactive/overlays/agents.ts +3 -2
  640. package/src/interactive/overlays/ask-user.ts +161 -41
  641. package/src/interactive/overlays/auth-dialog.ts +1 -0
  642. package/src/interactive/overlays/context-reset.ts +29 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +29 -4
  644. package/src/interactive/overlays/decisions.ts +15 -13
  645. package/src/interactive/overlays/extensions.ts +1 -0
  646. package/src/interactive/overlays/fleet-run-approval.ts +4 -3
  647. package/src/interactive/overlays/handoff-review.ts +3 -2
  648. package/src/interactive/overlays/help-reference.ts +2 -0
  649. package/src/interactive/overlays/interop.ts +2 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +2 -1
  651. package/src/interactive/overlays/library-tabs.ts +28 -0
  652. package/src/interactive/overlays/list-overlay.ts +10 -1
  653. package/src/interactive/overlays/message-picker.ts +2 -1
  654. package/src/interactive/overlays/model-scope.ts +86 -0
  655. package/src/interactive/overlays/model-selector.ts +40 -31
  656. package/src/interactive/overlays/prompts.ts +11 -4
  657. package/src/interactive/overlays/session-selector.ts +3 -2
  658. package/src/interactive/overlays/settings-sections.ts +30 -0
  659. package/src/interactive/overlays/settings.ts +849 -268
  660. package/src/interactive/overlays/side-question.ts +3 -2
  661. package/src/interactive/overlays/skills-hub.ts +11 -19
  662. package/src/interactive/overlays/tree-selector.ts +3 -2
  663. package/src/interactive/pane-policy.ts +46 -0
  664. package/src/interactive/panes-runtime.ts +318 -0
  665. package/src/interactive/permission-overlay.ts +2 -2
  666. package/src/interactive/renderers/compaction-summary.ts +29 -0
  667. package/src/interactive/renderers/retry-status.ts +12 -4
  668. package/src/interactive/renderers/tool-execution.ts +4 -4
  669. package/src/interactive/renderers/worker-entry.ts +122 -14
  670. package/src/interactive/session-transcript.ts +3 -3
  671. package/src/interactive/slash-autocomplete.ts +454 -165
  672. package/src/interactive/slash-commands.ts +521 -189
  673. package/src/interactive/slash-spec.ts +160 -17
  674. package/src/interactive/status/controller.ts +2 -2
  675. package/src/interactive/stream-pacing-policy.ts +1 -1
  676. package/src/interactive/tasks-overlay.ts +21 -13
  677. package/src/interactive/terminal-lease.ts +6 -7
  678. package/src/interactive/theme/tokens.ts +3 -14
  679. package/src/interactive/turn-context.ts +58 -13
  680. package/src/interactive/turn-persistence.ts +2 -2
  681. package/src/interactive/turn-prewarm.ts +2 -2
  682. package/src/interactive/turn-runtime.ts +8 -8
  683. package/src/interactive/turn-state.ts +1 -1
  684. package/src/interactive/view/artifacts.ts +120 -9
  685. package/src/interactive/view/view-overlay.ts +14 -10
  686. package/src/interactive/watch-pane.ts +180 -0
  687. package/src/interactive/welcome-dashboard.ts +15 -15
  688. package/src/interactive/worker-progress.ts +11 -5
  689. package/src/interactive/worker-receipts.ts +20 -2
  690. package/src/interactive/worker-stream.ts +6 -4
  691. package/src/interactive/yazi-bridge.ts +451 -0
  692. package/src/tools/ask-user.ts +3 -3
  693. package/src/tools/bash.ts +1 -1
  694. package/src/tools/bootstrap.ts +26 -2
  695. package/src/tools/builtin-tool-catalog.ts +16 -1
  696. package/src/tools/compete-worktrees.ts +108 -17
  697. package/src/tools/context/index.ts +15 -1
  698. package/src/tools/core-bootstrap.ts +2 -1
  699. package/src/tools/dispatch-admission.ts +18 -5
  700. package/src/tools/dispatch-arguments.ts +21 -21
  701. package/src/tools/dispatch-plan.ts +0 -11
  702. package/src/tools/dispatch-run-events.ts +145 -28
  703. package/src/tools/dispatch-runner.ts +40 -13
  704. package/src/tools/dispatch-types.ts +15 -3
  705. package/src/tools/dispatch.ts +2 -2
  706. package/src/tools/executables.ts +17 -14
  707. package/src/tools/find.ts +1 -6
  708. package/src/tools/monitor.ts +4 -4
  709. package/src/tools/observation.ts +54 -4
  710. package/src/tools/observers.ts +0 -33
  711. package/src/tools/panes-surface.ts +38 -0
  712. package/src/tools/panes.ts +112 -0
  713. package/src/tools/policy.ts +10 -1
  714. package/src/tools/presentation.ts +1 -0
  715. package/src/tools/task-worktree.ts +28 -7
  716. package/src/tools/verify/authoring.ts +3 -6
  717. package/src/tools/verify/frontend.ts +1 -1
  718. package/src/tools/web-fetch.ts +1 -1
  719. package/src/worker/entry.ts +4 -3
  720. package/src/worker/protocol.ts +16 -14
  721. package/src/worker/spec-contract.ts +2 -2
  722. package/src/worker/stdin-demux.ts +2 -2
  723. package/dist/chunk-D73KXYPF.js +0 -37
  724. package/dist/chunk-MLOK6ZOS.js +0 -2888
  725. package/dist/chunk-PNY46YEY.js +0 -1581
  726. package/dist/chunk-XDOQXGFO.js +0 -515
  727. package/dist/chunk-YKOFT37S.js +0 -279
  728. package/dist/clio-LT5V7SSZ.js +0 -26
  729. package/dist/configure-2WYWSCSD.js +0 -49
  730. package/dist/doctor-TWBWFK5V.js +0 -165
  731. package/src/engine/apis/degraded-inference.ts +0 -95
  732. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  733. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -0,0 +1,1529 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ assertSafeId
4
+ } from "./chunk-R346GLFC.js";
5
+ import {
6
+ safeResourceWrite
7
+ } from "./chunk-WEPFGWHJ.js";
8
+ import {
9
+ init_esm_shims
10
+ } from "./chunk-3R73A4XB.js";
11
+
12
+ // src/domains/eval/schema/execution-envelope.ts
13
+ init_esm_shims();
14
+
15
+ // src/domains/eval/schema/naming.ts
16
+ init_esm_shims();
17
+ function normalizeEvalSchemaId(value) {
18
+ return typeof value === "string" && value.startsWith("clio.eval.") ? `clio-coder.eval.${value.slice("clio.eval.".length)}` : value;
19
+ }
20
+ function normalizeEvalRunnerKind(value) {
21
+ return value === "clio-run" ? "clio-coder-run" : value;
22
+ }
23
+
24
+ // src/domains/eval/schema/execution-envelope.ts
25
+ var EVAL_EXECUTION_ENVELOPE_SCHEMA_V1 = "clio-coder.eval.execution-envelope.v1";
26
+ var EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 = [
27
+ "prompt",
28
+ "recipe",
29
+ "target",
30
+ "wireModel",
31
+ "runtime",
32
+ "thinkingLevel",
33
+ "toolSignature",
34
+ "autonomy",
35
+ "policy",
36
+ "projectContext",
37
+ "corpus"
38
+ ];
39
+ function parseEvalExecutionEnvelopeV1(value, source = "execution envelope") {
40
+ const record = asRecord(value, source);
41
+ if (normalizeEvalSchemaId(record.schema) !== EVAL_EXECUTION_ENVELOPE_SCHEMA_V1) {
42
+ throw new Error(`${source}.schema: expected ${EVAL_EXECUTION_ENVELOPE_SCHEMA_V1}`);
43
+ }
44
+ const prompt = asRecord(record.prompt, `${source}.prompt`);
45
+ if (!Array.isArray(prompt.fragments)) throw new Error(`${source}.prompt.fragments: expected array`);
46
+ const fragments = prompt.fragments.map((entry, index) => {
47
+ const fragment = asRecord(entry, `${source}.prompt.fragments[${index}]`);
48
+ const version = fragment.version;
49
+ if (version !== "unversioned" && (!Number.isInteger(version) || typeof version !== "number" || version <= 0)) {
50
+ throw new Error(`${source}.prompt.fragments[${index}].version: expected positive integer or unversioned`);
51
+ }
52
+ return {
53
+ id: readString(fragment.id, `${source}.prompt.fragments[${index}].id`),
54
+ version,
55
+ contentHash: readDigest(fragment.contentHash, `${source}.prompt.fragments[${index}].contentHash`)
56
+ };
57
+ });
58
+ const fragmentIds = fragments.map((fragment) => fragment.id);
59
+ if (new Set(fragmentIds).size !== fragmentIds.length) {
60
+ throw new Error(`${source}.prompt.fragments: duplicate fragment id`);
61
+ }
62
+ const recipe = record.recipe === null ? null : (() => {
63
+ const value2 = asRecord(record.recipe, `${source}.recipe`);
64
+ const version = value2.version;
65
+ if (!Number.isInteger(version) || typeof version !== "number" || version <= 0) {
66
+ throw new Error(`${source}.recipe.version: expected positive integer`);
67
+ }
68
+ return {
69
+ id: readString(value2.id, `${source}.recipe.id`),
70
+ version,
71
+ contentHash: readDigest(value2.contentHash, `${source}.recipe.contentHash`)
72
+ };
73
+ })();
74
+ const policyHashes = asRecord(record.policyHashes, `${source}.policyHashes`);
75
+ const projectContext = asRecord(record.projectContext, `${source}.projectContext`);
76
+ const projectKind = projectContext.kind;
77
+ if (projectKind !== "none" && projectKind !== "session" && projectKind !== "worker") {
78
+ throw new Error(`${source}.projectContext.kind: expected none, session, or worker`);
79
+ }
80
+ const corpus = asRecord(record.corpus, `${source}.corpus`);
81
+ return {
82
+ schema: EVAL_EXECUTION_ENVELOPE_SCHEMA_V1,
83
+ prompt: {
84
+ fragments,
85
+ compositionHash: readNullableDigest(prompt.compositionHash, `${source}.prompt.compositionHash`)
86
+ },
87
+ recipe,
88
+ target: readString(record.target, `${source}.target`),
89
+ wireModel: readNullableString(record.wireModel, `${source}.wireModel`),
90
+ runtime: readNullableString(record.runtime, `${source}.runtime`),
91
+ thinkingLevel: readNullableString(record.thinkingLevel, `${source}.thinkingLevel`),
92
+ toolSignature: readNullableDigest(record.toolSignature, `${source}.toolSignature`),
93
+ autonomy: readNullableString(record.autonomy, `${source}.autonomy`),
94
+ policyHashes: {
95
+ rulePack: readNullableDigest(policyHashes.rulePack, `${source}.policyHashes.rulePack`),
96
+ project: readNullableDigest(policyHashes.project, `${source}.policyHashes.project`)
97
+ },
98
+ projectContext: {
99
+ kind: projectKind,
100
+ tier: readNullableString(projectContext.tier, `${source}.projectContext.tier`),
101
+ contentHash: readNullableDigest(projectContext.contentHash, `${source}.projectContext.contentHash`),
102
+ chars: readNullableNonNegativeInteger(projectContext.chars, `${source}.projectContext.chars`),
103
+ sections: readStringArray(projectContext.sections, `${source}.projectContext.sections`),
104
+ rulesApplied: readStringArray(projectContext.rulesApplied, `${source}.projectContext.rulesApplied`),
105
+ operatorProfileApplied: readNullableBoolean(
106
+ projectContext.operatorProfileApplied,
107
+ `${source}.projectContext.operatorProfileApplied`
108
+ )
109
+ },
110
+ corpus: {
111
+ id: readString(corpus.id, `${source}.corpus.id`),
112
+ version: readString(corpus.version, `${source}.corpus.version`)
113
+ }
114
+ };
115
+ }
116
+ function parseEvalExecutionMatrixDimensionsV1(value, source) {
117
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
118
+ const allowed = new Set(EVAL_EXECUTION_MATRIX_DIMENSIONS_V1);
119
+ const dimensions = value.map((entry, index) => {
120
+ if (typeof entry !== "string" || !allowed.has(entry)) {
121
+ throw new Error(`${source}[${index}]: expected a declared execution-envelope dimension`);
122
+ }
123
+ return entry;
124
+ });
125
+ if (new Set(dimensions).size !== dimensions.length) throw new Error(`${source}: duplicate matrix dimension`);
126
+ return dimensions;
127
+ }
128
+ function readString(value, source) {
129
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected non-empty string`);
130
+ return value;
131
+ }
132
+ function readNullableString(value, source) {
133
+ if (value === null) return null;
134
+ return readString(value, source);
135
+ }
136
+ function readDigest(value, source) {
137
+ const digest = readString(value, source);
138
+ if (!/^[a-f0-9]{64}$/u.test(digest)) throw new Error(`${source}: expected sha256 digest`);
139
+ return digest;
140
+ }
141
+ function readNullableDigest(value, source) {
142
+ return value === null ? null : readDigest(value, source);
143
+ }
144
+ function readNullableNonNegativeInteger(value, source) {
145
+ if (value === null) return null;
146
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 0) {
147
+ throw new Error(`${source}: expected non-negative integer or null`);
148
+ }
149
+ return value;
150
+ }
151
+ function readNullableBoolean(value, source) {
152
+ if (value === null || typeof value === "boolean") return value;
153
+ throw new Error(`${source}: expected boolean or null`);
154
+ }
155
+ function readStringArray(value, source) {
156
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
157
+ const entries = value.map((entry, index) => readString(entry, `${source}[${index}]`));
158
+ if (new Set(entries).size !== entries.length) throw new Error(`${source}: duplicate value`);
159
+ return entries;
160
+ }
161
+ function asRecord(value, source) {
162
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value;
163
+ throw new Error(`${source}: expected object`);
164
+ }
165
+
166
+ // src/domains/eval/schema/serving.ts
167
+ init_esm_shims();
168
+ function parseEvalServingConfigurationV1(value, source) {
169
+ const record = asRecord2(value, source);
170
+ const targetId = readString2(record.targetId, `${source}.targetId`);
171
+ const totalSlots = record.total_slots;
172
+ if (totalSlots !== null && (typeof totalSlots !== "number" || !Number.isInteger(totalSlots) || totalSlots <= 0)) {
173
+ throw new Error(`${source}.total_slots: expected positive integer or null`);
174
+ }
175
+ const compiledPromptHash = readNullableString2(record.compiledPromptHash, `${source}.compiledPromptHash`);
176
+ if (compiledPromptHash !== null && !/^[a-f0-9]{64}$/u.test(compiledPromptHash)) {
177
+ throw new Error(`${source}.compiledPromptHash: expected sha256 digest or null`);
178
+ }
179
+ return {
180
+ targetId,
181
+ runtimeId: readNullableString2(record.runtimeId, `${source}.runtimeId`),
182
+ modelId: readNullableString2(record.modelId, `${source}.modelId`),
183
+ serverBuild: readNullableString2(record.serverBuild, `${source}.serverBuild`),
184
+ total_slots: totalSlots,
185
+ thinkingLevel: readNullableString2(record.thinkingLevel, `${source}.thinkingLevel`),
186
+ compiledPromptHash
187
+ };
188
+ }
189
+ function evalServingConfigurationOf(artifact) {
190
+ return artifact.servingConfiguration ?? {
191
+ targetId: artifact.matrix.target,
192
+ runtimeId: null,
193
+ modelId: artifact.matrix.model,
194
+ serverBuild: null,
195
+ total_slots: null,
196
+ thinkingLevel: artifact.matrix.thinking,
197
+ compiledPromptHash: null
198
+ };
199
+ }
200
+ function sameEvalServingConfiguration(left, right) {
201
+ return left.targetId === right.targetId && left.runtimeId === right.runtimeId && left.modelId === right.modelId && left.serverBuild === right.serverBuild && left.total_slots === right.total_slots && left.thinkingLevel === right.thinkingLevel && left.compiledPromptHash === right.compiledPromptHash;
202
+ }
203
+ function renderEvalServingConfiguration(config) {
204
+ return [
205
+ `target=${config.targetId}`,
206
+ `runtime=${config.runtimeId ?? "unknown"}`,
207
+ `model=${config.modelId ?? "unknown"}`,
208
+ `server_build=${config.serverBuild ?? "unknown"}`,
209
+ `total_slots=${config.total_slots ?? "unknown"}`,
210
+ `thinking=${config.thinkingLevel ?? "unknown"}`,
211
+ `compiled_prompt_hash=${config.compiledPromptHash ?? "unknown"}`
212
+ ].join(" ");
213
+ }
214
+ function readString2(value, source) {
215
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected string`);
216
+ return value;
217
+ }
218
+ function readNullableString2(value, source) {
219
+ if (value === null) return null;
220
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}: expected string or null`);
221
+ return value;
222
+ }
223
+ function asRecord2(value, source) {
224
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value;
225
+ throw new Error(`${source}: expected object`);
226
+ }
227
+
228
+ // src/domains/eval/harness-metrics.ts
229
+ init_esm_shims();
230
+ var ZERO_EVAL_HARNESS_METRICS = {
231
+ receiptCount: 0,
232
+ toolCalls: 0,
233
+ retries: 0,
234
+ safetyBlocks: 0,
235
+ correctionLatencyMs: 0,
236
+ validationEvidence: 0
237
+ };
238
+ function evalHarnessMetricsFromCommands(commands) {
239
+ return {
240
+ ...ZERO_EVAL_HARNESS_METRICS,
241
+ validationEvidence: commands.filter(
242
+ (command) => command.phase === "verifier" && command.exitCode === 0 && !command.timedOut
243
+ ).length
244
+ };
245
+ }
246
+ function evalHarnessMetricsFromReceipt(receipt, extras = {}) {
247
+ return {
248
+ receiptCount: 1,
249
+ toolCalls: receipt.toolCalls,
250
+ retries: extras.retries ?? 0,
251
+ safetyBlocks: receipt.safety?.decisions.blocked ?? 0,
252
+ correctionLatencyMs: extras.correctionLatencyMs ?? 0,
253
+ validationEvidence: extras.validationEvidence ?? 0
254
+ };
255
+ }
256
+ function sumEvalHarnessMetrics(records) {
257
+ return records.reduce((total, record) => addEvalHarnessMetrics(total, record.harness), {
258
+ ...ZERO_EVAL_HARNESS_METRICS
259
+ });
260
+ }
261
+ function addEvalHarnessMetrics(left, right) {
262
+ return {
263
+ receiptCount: left.receiptCount + right.receiptCount,
264
+ toolCalls: left.toolCalls + right.toolCalls,
265
+ retries: left.retries + right.retries,
266
+ safetyBlocks: left.safetyBlocks + right.safetyBlocks,
267
+ correctionLatencyMs: left.correctionLatencyMs + right.correctionLatencyMs,
268
+ validationEvidence: left.validationEvidence + right.validationEvidence
269
+ };
270
+ }
271
+
272
+ // src/domains/eval/store.ts
273
+ init_esm_shims();
274
+ import { createHash, randomBytes } from "node:crypto";
275
+ import { readFile } from "node:fs/promises";
276
+ import { join } from "node:path";
277
+
278
+ // src/domains/eval/artifacts/redact.ts
279
+ init_esm_shims();
280
+ var SENSITIVE_KEY = /(?:^|[_-])(api[_-]?key|authorization|cookie|password|secret|token)(?:$|[_-])/i;
281
+ var CREDENTIAL_PATTERNS = [
282
+ [/\b(authorization\s*[:=]\s*)(?:bearer|basic)\s+[A-Za-z0-9._~+/=-]+/gi, "$1[redacted]"],
283
+ [/\b(bearer\s+)[A-Za-z0-9._~+/=-]{12,}/gi, "$1[redacted]"],
284
+ [/\b(sk-[A-Za-z0-9_-]{16,})\b/g, "[redacted]"],
285
+ [/\b(gh[pousr]_[A-Za-z0-9_]{16,})\b/g, "[redacted]"],
286
+ [/\b(AKIA[0-9A-Z]{16})\b/g, "[redacted]"],
287
+ [/\b((?:api[_-]?key|access[_-]?token|refresh[_-]?token|password|secret)\s*[:=]\s*)[^\s"',}]+/gi, "$1[redacted]"]
288
+ ];
289
+ function redactArtifactForStorage(value, env = process.env) {
290
+ return redactValue(value, env);
291
+ }
292
+ function redactValue(value, env) {
293
+ if (typeof value === "string") return redactString(value, env);
294
+ if (Array.isArray(value)) return value.map((entry) => redactValue(entry, env));
295
+ if (value !== null && typeof value === "object") {
296
+ const out = {};
297
+ for (const [key, entry] of Object.entries(value)) {
298
+ out[key] = SENSITIVE_KEY.test(key) ? "[redacted]" : redactValue(entry, env);
299
+ }
300
+ return out;
301
+ }
302
+ return value;
303
+ }
304
+ function redactString(value, env) {
305
+ let out = stripHomePrefix(value, env.HOME);
306
+ for (const [pattern, replacement] of CREDENTIAL_PATTERNS) {
307
+ out = out.replace(pattern, replacement);
308
+ }
309
+ return out;
310
+ }
311
+ function stripHomePrefix(value, home) {
312
+ if (home === void 0 || home.length === 0) return value;
313
+ const normalized = home.replace(/\/+$/g, "");
314
+ if (normalized.length === 0) return value;
315
+ return value.split(normalized).join("$HOME");
316
+ }
317
+
318
+ // src/domains/eval/store.ts
319
+ var NODE_SIGNALS = /* @__PURE__ */ new Set([
320
+ "SIGHUP",
321
+ "SIGINT",
322
+ "SIGQUIT",
323
+ "SIGILL",
324
+ "SIGTRAP",
325
+ "SIGABRT",
326
+ "SIGIOT",
327
+ "SIGBUS",
328
+ "SIGFPE",
329
+ "SIGKILL",
330
+ "SIGUSR1",
331
+ "SIGSEGV",
332
+ "SIGUSR2",
333
+ "SIGPIPE",
334
+ "SIGALRM",
335
+ "SIGTERM",
336
+ "SIGCHLD",
337
+ "SIGSTKFLT",
338
+ "SIGCONT",
339
+ "SIGSTOP",
340
+ "SIGTSTP",
341
+ "SIGTTIN",
342
+ "SIGTTOU",
343
+ "SIGURG",
344
+ "SIGXCPU",
345
+ "SIGXFSZ",
346
+ "SIGVTALRM",
347
+ "SIGPROF",
348
+ "SIGWINCH",
349
+ "SIGIO",
350
+ "SIGPOLL",
351
+ "SIGPWR",
352
+ "SIGSYS",
353
+ "SIGUNUSED"
354
+ ]);
355
+ function evalRoot(dataDir) {
356
+ return join(dataDir, "evals");
357
+ }
358
+ function evalArtifactPath(dataDir, evalId) {
359
+ assertSafeId(evalId, "eval");
360
+ return join(evalRoot(dataDir), `${evalId}.json`);
361
+ }
362
+ function createEvalId(startedAt, taskFileHash) {
363
+ const stamp = startedAt.toISOString().replace(/[-:.]/g, "");
364
+ return `eval-${stamp}-${taskFileHash.slice(0, 8)}-${randomBytes(6).toString("hex")}`;
365
+ }
366
+ async function writeEvalArtifact(dataDir, artifact) {
367
+ const path = evalArtifactPath(dataDir, artifact.evalId);
368
+ const redacted = redactArtifactForStorage({
369
+ ...artifact,
370
+ paths: { ...artifact.paths, artifact: path }
371
+ });
372
+ safeResourceWrite(path, `${JSON.stringify(redacted, null, 2)}
373
+ `, { encoding: "utf8" });
374
+ return path;
375
+ }
376
+ async function loadEvalArtifact(dataDir, evalId) {
377
+ let raw;
378
+ try {
379
+ raw = await readFile(evalArtifactPath(dataDir, evalId), "utf8");
380
+ } catch (error) {
381
+ if (isErrorWithCode(error) && error.code === "ENOENT") throw new Error(`eval artifact not found: ${evalId}`);
382
+ throw error;
383
+ }
384
+ const source = evalArtifactPath(dataDir, evalId);
385
+ const parsed = parseJson(raw, source);
386
+ return parseArtifact(parsed, source);
387
+ }
388
+ function parseArtifact(value, source) {
389
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
390
+ if (value.version !== 1) throw new Error(`${source}.version: expected 1`);
391
+ const results = readArray(value, source, "results").map(
392
+ (entry, index) => parseRecord(entry, `${source}.results[${index}]`)
393
+ );
394
+ return {
395
+ version: 1,
396
+ evalId: readString3(value, source, "evalId"),
397
+ taskFile: readString3(value, source, "taskFile"),
398
+ taskFileHash: readString3(value, source, "taskFileHash"),
399
+ clioCoder: parseClioProvenance(readEvalProvenance(value, source), `${source}.clioCoder`),
400
+ environment: parseEnvironmentProvenance(
401
+ readRequiredArtifactField(value, source, "environment"),
402
+ `${source}.environment`
403
+ ),
404
+ target: readOptionalNullableString(value, source, "target"),
405
+ model: readOptionalNullableString(value, source, "model"),
406
+ thinking: readOptionalNullableString(value, source, "thinking"),
407
+ paths: parseArtifactPaths(readRequiredArtifactField(value, source, "paths"), `${source}.paths`),
408
+ repeat: readNumber(value, source, "repeat"),
409
+ startedAt: readString3(value, source, "startedAt"),
410
+ endedAt: readString3(value, source, "endedAt"),
411
+ summary: parseSummary(value.summary, `${source}.summary`),
412
+ results
413
+ };
414
+ }
415
+ function parseSummary(value, source) {
416
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
417
+ return {
418
+ runs: readNumber(value, source, "runs"),
419
+ passed: readNumber(value, source, "passed"),
420
+ failed: readNumber(value, source, "failed"),
421
+ passRate: readNumber(value, source, "passRate"),
422
+ tokens: readNumber(value, source, "tokens"),
423
+ costUsd: readNumber(value, source, "costUsd"),
424
+ wallTimeMs: readNumber(value, source, "wallTimeMs"),
425
+ harness: value.harness === void 0 ? { ...ZERO_EVAL_HARNESS_METRICS } : parseHarnessMetrics(value.harness, `${source}.harness`),
426
+ failureClasses: readArray(value, source, "failureClasses").map(
427
+ (entry, index) => parseFailureClassCount(entry, `${source}.failureClasses[${index}]`)
428
+ )
429
+ };
430
+ }
431
+ function parseRecord(value, source) {
432
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
433
+ const failureClass = readOptionalFailureClass(value, source, "failureClass");
434
+ const commands = readArray(value, source, "commands").map(
435
+ (entry, index) => parseCommand(entry, `${source}.commands[${index}]`)
436
+ );
437
+ const record = {
438
+ taskId: readString3(value, source, "taskId"),
439
+ runId: readString3(value, source, "runId"),
440
+ repeatIndex: readNumber(value, source, "repeatIndex"),
441
+ cwd: readString3(value, source, "cwd"),
442
+ prompt: readString3(value, source, "prompt"),
443
+ tags: readStringArray2(value, source, "tags"),
444
+ pass: readBoolean(value, source, "pass"),
445
+ exitCode: readNumber(value, source, "exitCode"),
446
+ tokens: readNumber(value, source, "tokens"),
447
+ costUsd: readNumber(value, source, "costUsd"),
448
+ wallTimeMs: readNumber(value, source, "wallTimeMs"),
449
+ harness: value.harness === void 0 ? evalHarnessMetricsFromCommands(commands) : parseHarnessMetrics(value.harness, `${source}.harness`),
450
+ commands
451
+ };
452
+ if (failureClass !== void 0) record.failureClass = failureClass;
453
+ const receiptPath = readOptionalString(value, source, "receiptPath");
454
+ if (receiptPath !== void 0) record.receiptPath = receiptPath;
455
+ const evidenceId = readOptionalString(value, source, "evidenceId");
456
+ if (evidenceId !== void 0) record.evidenceId = evidenceId;
457
+ const paths = value.paths === void 0 ? void 0 : parseRunPaths(value.paths, `${source}.paths`);
458
+ if (paths !== void 0) record.paths = paths;
459
+ return record;
460
+ }
461
+ function parseClioProvenance(value, source) {
462
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
463
+ return {
464
+ version: readString3(value, source, "version"),
465
+ commit: readNullableString3(value, source, "commit"),
466
+ entry: readString3(value, source, "entry")
467
+ };
468
+ }
469
+ function parseEnvironmentProvenance(value, source) {
470
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
471
+ return {
472
+ platform: readString3(value, source, "platform"),
473
+ node: readString3(value, source, "node")
474
+ };
475
+ }
476
+ function parseArtifactPaths(value, source) {
477
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
478
+ const out = {
479
+ taskFile: readString3(value, source, "taskFile"),
480
+ receipts: readStringArray2(value, source, "receipts"),
481
+ sessionLedgers: readStringArray2(value, source, "sessionLedgers")
482
+ };
483
+ const artifact = readOptionalString(value, source, "artifact");
484
+ if (artifact !== void 0) out.artifact = artifact;
485
+ const evidence = readOptionalString(value, source, "evidence");
486
+ if (evidence !== void 0) out.evidence = evidence;
487
+ return out;
488
+ }
489
+ function parseRunPaths(value, source) {
490
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
491
+ const out = {};
492
+ const receipt = readOptionalString(value, source, "receipt");
493
+ if (receipt !== void 0) out.receipt = receipt;
494
+ const sessionLedger = readOptionalString(value, source, "sessionLedger");
495
+ if (sessionLedger !== void 0) out.sessionLedger = sessionLedger;
496
+ const evidence = readOptionalString(value, source, "evidence");
497
+ if (evidence !== void 0) out.evidence = evidence;
498
+ return out;
499
+ }
500
+ function readRequiredArtifactField(record, source, field) {
501
+ const value = record[field];
502
+ if (value === void 0) {
503
+ throw new Error(
504
+ `eval artifact has an invalid schema: missing required field '${field}' in ${source}. Re-run the evaluation suite to generate a complete artifact.`
505
+ );
506
+ }
507
+ return value;
508
+ }
509
+ function readEvalProvenance(record, source) {
510
+ const value = record.clioCoder ?? record.clio;
511
+ if (value === void 0) {
512
+ throw new Error(
513
+ `eval artifact has an invalid schema: missing required field 'clioCoder' in ${source}. Re-run the evaluation suite to generate a complete artifact.`
514
+ );
515
+ }
516
+ return value;
517
+ }
518
+ function parseHarnessMetrics(value, source) {
519
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
520
+ return {
521
+ receiptCount: readNumber(value, source, "receiptCount"),
522
+ toolCalls: readNumber(value, source, "toolCalls"),
523
+ retries: readNumber(value, source, "retries"),
524
+ safetyBlocks: readNumber(value, source, "safetyBlocks"),
525
+ correctionLatencyMs: readNumber(value, source, "correctionLatencyMs"),
526
+ validationEvidence: readNumber(value, source, "validationEvidence")
527
+ };
528
+ }
529
+ function parseCommand(value, source) {
530
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
531
+ const phase = readString3(value, source, "phase");
532
+ if (phase !== "setup" && phase !== "verifier") throw new Error(`${source}.phase: expected setup or verifier`);
533
+ return {
534
+ phase,
535
+ index: readNumber(value, source, "index"),
536
+ command: readString3(value, source, "command"),
537
+ exitCode: readNumber(value, source, "exitCode"),
538
+ signal: readSignal(value.signal, `${source}.signal`),
539
+ timedOut: readBoolean(value, source, "timedOut"),
540
+ wallTimeMs: readNumber(value, source, "wallTimeMs"),
541
+ stdout: readStringAllowEmpty(value, source, "stdout"),
542
+ stderr: readStringAllowEmpty(value, source, "stderr")
543
+ };
544
+ }
545
+ function readSignal(value, source) {
546
+ if (value === null) return null;
547
+ if (typeof value === "string" && NODE_SIGNALS.has(value)) return value;
548
+ throw new Error(`${source}: expected signal or null`);
549
+ }
550
+ function parseFailureClassCount(value, source) {
551
+ if (!isRecord(value)) throw new Error(`${source}: expected object`);
552
+ return {
553
+ failureClass: readFailureClass(value, source, "failureClass"),
554
+ count: readNumber(value, source, "count")
555
+ };
556
+ }
557
+ function readFailureClass(record, source, field) {
558
+ const value = record[field];
559
+ if (value === "setup_failed" || value === "verifier_failed" || value === "timeout" || value === "cwd_missing" || value === "command_error") {
560
+ return value;
561
+ }
562
+ throw new Error(`${source}.${field}: expected failure class`);
563
+ }
564
+ function readOptionalFailureClass(record, source, field) {
565
+ if (record[field] === void 0) return void 0;
566
+ return readFailureClass(record, source, field);
567
+ }
568
+ function readString3(record, source, field) {
569
+ const value = record[field];
570
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
571
+ return value;
572
+ }
573
+ function readStringAllowEmpty(record, source, field) {
574
+ const value = record[field];
575
+ if (typeof value !== "string") throw new Error(`${source}.${field}: expected string`);
576
+ return value;
577
+ }
578
+ function readOptionalString(record, source, field) {
579
+ const value = record[field];
580
+ if (value === void 0) return void 0;
581
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
582
+ return value;
583
+ }
584
+ function readNullableString3(record, source, field) {
585
+ const value = record[field];
586
+ if (value === null) return null;
587
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
588
+ return value;
589
+ }
590
+ function readOptionalNullableString(record, source, field) {
591
+ const value = record[field];
592
+ if (value === void 0 || value === null) return null;
593
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
594
+ return value;
595
+ }
596
+ function readStringArray2(record, source, field) {
597
+ const value = readArray(record, source, field);
598
+ const out = [];
599
+ for (let index = 0; index < value.length; index += 1) {
600
+ const entry = value[index];
601
+ if (typeof entry !== "string") throw new Error(`${source}.${field}[${index}]: expected string`);
602
+ out.push(entry);
603
+ }
604
+ return out;
605
+ }
606
+ function readNumber(record, source, field) {
607
+ const value = record[field];
608
+ if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`${source}.${field}: expected number`);
609
+ return value;
610
+ }
611
+ function readBoolean(record, source, field) {
612
+ const value = record[field];
613
+ if (typeof value !== "boolean") throw new Error(`${source}.${field}: expected boolean`);
614
+ return value;
615
+ }
616
+ function readArray(record, source, field) {
617
+ const value = record[field];
618
+ if (!Array.isArray(value)) throw new Error(`${source}.${field}: expected array`);
619
+ return value;
620
+ }
621
+ function parseJson(raw, source) {
622
+ try {
623
+ return JSON.parse(raw);
624
+ } catch (error) {
625
+ const message = error instanceof Error ? error.message : String(error);
626
+ throw new Error(`${source}: invalid JSON: ${message}`);
627
+ }
628
+ }
629
+ function isRecord(value) {
630
+ return typeof value === "object" && value !== null && !Array.isArray(value);
631
+ }
632
+ function isErrorWithCode(error) {
633
+ return error instanceof Error && "code" in error && typeof error.code === "string";
634
+ }
635
+
636
+ // src/domains/eval/artifacts/store.ts
637
+ init_esm_shims();
638
+ import { readFile as readFile2 } from "node:fs/promises";
639
+ import { join as join2 } from "node:path";
640
+
641
+ // src/domains/eval/schema/behavioral.ts
642
+ init_esm_shims();
643
+ import { createHash as createHash2 } from "node:crypto";
644
+
645
+ // src/domains/eval/schema/verdict.ts
646
+ init_esm_shims();
647
+ var EVAL_VERDICT_SCHEMA_V1 = "clio-coder.eval.verdict.v1";
648
+ var EVAL_TRACKED_METRIC_NAMES = [
649
+ "modelCalls",
650
+ "uncachedPrefillTokens",
651
+ "cacheReadTokens",
652
+ "generatedTokens",
653
+ "reasoningTokens",
654
+ "toolCalls",
655
+ "toolErrors",
656
+ "ttftMsFirstCall",
657
+ "wallClockMs",
658
+ "contextTokensAtEnd",
659
+ "compactions"
660
+ ];
661
+ function parseEvalVerdictEnvelopeV1(value, source = "verdict") {
662
+ const record = asRecord3(value, source);
663
+ if (normalizeEvalSchemaId(record.schema) !== EVAL_VERDICT_SCHEMA_V1) {
664
+ throw new Error(`${source}.schema: expected ${EVAL_VERDICT_SCHEMA_V1}`);
665
+ }
666
+ const scenarioId = readNonEmptyString(record, source, "scenarioId");
667
+ const trialIndex = readNonNegativeInteger(record, source, "trialIndex");
668
+ const outcome = readOutcome(record.outcome, `${source}.outcome`);
669
+ const machinery = readMachinery(record.machinery, `${source}.machinery`);
670
+ if (machinery === "infrastructure_failure" && outcome === "pass") {
671
+ throw new Error(`${source}: infrastructure_failure cannot carry a pass outcome`);
672
+ }
673
+ if (record.behavioral !== null) throw new Error(`${source}.behavioral: expected null in verdict v1`);
674
+ const evidence = parseEvidence(record.evidence, `${source}.evidence`);
675
+ const reason = record.reason === void 0 ? legacyVerdictReason(outcome, machinery, evidence) : readNullableNonEmptyString(record, source, "reason");
676
+ if (outcome === "fail" && reason === null) throw new Error(`${source}.reason: failed outcome requires a reason`);
677
+ if (outcome !== "fail" && reason !== null) {
678
+ throw new Error(`${source}.reason: only a failed outcome can carry a reason`);
679
+ }
680
+ return {
681
+ schema: EVAL_VERDICT_SCHEMA_V1,
682
+ scenarioId,
683
+ trialIndex,
684
+ outcome,
685
+ machinery,
686
+ reason,
687
+ trackedMetrics: parseTrackedMetrics(record.trackedMetrics, `${source}.trackedMetrics`),
688
+ behavioral: null,
689
+ evidence
690
+ };
691
+ }
692
+ function parseTrackedMetrics(value, source) {
693
+ const record = asRecord3(value, source);
694
+ const expectedColdReasons = asRecord3(record.expectedColdReasons, `${source}.expectedColdReasons`);
695
+ return {
696
+ modelCalls: readSourcedNumber(record.modelCalls, `${source}.modelCalls`),
697
+ uncachedPrefillTokens: readSourcedNumber(record.uncachedPrefillTokens, `${source}.uncachedPrefillTokens`),
698
+ cacheReadTokens: readSourcedNumber(record.cacheReadTokens, `${source}.cacheReadTokens`),
699
+ generatedTokens: readSourcedNumber(record.generatedTokens, `${source}.generatedTokens`),
700
+ reasoningTokens: readSourcedNullableNumber(record.reasoningTokens, `${source}.reasoningTokens`),
701
+ toolCalls: readSourcedNumber(record.toolCalls, `${source}.toolCalls`),
702
+ toolErrors: readSourcedNumber(record.toolErrors, `${source}.toolErrors`),
703
+ ttftMsFirstCall: readSourcedNumber(record.ttftMsFirstCall, `${source}.ttftMsFirstCall`),
704
+ wallClockMs: readSourcedNumber(record.wallClockMs, `${source}.wallClockMs`),
705
+ contextTokensAtEnd: readSourcedNumber(record.contextTokensAtEnd, `${source}.contextTokensAtEnd`),
706
+ compactions: readSourcedNumber(record.compactions, `${source}.compactions`),
707
+ expectedColdReasons: Object.fromEntries(
708
+ Object.entries(expectedColdReasons).map(([reason, metric]) => {
709
+ if (reason.trim().length === 0) throw new Error(`${source}.expectedColdReasons: expected non-empty reason`);
710
+ return [reason, readSourcedNumber(metric, `${source}.expectedColdReasons.${reason}`)];
711
+ })
712
+ )
713
+ };
714
+ }
715
+ function parseEvidence(value, source) {
716
+ const record = asRecord3(value, source);
717
+ const terminalReceiptDigest = readNullableString4(record, source, "terminalReceiptDigest");
718
+ if (terminalReceiptDigest !== null && !/^[a-f0-9]{64}$/u.test(terminalReceiptDigest)) {
719
+ throw new Error(`${source}.terminalReceiptDigest: expected sha256 digest or null`);
720
+ }
721
+ const graderExitCode = record.graderExitCode;
722
+ if (graderExitCode !== null && (!Number.isInteger(graderExitCode) || !Number.isFinite(graderExitCode))) {
723
+ throw new Error(`${source}.graderExitCode: expected integer or null`);
724
+ }
725
+ return {
726
+ assignmentId: readNullableString4(record, source, "assignmentId"),
727
+ terminalReceiptDigest,
728
+ graderExitCode
729
+ };
730
+ }
731
+ function legacyVerdictReason(outcome, machinery, evidence) {
732
+ if (outcome !== "fail") return null;
733
+ if (machinery === "infrastructure_failure") return "infrastructure_failure";
734
+ if (evidence.graderExitCode !== null && evidence.graderExitCode !== 0) return "grader_failed";
735
+ return "outcome_failed";
736
+ }
737
+ function readSourcedNumber(value, source) {
738
+ const record = asRecord3(value, source);
739
+ return {
740
+ value: readNonNegativeNumber(record.value, `${source}.value`),
741
+ source: readMetricSource(record.source, source)
742
+ };
743
+ }
744
+ function readSourcedNullableNumber(value, source) {
745
+ const record = asRecord3(value, source);
746
+ return {
747
+ value: record.value === null ? null : readNonNegativeNumber(record.value, `${source}.value`),
748
+ source: readMetricSource(record.source, source)
749
+ };
750
+ }
751
+ function readMetricSource(value, source) {
752
+ if (value === "ledger" || value === "receipt" || value === "estimated") return value;
753
+ throw new Error(`${source}.source: expected ledger, receipt, or estimated`);
754
+ }
755
+ function readOutcome(value, source) {
756
+ if (value === "pass" || value === "fail" || value === "unmeasured") return value;
757
+ throw new Error(`${source}: expected pass, fail, or unmeasured`);
758
+ }
759
+ function readMachinery(value, source) {
760
+ if (value === "ok" || value === "infrastructure_failure") return value;
761
+ throw new Error(`${source}: expected ok or infrastructure_failure`);
762
+ }
763
+ function readNonNegativeNumber(value, source) {
764
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
765
+ throw new Error(`${source}: expected non-negative number`);
766
+ }
767
+ return value;
768
+ }
769
+ function readNonNegativeInteger(record, source, field) {
770
+ const value = record[field];
771
+ if (!Number.isInteger(value) || typeof value !== "number" || value < 0) {
772
+ throw new Error(`${source}.${field}: expected non-negative integer`);
773
+ }
774
+ return value;
775
+ }
776
+ function readNonEmptyString(record, source, field) {
777
+ const value = record[field];
778
+ if (typeof value !== "string" || value.trim().length === 0) throw new Error(`${source}.${field}: expected string`);
779
+ return value;
780
+ }
781
+ function readNullableString4(record, source, field) {
782
+ const value = record[field];
783
+ if (value === null) return null;
784
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
785
+ return value;
786
+ }
787
+ function readNullableNonEmptyString(record, source, field) {
788
+ const value = readNullableString4(record, source, field);
789
+ if (value !== null && value.trim().length === 0) {
790
+ throw new Error(`${source}.${field}: expected non-empty string or null`);
791
+ }
792
+ return value;
793
+ }
794
+ function asRecord3(value, source) {
795
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value;
796
+ throw new Error(`${source}: expected object`);
797
+ }
798
+
799
+ // src/domains/eval/schema/behavioral.ts
800
+ var EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1 = "clio-coder.eval.scenario.v1";
801
+ var EVAL_BEHAVIOR_SCHEMA_V1 = "clio-coder.eval.behavior.v1";
802
+ var EVAL_BEHAVIOR_CATEGORIES = [
803
+ "tool_choice",
804
+ "exploration",
805
+ "delegation",
806
+ "safety_comprehension",
807
+ "claim_grounding",
808
+ "denied_tool_recovery",
809
+ "completion_behavior",
810
+ "task_correctness"
811
+ ];
812
+ var MAX_RULES = 64;
813
+ var MAX_FACTS = 128;
814
+ var MAX_EVIDENCE_PER_LABEL = 8;
815
+ var MAX_ID_CHARS = 128;
816
+ var MAX_TEXT_CHARS = 1e3;
817
+ var MAX_EXPLANATION_CHARS = 2e3;
818
+ function parseEvalBehaviorScenarioV1(value, source = "behavioral scenario") {
819
+ const record = asRecord4(value, source);
820
+ if (normalizeEvalSchemaId(record.schema) !== EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1) {
821
+ throw new Error(`${source}.schema: expected ${EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1}`);
822
+ }
823
+ const corpus = asRecord4(record.corpus, `${source}.corpus`);
824
+ const execution = asRecord4(record.execution, `${source}.execution`);
825
+ const subject = asRecord4(execution.subject, `${source}.execution.subject`);
826
+ const mode = execution.mode;
827
+ if (mode !== "machinery-only" && mode !== "model-required") {
828
+ throw new Error(`${source}.execution.mode: expected machinery-only or model-required`);
829
+ }
830
+ const subjectKind = subject.kind;
831
+ if (subjectKind !== "main-agent" && subjectKind !== "worker") {
832
+ throw new Error(`${source}.execution.subject.kind: expected main-agent or worker`);
833
+ }
834
+ const toolTarget = execution.toolTarget;
835
+ if (toolTarget !== "available" && toolTarget !== "none") {
836
+ throw new Error(`${source}.execution.toolTarget: expected available or none`);
837
+ }
838
+ const expectedBehavior = parseRules(record.expectedBehavior, `${source}.expectedBehavior`);
839
+ const forbiddenBehavior = parseRules(record.forbiddenBehavior, `${source}.forbiddenBehavior`);
840
+ const ruleIds = /* @__PURE__ */ new Set();
841
+ for (const rule of [...expectedBehavior, ...forbiddenBehavior]) {
842
+ if (ruleIds.has(rule.id)) throw new Error(`${source}: duplicate behavioral rule id ${rule.id}`);
843
+ ruleIds.add(rule.id);
844
+ }
845
+ if (ruleIds.size === 0) throw new Error(`${source}: expected at least one behavioral rule`);
846
+ const judge = asRecord4(record.judge, `${source}.judge`);
847
+ const maxEvidenceItems = readBoundedInteger(judge.maxEvidenceItems, `${source}.judge.maxEvidenceItems`, 1, MAX_FACTS);
848
+ const maxExplanationChars = readBoundedInteger(
849
+ judge.maxExplanationChars,
850
+ `${source}.judge.maxExplanationChars`,
851
+ 1,
852
+ MAX_EXPLANATION_CHARS
853
+ );
854
+ return {
855
+ schema: EVAL_BEHAVIOR_SCENARIO_SCHEMA_V1,
856
+ corpus: {
857
+ id: readId(corpus.id, `${source}.corpus.id`),
858
+ version: readText(corpus.version, `${source}.corpus.version`, MAX_ID_CHARS)
859
+ },
860
+ execution: {
861
+ mode,
862
+ subject: { kind: subjectKind, role: readId(subject.role, `${source}.execution.subject.role`) },
863
+ toolTarget
864
+ },
865
+ expectedBehavior,
866
+ forbiddenBehavior,
867
+ judge: { maxEvidenceItems, maxExplanationChars }
868
+ };
869
+ }
870
+ function canonicalizeEvalBehaviorJudgeInputV1(value, scenario, source = "behavioral judge input") {
871
+ const record = asRecord4(value, source);
872
+ if (!Array.isArray(record.facts)) throw new Error(`${source}.facts: expected array`);
873
+ if (record.facts.length > scenario.judge.maxEvidenceItems || record.facts.length > MAX_FACTS) {
874
+ throw new Error(`${source}.facts: exceeds bounded evidence limit`);
875
+ }
876
+ const facts = record.facts.map((fact, index) => parseFact(fact, `${source}.facts[${index}]`));
877
+ const factIds = /* @__PURE__ */ new Set();
878
+ const factKeys = /* @__PURE__ */ new Set();
879
+ for (const fact of facts) {
880
+ if (factIds.has(fact.id)) throw new Error(`${source}: duplicate fact id ${fact.id}`);
881
+ const key = `${fact.source}\0${fact.key}`;
882
+ if (factKeys.has(key)) throw new Error(`${source}: conflicting fact ${fact.source}.${fact.key}`);
883
+ factIds.add(fact.id);
884
+ factKeys.add(key);
885
+ }
886
+ const unavailableSources = parseSources(record.unavailableSources, `${source}.unavailableSources`);
887
+ const infrastructureFailure = record.infrastructureFailure;
888
+ if (typeof infrastructureFailure !== "boolean") {
889
+ throw new Error(`${source}.infrastructureFailure: expected boolean`);
890
+ }
891
+ const input = {
892
+ facts: facts.sort((left, right) => left.source.localeCompare(right.source) || left.key.localeCompare(right.key)),
893
+ unavailableSources: [...new Set(unavailableSources)].sort(),
894
+ infrastructureFailure
895
+ };
896
+ return { input, digest: sha256(stableJson(input)) };
897
+ }
898
+ function judgeEvalBehaviorV1(scenarioValue, verdict, inputValue) {
899
+ const scenario = parseEvalBehaviorScenarioV1(scenarioValue);
900
+ const { input, digest } = canonicalizeEvalBehaviorJudgeInputV1(inputValue, scenario);
901
+ const labels = EVAL_BEHAVIOR_CATEGORIES.map(
902
+ (category) => judgeCategory(category, scenario, input, scenario.judge.maxExplanationChars)
903
+ );
904
+ const outcome = input.infrastructureFailure ? "infrastructure_failure" : labels.some((label) => label.label === "violated") ? "behavioral_failure" : labels.some((label) => label.label === "unknown") ? "unknown" : labels.every((label) => label.label === "unmeasured") ? "unmeasured" : "pass";
905
+ return parseEvalBehaviorVerdictV1({
906
+ schema: EVAL_BEHAVIOR_SCHEMA_V1,
907
+ verdictRef: {
908
+ schema: verdict.schema,
909
+ scenarioId: verdict.scenarioId,
910
+ trialIndex: verdict.trialIndex
911
+ },
912
+ corpus: scenario.corpus,
913
+ judgeInputDigest: digest,
914
+ outcome,
915
+ labels
916
+ });
917
+ }
918
+ function parseEvalBehaviorVerdictV1(value, source = "behavioral verdict") {
919
+ const record = asRecord4(value, source);
920
+ if (normalizeEvalSchemaId(record.schema) !== EVAL_BEHAVIOR_SCHEMA_V1)
921
+ throw new Error(`${source}.schema: expected ${EVAL_BEHAVIOR_SCHEMA_V1}`);
922
+ const verdictRef = asRecord4(record.verdictRef, `${source}.verdictRef`);
923
+ if (normalizeEvalSchemaId(verdictRef.schema) !== EVAL_VERDICT_SCHEMA_V1) {
924
+ throw new Error(`${source}.verdictRef.schema: expected ${EVAL_VERDICT_SCHEMA_V1}`);
925
+ }
926
+ const corpus = asRecord4(record.corpus, `${source}.corpus`);
927
+ const outcome = readOutcome2(record.outcome, `${source}.outcome`);
928
+ if (!Array.isArray(record.labels)) throw new Error(`${source}.labels: expected array`);
929
+ const labels = record.labels.map((label, index) => parseLabel(label, `${source}.labels[${index}]`));
930
+ const categories = labels.map((label) => label.category);
931
+ if (labels.length !== EVAL_BEHAVIOR_CATEGORIES.length || new Set(categories).size !== EVAL_BEHAVIOR_CATEGORIES.length) {
932
+ throw new Error(`${source}.labels: expected every behavioral category exactly once`);
933
+ }
934
+ for (const category of EVAL_BEHAVIOR_CATEGORIES) {
935
+ if (!categories.includes(category)) throw new Error(`${source}.labels: missing category ${category}`);
936
+ }
937
+ const derived = deriveOutcome(labels, outcome === "infrastructure_failure");
938
+ if (outcome !== derived) throw new Error(`${source}.outcome: ${outcome} conflicts with labels (expected ${derived})`);
939
+ return {
940
+ schema: EVAL_BEHAVIOR_SCHEMA_V1,
941
+ verdictRef: {
942
+ schema: EVAL_VERDICT_SCHEMA_V1,
943
+ scenarioId: readId(verdictRef.scenarioId, `${source}.verdictRef.scenarioId`),
944
+ trialIndex: readBoundedInteger(verdictRef.trialIndex, `${source}.verdictRef.trialIndex`, 0, Number.MAX_SAFE_INTEGER)
945
+ },
946
+ corpus: {
947
+ id: readId(corpus.id, `${source}.corpus.id`),
948
+ version: readText(corpus.version, `${source}.corpus.version`, MAX_ID_CHARS)
949
+ },
950
+ judgeInputDigest: readDigest2(record.judgeInputDigest, `${source}.judgeInputDigest`),
951
+ outcome,
952
+ labels
953
+ };
954
+ }
955
+ function assertEvalBehaviorReferencesVerdictV1(behavior, verdict, source = "behavioral verdict") {
956
+ if (behavior.verdictRef.scenarioId !== verdict.scenarioId || behavior.verdictRef.trialIndex !== verdict.trialIndex) {
957
+ throw new Error(`${source}.verdictRef: conflicts with result verdict identity`);
958
+ }
959
+ if (verdict.machinery === "infrastructure_failure" && behavior.outcome !== "infrastructure_failure") {
960
+ throw new Error(`${source}.outcome: machinery failure must remain infrastructure_failure`);
961
+ }
962
+ if (behavior.outcome === "pass" && verdict.outcome !== "pass") {
963
+ throw new Error(`${source}.outcome: behavioral pass cannot override a failed or unmeasured result`);
964
+ }
965
+ }
966
+ function judgeCategory(category, scenario, input, maxExplanationChars) {
967
+ const expected = scenario.expectedBehavior.filter((rule) => rule.category === category);
968
+ const forbidden = scenario.forbiddenBehavior.filter((rule) => rule.category === category);
969
+ const rules = [...expected, ...forbidden];
970
+ if (input.infrastructureFailure)
971
+ return labelResult(category, "unknown", rules, [], "infrastructure failure", maxExplanationChars);
972
+ if (rules.length === 0) return labelResult(category, "unmeasured", [], [], null, maxExplanationChars);
973
+ const unavailable = rules.some((rule) => input.unavailableSources.includes(rule.fact.source));
974
+ if (unavailable)
975
+ return labelResult(category, "unmeasured", rules, [], "required evidence source unavailable", maxExplanationChars);
976
+ const evaluations = rules.map((rule) => {
977
+ const fact = input.facts.find(
978
+ (candidate) => candidate.source === rule.fact.source && candidate.key === rule.fact.key
979
+ );
980
+ if (fact === void 0) return { rule, fact: null, holds: null };
981
+ const matches = compare(fact.value, rule.fact.op, rule.fact.value);
982
+ return { rule, fact, holds: expected.includes(rule) ? matches : !matches };
983
+ });
984
+ const evidence = evaluations.flatMap(({ fact }) => fact === null ? [] : [toEvidence(fact)]).slice(0, MAX_EVIDENCE_PER_LABEL);
985
+ if (evaluations.some(({ holds }) => holds === false)) {
986
+ return labelResult(category, "violated", rules, evidence, "one or more declared rules failed", maxExplanationChars);
987
+ }
988
+ if (evaluations.some(({ holds }) => holds === null)) {
989
+ return labelResult(category, "unknown", rules, evidence, "required observable fact missing", maxExplanationChars);
990
+ }
991
+ return labelResult(category, "satisfied", rules, evidence, null, maxExplanationChars);
992
+ }
993
+ function labelResult(category, label, rules, evidence, explanation, maxExplanationChars) {
994
+ return {
995
+ category,
996
+ label,
997
+ ruleIds: rules.map((rule) => rule.id).sort(),
998
+ evidence,
999
+ explanation: explanation === null ? null : explanation.slice(0, maxExplanationChars)
1000
+ };
1001
+ }
1002
+ function deriveOutcome(labels, infrastructure) {
1003
+ if (infrastructure) return "infrastructure_failure";
1004
+ if (labels.some((label) => label.label === "violated")) return "behavioral_failure";
1005
+ if (labels.some((label) => label.label === "unknown")) return "unknown";
1006
+ if (labels.every((label) => label.label === "unmeasured")) return "unmeasured";
1007
+ return "pass";
1008
+ }
1009
+ function parseRules(value, source) {
1010
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
1011
+ if (value.length > MAX_RULES) throw new Error(`${source}: exceeds ${MAX_RULES} rules`);
1012
+ return value.map((entry, index) => {
1013
+ const record = asRecord4(entry, `${source}[${index}]`);
1014
+ const fact = asRecord4(record.fact, `${source}[${index}].fact`);
1015
+ const rationale = record.rationale === void 0 ? void 0 : readText(record.rationale, `${source}[${index}].rationale`, MAX_TEXT_CHARS);
1016
+ return {
1017
+ id: readId(record.id, `${source}[${index}].id`),
1018
+ category: readCategory(record.category, `${source}[${index}].category`),
1019
+ fact: {
1020
+ source: readSource(fact.source, `${source}[${index}].fact.source`),
1021
+ key: readText(fact.key, `${source}[${index}].fact.key`, MAX_TEXT_CHARS),
1022
+ op: readOp(fact.op, `${source}[${index}].fact.op`),
1023
+ value: readScalar(fact.value, `${source}[${index}].fact.value`)
1024
+ },
1025
+ ...rationale === void 0 ? {} : { rationale }
1026
+ };
1027
+ });
1028
+ }
1029
+ function parseFact(value, source) {
1030
+ const record = asRecord4(value, source);
1031
+ const evidence = asRecord4(record.evidence, `${source}.evidence`);
1032
+ return {
1033
+ id: readId(record.id, `${source}.id`),
1034
+ source: readSource(record.source, `${source}.source`),
1035
+ key: readText(record.key, `${source}.key`, MAX_TEXT_CHARS),
1036
+ value: readScalar(record.value, `${source}.value`),
1037
+ evidence: {
1038
+ locator: readText(evidence.locator, `${source}.evidence.locator`, MAX_TEXT_CHARS),
1039
+ digest: readDigest2(evidence.digest, `${source}.evidence.digest`),
1040
+ excerpt: evidence.excerpt === null ? null : readText(evidence.excerpt, `${source}.evidence.excerpt`, MAX_TEXT_CHARS)
1041
+ }
1042
+ };
1043
+ }
1044
+ function parseLabel(value, source) {
1045
+ const record = asRecord4(value, source);
1046
+ const label = record.label;
1047
+ if (label !== "satisfied" && label !== "violated" && label !== "unknown" && label !== "unmeasured") {
1048
+ throw new Error(`${source}.label: expected satisfied, violated, unknown, or unmeasured`);
1049
+ }
1050
+ if (!Array.isArray(record.ruleIds) || !Array.isArray(record.evidence)) {
1051
+ throw new Error(`${source}: expected ruleIds and evidence arrays`);
1052
+ }
1053
+ if (record.evidence.length > MAX_EVIDENCE_PER_LABEL) throw new Error(`${source}.evidence: exceeds bounded limit`);
1054
+ if ((label === "satisfied" || label === "violated") && (record.ruleIds.length === 0 || record.evidence.length === 0)) {
1055
+ throw new Error(`${source}: ${label} label requires a rule and observable evidence`);
1056
+ }
1057
+ const explanation = record.explanation;
1058
+ if (explanation !== null && (typeof explanation !== "string" || explanation.length > MAX_EXPLANATION_CHARS)) {
1059
+ throw new Error(`${source}.explanation: expected bounded string or null`);
1060
+ }
1061
+ return {
1062
+ category: readCategory(record.category, `${source}.category`),
1063
+ label,
1064
+ ruleIds: record.ruleIds.map((id, index) => readId(id, `${source}.ruleIds[${index}]`)),
1065
+ evidence: record.evidence.map((entry, index) => {
1066
+ const evidence = asRecord4(entry, `${source}.evidence[${index}]`);
1067
+ return {
1068
+ factId: readId(evidence.factId, `${source}.evidence[${index}].factId`),
1069
+ source: readSource(evidence.source, `${source}.evidence[${index}].source`),
1070
+ locator: readText(evidence.locator, `${source}.evidence[${index}].locator`, MAX_TEXT_CHARS),
1071
+ digest: readDigest2(evidence.digest, `${source}.evidence[${index}].digest`),
1072
+ excerpt: evidence.excerpt === null ? null : readText(evidence.excerpt, `${source}.evidence[${index}].excerpt`, MAX_TEXT_CHARS)
1073
+ };
1074
+ }),
1075
+ explanation
1076
+ };
1077
+ }
1078
+ function toEvidence(fact) {
1079
+ return { factId: fact.id, source: fact.source, ...fact.evidence };
1080
+ }
1081
+ function compare(actual, op, expected) {
1082
+ if (op === "eq") return actual === expected;
1083
+ if (op === "neq") return actual !== expected;
1084
+ if (typeof actual !== "number" || typeof expected !== "number") return false;
1085
+ if (op === "lt") return actual < expected;
1086
+ if (op === "lte") return actual <= expected;
1087
+ if (op === "gt") return actual > expected;
1088
+ return actual >= expected;
1089
+ }
1090
+ function parseSources(value, source) {
1091
+ if (!Array.isArray(value)) throw new Error(`${source}: expected array`);
1092
+ return value.map((entry, index) => readSource(entry, `${source}[${index}]`));
1093
+ }
1094
+ function readOutcome2(value, source) {
1095
+ if (value === "pass" || value === "behavioral_failure" || value === "unknown" || value === "unmeasured" || value === "infrastructure_failure")
1096
+ return value;
1097
+ throw new Error(`${source}: expected a closed behavioral outcome`);
1098
+ }
1099
+ function readCategory(value, source) {
1100
+ if (typeof value === "string" && EVAL_BEHAVIOR_CATEGORIES.includes(value)) {
1101
+ return value;
1102
+ }
1103
+ throw new Error(`${source}: expected a closed behavioral category`);
1104
+ }
1105
+ function readSource(value, source) {
1106
+ if (value === "transcript" || value === "tool" || value === "receipt" || value === "grader") return value;
1107
+ throw new Error(`${source}: expected transcript, tool, receipt, or grader`);
1108
+ }
1109
+ function readOp(value, source) {
1110
+ if (value === "eq" || value === "neq" || value === "lt" || value === "lte" || value === "gt" || value === "gte") {
1111
+ return value;
1112
+ }
1113
+ throw new Error(`${source}: expected eq, neq, lt, lte, gt, or gte`);
1114
+ }
1115
+ function readScalar(value, source) {
1116
+ if (typeof value === "boolean") return value;
1117
+ if (typeof value === "number" && Number.isFinite(value)) return value;
1118
+ if (typeof value === "string" && value.length <= MAX_TEXT_CHARS) return value;
1119
+ throw new Error(`${source}: expected bounded string, finite number, or boolean`);
1120
+ }
1121
+ function readId(value, source) {
1122
+ const id = readText(value, source, MAX_ID_CHARS);
1123
+ if (!/^[A-Za-z0-9._-]+$/u.test(id)) throw new Error(`${source}: expected stable id`);
1124
+ return id;
1125
+ }
1126
+ function readText(value, source, maxChars) {
1127
+ if (typeof value !== "string" || value.trim().length === 0 || value.length > maxChars) {
1128
+ throw new Error(`${source}: expected non-empty string no longer than ${maxChars} characters`);
1129
+ }
1130
+ return value;
1131
+ }
1132
+ function readDigest2(value, source) {
1133
+ if (typeof value !== "string" || !/^[a-f0-9]{64}$/u.test(value)) throw new Error(`${source}: expected sha256 digest`);
1134
+ return value;
1135
+ }
1136
+ function readBoundedInteger(value, source, min, max) {
1137
+ if (typeof value !== "number" || !Number.isInteger(value) || value < min || value > max) {
1138
+ throw new Error(`${source}: expected integer from ${min} through ${max}`);
1139
+ }
1140
+ return value;
1141
+ }
1142
+ function asRecord4(value, source) {
1143
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value;
1144
+ throw new Error(`${source}: expected object`);
1145
+ }
1146
+ function stableJson(value) {
1147
+ if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
1148
+ if (typeof value === "object" && value !== null) {
1149
+ return `{${Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`).join(",")}}`;
1150
+ }
1151
+ return JSON.stringify(value);
1152
+ }
1153
+ function sha256(value) {
1154
+ return createHash2("sha256").update(value, "utf8").digest("hex");
1155
+ }
1156
+
1157
+ // src/domains/eval/schema/behavioral-metrics.ts
1158
+ init_esm_shims();
1159
+ var EVAL_BEHAVIOR_METRICS_SCHEMA_V1 = "clio-coder.eval.behavior.metrics.v1";
1160
+ var EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1 = [
1161
+ {
1162
+ name: "correctness.taskSolved",
1163
+ family: "correctness",
1164
+ direction: "higher",
1165
+ hardGate: true,
1166
+ source: "grader"
1167
+ },
1168
+ {
1169
+ name: "safety.violations",
1170
+ family: "safety",
1171
+ direction: "lower",
1172
+ hardGate: true,
1173
+ source: "behavioral-label"
1174
+ },
1175
+ {
1176
+ name: "behavior.labelViolations",
1177
+ family: "behavior",
1178
+ direction: "lower",
1179
+ hardGate: false,
1180
+ source: "behavioral-label"
1181
+ },
1182
+ {
1183
+ name: "efficiency.toolCalls",
1184
+ family: "efficiency",
1185
+ direction: "lower",
1186
+ hardGate: false,
1187
+ source: "tool-event"
1188
+ },
1189
+ {
1190
+ name: "exploration.unnecessaryReads",
1191
+ family: "exploration",
1192
+ direction: "lower",
1193
+ hardGate: false,
1194
+ source: "tool-event"
1195
+ },
1196
+ {
1197
+ name: "delegation.quality",
1198
+ family: "delegation",
1199
+ direction: "higher",
1200
+ hardGate: false,
1201
+ source: "behavioral-label"
1202
+ },
1203
+ {
1204
+ name: "claims.unsupported",
1205
+ family: "claims",
1206
+ direction: "lower",
1207
+ hardGate: false,
1208
+ source: "grader"
1209
+ },
1210
+ {
1211
+ name: "tokens.total",
1212
+ family: "tokens",
1213
+ direction: "lower",
1214
+ hardGate: false,
1215
+ source: "runner"
1216
+ },
1217
+ {
1218
+ name: "latency.wallMs",
1219
+ family: "latency",
1220
+ direction: "lower",
1221
+ hardGate: false,
1222
+ source: "runner"
1223
+ },
1224
+ {
1225
+ name: "cost.usd",
1226
+ family: "cost",
1227
+ direction: "lower",
1228
+ hardGate: false,
1229
+ source: "receipt"
1230
+ }
1231
+ ];
1232
+ function buildEvalBehaviorMetricsV1(result, role) {
1233
+ const label = (category) => result.behavioral?.labels.find((entry) => entry.category === category)?.label ?? null;
1234
+ const observedLabels = result.behavioral?.labels.filter(
1235
+ (entry) => entry.label === "satisfied" || entry.label === "violated"
1236
+ );
1237
+ const values = {
1238
+ "correctness.taskSolved": booleanMetric(result.metrics["task.solved"]),
1239
+ "safety.violations": violationMetric(label("safety_comprehension")),
1240
+ "behavior.labelViolations": observedLabels === void 0 || observedLabels.length !== result.behavioral?.labels.length ? null : observedLabels.filter((entry) => entry.label === "violated").length,
1241
+ "efficiency.toolCalls": numberMetric(result.metrics["tools.totalCalls"]),
1242
+ "exploration.unnecessaryReads": numberMetric(result.metrics["tools.read.outsideAllowed"]),
1243
+ "delegation.quality": qualityMetric(label("delegation")),
1244
+ "claims.unsupported": numberMetric(result.metrics["claims.unsupported"]),
1245
+ "tokens.total": numberMetric(result.metrics["tokens.total"]),
1246
+ "latency.wallMs": numberMetric(result.metrics["latency.wallMs"]),
1247
+ "cost.usd": numberMetric(result.metrics["cost.usd"])
1248
+ };
1249
+ const metrics = Object.fromEntries(
1250
+ EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1.map((definition) => [
1251
+ definition.name,
1252
+ { value: values[definition.name], source: definition.source }
1253
+ ])
1254
+ );
1255
+ return {
1256
+ schema: EVAL_BEHAVIOR_METRICS_SCHEMA_V1,
1257
+ scenarioId: result.taskId,
1258
+ role,
1259
+ target: { id: result.target.id, model: result.target.model },
1260
+ metrics
1261
+ };
1262
+ }
1263
+ function parseEvalBehaviorMetricsV1(value, source = "behavioral metrics") {
1264
+ const record = asRecord5(value, source);
1265
+ if (normalizeEvalSchemaId(record.schema) !== EVAL_BEHAVIOR_METRICS_SCHEMA_V1) {
1266
+ throw new Error(`${source}.schema: expected ${EVAL_BEHAVIOR_METRICS_SCHEMA_V1}`);
1267
+ }
1268
+ const target = asRecord5(record.target, `${source}.target`);
1269
+ const rawMetrics = asRecord5(record.metrics, `${source}.metrics`);
1270
+ const expectedMetricNames = new Set(EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1.map((definition) => definition.name));
1271
+ for (const metricName of Object.keys(rawMetrics)) {
1272
+ if (!expectedMetricNames.has(metricName)) {
1273
+ throw new Error(`${source}.metrics.${metricName}: unknown behavioral metric`);
1274
+ }
1275
+ }
1276
+ const metrics = Object.fromEntries(
1277
+ EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1.map((definition) => {
1278
+ const observation = asRecord5(rawMetrics[definition.name], `${source}.metrics.${definition.name}`);
1279
+ const metricSource = observation.source;
1280
+ if (metricSource !== definition.source) {
1281
+ throw new Error(`${source}.metrics.${definition.name}.source: expected ${definition.source}`);
1282
+ }
1283
+ const metricValue = observation.value;
1284
+ if (metricValue !== null && (typeof metricValue !== "number" || !Number.isFinite(metricValue))) {
1285
+ throw new Error(`${source}.metrics.${definition.name}.value: expected finite number or null`);
1286
+ }
1287
+ return [definition.name, { value: metricValue, source: metricSource }];
1288
+ })
1289
+ );
1290
+ return {
1291
+ schema: EVAL_BEHAVIOR_METRICS_SCHEMA_V1,
1292
+ scenarioId: readString4(record.scenarioId, `${source}.scenarioId`),
1293
+ role: readString4(record.role, `${source}.role`),
1294
+ target: {
1295
+ id: readString4(target.id, `${source}.target.id`),
1296
+ model: target.model === null ? null : readString4(target.model, `${source}.target.model`)
1297
+ },
1298
+ metrics
1299
+ };
1300
+ }
1301
+ function numberMetric(value) {
1302
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
1303
+ }
1304
+ function booleanMetric(value) {
1305
+ return typeof value === "boolean" ? value ? 1 : 0 : null;
1306
+ }
1307
+ function violationMetric(label) {
1308
+ if (label === "violated") return 1;
1309
+ if (label === "satisfied") return 0;
1310
+ return null;
1311
+ }
1312
+ function qualityMetric(label) {
1313
+ if (label === "satisfied") return 1;
1314
+ if (label === "violated") return 0;
1315
+ return null;
1316
+ }
1317
+ function asRecord5(value, source) {
1318
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) return value;
1319
+ throw new Error(`${source}: expected object`);
1320
+ }
1321
+ function readString4(value, source) {
1322
+ if (typeof value === "string" && value.length > 0) return value;
1323
+ throw new Error(`${source}: expected non-empty string`);
1324
+ }
1325
+
1326
+ // src/domains/eval/artifacts/store.ts
1327
+ function evalArtifactPathV4(dataDir, evalId) {
1328
+ assertSafeId(evalId, "eval");
1329
+ return join2(evalRoot(dataDir), `${evalId}.json`);
1330
+ }
1331
+ async function writeEvalArtifactV4(dataDir, artifact, out) {
1332
+ const path = out === void 0 ? evalArtifactPathV4(dataDir, artifact.evalId) : out.endsWith(".json") ? out : join2(out, `${artifact.evalId}.json`);
1333
+ safeResourceWrite(path, `${JSON.stringify(redactArtifactForStorage(artifact), null, 2)}
1334
+ `, { encoding: "utf8" });
1335
+ return path;
1336
+ }
1337
+ async function loadEvalArtifactV4(dataDir, evalId) {
1338
+ let raw;
1339
+ try {
1340
+ raw = await readFile2(evalArtifactPathV4(dataDir, evalId), "utf8");
1341
+ } catch (error) {
1342
+ if (error.code === "ENOENT") throw new Error(`eval artifact not found: ${evalId}`);
1343
+ throw error;
1344
+ }
1345
+ return parseEvalArtifactV4(JSON.parse(raw), evalId);
1346
+ }
1347
+ function parseEvalArtifactV4(value, source) {
1348
+ if (!isRecord2(value)) throw new Error(`${source}: expected object`);
1349
+ if (value.version !== 4) throw new Error(`${source}.version: expected current version 4`);
1350
+ const summary = asRecord6(value.summary, `${source}.summary`);
1351
+ const matrix = asRecord6(value.matrix, `${source}.matrix`);
1352
+ const suite = asRecord6(value.suite, `${source}.suite`);
1353
+ const servingConfiguration = value.servingConfiguration === void 0 ? void 0 : parseEvalServingConfigurationV1(value.servingConfiguration, `${source}.servingConfiguration`);
1354
+ const aggregates = value.aggregates === void 0 ? void 0 : readArray2(value, source, "aggregates");
1355
+ const clioCoder = asRecord6(value.clioCoder ?? value.clio, `${source}.clioCoder`);
1356
+ return {
1357
+ version: 4,
1358
+ evalId: readString5(value, source, "evalId"),
1359
+ suite: { id: readString5(suite, `${source}.suite`, "id"), hash: readString5(suite, `${source}.suite`, "hash") },
1360
+ clioCoder: {
1361
+ version: readString5(clioCoder, `${source}.clioCoder`, "version"),
1362
+ commit: readNullableString5(clioCoder, `${source}.clioCoder`, "commit"),
1363
+ entry: readString5(clioCoder, `${source}.clioCoder`, "entry")
1364
+ },
1365
+ environment: {
1366
+ platform: readString5(asRecord6(value.environment, `${source}.environment`), `${source}.environment`, "platform"),
1367
+ node: readString5(asRecord6(value.environment, `${source}.environment`), `${source}.environment`, "node")
1368
+ },
1369
+ matrix: {
1370
+ target: readString5(matrix, `${source}.matrix`, "target"),
1371
+ model: readNullableString5(matrix, `${source}.matrix`, "model"),
1372
+ thinking: readNullableString5(matrix, `${source}.matrix`, "thinking"),
1373
+ ...matrix.dimensions === void 0 ? {} : { dimensions: parseEvalExecutionMatrixDimensionsV1(matrix.dimensions, `${source}.matrix.dimensions`) }
1374
+ },
1375
+ ...servingConfiguration === void 0 ? {} : { servingConfiguration },
1376
+ summary: {
1377
+ runs: readNumber2(summary, `${source}.summary`, "runs"),
1378
+ passed: readNumber2(summary, `${source}.summary`, "passed"),
1379
+ failed: readNumber2(summary, `${source}.summary`, "failed"),
1380
+ passRate: readNumber2(summary, `${source}.summary`, "passRate"),
1381
+ tokens: parseTokenAccounting(summary.tokens, `${source}.summary.tokens`),
1382
+ wallTimeMs: readNumber2(summary, `${source}.summary`, "wallTimeMs")
1383
+ },
1384
+ ...aggregates === void 0 ? {} : { aggregates },
1385
+ results: readArray2(value, source, "results").map((entry, index) => parseResult(entry, `${source}.results[${index}]`))
1386
+ };
1387
+ }
1388
+ function parseTokenAccounting(value, source) {
1389
+ const record = asRecord6(value, source);
1390
+ const measured = readBoolean2(record, source, "measured");
1391
+ const runs = readNumber2(record, source, "runs");
1392
+ const measuredRuns = readNumber2(record, source, "measuredRuns");
1393
+ const countFields = ["input", "output", "total", "cacheRead", "cacheWrite"];
1394
+ if (!measured) {
1395
+ if (measuredRuns !== 0) throw new Error(`${source}.measuredRuns: expected 0 when unmeasured`);
1396
+ const present = countFields.filter((field) => field in record);
1397
+ if (present.length > 0) throw new Error(`${source}: unmeasured accounting carries no counts (${present.join(", ")})`);
1398
+ return { measured: false, runs, measuredRuns: 0 };
1399
+ }
1400
+ if (measuredRuns <= 0) throw new Error(`${source}.measuredRuns: expected a positive count when measured`);
1401
+ return {
1402
+ measured: true,
1403
+ runs,
1404
+ measuredRuns,
1405
+ input: readNumber2(record, source, "input"),
1406
+ output: readNumber2(record, source, "output"),
1407
+ total: readNumber2(record, source, "total"),
1408
+ cacheRead: readNumber2(record, source, "cacheRead"),
1409
+ cacheWrite: readNumber2(record, source, "cacheWrite")
1410
+ };
1411
+ }
1412
+ function parseResult(value, source) {
1413
+ const record = asRecord6(value, source);
1414
+ const target = asRecord6(record.target, `${source}.target`);
1415
+ const verdict = record.verdict === void 0 ? void 0 : parseEvalVerdictEnvelopeV1(record.verdict, `${source}.verdict`);
1416
+ const behavioral = record.behavioral === void 0 ? void 0 : parseEvalBehaviorVerdictV1(record.behavioral, `${source}.behavioral`);
1417
+ const behavioralMetrics = record.behavioralMetrics === void 0 ? void 0 : parseEvalBehaviorMetricsV1(record.behavioralMetrics, `${source}.behavioralMetrics`);
1418
+ const executionEnvelope = record.executionEnvelope === void 0 ? void 0 : parseEvalExecutionEnvelopeV1(record.executionEnvelope, `${source}.executionEnvelope`);
1419
+ if (behavioral !== void 0 && verdict === void 0) {
1420
+ throw new Error(`${source}.behavioral: sibling document requires a verdict`);
1421
+ }
1422
+ if (behavioral !== void 0 && verdict !== void 0) {
1423
+ assertEvalBehaviorReferencesVerdictV1(behavioral, verdict, `${source}.behavioral`);
1424
+ }
1425
+ if (behavioralMetrics !== void 0) {
1426
+ if (behavioral === void 0) throw new Error(`${source}.behavioralMetrics: requires a behavioral verdict`);
1427
+ if (behavioralMetrics.scenarioId !== readString5(record, source, "taskId")) {
1428
+ throw new Error(`${source}.behavioralMetrics.scenarioId: conflicts with result taskId`);
1429
+ }
1430
+ if (behavioralMetrics.target.id !== readString5(target, `${source}.target`, "id") || behavioralMetrics.target.model !== readNullableString5(target, `${source}.target`, "model")) {
1431
+ throw new Error(`${source}.behavioralMetrics.target: conflicts with result target`);
1432
+ }
1433
+ }
1434
+ if (executionEnvelope !== void 0) {
1435
+ if (behavioral === void 0) throw new Error(`${source}.executionEnvelope: requires a behavioral verdict`);
1436
+ if (executionEnvelope.target !== readString5(target, `${source}.target`, "id") || executionEnvelope.corpus.id !== behavioral.corpus.id || executionEnvelope.corpus.version !== behavioral.corpus.version) {
1437
+ throw new Error(`${source}.executionEnvelope: conflicts with result target or behavioral corpus`);
1438
+ }
1439
+ }
1440
+ return {
1441
+ assignmentId: readNullableString5(record, source, "assignmentId"),
1442
+ terminalReceiptDigest: readNullableDigest2(record, source, "terminalReceiptDigest"),
1443
+ taskId: readString5(record, source, "taskId"),
1444
+ repeatIndex: readNumber2(record, source, "repeatIndex"),
1445
+ target: {
1446
+ id: readString5(target, `${source}.target`, "id"),
1447
+ model: readNullableString5(target, `${source}.target`, "model"),
1448
+ thinking: readNullableString5(target, `${source}.target`, "thinking")
1449
+ },
1450
+ pass: readBoolean2(record, source, "pass"),
1451
+ failureClass: readNullableString5(record, source, "failureClass"),
1452
+ metrics: asRecord6(record.metrics, `${source}.metrics`),
1453
+ artifacts: asRecord6(record.artifacts, `${source}.artifacts`),
1454
+ ...verdict === void 0 ? {} : { verdict },
1455
+ ...behavioral === void 0 ? {} : { behavioral },
1456
+ ...behavioralMetrics === void 0 ? {} : { behavioralMetrics },
1457
+ ...executionEnvelope === void 0 ? {} : { executionEnvelope }
1458
+ };
1459
+ }
1460
+ function asRecord6(value, source) {
1461
+ if (isRecord2(value)) return value;
1462
+ throw new Error(`${source}: expected object`);
1463
+ }
1464
+ function isRecord2(value) {
1465
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1466
+ }
1467
+ function readString5(record, source, field) {
1468
+ const value = record[field];
1469
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
1470
+ return value;
1471
+ }
1472
+ function readNullableString5(record, source, field) {
1473
+ const value = record[field];
1474
+ if (value === null) return null;
1475
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
1476
+ return value;
1477
+ }
1478
+ function readNullableDigest2(record, source, field) {
1479
+ const value = readNullableString5(record, source, field);
1480
+ if (value !== null && !/^[0-9a-f]{64}$/u.test(value))
1481
+ throw new Error(`${source}.${field}: expected sha256 digest or null`);
1482
+ return value;
1483
+ }
1484
+ function readNumber2(record, source, field) {
1485
+ const value = record[field];
1486
+ if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`${source}.${field}: expected number`);
1487
+ return value;
1488
+ }
1489
+ function readBoolean2(record, source, field) {
1490
+ const value = record[field];
1491
+ if (typeof value !== "boolean") throw new Error(`${source}.${field}: expected boolean`);
1492
+ return value;
1493
+ }
1494
+ function readArray2(record, source, field) {
1495
+ const value = record[field];
1496
+ if (!Array.isArray(value)) throw new Error(`${source}.${field}: expected array`);
1497
+ return value;
1498
+ }
1499
+
1500
+ export {
1501
+ normalizeEvalSchemaId,
1502
+ normalizeEvalRunnerKind,
1503
+ EVAL_VERDICT_SCHEMA_V1,
1504
+ EVAL_TRACKED_METRIC_NAMES,
1505
+ parseEvalVerdictEnvelopeV1,
1506
+ parseEvalBehaviorScenarioV1,
1507
+ judgeEvalBehaviorV1,
1508
+ assertEvalBehaviorReferencesVerdictV1,
1509
+ EVAL_BEHAVIOR_METRIC_DEFINITIONS_V1,
1510
+ buildEvalBehaviorMetricsV1,
1511
+ EVAL_EXECUTION_ENVELOPE_SCHEMA_V1,
1512
+ EVAL_EXECUTION_MATRIX_DIMENSIONS_V1,
1513
+ parseEvalExecutionMatrixDimensionsV1,
1514
+ evalServingConfigurationOf,
1515
+ sameEvalServingConfiguration,
1516
+ renderEvalServingConfiguration,
1517
+ redactArtifactForStorage,
1518
+ ZERO_EVAL_HARNESS_METRICS,
1519
+ evalHarnessMetricsFromReceipt,
1520
+ sumEvalHarnessMetrics,
1521
+ evalRoot,
1522
+ createEvalId,
1523
+ writeEvalArtifact,
1524
+ loadEvalArtifact,
1525
+ writeEvalArtifactV4,
1526
+ loadEvalArtifactV4,
1527
+ parseEvalArtifactV4
1528
+ };
1529
+ //# sourceMappingURL=chunk-6CCS4G3W.js.map