@iowarp/clio-coder 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1187) hide show
  1. package/CHANGELOG.md +123 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +295 -627
  4. package/dist/acp-BIYHVZIM.js +128 -0
  5. package/dist/{agents-Q4MYPMUW.js → agents-YT6SSRIT.js} +52 -27
  6. package/dist/assets/codewiki.json +1 -0
  7. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
  8. package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
  9. package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
  10. package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
  11. package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
  12. package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
  13. package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
  14. package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
  15. package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
  16. package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
  17. package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
  18. package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
  19. package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
  20. package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
  21. package/dist/assets/grammars/tree-sitter.wasm +0 -0
  22. package/dist/{auth-O6HYIJ6J.js → auth-5TWEIYDN.js} +30 -15
  23. package/dist/chunk-2EHAIA3X.js +481 -0
  24. package/dist/{chunk-ME6DNWIU.js → chunk-2IR2NMPA.js} +12 -4
  25. package/dist/chunk-2SFS6XQE.js +122 -0
  26. package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
  27. package/dist/chunk-2VTFPG5O.js +48 -0
  28. package/dist/chunk-3I7MS7N2.js +40 -0
  29. package/dist/chunk-3R73A4XB.js +69 -0
  30. package/dist/{chunk-JPOWPFCU.js → chunk-3ZXDFGR5.js} +52 -23
  31. package/dist/chunk-4BJ5BYCE.js +61 -0
  32. package/dist/{chunk-26BZQOAD.js → chunk-4BPJXDWC.js} +161 -260
  33. package/dist/chunk-4KLWL3UC.js +18 -0
  34. package/dist/{chunk-5LDRNKX2.js → chunk-4VP4KH3K.js} +161 -262
  35. package/dist/chunk-4ZG3XFUR.js +77 -0
  36. package/dist/chunk-5B2AEOW5.js +5407 -0
  37. package/dist/chunk-5TSRNF4G.js +510 -0
  38. package/dist/{chunk-WD6AJM35.js → chunk-5UUP6MWO.js} +48 -69
  39. package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
  40. package/dist/chunk-65DEGPJ6.js +52 -0
  41. package/dist/chunk-6EJMN2Y3.js +17 -0
  42. package/dist/chunk-6EJV5X2W.js +16405 -0
  43. package/dist/chunk-6N5PTWMY.js +136 -0
  44. package/dist/chunk-6XLNIQDB.js +27 -0
  45. package/dist/{chunk-XNISANGE.js → chunk-77VKQEHF.js} +171 -74
  46. package/dist/chunk-7CR24IG7.js +242 -0
  47. package/dist/{chunk-UWIJNAOB.js → chunk-7EYHLWU7.js} +907 -638
  48. package/dist/chunk-7MNJORFF.js +22 -0
  49. package/dist/{chunk-JWHCJDCI.js → chunk-A3CYT5EX.js} +257 -79
  50. package/dist/chunk-AGYYIBLL.js +1069 -0
  51. package/dist/chunk-AO4RKG4M.js +277 -0
  52. package/dist/chunk-APJ265NV.js +7410 -0
  53. package/dist/chunk-ARBGF5F7.js +174 -0
  54. package/dist/{chunk-TFSSEXL6.js → chunk-BMEMKKIT.js} +14 -4
  55. package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
  56. package/dist/chunk-CBCAPZAA.js +229 -0
  57. package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
  58. package/dist/chunk-CMZWFGD2.js +352 -0
  59. package/dist/chunk-ECH6PKUQ.js +39 -0
  60. package/dist/{chunk-67MTHP2E.js → chunk-ED4KHGC3.js} +13 -5
  61. package/dist/chunk-EKMEHE4H.js +340 -0
  62. package/dist/{chunk-O4EJEDHO.js → chunk-EPVUXGXG.js} +50 -35
  63. package/dist/chunk-FCSXB6T2.js +338 -0
  64. package/dist/chunk-FJ3H4MN5.js +48 -0
  65. package/dist/chunk-FQ4SKYE4.js +29 -0
  66. package/dist/chunk-G2DE3C7R.js +644 -0
  67. package/dist/chunk-G4BMMOKF.js +182 -0
  68. package/dist/{chunk-7BHLZB3A.js → chunk-GGXXDWE4.js} +190 -1218
  69. package/dist/chunk-HC4CLZ2Y.js +68 -0
  70. package/dist/{chunk-E3NYWENM.js → chunk-HFSBBKSQ.js} +55 -61
  71. package/dist/chunk-HKIYEGME.js +30 -0
  72. package/dist/chunk-I4HZDVNP.js +73 -0
  73. package/dist/chunk-IGLFWIYI.js +161 -0
  74. package/dist/chunk-IHXBNWMM.js +137 -0
  75. package/dist/chunk-IKCO5N3L.js +162 -0
  76. package/dist/chunk-IR4CFBFN.js +56 -0
  77. package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
  78. package/dist/{chunk-VOO7NYPP.js → chunk-J5HN4RYU.js} +27 -9
  79. package/dist/{chunk-4UQA7NCT.js → chunk-J5Q24KAG.js} +7 -2
  80. package/dist/{chunk-KBR4MZZR.js → chunk-JVCV3ICN.js} +7 -1
  81. package/dist/chunk-KJ5LWLOE.js +1077 -0
  82. package/dist/chunk-LBMZMYH2.js +285 -0
  83. package/dist/{chunk-3DANZDGR.js → chunk-LBNRH5WM.js} +100 -161
  84. package/dist/{chunk-TKHQ4DGZ.js → chunk-LZSJBIVT.js} +7358 -7414
  85. package/dist/{chunk-UGYAX5YI.js → chunk-M6SHUN7Q.js} +13 -8
  86. package/dist/chunk-MAW544W2.js +1882 -0
  87. package/dist/chunk-MBS4V7ZP.js +217 -0
  88. package/dist/{chunk-2J63S4SF.js → chunk-MFFY33HR.js} +167 -140
  89. package/dist/chunk-MNA4JGU4.js +255 -0
  90. package/dist/chunk-MQSRRFWA.js +3428 -0
  91. package/dist/{chunk-RQDWMVRB.js → chunk-MVVUPGPW.js} +138 -137
  92. package/dist/chunk-OAO4GE4M.js +619 -0
  93. package/dist/chunk-OHHN2SO4.js +5135 -0
  94. package/dist/chunk-OKGUZO2U.js +34 -0
  95. package/dist/{chunk-BBUH4VAA.js → chunk-OOJYHWRB.js} +60 -361
  96. package/dist/{chunk-D5YD55AR.js → chunk-OQ33BKR3.js} +12 -1
  97. package/dist/chunk-OQE5J4C6.js +73 -0
  98. package/dist/{chunk-AMFR5YA3.js → chunk-ORBHGJC5.js} +26 -12
  99. package/dist/chunk-POHLU5DW.js +1186 -0
  100. package/dist/chunk-QKMUKYO7.js +4961 -0
  101. package/dist/{chunk-7RBKDI66.js → chunk-QTYWRVRA.js} +104 -12
  102. package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
  103. package/dist/chunk-SRF2PJNW.js +184 -0
  104. package/dist/chunk-SST6Z5JA.js +80 -0
  105. package/dist/{chunk-XV4ZJ6ZM.js → chunk-STBPMHSX.js} +473 -1194
  106. package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
  107. package/dist/chunk-T6YILFSB.js +80 -0
  108. package/dist/chunk-TXOTCRLG.js +15 -0
  109. package/dist/chunk-TZTZS7QK.js +227 -0
  110. package/dist/chunk-UOV2BYIW.js +107 -0
  111. package/dist/{chunk-527KG6XR.js → chunk-V4RXGQ5Q.js} +72 -185
  112. package/dist/chunk-VAKQQHWR.js +434 -0
  113. package/dist/chunk-VG7TBQIY.js +128 -0
  114. package/dist/chunk-VJWL6YS5.js +244 -0
  115. package/dist/chunk-WEH5XRJQ.js +32 -0
  116. package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
  117. package/dist/chunk-WMSVI4G2.js +2095 -0
  118. package/dist/chunk-WVO7V2QY.js +797 -0
  119. package/dist/chunk-X4RCMKVQ.js +641 -0
  120. package/dist/chunk-X75S7HFS.js +374 -0
  121. package/dist/chunk-XN3L4EYL.js +46 -0
  122. package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
  123. package/dist/{chunk-PIDUD6M2.js → chunk-YCWGATWI.js} +12 -5
  124. package/dist/chunk-YHZX5GEU.js +193 -0
  125. package/dist/chunk-YXLYO42X.js +91 -0
  126. package/dist/{chunk-UHTSULZS.js → chunk-ZDOOVTXZ.js} +38 -73
  127. package/dist/chunk-ZI647VB5.js +37 -0
  128. package/dist/{chunk-CLJ5HLUD.js → chunk-ZWLZP4ZT.js} +25 -6
  129. package/dist/cli/index.js +70 -56
  130. package/dist/clio-4LY5K2AC.js +25 -0
  131. package/dist/code-nav-7AX6FYE6.js +600 -0
  132. package/dist/codewiki/build-worker.js +66 -0
  133. package/dist/compile-cache-CVJMMODC.js +18 -0
  134. package/dist/{components-JVHMUBEB.js → components-KELWS457.js} +31 -9
  135. package/dist/{config-ZFCDBMDC.js → config-GTLUW2PR.js} +104 -56
  136. package/dist/configure-R6A64DHX.js +42 -0
  137. package/dist/context-5VKGUVJJ.js +866 -0
  138. package/dist/{context-CDXTP2MP.js → context-JFZEJ7W5.js} +21 -13
  139. package/dist/{context-E3KIFVXI.js → context-RW5HC47S.js} +77 -36
  140. package/dist/{context-clear-3F4PLXOS.js → context-clear-6ZHBAZZT.js} +64 -30
  141. package/dist/{context-index-Q7YSYTR3.js → context-index-BZ4UYMTC.js} +36 -24
  142. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  143. package/dist/{docs-YIETIWZI.js → docs-2C2LTVT2.js} +32 -13
  144. package/dist/doctor-KI767GSN.js +87 -0
  145. package/dist/{eval-B3KZZESM.js → eval-XSSNATB4.js} +93 -27
  146. package/dist/{evidence-V67CHM35.js → evidence-UA6AWDQQ.js} +55 -27
  147. package/dist/{evolve-YDZSUQYA.js → evolve-QNTFGV6Z.js} +59 -26
  148. package/dist/{extensions-SRG7XCAH.js → extensions-QVDOHDGJ.js} +23 -8
  149. package/dist/{fleet-CA2CRTVG.js → fleet-Q7UOMUSG.js} +173 -56
  150. package/dist/fleet-preflight-DDN536IT.js +26 -0
  151. package/dist/{init-2OZDJE2D.js → init-WBB65ZHQ.js} +79 -34
  152. package/dist/{memory-3PIQQAKX.js → memory-MD3O64RI.js} +57 -28
  153. package/dist/{models-DY35XI7Y.js → models-BZU34YWD.js} +49 -24
  154. package/dist/monitor-MEQA5C3I.js +661 -0
  155. package/dist/{chunk-PS4PFJQP.js → orchestrator-CGFKEP27.js} +22837 -18564
  156. package/dist/{paths-5OMXW7Z4.js → paths-UXLN5YYZ.js} +17 -6
  157. package/dist/preload-P6DGH2PZ.js +13 -0
  158. package/dist/{reset-PIFYNOS3.js → reset-L2FQEE3E.js} +25 -13
  159. package/dist/{run-3VSPP24F.js → run-IV4Q6RLN.js} +115 -63
  160. package/dist/{share-D36RQCXM.js → share-S5BZQC5I.js} +23 -10
  161. package/dist/{skills-F2MRLELY.js → skills-LQEKRDTN.js} +42 -15
  162. package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-3DC4HEWS.js} +90 -45
  163. package/dist/steer-GGWFUJUD.js +77 -0
  164. package/dist/{targets-DZMEZAH4.js → targets-C4SSGQOB.js} +78 -60
  165. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  166. package/dist/{trace-7NYCUI2J.js → trace-PNCASAXC.js} +48 -17
  167. package/dist/tree-sitter-HGKH6LG4.js +4673 -0
  168. package/dist/{uninstall-AD3JWHBB.js → uninstall-FZCQCDKC.js} +19 -8
  169. package/dist/{upgrade-WYYBKGDY.js → upgrade-7TT7SQ3G.js} +66 -24
  170. package/dist/{usage-ULIDAGFF.js → usage-GV4PKT3M.js} +71 -32
  171. package/dist/verify-G6V4D2G7.js +716 -0
  172. package/dist/version-KGEG7EPO.js +21 -0
  173. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  174. package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-DQF6Z66B.js} +98 -48
  175. package/dist/worker/entry.js +297 -54
  176. package/dist/workspace-G4ZWUIPR.js +22 -0
  177. package/docs/README.md +29 -21
  178. package/docs/acp.md +191 -16
  179. package/docs/alcf-provider.md +1 -1
  180. package/docs/architecture.md +157 -7
  181. package/docs/artifact-placement.md +101 -0
  182. package/docs/artifact-versions.md +1 -1
  183. package/docs/built-in-agents.md +4 -2
  184. package/docs/capacity-and-scheduling.md +1 -1
  185. package/docs/commands-and-modes.md +224 -97
  186. package/docs/config-knobs-audit.md +1 -3
  187. package/docs/configuration-and-targets.md +236 -38
  188. package/docs/context-engine.md +34 -7
  189. package/docs/development-pipeline.md +102 -0
  190. package/docs/dispatch-architecture-rationale.md +1 -1
  191. package/docs/documentation-coverage.md +4 -4
  192. package/docs/documentation-guide.md +3 -3
  193. package/docs/environment-variables.md +15 -6
  194. package/docs/eval-runner.md +3 -3
  195. package/docs/evals-internal.md +2 -2
  196. package/docs/evidence-and-memory.md +10 -2
  197. package/docs/evolution.md +2 -2
  198. package/docs/exit-codes-and-output.md +15 -9
  199. package/docs/extensions-and-sharing.md +25 -18
  200. package/docs/fleet-demo-runbook.md +22 -23
  201. package/docs/fleet-dispatch.md +117 -16
  202. package/docs/git-commit-provenance.md +120 -0
  203. package/docs/glossary.md +107 -15
  204. package/docs/installation-and-lifecycle.md +75 -17
  205. package/docs/middleware-and-components.md +1 -1
  206. package/docs/model-catalog.md +46 -15
  207. package/docs/observability.md +8 -5
  208. package/docs/performance-methodology.md +491 -0
  209. package/docs/pi-boundary.md +72 -0
  210. package/docs/proactive-memory.md +14 -14
  211. package/docs/prompt-envelope-and-tools.md +25 -4
  212. package/docs/provider-adapter-cookbook.md +57 -4
  213. package/docs/release-cut-checklist.md +129 -111
  214. package/docs/safety-model.md +28 -8
  215. package/docs/scientific-validation.md +3 -3
  216. package/docs/session-lifecycle.md +55 -12
  217. package/docs/skills-marketplace.md +12 -8
  218. package/docs/time-conventions.md +101 -0
  219. package/docs/tool-usage.md +6 -5
  220. package/docs/trace-store.md +1 -1
  221. package/docs/troubleshooting.md +10 -7
  222. package/docs/tui-design.md +121 -28
  223. package/docs/worker-dispatch-mechanics.md +3 -3
  224. package/package.json +33 -36
  225. package/skills/README.md +5 -6
  226. package/skills/coding/ast-grep/SKILL.md +136 -0
  227. package/skills/coding/ast-grep/evals.md +56 -0
  228. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  229. package/skills/coding/coding-standards/SKILL.md +113 -0
  230. package/skills/coding/coding-standards/evals.md +34 -0
  231. package/skills/coding/prototype/SKILL.md +86 -0
  232. package/skills/coding/prototype/evals.md +42 -0
  233. package/skills/coding/prototype/references/LOGIC.md +67 -0
  234. package/skills/coding/prototype/references/UI.md +112 -0
  235. package/skills/coding/tdd/SKILL.md +101 -0
  236. package/skills/coding/tdd/evals.md +41 -0
  237. package/skills/coding/tdd/references/mocking.md +59 -0
  238. package/skills/coding/tdd/references/tests.md +77 -0
  239. package/skills/context/context-handoff/SKILL.md +126 -0
  240. package/skills/context/context-handoff/evals.md +57 -0
  241. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  242. package/skills/context/context-prime/SKILL.md +95 -0
  243. package/skills/context/context-prime/evals.md +54 -0
  244. package/skills/git/file-ticket/SKILL.md +107 -0
  245. package/skills/git/file-ticket/evals.md +54 -0
  246. package/skills/git/fix-issue/SKILL.md +106 -0
  247. package/skills/git/fix-issue/evals.md +71 -0
  248. package/skills/git/ship/SKILL.md +92 -0
  249. package/skills/git/ship/evals.md +72 -0
  250. package/skills/meta/clio-dev/SKILL.md +91 -0
  251. package/skills/meta/clio-dev/evals.md +45 -0
  252. package/skills/meta/clio-test/SKILL.md +130 -0
  253. package/skills/meta/clio-test/evals.md +43 -0
  254. package/skills/meta/clio-test/references/harness.md +97 -0
  255. package/skills/meta/clio-test/references/test-map.md +59 -0
  256. package/skills/meta/credentials/SKILL.md +125 -0
  257. package/skills/meta/credentials/evals.md +104 -0
  258. package/skills/meta/find-skills/SKILL.md +72 -0
  259. package/skills/meta/find-skills/evals.md +47 -0
  260. package/skills/meta/herdr/SKILL.md +127 -0
  261. package/skills/meta/herdr/evals.md +38 -0
  262. package/skills/meta/skill-craft/SKILL.md +102 -0
  263. package/skills/meta/skill-craft/evals.md +41 -0
  264. package/skills/planning/architecture/SKILL.md +129 -0
  265. package/skills/planning/architecture/evals.md +36 -0
  266. package/skills/planning/backlog/SKILL.md +90 -0
  267. package/skills/planning/backlog/evals.md +43 -0
  268. package/skills/planning/prd/SKILL.md +82 -0
  269. package/skills/planning/prd/evals.md +49 -0
  270. package/skills/planning/product-intent/SKILL.md +112 -0
  271. package/skills/planning/product-intent/evals.md +36 -0
  272. package/skills/planning/tech-spec/SKILL.md +115 -0
  273. package/skills/planning/tech-spec/evals.md +47 -0
  274. package/skills/registry.yaml +136 -0
  275. package/skills/research/arxiv-literature/SKILL.md +104 -0
  276. package/skills/research/arxiv-literature/evals.md +58 -0
  277. package/skills/research/experiment-protocol/SKILL.md +122 -0
  278. package/skills/research/experiment-protocol/evals.md +91 -0
  279. package/skills/research/scientific-debugging/SKILL.md +119 -0
  280. package/skills/research/scientific-debugging/evals.md +138 -0
  281. package/skills/research/scientific-modernization/SKILL.md +138 -0
  282. package/skills/research/scientific-modernization/evals.md +84 -0
  283. package/skills/skill-marketplace.json +12 -20
  284. package/skills/workflow/design-council/SKILL.md +139 -0
  285. package/skills/workflow/design-council/evals.md +97 -0
  286. package/skills/workflow/grill-me/SKILL.md +186 -0
  287. package/skills/workflow/grill-me/evals.md +78 -0
  288. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  289. package/skills/workflow/workflow-distiller/evals.md +107 -0
  290. package/src/cli/acp.ts +115 -0
  291. package/src/cli/agents.ts +60 -0
  292. package/src/cli/args.ts +280 -0
  293. package/src/cli/argv.ts +170 -0
  294. package/src/cli/ask.ts +34 -0
  295. package/src/cli/auth.ts +468 -0
  296. package/src/cli/bootstrap-generate.ts +498 -0
  297. package/src/cli/clio.ts +96 -0
  298. package/src/cli/components.ts +195 -0
  299. package/src/cli/config-inspect.ts +336 -0
  300. package/src/cli/config.ts +72 -0
  301. package/src/cli/configure-interop.ts +67 -0
  302. package/src/cli/configure-layout.ts +172 -0
  303. package/src/cli/configure.ts +1525 -0
  304. package/src/cli/context-clear.ts +76 -0
  305. package/src/cli/context-index.ts +100 -0
  306. package/src/cli/context.ts +321 -0
  307. package/src/cli/default-target.ts +55 -0
  308. package/src/cli/docs.ts +346 -0
  309. package/src/cli/doctor.ts +54 -0
  310. package/src/cli/eval.ts +315 -0
  311. package/src/cli/evidence.ts +225 -0
  312. package/src/cli/evolve.ts +219 -0
  313. package/src/cli/extensions.ts +214 -0
  314. package/src/cli/fleet.ts +868 -0
  315. package/src/cli/index.ts +338 -0
  316. package/src/cli/init.ts +219 -0
  317. package/src/cli/initial-message.ts +47 -0
  318. package/src/cli/internal-dispatch.ts +55 -0
  319. package/src/cli/memory.ts +182 -0
  320. package/src/cli/models.ts +257 -0
  321. package/src/cli/modes/json-stream.ts +121 -0
  322. package/src/cli/modes/jsonl.ts +9 -0
  323. package/src/cli/modes/print.ts +604 -0
  324. package/src/cli/oauth-manual-input.ts +72 -0
  325. package/src/cli/oauth-select.ts +36 -0
  326. package/src/cli/output-guard.ts +48 -0
  327. package/src/cli/paths.ts +44 -0
  328. package/src/cli/provider-target.ts +113 -0
  329. package/src/cli/removal.ts +72 -0
  330. package/src/cli/reset.ts +253 -0
  331. package/src/cli/run.ts +497 -0
  332. package/src/cli/share.ts +243 -0
  333. package/src/cli/shared.ts +60 -0
  334. package/src/cli/skills-eval.ts +1240 -0
  335. package/src/cli/skills.ts +485 -0
  336. package/src/cli/steer-channel.ts +86 -0
  337. package/src/cli/targets.ts +1154 -0
  338. package/src/cli/text-layout.ts +112 -0
  339. package/src/cli/trace.ts +322 -0
  340. package/src/cli/uninstall.ts +405 -0
  341. package/src/cli/upgrade.ts +286 -0
  342. package/src/cli/usage.ts +876 -0
  343. package/src/cli/validate-model.ts +28 -0
  344. package/src/cli/version.ts +7 -0
  345. package/src/cli/wiki-generate.ts +510 -0
  346. package/src/core/agent-environment.ts +7 -0
  347. package/src/core/artifact-paths.ts +43 -0
  348. package/src/core/bash-exec.ts +313 -0
  349. package/src/core/boot-trace.ts +42 -0
  350. package/src/core/bus-events.ts +744 -0
  351. package/src/core/bus-trace.ts +53 -0
  352. package/src/core/c-header-language.ts +265 -0
  353. package/src/core/clio-repo.ts +78 -0
  354. package/src/core/commit-attribution.ts +157 -0
  355. package/src/core/compile-cache.ts +159 -0
  356. package/src/core/config.ts +1722 -0
  357. package/src/core/context-floor.ts +33 -0
  358. package/src/core/defaults.ts +659 -0
  359. package/src/core/domain-loader.ts +177 -0
  360. package/src/core/event-bus.ts +94 -0
  361. package/src/core/file-references.ts +282 -0
  362. package/src/core/git-commit-attribution.ts +362 -0
  363. package/src/core/guardrails.ts +185 -0
  364. package/src/core/headless-permission.ts +21 -0
  365. package/src/core/incomplete-installation.ts +45 -0
  366. package/src/core/init.ts +223 -0
  367. package/src/core/json-payload.ts +58 -0
  368. package/src/core/package-root.ts +54 -0
  369. package/src/core/path-canonical.ts +37 -0
  370. package/src/core/process-identity.ts +41 -0
  371. package/src/core/recent-models.ts +91 -0
  372. package/src/core/residency-protection.ts +56 -0
  373. package/src/core/resolve-config-value.ts +88 -0
  374. package/src/core/response-schema.ts +279 -0
  375. package/src/core/run-overrides.ts +77 -0
  376. package/src/core/safe-exec.ts +205 -0
  377. package/src/core/safe-id.ts +37 -0
  378. package/src/core/safe-resource-write.ts +162 -0
  379. package/src/core/session-routing.ts +339 -0
  380. package/src/core/settings-layers.ts +354 -0
  381. package/src/core/shared-bus.ts +8 -0
  382. package/src/core/shell-quote.ts +26 -0
  383. package/src/core/skill-activation.ts +190 -0
  384. package/src/core/startup-timer.ts +37 -0
  385. package/src/core/state-file-lock.ts +219 -0
  386. package/src/core/termination.ts +275 -0
  387. package/src/core/timers.ts +38 -0
  388. package/src/core/tool-names.ts +65 -0
  389. package/src/core/verification-scripts.ts +13 -0
  390. package/src/core/workspace-files.ts +492 -0
  391. package/src/core/xdg.ts +177 -0
  392. package/src/domains/agents/builtins/architect.md +4 -4
  393. package/src/domains/agents/builtins/coder.md +3 -2
  394. package/src/domains/agents/builtins/debugger.md +1 -1
  395. package/src/domains/agents/builtins/documenter.md +1 -1
  396. package/src/domains/agents/builtins/git-master.md +3 -3
  397. package/src/domains/agents/builtins/provenance.md +1 -1
  398. package/src/domains/agents/builtins/researcher.md +1 -1
  399. package/src/domains/agents/builtins/scout.md +1 -1
  400. package/src/domains/agents/builtins/tester.md +1 -1
  401. package/src/domains/agents/builtins/verifier.md +1 -1
  402. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  403. package/src/domains/agents/catalog.ts +172 -0
  404. package/src/domains/agents/contract.ts +16 -0
  405. package/src/domains/agents/extension.ts +110 -0
  406. package/src/domains/agents/fleet-commands.ts +154 -0
  407. package/src/domains/agents/fleet-contract.ts +797 -0
  408. package/src/domains/agents/frontmatter.ts +40 -0
  409. package/src/domains/agents/index.ts +102 -0
  410. package/src/domains/agents/manifest.ts +6 -0
  411. package/src/domains/agents/recipe-schema.ts +202 -0
  412. package/src/domains/agents/recipe.ts +125 -0
  413. package/src/domains/agents/registry.ts +111 -0
  414. package/src/domains/agents/result-contract.ts +1265 -0
  415. package/src/domains/agents/spec.ts +371 -0
  416. package/src/domains/agents/write-boundary.ts +109 -0
  417. package/src/domains/components/diff.ts +99 -0
  418. package/src/domains/components/hash.ts +21 -0
  419. package/src/domains/components/index.ts +3 -0
  420. package/src/domains/components/scan.ts +304 -0
  421. package/src/domains/components/snapshot.ts +108 -0
  422. package/src/domains/components/types.ts +82 -0
  423. package/src/domains/config/agent-namespace.ts +13 -0
  424. package/src/domains/config/classify.ts +106 -0
  425. package/src/domains/config/contract.ts +22 -0
  426. package/src/domains/config/extension.ts +142 -0
  427. package/src/domains/config/index.ts +23 -0
  428. package/src/domains/config/keybindings.ts +200 -0
  429. package/src/domains/config/manifest.ts +6 -0
  430. package/src/domains/config/watcher.ts +41 -0
  431. package/src/domains/context/adoption.ts +880 -0
  432. package/src/domains/context/bootstrap-prompt.ts +273 -0
  433. package/src/domains/context/bootstrap.ts +1502 -0
  434. package/src/domains/context/clear.ts +91 -0
  435. package/src/domains/context/clio-md.ts +429 -0
  436. package/src/domains/context/codewiki/artifact.ts +400 -0
  437. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  438. package/src/domains/context/codewiki/build-worker.ts +54 -0
  439. package/src/domains/context/codewiki/cmake.ts +356 -0
  440. package/src/domains/context/codewiki/cooperative.ts +46 -0
  441. package/src/domains/context/codewiki/coordinator.ts +182 -0
  442. package/src/domains/context/codewiki/digest.ts +135 -0
  443. package/src/domains/context/codewiki/grammar-assets.ts +33 -0
  444. package/src/domains/context/codewiki/indexer.ts +1529 -0
  445. package/src/domains/context/codewiki/paths.ts +67 -0
  446. package/src/domains/context/codewiki/schema.ts +80 -0
  447. package/src/domains/context/codewiki/tree-sitter.ts +771 -0
  448. package/src/domains/context/contract.ts +68 -0
  449. package/src/domains/context/excluded-dirs.ts +1 -0
  450. package/src/domains/context/extension.ts +358 -0
  451. package/src/domains/context/fingerprint.ts +198 -0
  452. package/src/domains/context/index.ts +154 -0
  453. package/src/domains/context/init-options.ts +69 -0
  454. package/src/domains/context/manifest.ts +6 -0
  455. package/src/domains/context/operator-profile.ts +157 -0
  456. package/src/domains/context/project-metadata.ts +529 -0
  457. package/src/domains/context/project-rules.ts +227 -0
  458. package/src/domains/context/prompt-context.ts +61 -0
  459. package/src/domains/context/refresh.ts +178 -0
  460. package/src/domains/context/runtime.ts +17 -0
  461. package/src/domains/context/sibling-files.ts +10 -0
  462. package/src/domains/context/state.ts +237 -0
  463. package/src/domains/context/wiki/assemble.ts +303 -0
  464. package/src/domains/context/wiki/frontmatter.ts +210 -0
  465. package/src/domains/context/wiki/generate.ts +595 -0
  466. package/src/domains/context/wiki/layout.ts +111 -0
  467. package/src/domains/context/wiki/meta.ts +221 -0
  468. package/src/domains/context/wiki/plan-store.ts +217 -0
  469. package/src/domains/context/wiki/plan.ts +250 -0
  470. package/src/domains/context/wiki/prompts.ts +283 -0
  471. package/src/domains/context/wiki/staleness.ts +198 -0
  472. package/src/domains/dispatch/active-route-planner.ts +168 -0
  473. package/src/domains/dispatch/admission-queue.ts +150 -0
  474. package/src/domains/dispatch/admission.ts +334 -0
  475. package/src/domains/dispatch/agent-candidates.ts +307 -0
  476. package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
  477. package/src/domains/dispatch/agent-ledger-store.ts +257 -0
  478. package/src/domains/dispatch/agent-ledger.ts +212 -0
  479. package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
  480. package/src/domains/dispatch/assignment-events.ts +132 -0
  481. package/src/domains/dispatch/assignment-reconcile.ts +76 -0
  482. package/src/domains/dispatch/assignment-store.ts +162 -0
  483. package/src/domains/dispatch/assignment.ts +278 -0
  484. package/src/domains/dispatch/backoff.ts +59 -0
  485. package/src/domains/dispatch/batch-store.ts +134 -0
  486. package/src/domains/dispatch/batch-tracker.ts +66 -0
  487. package/src/domains/dispatch/capability-match.ts +155 -0
  488. package/src/domains/dispatch/capacity-lease.ts +413 -0
  489. package/src/domains/dispatch/code-step-store.ts +52 -0
  490. package/src/domains/dispatch/code-step.ts +387 -0
  491. package/src/domains/dispatch/contract.ts +278 -0
  492. package/src/domains/dispatch/dedup.ts +133 -0
  493. package/src/domains/dispatch/event-pump.ts +251 -0
  494. package/src/domains/dispatch/execution-handoff.ts +29 -0
  495. package/src/domains/dispatch/execution-plan.ts +328 -0
  496. package/src/domains/dispatch/execution-role.ts +277 -0
  497. package/src/domains/dispatch/execution-scheduler.ts +583 -0
  498. package/src/domains/dispatch/extension.ts +6006 -0
  499. package/src/domains/dispatch/failure-classification.ts +147 -0
  500. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  501. package/src/domains/dispatch/fleet-plan.ts +225 -0
  502. package/src/domains/dispatch/fleet-preflight.ts +394 -0
  503. package/src/domains/dispatch/gate-decisions.ts +1040 -0
  504. package/src/domains/dispatch/gate-role-prompts.ts +58 -0
  505. package/src/domains/dispatch/heartbeat.ts +27 -0
  506. package/src/domains/dispatch/index.ts +137 -0
  507. package/src/domains/dispatch/joint-route-adapter.ts +114 -0
  508. package/src/domains/dispatch/joint-route-resolver.ts +283 -0
  509. package/src/domains/dispatch/manifest.ts +6 -0
  510. package/src/domains/dispatch/orphan-recovery.ts +266 -0
  511. package/src/domains/dispatch/outcome.ts +109 -0
  512. package/src/domains/dispatch/phase-timing.ts +47 -0
  513. package/src/domains/dispatch/placement.ts +202 -0
  514. package/src/domains/dispatch/receipt-findings.ts +255 -0
  515. package/src/domains/dispatch/receipt-integrity.ts +383 -0
  516. package/src/domains/dispatch/recovery-candidates.ts +74 -0
  517. package/src/domains/dispatch/reproducibility.ts +48 -0
  518. package/src/domains/dispatch/reservation-store.ts +501 -0
  519. package/src/domains/dispatch/route-approval.ts +177 -0
  520. package/src/domains/dispatch/route-candidates.ts +57 -0
  521. package/src/domains/dispatch/route-decision.ts +1079 -0
  522. package/src/domains/dispatch/route-facts.ts +187 -0
  523. package/src/domains/dispatch/route-history.ts +238 -0
  524. package/src/domains/dispatch/route-observer.ts +488 -0
  525. package/src/domains/dispatch/route-policy.ts +327 -0
  526. package/src/domains/dispatch/route-quality.ts +256 -0
  527. package/src/domains/dispatch/route-readiness.ts +120 -0
  528. package/src/domains/dispatch/routing-intent.ts +287 -0
  529. package/src/domains/dispatch/run-identity.ts +56 -0
  530. package/src/domains/dispatch/scout-transition.ts +130 -0
  531. package/src/domains/dispatch/state.ts +302 -0
  532. package/src/domains/dispatch/tool-stats.ts +132 -0
  533. package/src/domains/dispatch/transport.ts +210 -0
  534. package/src/domains/dispatch/types.ts +799 -0
  535. package/src/domains/dispatch/validation-grounding.ts +154 -0
  536. package/src/domains/dispatch/validation.ts +721 -0
  537. package/src/domains/dispatch/worker-protocol.ts +275 -0
  538. package/src/domains/dispatch/worker-spawn.ts +585 -0
  539. package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
  540. package/src/domains/dispatch/write-boundary.ts +426 -0
  541. package/src/domains/eval/artifacts/redact.ts +42 -0
  542. package/src/domains/eval/artifacts/store.ts +173 -0
  543. package/src/domains/eval/compare/compare.ts +33 -0
  544. package/src/domains/eval/compare/gates.ts +66 -0
  545. package/src/domains/eval/compare/thresholds.ts +92 -0
  546. package/src/domains/eval/harness-metrics.ts +62 -0
  547. package/src/domains/eval/index.ts +66 -0
  548. package/src/domains/eval/metrics/chaos-stream.ts +93 -0
  549. package/src/domains/eval/metrics/context.ts +34 -0
  550. package/src/domains/eval/metrics/coverage.ts +21 -0
  551. package/src/domains/eval/metrics/evidence.ts +182 -0
  552. package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
  553. package/src/domains/eval/metrics/invariants.ts +736 -0
  554. package/src/domains/eval/metrics/latency.ts +4 -0
  555. package/src/domains/eval/metrics/token-stream.ts +139 -0
  556. package/src/domains/eval/metrics/tokens.ts +51 -0
  557. package/src/domains/eval/metrics/tool-calls.ts +7 -0
  558. package/src/domains/eval/proactive-memory.ts +279 -0
  559. package/src/domains/eval/provenance.ts +35 -0
  560. package/src/domains/eval/report.ts +234 -0
  561. package/src/domains/eval/reports/json.ts +5 -0
  562. package/src/domains/eval/reports/junit.ts +23 -0
  563. package/src/domains/eval/reports/markdown.ts +20 -0
  564. package/src/domains/eval/reports/swe-jsonl.ts +16 -0
  565. package/src/domains/eval/reports/text.ts +25 -0
  566. package/src/domains/eval/run-compare.ts +274 -0
  567. package/src/domains/eval/runner.ts +244 -0
  568. package/src/domains/eval/runners/clio-run.ts +148 -0
  569. package/src/domains/eval/runners/context-index.ts +56 -0
  570. package/src/domains/eval/runners/context-init.ts +203 -0
  571. package/src/domains/eval/runners/external-command.ts +350 -0
  572. package/src/domains/eval/runtime-paths.ts +171 -0
  573. package/src/domains/eval/schema/artifact.ts +75 -0
  574. package/src/domains/eval/schema/suite.ts +235 -0
  575. package/src/domains/eval/schema/validate.ts +339 -0
  576. package/src/domains/eval/store.ts +392 -0
  577. package/src/domains/eval/suites/load.ts +74 -0
  578. package/src/domains/eval/suites/matrix.ts +19 -0
  579. package/src/domains/eval/suites/resolve.ts +44 -0
  580. package/src/domains/eval/suites/run.ts +325 -0
  581. package/src/domains/eval/task-file.ts +186 -0
  582. package/src/domains/eval/types.ts +140 -0
  583. package/src/domains/eval/verifiers/command.ts +27 -0
  584. package/src/domains/eval/verifiers/file-exists.ts +6 -0
  585. package/src/domains/eval/verifiers/patch.ts +22 -0
  586. package/src/domains/eval/workspaces/git.ts +41 -0
  587. package/src/domains/eval/workspaces/local.ts +17 -0
  588. package/src/domains/eval/workspaces/temp-copy.ts +29 -0
  589. package/src/domains/evidence/build.ts +1754 -0
  590. package/src/domains/evidence/eval.ts +605 -0
  591. package/src/domains/evidence/failure-attribution.ts +54 -0
  592. package/src/domains/evidence/finish-contract-map.ts +42 -0
  593. package/src/domains/evidence/index.ts +55 -0
  594. package/src/domains/evidence/provenance.ts +200 -0
  595. package/src/domains/evidence/redact.ts +81 -0
  596. package/src/domains/evidence/store.ts +291 -0
  597. package/src/domains/evidence/types.ts +325 -0
  598. package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
  599. package/src/domains/evolution/index.ts +26 -0
  600. package/src/domains/evolution/manifest.ts +154 -0
  601. package/src/domains/evolution/validate.ts +304 -0
  602. package/src/domains/extensions/contract.ts +22 -0
  603. package/src/domains/extensions/discovery.ts +193 -0
  604. package/src/domains/extensions/extension.ts +46 -0
  605. package/src/domains/extensions/index.ts +34 -0
  606. package/src/domains/extensions/manager.ts +30 -0
  607. package/src/domains/extensions/manifest.ts +6 -0
  608. package/src/domains/extensions/resources.ts +38 -0
  609. package/src/domains/extensions/state.ts +224 -0
  610. package/src/domains/extensions/types.ts +83 -0
  611. package/src/domains/interop/consent.ts +185 -0
  612. package/src/domains/interop/contract.ts +29 -0
  613. package/src/domains/interop/detect.ts +173 -0
  614. package/src/domains/interop/extension.ts +59 -0
  615. package/src/domains/interop/index.ts +34 -0
  616. package/src/domains/interop/manifest.ts +6 -0
  617. package/src/domains/interop/registry.ts +139 -0
  618. package/src/domains/interop/state.ts +92 -0
  619. package/src/domains/interop/types.ts +109 -0
  620. package/src/domains/lifecycle/contract.ts +11 -0
  621. package/src/domains/lifecycle/doctor.ts +536 -0
  622. package/src/domains/lifecycle/extension.ts +23 -0
  623. package/src/domains/lifecycle/index.ts +21 -0
  624. package/src/domains/lifecycle/install-method.ts +51 -0
  625. package/src/domains/lifecycle/manifest.ts +6 -0
  626. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  627. package/src/domains/lifecycle/migrations/index.ts +114 -0
  628. package/src/domains/lifecycle/state.ts +93 -0
  629. package/src/domains/lifecycle/upgrade-notice.ts +35 -0
  630. package/src/domains/lifecycle/version.ts +35 -0
  631. package/src/domains/memory/index.ts +128 -0
  632. package/src/domains/memory/operations.ts +143 -0
  633. package/src/domains/memory/prompt-section.ts +86 -0
  634. package/src/domains/memory/proposal.ts +180 -0
  635. package/src/domains/memory/store.ts +163 -0
  636. package/src/domains/memory/task-bank.ts +229 -0
  637. package/src/domains/memory/task-memory-handoff.ts +222 -0
  638. package/src/domains/memory/task-memory-policy.ts +602 -0
  639. package/src/domains/memory/task-memory-status.ts +58 -0
  640. package/src/domains/memory/task-memory-telemetry.ts +346 -0
  641. package/src/domains/memory/task-memory-trace.ts +89 -0
  642. package/src/domains/memory/types.ts +74 -0
  643. package/src/domains/memory/validate.ts +297 -0
  644. package/src/domains/middleware/budget.ts +216 -0
  645. package/src/domains/middleware/contract.ts +35 -0
  646. package/src/domains/middleware/dispatch-nudge.ts +469 -0
  647. package/src/domains/middleware/extension.ts +129 -0
  648. package/src/domains/middleware/hook-receipts.ts +70 -0
  649. package/src/domains/middleware/hooks-io.ts +186 -0
  650. package/src/domains/middleware/hooks.ts +432 -0
  651. package/src/domains/middleware/index.ts +154 -0
  652. package/src/domains/middleware/manifest.ts +6 -0
  653. package/src/domains/middleware/memory-intervention.ts +701 -0
  654. package/src/domains/middleware/rules.ts +42 -0
  655. package/src/domains/middleware/runtime.ts +333 -0
  656. package/src/domains/middleware/skills-reminder.ts +202 -0
  657. package/src/domains/middleware/snapshot.ts +71 -0
  658. package/src/domains/middleware/stalled-turn.ts +71 -0
  659. package/src/domains/middleware/task-board-reminder.ts +87 -0
  660. package/src/domains/middleware/task-nudge.ts +77 -0
  661. package/src/domains/middleware/tool-choice-control.ts +42 -0
  662. package/src/domains/middleware/types.ts +131 -0
  663. package/src/domains/middleware/validate.ts +329 -0
  664. package/src/domains/observability/accountability.ts +67 -0
  665. package/src/domains/observability/contract.ts +168 -0
  666. package/src/domains/observability/cost.ts +206 -0
  667. package/src/domains/observability/evidence-index.ts +123 -0
  668. package/src/domains/observability/extension.ts +281 -0
  669. package/src/domains/observability/index.ts +78 -0
  670. package/src/domains/observability/manifest.ts +10 -0
  671. package/src/domains/observability/metrics.ts +37 -0
  672. package/src/domains/observability/projection.ts +477 -0
  673. package/src/domains/observability/telemetry.ts +89 -0
  674. package/src/domains/observability/trace-store.ts +1454 -0
  675. package/src/domains/prompts/compiler.ts +614 -0
  676. package/src/domains/prompts/contract.ts +46 -0
  677. package/src/domains/prompts/extension.ts +336 -0
  678. package/src/domains/prompts/fragment-loader.ts +138 -0
  679. package/src/domains/prompts/fragments/identity/clio.md +5 -6
  680. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  681. package/src/domains/prompts/fragments/identity/self-awareness.md +19 -0
  682. package/src/domains/prompts/fragments/operating/contract.md +4 -41
  683. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  684. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  685. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  686. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  687. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  688. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  689. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  690. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  691. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  692. package/src/domains/prompts/hash.ts +73 -0
  693. package/src/domains/prompts/index.ts +32 -0
  694. package/src/domains/prompts/manifest.ts +8 -0
  695. package/src/domains/prompts/memory-intervention.ts +57 -0
  696. package/src/domains/prompts/preload.ts +82 -0
  697. package/src/domains/providers/auth/api-key.ts +47 -0
  698. package/src/domains/providers/auth/backend-file.ts +79 -0
  699. package/src/domains/providers/auth/backend-memory.ts +72 -0
  700. package/src/domains/providers/auth/boot-status.ts +65 -0
  701. package/src/domains/providers/auth/index.ts +37 -0
  702. package/src/domains/providers/auth/oauth.ts +37 -0
  703. package/src/domains/providers/auth/storage.ts +726 -0
  704. package/src/domains/providers/capabilities.ts +58 -0
  705. package/src/domains/providers/catalog.ts +162 -0
  706. package/src/domains/providers/contract.ts +162 -0
  707. package/src/domains/providers/credentials.ts +20 -0
  708. package/src/domains/providers/eligibility.ts +24 -0
  709. package/src/domains/providers/errors.ts +64 -0
  710. package/src/domains/providers/extension.ts +548 -0
  711. package/src/domains/providers/index.ts +142 -0
  712. package/src/domains/providers/knowledge-base-path.ts +102 -0
  713. package/src/domains/providers/manifest.ts +6 -0
  714. package/src/domains/providers/model-capabilities.ts +136 -0
  715. package/src/domains/providers/model-discovery.ts +144 -0
  716. package/src/domains/providers/model-family.ts +32 -0
  717. package/src/domains/providers/model-runtime-capabilities.ts +723 -0
  718. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +120 -37
  719. package/src/domains/providers/plugins.ts +61 -0
  720. package/src/domains/providers/probe/fingerprint.ts +64 -0
  721. package/src/domains/providers/probe/http.ts +114 -0
  722. package/src/domains/providers/probe/reasoning.ts +111 -0
  723. package/src/domains/providers/registry.ts +187 -0
  724. package/src/domains/providers/resolver.ts +156 -0
  725. package/src/domains/providers/runtime-resolution.ts +720 -0
  726. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
  727. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  728. package/src/domains/providers/runtimes/builtins.ts +78 -0
  729. package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
  730. package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
  731. package/src/domains/providers/runtimes/claude/common.ts +55 -0
  732. package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
  733. package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
  734. package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
  735. package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
  736. package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
  737. package/src/domains/providers/runtimes/cloud/google.ts +41 -0
  738. package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
  739. package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
  740. package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
  741. package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
  742. package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
  743. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  744. package/src/domains/providers/runtimes/common/local-synth.ts +164 -0
  745. package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
  746. package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
  747. package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
  748. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
  749. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
  750. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
  751. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
  752. package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
  753. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  754. package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
  755. package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
  756. package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
  757. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
  758. package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
  759. package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
  760. package/src/domains/providers/runtimes/protocol/google.ts +27 -0
  761. package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
  762. package/src/domains/providers/support.ts +241 -0
  763. package/src/domains/providers/thinking-control-policy.ts +85 -0
  764. package/src/domains/providers/types/capability-flags.ts +114 -0
  765. package/src/domains/providers/types/cost-provenance.ts +7 -0
  766. package/src/domains/providers/types/inference.ts +41 -0
  767. package/src/domains/providers/types/knowledge-base.ts +156 -0
  768. package/src/domains/providers/types/local-model-quirks.ts +216 -0
  769. package/src/domains/providers/types/runtime-descriptor.ts +181 -0
  770. package/src/domains/providers/types/target-descriptor.ts +60 -0
  771. package/src/domains/resources/collision.ts +92 -0
  772. package/src/domains/resources/common-loader.ts +140 -0
  773. package/src/domains/resources/contract.ts +24 -0
  774. package/src/domains/resources/extension.ts +59 -0
  775. package/src/domains/resources/index.ts +74 -0
  776. package/src/domains/resources/loader.ts +85 -0
  777. package/src/domains/resources/manifest.ts +6 -0
  778. package/src/domains/resources/prompts/loader.ts +246 -0
  779. package/src/domains/resources/prompts/substitute.ts +1 -0
  780. package/src/domains/resources/skills/content-hash.ts +107 -0
  781. package/src/domains/resources/skills/evals.ts +175 -0
  782. package/src/domains/resources/skills/install.ts +427 -0
  783. package/src/domains/resources/skills/loader.ts +985 -0
  784. package/src/domains/resources/skills/marketplace.ts +301 -0
  785. package/src/domains/resources/skills/provenance-pin.ts +115 -0
  786. package/src/domains/safety/action-classifier.ts +270 -0
  787. package/src/domains/safety/approval-axis.ts +23 -0
  788. package/src/domains/safety/audit.ts +493 -0
  789. package/src/domains/safety/autonomy.ts +174 -0
  790. package/src/domains/safety/call-target.ts +59 -0
  791. package/src/domains/safety/contract.ts +65 -0
  792. package/src/domains/safety/damage-control.ts +44 -0
  793. package/src/domains/safety/default-path-policy.ts +117 -0
  794. package/src/domains/safety/extension.ts +383 -0
  795. package/src/domains/safety/finish-contract-registration.ts +128 -0
  796. package/src/domains/safety/finish-contract.ts +554 -0
  797. package/src/domains/safety/index.ts +44 -0
  798. package/src/domains/safety/loop-detector.ts +143 -0
  799. package/src/domains/safety/manifest.ts +6 -0
  800. package/src/domains/safety/path-policy.ts +164 -0
  801. package/src/domains/safety/policy-engine.ts +994 -0
  802. package/src/domains/safety/project-policy.ts +391 -0
  803. package/src/domains/safety/protected-artifacts-registration.ts +189 -0
  804. package/src/domains/safety/protected-artifacts.ts +993 -0
  805. package/src/domains/safety/rejection-feedback.ts +102 -0
  806. package/src/domains/safety/rigor.ts +72 -0
  807. package/src/domains/safety/rule-compiler.ts +48 -0
  808. package/src/domains/safety/rule-pack-loader.ts +92 -0
  809. package/src/domains/safety/run-effects.ts +197 -0
  810. package/src/domains/safety/scope.ts +61 -0
  811. package/src/domains/scheduling/budget.ts +35 -0
  812. package/src/domains/scheduling/cluster.ts +175 -0
  813. package/src/domains/scheduling/contract.ts +30 -0
  814. package/src/domains/scheduling/extension.ts +91 -0
  815. package/src/domains/scheduling/index.ts +12 -0
  816. package/src/domains/scheduling/manifest.ts +6 -0
  817. package/src/domains/session/archive-readers.ts +208 -0
  818. package/src/domains/session/checkpoint.ts +38 -0
  819. package/src/domains/session/compaction/auto.ts +89 -0
  820. package/src/domains/session/compaction/branch-summary.ts +187 -0
  821. package/src/domains/session/compaction/compact.ts +493 -0
  822. package/src/domains/session/compaction/cut-point.ts +172 -0
  823. package/src/domains/session/compaction/defaults.ts +34 -0
  824. package/src/domains/session/compaction/mask-observations.ts +265 -0
  825. package/src/domains/session/compaction/session-entries.ts +18 -0
  826. package/src/domains/session/compaction/tokens.ts +148 -0
  827. package/src/domains/session/context-accounting.ts +583 -0
  828. package/src/domains/session/context-ledger.ts +362 -0
  829. package/src/domains/session/contract.ts +159 -0
  830. package/src/domains/session/cwd-fallback.ts +65 -0
  831. package/src/domains/session/decision-board.ts +190 -0
  832. package/src/domains/session/entries.ts +572 -0
  833. package/src/domains/session/extension.ts +403 -0
  834. package/src/domains/session/history.ts +172 -0
  835. package/src/domains/session/index.ts +84 -0
  836. package/src/domains/session/manager.ts +128 -0
  837. package/src/domains/session/manifest.ts +6 -0
  838. package/src/domains/session/migrations/index.ts +27 -0
  839. package/src/domains/session/prompt-manifest.ts +173 -0
  840. package/src/domains/session/protected-artifact-journal.ts +241 -0
  841. package/src/domains/session/protected-artifacts.ts +90 -0
  842. package/src/domains/session/retry.ts +230 -0
  843. package/src/domains/session/session-artifacts.ts +107 -0
  844. package/src/domains/session/task-board.ts +569 -0
  845. package/src/domains/session/tree/active-path.ts +137 -0
  846. package/src/domains/session/tree/fork.ts +159 -0
  847. package/src/domains/session/tree/manager.ts +128 -0
  848. package/src/domains/session/tree/navigator.ts +177 -0
  849. package/src/domains/session/tree/preview.ts +259 -0
  850. package/src/domains/session/usage.ts +148 -0
  851. package/src/domains/session/workspace/git-probe.ts +167 -0
  852. package/src/domains/session/workspace/index.ts +4 -0
  853. package/src/domains/session/workspace/project-type.ts +217 -0
  854. package/src/domains/session/workspace/snapshot.ts +74 -0
  855. package/src/domains/share/archive.ts +684 -0
  856. package/src/domains/share/contract.ts +9 -0
  857. package/src/domains/share/extension.ts +26 -0
  858. package/src/domains/share/index.ts +28 -0
  859. package/src/domains/share/manifest.ts +6 -0
  860. package/src/domains/user-tasks/store.ts +297 -0
  861. package/src/engine/acp/adapter.ts +397 -0
  862. package/src/engine/acp/errors.ts +128 -0
  863. package/src/engine/acp/event-mapper.ts +154 -0
  864. package/src/engine/acp/server.ts +2238 -0
  865. package/src/engine/acp/tool-mediator.ts +686 -0
  866. package/src/engine/acp/transport.ts +775 -0
  867. package/src/engine/acp/types.ts +196 -0
  868. package/src/engine/agent.ts +29 -0
  869. package/src/engine/ai.ts +207 -0
  870. package/src/engine/alcf-oauth.ts +205 -0
  871. package/src/engine/antigravity/subprocess-runtime.ts +205 -0
  872. package/src/engine/api-registry.ts +223 -0
  873. package/src/engine/apis/degraded-inference.ts +95 -0
  874. package/src/engine/apis/index.ts +16 -0
  875. package/src/engine/apis/llamacpp-residency.ts +292 -0
  876. package/src/engine/apis/lmstudio-residency.ts +76 -0
  877. package/src/engine/apis/lmstudio.ts +243 -0
  878. package/src/engine/apis/ollama-native.ts +528 -0
  879. package/src/engine/apis/openai-completions.ts +795 -0
  880. package/src/engine/apis/output-budget.ts +99 -0
  881. package/src/engine/apis/residency-lock.ts +29 -0
  882. package/src/engine/apis/residency.ts +776 -0
  883. package/src/engine/apis/resident-models.ts +42 -0
  884. package/src/engine/apis/sampling-overrides.ts +38 -0
  885. package/src/engine/apis/types.ts +16 -0
  886. package/src/engine/claude/sdk-runtime.ts +685 -0
  887. package/src/engine/claude/session-id.ts +5 -0
  888. package/src/engine/claude/subprocess-runtime.ts +316 -0
  889. package/src/engine/claude/tool-safety.ts +400 -0
  890. package/src/engine/env-api-keys.ts +98 -0
  891. package/src/engine/external-subprocess.ts +23 -0
  892. package/src/engine/gemma-channel-filter.ts +223 -0
  893. package/src/engine/harmony-response.ts +165 -0
  894. package/src/engine/instrumented-tui.ts +192 -0
  895. package/src/engine/loop-guard.ts +1127 -0
  896. package/src/engine/messages.ts +14 -0
  897. package/src/engine/models.ts +42 -0
  898. package/src/engine/oauth.ts +196 -0
  899. package/src/engine/pi-mono-names.ts +13 -0
  900. package/src/engine/prompt-templates.ts +1 -0
  901. package/src/engine/provider-payload.ts +272 -0
  902. package/src/engine/select-list.ts +53 -0
  903. package/src/engine/session.ts +834 -0
  904. package/src/engine/strip-tokenizer-sentinels.ts +125 -0
  905. package/src/engine/truncate.ts +9 -0
  906. package/src/engine/tui.ts +111 -0
  907. package/src/engine/types.ts +63 -0
  908. package/src/engine/worker-events.ts +100 -0
  909. package/src/engine/worker-runtime-capabilities.ts +5 -0
  910. package/src/engine/worker-runtime.ts +1022 -0
  911. package/src/engine/worker-tools.ts +208 -0
  912. package/src/entry/boot-options.ts +50 -0
  913. package/src/entry/orchestrator.ts +2011 -0
  914. package/src/interactive/application-controller.ts +433 -0
  915. package/src/interactive/bus-notices.ts +265 -0
  916. package/src/interactive/chat-loop-messages.ts +626 -0
  917. package/src/interactive/chat-loop-policy.ts +18 -0
  918. package/src/interactive/chat-loop.ts +1090 -0
  919. package/src/interactive/chat-panel.ts +1820 -0
  920. package/src/interactive/chat-renderer.ts +1228 -0
  921. package/src/interactive/clio-editor.ts +161 -0
  922. package/src/interactive/command-fallbacks.ts +23 -0
  923. package/src/interactive/command-output.ts +85 -0
  924. package/src/interactive/context-activity.ts +203 -0
  925. package/src/interactive/context-meter.ts +223 -0
  926. package/src/interactive/context-overlay.ts +246 -0
  927. package/src/interactive/cost-overlay.ts +279 -0
  928. package/src/interactive/dispatch-board.ts +1319 -0
  929. package/src/interactive/dispatch-steering.ts +86 -0
  930. package/src/interactive/editor-bash.ts +46 -0
  931. package/src/interactive/editor-steer.ts +51 -0
  932. package/src/interactive/editor-submit.ts +507 -0
  933. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  934. package/src/interactive/export-html/index.ts +51 -0
  935. package/src/interactive/export-html/template.ts +45 -0
  936. package/src/interactive/export-html/tool-renderer.ts +54 -0
  937. package/src/interactive/external-editor.ts +67 -0
  938. package/src/interactive/follow-up-queue-panel.ts +75 -0
  939. package/src/interactive/footer/dashboard.ts +538 -0
  940. package/src/interactive/footer/notifications.ts +275 -0
  941. package/src/interactive/footer/widgets.ts +1264 -0
  942. package/src/interactive/footer-panel.ts +187 -0
  943. package/src/interactive/format-time.ts +97 -0
  944. package/src/interactive/index.ts +11 -0
  945. package/src/interactive/interactive-application.ts +939 -0
  946. package/src/interactive/interactive-event-projection.ts +385 -0
  947. package/src/interactive/interactive-input-runtime.ts +307 -0
  948. package/src/interactive/interactive-presentation.ts +584 -0
  949. package/src/interactive/interactive-shell.ts +388 -0
  950. package/src/interactive/interactive-slash-runtime.ts +554 -0
  951. package/src/interactive/interactive-subscriptions.ts +111 -0
  952. package/src/interactive/interactive-tickers.ts +183 -0
  953. package/src/interactive/keybinding-manager.ts +496 -0
  954. package/src/interactive/layout.ts +57 -0
  955. package/src/interactive/leader-key.ts +143 -0
  956. package/src/interactive/loop-guard-interrupt.ts +101 -0
  957. package/src/interactive/memory-overlay.ts +280 -0
  958. package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
  959. package/src/interactive/overlay-auth-lifecycle.ts +308 -0
  960. package/src/interactive/overlay-frame.ts +502 -0
  961. package/src/interactive/overlay-general-openers.ts +274 -0
  962. package/src/interactive/overlay-key-routing.ts +216 -0
  963. package/src/interactive/overlay-lifecycle.ts +426 -0
  964. package/src/interactive/overlay-model-selectors.ts +127 -0
  965. package/src/interactive/overlay-permission-lifecycle.ts +345 -0
  966. package/src/interactive/overlay-resource-openers.ts +112 -0
  967. package/src/interactive/overlay-session-lifecycle.ts +327 -0
  968. package/src/interactive/overlay-transitions.ts +57 -0
  969. package/src/interactive/overlays/agents.ts +69 -0
  970. package/src/interactive/overlays/ask-user.ts +921 -0
  971. package/src/interactive/overlays/auth-dialog.ts +221 -0
  972. package/src/interactive/overlays/context-reset.ts +108 -0
  973. package/src/interactive/overlays/cwd-fallback.ts +141 -0
  974. package/src/interactive/overlays/decisions.ts +300 -0
  975. package/src/interactive/overlays/extensions.ts +54 -0
  976. package/src/interactive/overlays/help-reference.ts +145 -0
  977. package/src/interactive/overlays/interop.ts +139 -0
  978. package/src/interactive/overlays/keybinding-detail.ts +90 -0
  979. package/src/interactive/overlays/list-overlay.ts +606 -0
  980. package/src/interactive/overlays/message-picker.ts +155 -0
  981. package/src/interactive/overlays/model-selector.ts +1109 -0
  982. package/src/interactive/overlays/prompts.ts +72 -0
  983. package/src/interactive/overlays/session-selector-search.ts +31 -0
  984. package/src/interactive/overlays/session-selector.ts +284 -0
  985. package/src/interactive/overlays/settings.ts +3451 -0
  986. package/src/interactive/overlays/skills-hub.ts +237 -0
  987. package/src/interactive/overlays/tree-selector.ts +422 -0
  988. package/src/interactive/permission-overlay.ts +170 -0
  989. package/src/interactive/render-trace.ts +534 -0
  990. package/src/interactive/renderers/branch-summary.ts +86 -0
  991. package/src/interactive/renderers/code-ink.ts +420 -0
  992. package/src/interactive/renderers/compaction-summary.ts +112 -0
  993. package/src/interactive/renderers/diff.ts +137 -0
  994. package/src/interactive/renderers/mermaid.ts +53 -0
  995. package/src/interactive/renderers/notice.ts +28 -0
  996. package/src/interactive/renderers/retry-status.ts +31 -0
  997. package/src/interactive/renderers/structured.ts +89 -0
  998. package/src/interactive/renderers/tool-execution.ts +1357 -0
  999. package/src/interactive/renderers/worker-entry.ts +280 -0
  1000. package/src/interactive/session-last-turn.ts +186 -0
  1001. package/src/interactive/session-switch-settlement.ts +10 -0
  1002. package/src/interactive/session-transcript.ts +105 -0
  1003. package/src/interactive/session-usage-reseed.ts +74 -0
  1004. package/src/interactive/slash-autocomplete.ts +256 -0
  1005. package/src/interactive/slash-commands.ts +1407 -0
  1006. package/src/interactive/slash-spec.ts +424 -0
  1007. package/src/interactive/status/controller.ts +260 -0
  1008. package/src/interactive/status/index.ts +23 -0
  1009. package/src/interactive/status/state-machine.ts +530 -0
  1010. package/src/interactive/status/summary.ts +170 -0
  1011. package/src/interactive/status/types.ts +121 -0
  1012. package/src/interactive/status/verbs.ts +163 -0
  1013. package/src/interactive/status/watchdog.ts +24 -0
  1014. package/src/interactive/stdout-backpressure.ts +99 -0
  1015. package/src/interactive/stream-pacer.ts +530 -0
  1016. package/src/interactive/stream-pacing-policy.ts +66 -0
  1017. package/src/interactive/tasks-overlay.ts +540 -0
  1018. package/src/interactive/terminal-lease.ts +485 -0
  1019. package/src/interactive/theme/components.ts +55 -0
  1020. package/src/interactive/theme/glyphs.ts +70 -0
  1021. package/src/interactive/theme/index.ts +15 -0
  1022. package/src/interactive/theme/labels.ts +88 -0
  1023. package/src/interactive/theme/rules.ts +138 -0
  1024. package/src/interactive/theme/segments.ts +88 -0
  1025. package/src/interactive/theme/tokens.ts +121 -0
  1026. package/src/interactive/thinking-level-policy.ts +6 -0
  1027. package/src/interactive/tool-prose-loop.ts +122 -0
  1028. package/src/interactive/tool-prose-registration.ts +48 -0
  1029. package/src/interactive/turn-context.ts +855 -0
  1030. package/src/interactive/turn-middleware.ts +283 -0
  1031. package/src/interactive/turn-persistence.ts +458 -0
  1032. package/src/interactive/turn-queues.ts +181 -0
  1033. package/src/interactive/turn-recovery.ts +323 -0
  1034. package/src/interactive/turn-runtime.ts +869 -0
  1035. package/src/interactive/turn-state.ts +133 -0
  1036. package/src/interactive/view/artifacts.ts +1452 -0
  1037. package/src/interactive/view/view-overlay.ts +735 -0
  1038. package/src/interactive/welcome-dashboard.ts +537 -0
  1039. package/src/interactive/worker-receipts.ts +143 -0
  1040. package/src/interactive/worker-replay.ts +111 -0
  1041. package/src/interactive/worker-share.ts +100 -0
  1042. package/src/interactive/worker-stream.ts +446 -0
  1043. package/src/interactive/workspace-facts.ts +141 -0
  1044. package/src/tools/agent-tools.ts +402 -0
  1045. package/src/tools/artifact.ts +103 -0
  1046. package/src/tools/ask-user.ts +666 -0
  1047. package/src/tools/bash.ts +204 -0
  1048. package/src/tools/bootstrap.ts +77 -0
  1049. package/src/tools/builtin-tool-catalog.ts +265 -0
  1050. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  1051. package/src/tools/codewiki/code-nav.ts +549 -0
  1052. package/src/tools/codewiki/shared.ts +118 -0
  1053. package/src/tools/compete-worktrees.ts +898 -0
  1054. package/src/tools/context/docs-engine.ts +630 -0
  1055. package/src/tools/context/index.ts +514 -0
  1056. package/src/tools/context/surface.ts +19 -0
  1057. package/src/tools/core-bootstrap.ts +168 -0
  1058. package/src/tools/credential-present.ts +151 -0
  1059. package/src/tools/dispatch-admission.ts +533 -0
  1060. package/src/tools/dispatch-arguments.ts +228 -0
  1061. package/src/tools/dispatch-background.ts +54 -0
  1062. package/src/tools/dispatch-event-text.ts +6 -0
  1063. package/src/tools/dispatch-plan.ts +746 -0
  1064. package/src/tools/dispatch-run-events.ts +238 -0
  1065. package/src/tools/dispatch-runner.ts +2370 -0
  1066. package/src/tools/dispatch-scout-admission.ts +295 -0
  1067. package/src/tools/dispatch-scout.ts +461 -0
  1068. package/src/tools/dispatch-types.ts +77 -0
  1069. package/src/tools/dispatch.ts +244 -0
  1070. package/src/tools/edit-diff.ts +534 -0
  1071. package/src/tools/edit.ts +128 -0
  1072. package/src/tools/executables.ts +22 -0
  1073. package/src/tools/file-mutation-queue.ts +35 -0
  1074. package/src/tools/find.ts +294 -0
  1075. package/src/tools/grep.ts +495 -0
  1076. package/src/tools/ignore-policy.ts +169 -0
  1077. package/src/tools/lazy-tool.ts +60 -0
  1078. package/src/tools/ledger.ts +206 -0
  1079. package/src/tools/ls.ts +110 -0
  1080. package/src/tools/monitor-surface.ts +36 -0
  1081. package/src/tools/monitor.ts +767 -0
  1082. package/src/tools/network-policy.ts +29 -0
  1083. package/src/tools/observation.ts +421 -0
  1084. package/src/tools/observers.ts +99 -0
  1085. package/src/tools/path-utils.ts +79 -0
  1086. package/src/tools/policy.ts +154 -0
  1087. package/src/tools/profiles.ts +108 -0
  1088. package/src/tools/read.ts +173 -0
  1089. package/src/tools/registry.ts +1169 -0
  1090. package/src/tools/result-shaping.ts +204 -0
  1091. package/src/tools/safe-exec.ts +128 -0
  1092. package/src/tools/spawn-hygiene.ts +182 -0
  1093. package/src/tools/steer-surface.ts +17 -0
  1094. package/src/tools/steer.ts +77 -0
  1095. package/src/tools/tasks.ts +265 -0
  1096. package/src/tools/truncate-utf8.ts +17 -0
  1097. package/src/tools/truncate.ts +43 -0
  1098. package/src/tools/verify/frontend.ts +687 -0
  1099. package/src/tools/verify/index.ts +31 -0
  1100. package/src/tools/verify/scripts.ts +108 -0
  1101. package/src/tools/verify/surface.ts +46 -0
  1102. package/src/tools/web-fetch-surface.ts +23 -0
  1103. package/src/tools/web-fetch.ts +759 -0
  1104. package/src/tools/worker-evidence.ts +215 -0
  1105. package/src/tools/write.ts +57 -0
  1106. package/src/utils/exif-orientation.ts +192 -0
  1107. package/src/utils/git.ts +24 -0
  1108. package/src/utils/image-resize.ts +148 -0
  1109. package/src/utils/photon.ts +103 -0
  1110. package/src/worker/control-lane.ts +22 -0
  1111. package/src/worker/entry.ts +294 -0
  1112. package/src/worker/event-projection.ts +56 -0
  1113. package/src/worker/heartbeat.ts +24 -0
  1114. package/src/worker/ledger-mirror.ts +95 -0
  1115. package/src/worker/ndjson.ts +40 -0
  1116. package/src/worker/protocol.ts +529 -0
  1117. package/src/worker/resource-facts.ts +79 -0
  1118. package/src/worker/runtime-registry.ts +12 -0
  1119. package/src/worker/spec-contract.ts +675 -0
  1120. package/src/worker/stdin-demux.ts +316 -0
  1121. package/dist/acp-UMLFVA3F.js +0 -92
  1122. package/dist/chunk-262G75JS.js +0 -35
  1123. package/dist/chunk-6CWDTGUC.js +0 -20
  1124. package/dist/chunk-BYEU76JP.js +0 -899
  1125. package/dist/chunk-GNGDQYDU.js +0 -34688
  1126. package/dist/chunk-GOTUR54M.js +0 -9
  1127. package/dist/chunk-NI4DEJMC.js +0 -88
  1128. package/dist/chunk-TPOCL34A.js +0 -2876
  1129. package/dist/chunk-UU3R62TT.js +0 -128
  1130. package/dist/clio-KIQ5SNDS.js +0 -53
  1131. package/dist/configure-G4E3A2PG.js +0 -27
  1132. package/dist/doctor-M5HJJZOL.js +0 -61
  1133. package/dist/domains/agents/builtins/architect.md +0 -33
  1134. package/dist/domains/agents/builtins/coder.md +0 -31
  1135. package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
  1136. package/dist/domains/agents/builtins/debugger.md +0 -30
  1137. package/dist/domains/agents/builtins/documenter.md +0 -31
  1138. package/dist/domains/agents/builtins/git-master.md +0 -30
  1139. package/dist/domains/agents/builtins/provenance.md +0 -30
  1140. package/dist/domains/agents/builtins/researcher.md +0 -71
  1141. package/dist/domains/agents/builtins/scout.md +0 -42
  1142. package/dist/domains/agents/builtins/tester.md +0 -31
  1143. package/dist/domains/agents/builtins/verifier.md +0 -30
  1144. package/dist/domains/agents/builtins/wiki-writer.md +0 -41
  1145. package/dist/fleet-preflight-CLIAX7YR.js +0 -21
  1146. package/dist/preload-KZVHET2B.js +0 -11
  1147. package/dist/version-ROZ6CZKH.js +0 -16
  1148. package/docs/html/agents_blueprint.html +0 -936
  1149. package/docs/html/alcf_blueprint.html +0 -324
  1150. package/docs/html/architecture_blueprint.html +0 -850
  1151. package/docs/html/commands_blueprint.html +0 -794
  1152. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  1153. package/docs/html/configuration_blueprint.html +0 -1080
  1154. package/docs/html/context_blueprint.html +0 -603
  1155. package/docs/html/documentation_blueprint.html +0 -832
  1156. package/docs/html/environment_blueprint.html +0 -404
  1157. package/docs/html/eval_blueprint.html +0 -743
  1158. package/docs/html/evals_internal_blueprint.html +0 -190
  1159. package/docs/html/evolution_blueprint.html +0 -674
  1160. package/docs/html/extensions_blueprint.html +0 -2065
  1161. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  1162. package/docs/html/index.html +0 -919
  1163. package/docs/html/lifecycle_blueprint.html +0 -723
  1164. package/docs/html/memory_blueprint.html +0 -699
  1165. package/docs/html/middleware_blueprint.html +0 -664
  1166. package/docs/html/models_blueprint.html +0 -2366
  1167. package/docs/html/observability_blueprint.html +0 -683
  1168. package/docs/html/provider_adapter_blueprint.html +0 -245
  1169. package/docs/html/safety_blueprint.html +0 -1386
  1170. package/docs/html/shared.css +0 -571
  1171. package/docs/html/shared.js +0 -143
  1172. package/docs/html/skills_blueprint.html +0 -671
  1173. package/docs/html/soak_blueprint.html +0 -182
  1174. package/docs/html/tool_usage_blueprint.html +0 -350
  1175. package/docs/html/tools_blueprint.html +0 -2249
  1176. package/docs/html/trace_blueprint.html +0 -235
  1177. package/docs/html/tui_design_blueprint.html +0 -314
  1178. package/docs/html/validation_blueprint.html +0 -961
  1179. package/docs/html/worker_dispatch_blueprint.html +0 -231
  1180. package/skills/git/commit-crafting/SKILL.md +0 -79
  1181. package/skills/git/commit-crafting/evals.md +0 -92
  1182. package/skills/git/create-pr/SKILL.md +0 -116
  1183. package/skills/git/create-pr/evals.md +0 -114
  1184. package/skills/git/investigate-issue/SKILL.md +0 -139
  1185. package/skills/git/investigate-issue/evals.md +0 -94
  1186. package/skills/git/review-changes/SKILL.md +0 -103
  1187. package/skills/git/review-changes/evals.md +0 -85
@@ -1,18 +1,13 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
1
2
  import {
2
3
  isAgentCapabilityClass
3
- } from "./chunk-WD6AJM35.js";
4
+ } from "./chunk-5UUP6MWO.js";
4
5
  import {
5
- assertSafeId
6
- } from "./chunk-5N2FG33Q.js";
7
- import {
8
- safeResourceWrite
9
- } from "./chunk-VPAWTYLY.js";
10
- import {
11
- readClioVersion,
12
- resolvePackageRoot
13
- } from "./chunk-DXQNI4PC.js";
6
+ init_esm_shims
7
+ } from "./chunk-3R73A4XB.js";
14
8
 
15
9
  // src/domains/dispatch/execution-role.ts
10
+ init_esm_shims();
16
11
  var EXECUTION_ROLES = [
17
12
  "builder",
18
13
  "reviewer",
@@ -95,13 +90,186 @@ function gateRouteCorrelation(subject, decider) {
95
90
  };
96
91
  }
97
92
 
98
- // src/domains/dispatch/receipt-integrity.ts
99
- import { createHash as createHash2 } from "node:crypto";
100
-
101
- // src/domains/dispatch/route-decision.ts
102
- import { createHash } from "node:crypto";
93
+ // src/domains/dispatch/routing-intent.ts
94
+ init_esm_shims();
95
+ var KEYS = /* @__PURE__ */ new Set([
96
+ "posture",
97
+ "maxCostUsd",
98
+ "deadlineMs",
99
+ "minimumQuality",
100
+ "requiredCapabilities",
101
+ "locality",
102
+ "failover"
103
+ ]);
104
+ var POSTURES = /* @__PURE__ */ new Set(["manual", "quality", "balanced", "latency", "economy"]);
105
+ var LOCALITIES = /* @__PURE__ */ new Set(["local-only", "prefer-local", "any"]);
106
+ var FAILOVERS = /* @__PURE__ */ new Set(["none", "approved"]);
107
+ function record(value) {
108
+ return typeof value === "object" && value !== null && !Array.isArray(value);
109
+ }
110
+ function isRoutingIntent(value) {
111
+ if (!record(value) || Object.keys(value).some((key) => !KEYS.has(key))) return false;
112
+ return typeof value.posture === "string" && POSTURES.has(value.posture) && (value.maxCostUsd === null || typeof value.maxCostUsd === "number" && Number.isFinite(value.maxCostUsd) && value.maxCostUsd > 0) && (value.deadlineMs === null || typeof value.deadlineMs === "number" && Number.isInteger(value.deadlineMs) && value.deadlineMs > 0) && (value.minimumQuality === null || typeof value.minimumQuality === "number" && value.minimumQuality >= 0 && value.minimumQuality <= 1) && Array.isArray(value.requiredCapabilities) && value.requiredCapabilities.every((entry) => typeof entry === "string" && entry.length > 0) && typeof value.locality === "string" && LOCALITIES.has(value.locality) && typeof value.failover === "string" && FAILOVERS.has(value.failover);
113
+ }
114
+ function parseRoutingIntent(value, pins = {}) {
115
+ const errors = [];
116
+ if (value !== void 0 && !record(value)) return { ok: false, errors: ["routing must be an object"] };
117
+ const input = value === void 0 ? {} : value;
118
+ for (const key of Object.keys(input)) if (!KEYS.has(key)) errors.push(`routing unknown key: ${key}`);
119
+ const pinned = pins.target !== void 0 || pins.model !== void 0 || pins.node !== void 0;
120
+ const posture = input.posture ?? (pinned ? "manual" : "balanced");
121
+ if (typeof posture !== "string" || !POSTURES.has(posture)) {
122
+ errors.push("routing.posture must be one of: manual|quality|balanced|latency|economy");
123
+ }
124
+ if (pinned && posture !== "manual") errors.push("exact target, model, or node pins require routing.posture manual");
125
+ const positive = (key) => {
126
+ const candidate = input[key];
127
+ if (candidate === void 0) return null;
128
+ if (typeof candidate !== "number" || !Number.isFinite(candidate) || candidate <= 0) {
129
+ errors.push(`routing.${key} must be a finite number greater than zero`);
130
+ return null;
131
+ }
132
+ if (key === "deadlineMs" && !Number.isInteger(candidate)) errors.push("routing.deadlineMs must be an integer");
133
+ return candidate;
134
+ };
135
+ const maxCostUsd = positive("maxCostUsd");
136
+ const deadlineMs = positive("deadlineMs");
137
+ let minimumQuality = null;
138
+ if (input.minimumQuality !== void 0) {
139
+ if (typeof input.minimumQuality !== "number" || !Number.isFinite(input.minimumQuality) || input.minimumQuality < 0 || input.minimumQuality > 1)
140
+ errors.push("routing.minimumQuality must be between zero and one");
141
+ else minimumQuality = input.minimumQuality;
142
+ }
143
+ const requiredCapabilities = input.requiredCapabilities ?? [];
144
+ if (!Array.isArray(requiredCapabilities) || requiredCapabilities.some((entry) => typeof entry !== "string" || entry.trim().length === 0) || new Set(requiredCapabilities).size !== requiredCapabilities.length)
145
+ errors.push("routing.requiredCapabilities must be an array of unique non-empty strings");
146
+ const locality = input.locality ?? "any";
147
+ if (typeof locality !== "string" || !LOCALITIES.has(locality)) {
148
+ errors.push("routing.locality must be one of: local-only|prefer-local|any");
149
+ }
150
+ const failover = input.failover ?? "none";
151
+ if (typeof failover !== "string" || !FAILOVERS.has(failover)) {
152
+ errors.push("routing.failover must be one of: none|approved");
153
+ }
154
+ if (pinned && failover !== "none") errors.push("manual pins imply routing.failover none");
155
+ if (errors.length > 0) return { ok: false, errors };
156
+ return {
157
+ ok: true,
158
+ intent: {
159
+ posture,
160
+ maxCostUsd,
161
+ deadlineMs,
162
+ minimumQuality,
163
+ requiredCapabilities: [...requiredCapabilities],
164
+ locality,
165
+ failover
166
+ }
167
+ };
168
+ }
169
+ function defaultRoutingIntent(pins) {
170
+ const parsed = parseRoutingIntent(void 0, pins);
171
+ if (!parsed.ok) throw new Error(parsed.errors.join("; "));
172
+ return parsed.intent;
173
+ }
174
+ function routingIntentRejection(input) {
175
+ const { intent } = input;
176
+ if (intent.minimumQuality !== null && input.qualityLowerBound < intent.minimumQuality) return "minimum-quality";
177
+ if (intent.maxCostUsd !== null && input.costUpperBoundUsd > intent.maxCostUsd) return "max-cost";
178
+ if (intent.deadlineMs !== null && input.endToEndUpperBoundMs > intent.deadlineMs) return "deadline";
179
+ if (intent.locality === "local-only" && input.candidate.nodeId !== "local") return "local-only";
180
+ if (intent.requiredCapabilities.some((capability) => !input.capabilities.includes(capability))) {
181
+ return "required-capabilities";
182
+ }
183
+ return null;
184
+ }
185
+ var ROUTE_EXPLANATION_MAX_BYTES = 4096;
186
+ function safeIdentity(candidate) {
187
+ const safe = (value) => {
188
+ const redacted = /(?:https?:\/\/|api[_-]?key|token|secret|password)/i.test(value) ? "[redacted]" : value;
189
+ return redacted.length <= 128 ? redacted : `${redacted.slice(0, 127)}\u2026`;
190
+ };
191
+ return {
192
+ ...candidate,
193
+ agentId: safe(candidate.agentId),
194
+ specFingerprint: safe(candidate.specFingerprint),
195
+ targetId: safe(candidate.targetId),
196
+ modelId: safe(candidate.modelId),
197
+ runtimeId: safe(candidate.runtimeId),
198
+ nodeId: safe(candidate.nodeId),
199
+ ...candidate.thinkingLevel !== void 0 ? { thinkingLevel: safe(candidate.thinkingLevel) } : {},
200
+ toolSignature: safe(candidate.toolSignature),
201
+ promptCompositionHash: safe(candidate.promptCompositionHash),
202
+ endpointIdentityHash: safe(candidate.endpointIdentityHash),
203
+ settingsFingerprint: safe(candidate.settingsFingerprint)
204
+ };
205
+ }
206
+ function explainRouteDecision(decision, intent) {
207
+ const exclusions = [
208
+ ...new Set(decision.candidateEvaluations.flatMap((entry) => entry.rejection ? [entry.rejection] : []))
209
+ ];
210
+ const explanation = {
211
+ mode: decision.mode,
212
+ executedRoute: safeIdentity(decision.executedRoute),
213
+ shadowRecommendation: decision.mode === "shadow" ? safeIdentity(decision.selected) : null,
214
+ hardExclusions: exclusions.slice(0, 16),
215
+ approvedFallbacks: decision.approvedFallbacks.slice(0, 3).map(safeIdentity),
216
+ costUpperBoundUsd: intent.maxCostUsd,
217
+ deadlineMs: intent.deadlineMs,
218
+ confidence: decision.confidence,
219
+ activeEligible: decision.candidateEvaluations.some(
220
+ (entry) => entry.rejection === null && entry.activeReadiness.ready
221
+ ),
222
+ reasonCodes: decision.reasonCodes.slice(0, 16),
223
+ decisionHash: decision.decisionHash,
224
+ agentSelection: {
225
+ request: decision.agentSelection.request,
226
+ activation: decision.agentSelection.activation,
227
+ baselineAgentId: safeIdentity({ ...decision.executedRoute, agentId: decision.agentSelection.baselineAgentId }).agentId,
228
+ recommendedAgentId: safeIdentity({ ...decision.executedRoute, agentId: decision.agentSelection.recommendedAgentId }).agentId,
229
+ excluded: decision.agentSelection.evaluations.filter((entry) => entry.rejections.length > 0).slice(0, 16).map((entry) => ({
230
+ agentId: safeIdentity({ ...decision.executedRoute, agentId: entry.agentId }).agentId,
231
+ reasons: entry.rejections.slice(0, 8)
232
+ })),
233
+ authorityTransition: decision.agentSelection.authorityTransition === null ? null : {
234
+ ...decision.agentSelection.authorityTransition,
235
+ from: safeIdentity({
236
+ ...decision.executedRoute,
237
+ agentId: decision.agentSelection.authorityTransition.from
238
+ }).agentId,
239
+ to: safeIdentity({
240
+ ...decision.executedRoute,
241
+ agentId: decision.agentSelection.authorityTransition.to
242
+ }).agentId
243
+ }
244
+ }
245
+ };
246
+ if (Buffer.byteLength(JSON.stringify(explanation), "utf8") <= ROUTE_EXPLANATION_MAX_BYTES) return explanation;
247
+ const compact = {
248
+ ...explanation,
249
+ approvedFallbacks: explanation.approvedFallbacks.slice(0, 1),
250
+ hardExclusions: explanation.hardExclusions.slice(0, 4),
251
+ reasonCodes: explanation.reasonCodes.slice(0, 4),
252
+ agentSelection: {
253
+ ...explanation.agentSelection,
254
+ excluded: explanation.agentSelection.excluded.slice(0, 4).map((entry) => ({ ...entry, reasons: entry.reasons.slice(0, 2) }))
255
+ }
256
+ };
257
+ if (Buffer.byteLength(JSON.stringify(compact), "utf8") <= ROUTE_EXPLANATION_MAX_BYTES) return compact;
258
+ return {
259
+ ...compact,
260
+ shadowRecommendation: null,
261
+ approvedFallbacks: [],
262
+ hardExclusions: compact.hardExclusions.slice(0, 2),
263
+ reasonCodes: compact.reasonCodes.slice(0, 2),
264
+ agentSelection: {
265
+ ...compact.agentSelection,
266
+ excluded: []
267
+ }
268
+ };
269
+ }
103
270
 
104
271
  // src/domains/dispatch/route-policy.ts
272
+ init_esm_shims();
105
273
  var ROUTE_POLICY_VERSION = "route-policy/4";
106
274
  var MINIMUM_QUALITY_LABELED_OUTCOMES = 6;
107
275
  var ROUTE_POSTURES = {
@@ -299,7 +467,12 @@ function compareRankedRoutes(left, right) {
299
467
  return left.key < right.key ? -1 : left.key > right.key ? 1 : 0;
300
468
  }
301
469
 
470
+ // src/domains/dispatch/route-decision.ts
471
+ init_esm_shims();
472
+ import { createHash } from "node:crypto";
473
+
302
474
  // src/domains/dispatch/route-readiness.ts
475
+ init_esm_shims();
303
476
  var MINIMUM_ACTIVE_QUALITY_LABELS = 6;
304
477
  var DECISION_LATENCY_BUDGET_MS = 10;
305
478
  function evaluateRouteReadiness(input) {
@@ -879,1191 +1052,6 @@ function evaluateRouteDecision(decision, realized) {
879
1052
  };
880
1053
  }
881
1054
 
882
- // src/domains/dispatch/routing-intent.ts
883
- var KEYS = /* @__PURE__ */ new Set([
884
- "posture",
885
- "maxCostUsd",
886
- "deadlineMs",
887
- "minimumQuality",
888
- "requiredCapabilities",
889
- "locality",
890
- "failover"
891
- ]);
892
- var POSTURES = /* @__PURE__ */ new Set(["manual", "quality", "balanced", "latency", "economy"]);
893
- var LOCALITIES = /* @__PURE__ */ new Set(["local-only", "prefer-local", "any"]);
894
- var FAILOVERS = /* @__PURE__ */ new Set(["none", "approved"]);
895
- function record(value) {
896
- return typeof value === "object" && value !== null && !Array.isArray(value);
897
- }
898
- function isRoutingIntent(value) {
899
- if (!record(value) || Object.keys(value).some((key) => !KEYS.has(key))) return false;
900
- return typeof value.posture === "string" && POSTURES.has(value.posture) && (value.maxCostUsd === null || typeof value.maxCostUsd === "number" && Number.isFinite(value.maxCostUsd) && value.maxCostUsd > 0) && (value.deadlineMs === null || typeof value.deadlineMs === "number" && Number.isInteger(value.deadlineMs) && value.deadlineMs > 0) && (value.minimumQuality === null || typeof value.minimumQuality === "number" && value.minimumQuality >= 0 && value.minimumQuality <= 1) && Array.isArray(value.requiredCapabilities) && value.requiredCapabilities.every((entry) => typeof entry === "string" && entry.length > 0) && typeof value.locality === "string" && LOCALITIES.has(value.locality) && typeof value.failover === "string" && FAILOVERS.has(value.failover);
901
- }
902
- function parseRoutingIntent(value, pins = {}) {
903
- const errors = [];
904
- if (value !== void 0 && !record(value)) return { ok: false, errors: ["routing must be an object"] };
905
- const input = value === void 0 ? {} : value;
906
- for (const key of Object.keys(input)) if (!KEYS.has(key)) errors.push(`routing unknown key: ${key}`);
907
- const pinned = pins.target !== void 0 || pins.model !== void 0 || pins.node !== void 0;
908
- const posture = input.posture ?? (pinned ? "manual" : "balanced");
909
- if (typeof posture !== "string" || !POSTURES.has(posture)) {
910
- errors.push("routing.posture must be one of: manual|quality|balanced|latency|economy");
911
- }
912
- if (pinned && posture !== "manual") errors.push("exact target, model, or node pins require routing.posture manual");
913
- const positive = (key) => {
914
- const candidate = input[key];
915
- if (candidate === void 0) return null;
916
- if (typeof candidate !== "number" || !Number.isFinite(candidate) || candidate <= 0) {
917
- errors.push(`routing.${key} must be a finite number greater than zero`);
918
- return null;
919
- }
920
- if (key === "deadlineMs" && !Number.isInteger(candidate)) errors.push("routing.deadlineMs must be an integer");
921
- return candidate;
922
- };
923
- const maxCostUsd = positive("maxCostUsd");
924
- const deadlineMs = positive("deadlineMs");
925
- let minimumQuality = null;
926
- if (input.minimumQuality !== void 0) {
927
- if (typeof input.minimumQuality !== "number" || !Number.isFinite(input.minimumQuality) || input.minimumQuality < 0 || input.minimumQuality > 1)
928
- errors.push("routing.minimumQuality must be between zero and one");
929
- else minimumQuality = input.minimumQuality;
930
- }
931
- const requiredCapabilities = input.requiredCapabilities ?? [];
932
- if (!Array.isArray(requiredCapabilities) || requiredCapabilities.some((entry) => typeof entry !== "string" || entry.trim().length === 0) || new Set(requiredCapabilities).size !== requiredCapabilities.length)
933
- errors.push("routing.requiredCapabilities must be an array of unique non-empty strings");
934
- const locality = input.locality ?? "any";
935
- if (typeof locality !== "string" || !LOCALITIES.has(locality)) {
936
- errors.push("routing.locality must be one of: local-only|prefer-local|any");
937
- }
938
- const failover = input.failover ?? "none";
939
- if (typeof failover !== "string" || !FAILOVERS.has(failover)) {
940
- errors.push("routing.failover must be one of: none|approved");
941
- }
942
- if (pinned && failover !== "none") errors.push("manual pins imply routing.failover none");
943
- if (errors.length > 0) return { ok: false, errors };
944
- return {
945
- ok: true,
946
- intent: {
947
- posture,
948
- maxCostUsd,
949
- deadlineMs,
950
- minimumQuality,
951
- requiredCapabilities: [...requiredCapabilities],
952
- locality,
953
- failover
954
- }
955
- };
956
- }
957
- function defaultRoutingIntent(pins) {
958
- const parsed = parseRoutingIntent(void 0, pins);
959
- if (!parsed.ok) throw new Error(parsed.errors.join("; "));
960
- return parsed.intent;
961
- }
962
- function routingIntentRejection(input) {
963
- const { intent } = input;
964
- if (intent.minimumQuality !== null && input.qualityLowerBound < intent.minimumQuality) return "minimum-quality";
965
- if (intent.maxCostUsd !== null && input.costUpperBoundUsd > intent.maxCostUsd) return "max-cost";
966
- if (intent.deadlineMs !== null && input.endToEndUpperBoundMs > intent.deadlineMs) return "deadline";
967
- if (intent.locality === "local-only" && input.candidate.nodeId !== "local") return "local-only";
968
- if (intent.requiredCapabilities.some((capability) => !input.capabilities.includes(capability))) {
969
- return "required-capabilities";
970
- }
971
- return null;
972
- }
973
- var ROUTE_EXPLANATION_MAX_BYTES = 4096;
974
- function safeIdentity(candidate) {
975
- const safe = (value) => {
976
- const redacted = /(?:https?:\/\/|api[_-]?key|token|secret|password)/i.test(value) ? "[redacted]" : value;
977
- return redacted.length <= 128 ? redacted : `${redacted.slice(0, 127)}\u2026`;
978
- };
979
- return {
980
- ...candidate,
981
- agentId: safe(candidate.agentId),
982
- specFingerprint: safe(candidate.specFingerprint),
983
- targetId: safe(candidate.targetId),
984
- modelId: safe(candidate.modelId),
985
- runtimeId: safe(candidate.runtimeId),
986
- nodeId: safe(candidate.nodeId),
987
- ...candidate.thinkingLevel !== void 0 ? { thinkingLevel: safe(candidate.thinkingLevel) } : {},
988
- toolSignature: safe(candidate.toolSignature),
989
- promptCompositionHash: safe(candidate.promptCompositionHash),
990
- endpointIdentityHash: safe(candidate.endpointIdentityHash),
991
- settingsFingerprint: safe(candidate.settingsFingerprint)
992
- };
993
- }
994
- function explainRouteDecision(decision, intent) {
995
- const exclusions = [
996
- ...new Set(decision.candidateEvaluations.flatMap((entry) => entry.rejection ? [entry.rejection] : []))
997
- ];
998
- const explanation = {
999
- mode: decision.mode,
1000
- executedRoute: safeIdentity(decision.executedRoute),
1001
- shadowRecommendation: decision.mode === "shadow" ? safeIdentity(decision.selected) : null,
1002
- hardExclusions: exclusions.slice(0, 16),
1003
- approvedFallbacks: decision.approvedFallbacks.slice(0, 3).map(safeIdentity),
1004
- costUpperBoundUsd: intent.maxCostUsd,
1005
- deadlineMs: intent.deadlineMs,
1006
- confidence: decision.confidence,
1007
- activeEligible: decision.candidateEvaluations.some(
1008
- (entry) => entry.rejection === null && entry.activeReadiness.ready
1009
- ),
1010
- reasonCodes: decision.reasonCodes.slice(0, 16),
1011
- decisionHash: decision.decisionHash,
1012
- agentSelection: {
1013
- request: decision.agentSelection.request,
1014
- activation: decision.agentSelection.activation,
1015
- baselineAgentId: safeIdentity({ ...decision.executedRoute, agentId: decision.agentSelection.baselineAgentId }).agentId,
1016
- recommendedAgentId: safeIdentity({ ...decision.executedRoute, agentId: decision.agentSelection.recommendedAgentId }).agentId,
1017
- excluded: decision.agentSelection.evaluations.filter((entry) => entry.rejections.length > 0).slice(0, 16).map((entry) => ({
1018
- agentId: safeIdentity({ ...decision.executedRoute, agentId: entry.agentId }).agentId,
1019
- reasons: entry.rejections.slice(0, 8)
1020
- })),
1021
- authorityTransition: decision.agentSelection.authorityTransition === null ? null : {
1022
- ...decision.agentSelection.authorityTransition,
1023
- from: safeIdentity({
1024
- ...decision.executedRoute,
1025
- agentId: decision.agentSelection.authorityTransition.from
1026
- }).agentId,
1027
- to: safeIdentity({
1028
- ...decision.executedRoute,
1029
- agentId: decision.agentSelection.authorityTransition.to
1030
- }).agentId
1031
- }
1032
- }
1033
- };
1034
- if (Buffer.byteLength(JSON.stringify(explanation), "utf8") <= ROUTE_EXPLANATION_MAX_BYTES) return explanation;
1035
- const compact = {
1036
- ...explanation,
1037
- approvedFallbacks: explanation.approvedFallbacks.slice(0, 1),
1038
- hardExclusions: explanation.hardExclusions.slice(0, 4),
1039
- reasonCodes: explanation.reasonCodes.slice(0, 4),
1040
- agentSelection: {
1041
- ...explanation.agentSelection,
1042
- excluded: explanation.agentSelection.excluded.slice(0, 4).map((entry) => ({ ...entry, reasons: entry.reasons.slice(0, 2) }))
1043
- }
1044
- };
1045
- if (Buffer.byteLength(JSON.stringify(compact), "utf8") <= ROUTE_EXPLANATION_MAX_BYTES) return compact;
1046
- return {
1047
- ...compact,
1048
- shadowRecommendation: null,
1049
- approvedFallbacks: [],
1050
- hardExclusions: compact.hardExclusions.slice(0, 2),
1051
- reasonCodes: compact.reasonCodes.slice(0, 2),
1052
- agentSelection: {
1053
- ...compact.agentSelection,
1054
- excluded: []
1055
- }
1056
- };
1057
- }
1058
-
1059
- // src/domains/dispatch/receipt-integrity.ts
1060
- var RUN_RECEIPT_INTEGRITY_VERSION = 15;
1061
- var RUN_RECEIPT_INTEGRITY_ALGORITHM = "sha256";
1062
- function sha256(input) {
1063
- return createHash2("sha256").update(input, "utf8").digest("hex");
1064
- }
1065
- function canonicalJson(value) {
1066
- return serializeCanonical(value);
1067
- }
1068
- function serializeCanonical(value) {
1069
- if (value === null) return "null";
1070
- if (typeof value === "number") {
1071
- if (!Number.isFinite(value)) {
1072
- throw new Error(`receipt integrity: non-finite number ${String(value)} is not representable`);
1073
- }
1074
- return JSON.stringify(value);
1075
- }
1076
- if (typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
1077
- if (typeof value === "bigint") throw new Error("receipt integrity: bigint is not representable");
1078
- if (typeof value === "symbol" || typeof value === "function") {
1079
- throw new Error(`receipt integrity: ${typeof value} is not representable`);
1080
- }
1081
- if (value === void 0) throw new Error("receipt integrity: undefined is not representable at root");
1082
- if (Array.isArray(value)) {
1083
- const parts = [];
1084
- for (let i = 0; i < value.length; i++) {
1085
- if (!(i in value) || value[i] === void 0) {
1086
- parts.push("null");
1087
- continue;
1088
- }
1089
- parts.push(serializeCanonical(value[i]));
1090
- }
1091
- return `[${parts.join(",")}]`;
1092
- }
1093
- if (typeof value === "object") {
1094
- const obj = value;
1095
- const keys = Object.keys(obj).sort();
1096
- const parts = [];
1097
- for (const key of keys) {
1098
- const child = obj[key];
1099
- if (child === void 0) continue;
1100
- parts.push(`${JSON.stringify(key)}:${serializeCanonical(child)}`);
1101
- }
1102
- return `{${parts.join(",")}}`;
1103
- }
1104
- throw new Error(`receipt integrity: unsupported value of type ${typeof value}`);
1105
- }
1106
- var RECEIPT_INTEGRITY_FIELD_COVERAGE = {
1107
- runId: true,
1108
- agentId: true,
1109
- executionRole: true,
1110
- agentAudience: true,
1111
- requestOrigin: true,
1112
- task: true,
1113
- targetId: true,
1114
- wireModelId: true,
1115
- runtimeId: true,
1116
- runtimeKind: true,
1117
- startedAt: true,
1118
- endedAt: true,
1119
- outcome: true,
1120
- outcomeDetail: true,
1121
- lineage: true,
1122
- identity: true,
1123
- node: true,
1124
- attestation: true,
1125
- reroutes: true,
1126
- pipeline: true,
1127
- gate: true,
1128
- plan: true,
1129
- personaOverride: true,
1130
- projectContext: true,
1131
- exitCode: true,
1132
- failureMessage: true,
1133
- tokenCount: true,
1134
- inputTokenCount: true,
1135
- outputTokenCount: true,
1136
- cacheReadTokenCount: true,
1137
- cacheWriteTokenCount: true,
1138
- reasoningTokenCount: true,
1139
- upstreamResponses: true,
1140
- output: true,
1141
- costUsd: true,
1142
- costProvenance: true,
1143
- compiledPromptHash: true,
1144
- staticCompositionHash: true,
1145
- staticShellHash: true,
1146
- sessionShellHash: true,
1147
- dynamicHash: true,
1148
- promptSignature: true,
1149
- toolSignature: true,
1150
- clioVersion: true,
1151
- piMonoVersion: true,
1152
- platform: true,
1153
- nodeVersion: true,
1154
- toolCalls: true,
1155
- toolStats: true,
1156
- toolActivity: true,
1157
- verification: true,
1158
- routingIntent: true,
1159
- quality: true,
1160
- skillActivations: true,
1161
- autonomyEnforcement: true,
1162
- safety: true,
1163
- reproducibility: true,
1164
- runtimeResolution: true,
1165
- delegation: true,
1166
- findingsSummary: true,
1167
- // Both are optional and absent unless the run produced the condition they
1168
- // name, so a receipt that carries neither digests exactly as it did before
1169
- // they existed and the integrity version stays where it is.
1170
- validationGrounding: true,
1171
- capabilityMismatch: true,
1172
- // Same reasoning: absent unless the run had an agent ledger, so a receipt
1173
- // without one digests byte-identically to one produced before it existed.
1174
- ledgerContribution: true,
1175
- sessionId: true,
1176
- briefing: true,
1177
- outcomeCode: true,
1178
- steering: true,
1179
- routeDecision: true
1180
- };
1181
- var RECEIPT_FIELDS = Object.keys(RECEIPT_INTEGRITY_FIELD_COVERAGE);
1182
- function selectedReceiptFields(receipt, fields) {
1183
- const source = receipt;
1184
- const result = {};
1185
- for (const field of fields) {
1186
- const value = source[field];
1187
- if (value !== void 0) result[field] = value;
1188
- }
1189
- return result;
1190
- }
1191
- function receiptDigestFields(receipt) {
1192
- const result = selectedReceiptFields(receipt, RECEIPT_FIELDS);
1193
- result.briefing = receipt.briefing ?? null;
1194
- result.outcomeCode = receipt.outcomeCode ?? null;
1195
- result.steering = receipt.steering ?? null;
1196
- return result;
1197
- }
1198
- function ledgerDigestFields(envelope) {
1199
- return {
1200
- id: envelope.id,
1201
- agentId: envelope.agentId,
1202
- executionRole: envelope.executionRole,
1203
- task: envelope.task,
1204
- targetId: envelope.targetId,
1205
- wireModelId: envelope.wireModelId,
1206
- runtimeId: envelope.runtimeId,
1207
- runtimeKind: envelope.runtimeKind,
1208
- startedAt: envelope.startedAt,
1209
- endedAt: envelope.endedAt,
1210
- status: envelope.status,
1211
- exitCode: envelope.exitCode,
1212
- sessionId: envelope.sessionId,
1213
- cwd: envelope.cwd,
1214
- tokenCount: envelope.tokenCount,
1215
- cacheReadTokenCount: envelope.cacheReadTokenCount,
1216
- cacheWriteTokenCount: envelope.cacheWriteTokenCount,
1217
- reasoningTokenCount: envelope.reasoningTokenCount,
1218
- staticShellHash: envelope.staticShellHash,
1219
- sessionShellHash: envelope.sessionShellHash,
1220
- dynamicHash: envelope.dynamicHash,
1221
- costUsd: envelope.costUsd,
1222
- agentAudience: envelope.agentAudience ?? null,
1223
- requestOrigin: envelope.requestOrigin ?? null,
1224
- outcome: envelope.outcome ?? null,
1225
- outcomeDetail: envelope.outcomeDetail ?? null,
1226
- lineage: envelope.lineage ?? null,
1227
- identity: envelope.identity ?? null,
1228
- node: envelope.node ?? null,
1229
- reroutes: envelope.reroutes ?? null,
1230
- pipeline: envelope.pipeline ?? null,
1231
- gate: envelope.gate ?? null,
1232
- plan: envelope.plan ?? null,
1233
- personaOverride: envelope.personaOverride ?? null,
1234
- inputTokenCount: envelope.inputTokenCount ?? 0,
1235
- outputTokenCount: envelope.outputTokenCount ?? 0,
1236
- promptSignature: envelope.promptSignature ?? null,
1237
- toolSignature: envelope.toolSignature ?? null,
1238
- briefing: envelope.briefing ?? null,
1239
- outcomeCode: envelope.outcomeCode ?? null,
1240
- steering: envelope.steering ?? null
1241
- };
1242
- }
1243
- function integrityPayload(receipt, envelope) {
1244
- return {
1245
- contract: "clio.runReceipt.integrity",
1246
- version: RUN_RECEIPT_INTEGRITY_VERSION,
1247
- sources: ["receipt", "run-ledger"],
1248
- receipt: receiptDigestFields(receipt),
1249
- ledger: ledgerDigestFields(envelope)
1250
- };
1251
- }
1252
- function computeReceiptIntegrity(receipt, envelope) {
1253
- return {
1254
- version: RUN_RECEIPT_INTEGRITY_VERSION,
1255
- algorithm: RUN_RECEIPT_INTEGRITY_ALGORITHM,
1256
- digest: sha256(canonicalJson(integrityPayload(receipt, envelope)))
1257
- };
1258
- }
1259
- function isReceiptQuality(value) {
1260
- if (!value || typeof value !== "object" || Array.isArray(value)) return false;
1261
- const quality = value;
1262
- if (quality.version !== 1 || !Array.isArray(quality.typedValidations)) return false;
1263
- if (!quality.typedValidations.every(
1264
- (fact) => fact !== null && typeof fact === "object" && typeof fact.sourceId === "string" && typeof fact.validatorDigest === "string" && /^[0-9a-f]{64}$/.test(String(fact.validatorDigest)) && typeof fact.passed === "boolean"
1265
- ))
1266
- return false;
1267
- const schema = quality.responseSchema;
1268
- if (!schema || typeof schema !== "object" || Array.isArray(schema)) return false;
1269
- const responseSchema = schema;
1270
- const resultContract = quality.resultContract;
1271
- const validResultContract = resultContract === null || resultContract !== void 0 && typeof resultContract === "object" && !Array.isArray(resultContract) && typeof resultContract.sourceId === "string" && typeof resultContract.validatorDigest === "string" && /^[0-9a-f]{64}$/.test(String(resultContract.validatorDigest)) && (resultContract.conformance === "pass" || resultContract.conformance === "fail" || resultContract.conformance === "not-reached") && (resultContract.quality === "pass" || resultContract.quality === "fail" || resultContract.quality === "unmeasured");
1272
- return (responseSchema.sourceId === null || typeof responseSchema.sourceId === "string") && (responseSchema.schemaDigest === null || typeof responseSchema.schemaDigest === "string" && /^[0-9a-f]{64}$/.test(responseSchema.schemaDigest)) && typeof responseSchema.runtimeEnforceable === "boolean" && (responseSchema.enforcementPassed === null || typeof responseSchema.enforcementPassed === "boolean") && validResultContract;
1273
- }
1274
- function isCurrentRouteDecision(value) {
1275
- if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
1276
- const decision = value;
1277
- return decision.policyVersion === ROUTE_POLICY_VERSION && (decision.mode === "fixed" || decision.mode === "shadow" || decision.mode === "active") && isRouteDecisionAgentSelection(decision.agentSelection) && typeof decision.decisionHash === "string" && /^[0-9a-f]{64}$/u.test(decision.decisionHash);
1278
- }
1279
- function withReceiptIntegrity(receipt, envelope) {
1280
- if (!isReceiptQuality(receipt.quality)) throw new Error("receipt integrity: required quality block invalid");
1281
- if (!isExecutionRole(receipt.executionRole)) throw new Error("receipt integrity: required execution role invalid");
1282
- if (!isRoutingIntent(receipt.routingIntent)) {
1283
- throw new Error("receipt integrity: required routing intent invalid");
1284
- }
1285
- if (receipt.routeDecision !== void 0 && !isCurrentRouteDecision(receipt.routeDecision)) {
1286
- throw new Error("receipt integrity: route decision is invalid or retired");
1287
- }
1288
- return {
1289
- ...receipt,
1290
- routingIntent: receipt.routingIntent,
1291
- integrity: computeReceiptIntegrity(receipt, envelope)
1292
- };
1293
- }
1294
- function isReceiptIntegrity(value) {
1295
- if (!value || typeof value !== "object" || Array.isArray(value)) return false;
1296
- const candidate = value;
1297
- return candidate.version === RUN_RECEIPT_INTEGRITY_VERSION && candidate.algorithm === RUN_RECEIPT_INTEGRITY_ALGORITHM && typeof candidate.digest === "string" && /^[0-9a-f]{64}$/.test(candidate.digest);
1298
- }
1299
- function firstLedgerMismatch(receipt, envelope) {
1300
- const sharedFields = [
1301
- ["runId", receipt.runId, envelope.id],
1302
- ["agentId", receipt.agentId, envelope.agentId],
1303
- ["executionRole", receipt.executionRole, envelope.executionRole],
1304
- ["agentAudience", receipt.agentAudience, envelope.agentAudience],
1305
- ["requestOrigin", receipt.requestOrigin, envelope.requestOrigin],
1306
- ["task", receipt.task, envelope.task],
1307
- ["targetId", receipt.targetId, envelope.targetId],
1308
- ["wireModelId", receipt.wireModelId, envelope.wireModelId],
1309
- ["runtimeId", receipt.runtimeId, envelope.runtimeId],
1310
- ["runtimeKind", receipt.runtimeKind, envelope.runtimeKind],
1311
- ["startedAt", receipt.startedAt, envelope.startedAt],
1312
- ["endedAt", receipt.endedAt, envelope.endedAt],
1313
- ["exitCode", receipt.exitCode, envelope.exitCode],
1314
- ["tokenCount", receipt.tokenCount, envelope.tokenCount],
1315
- ["cacheReadTokenCount", receipt.cacheReadTokenCount ?? 0, envelope.cacheReadTokenCount ?? 0],
1316
- ["cacheWriteTokenCount", receipt.cacheWriteTokenCount ?? 0, envelope.cacheWriteTokenCount ?? 0],
1317
- ["reasoningTokenCount", receipt.reasoningTokenCount ?? 0, envelope.reasoningTokenCount ?? 0],
1318
- ["staticShellHash", receipt.staticShellHash ?? null, envelope.staticShellHash ?? null],
1319
- ["sessionShellHash", receipt.sessionShellHash ?? null, envelope.sessionShellHash ?? null],
1320
- ["dynamicHash", receipt.dynamicHash ?? null, envelope.dynamicHash ?? null],
1321
- ["costUsd", receipt.costUsd, envelope.costUsd],
1322
- ["sessionId", receipt.sessionId, envelope.sessionId],
1323
- ["outcome", receipt.outcome ?? null, envelope.outcome ?? null],
1324
- ["outcomeDetail", receipt.outcomeDetail ?? null, envelope.outcomeDetail ?? null],
1325
- ["nodeId", receipt.node?.id ?? null, envelope.node?.id ?? null],
1326
- ["outcomeCode", receipt.outcomeCode ?? null, envelope.outcomeCode ?? null]
1327
- ];
1328
- for (const [field, receiptValue, ledgerValue] of sharedFields) {
1329
- if (!Object.is(receiptValue, ledgerValue)) return field;
1330
- }
1331
- if (canonicalJson(receipt.briefing ?? null) !== canonicalJson(envelope.briefing ?? null)) return "briefing";
1332
- if (canonicalJson(receipt.steering ?? null) !== canonicalJson(envelope.steering ?? null)) return "steering";
1333
- return null;
1334
- }
1335
- function verifyReceiptIntegrity(receipt, envelope) {
1336
- if (!isReceiptQuality(receipt.quality) || !isReceiptIntegrity(receipt.integrity)) {
1337
- return { ok: false, reason: "integrity invalid" };
1338
- }
1339
- if (!isExecutionRole(receipt.executionRole)) return { ok: false, reason: "execution role invalid" };
1340
- if (!isRoutingIntent(receipt.routingIntent)) {
1341
- return { ok: false, reason: "routing intent invalid" };
1342
- }
1343
- if (receipt.routeDecision !== void 0 && !isCurrentRouteDecision(receipt.routeDecision)) {
1344
- return { ok: false, reason: "route decision invalid" };
1345
- }
1346
- const mismatch = firstLedgerMismatch(receipt, envelope);
1347
- if (mismatch) {
1348
- return { ok: false, reason: `ledger mismatch: ${mismatch}` };
1349
- }
1350
- const expected = computeReceiptIntegrity(receipt, envelope);
1351
- if (expected.digest !== receipt.integrity.digest) {
1352
- return { ok: false, reason: "integrity mismatch" };
1353
- }
1354
- return { ok: true };
1355
- }
1356
-
1357
- // src/domains/eval/harness-metrics.ts
1358
- var ZERO_EVAL_HARNESS_METRICS = {
1359
- receiptCount: 0,
1360
- toolCalls: 0,
1361
- retries: 0,
1362
- safetyBlocks: 0,
1363
- correctionLatencyMs: 0,
1364
- validationEvidence: 0
1365
- };
1366
- function evalHarnessMetricsFromCommands(commands) {
1367
- return {
1368
- ...ZERO_EVAL_HARNESS_METRICS,
1369
- validationEvidence: commands.filter(
1370
- (command) => command.phase === "verifier" && command.exitCode === 0 && !command.timedOut
1371
- ).length
1372
- };
1373
- }
1374
- function sumEvalHarnessMetrics(records) {
1375
- return records.reduce((total, record2) => addEvalHarnessMetrics(total, record2.harness), {
1376
- ...ZERO_EVAL_HARNESS_METRICS
1377
- });
1378
- }
1379
- function addEvalHarnessMetrics(left, right) {
1380
- return {
1381
- receiptCount: left.receiptCount + right.receiptCount,
1382
- toolCalls: left.toolCalls + right.toolCalls,
1383
- retries: left.retries + right.retries,
1384
- safetyBlocks: left.safetyBlocks + right.safetyBlocks,
1385
- correctionLatencyMs: left.correctionLatencyMs + right.correctionLatencyMs,
1386
- validationEvidence: left.validationEvidence + right.validationEvidence
1387
- };
1388
- }
1389
-
1390
- // src/domains/eval/store.ts
1391
- import { readFile } from "node:fs/promises";
1392
- import { join } from "node:path";
1393
-
1394
- // src/domains/eval/artifacts/redact.ts
1395
- var SENSITIVE_KEY = /(?:^|[_-])(api[_-]?key|authorization|cookie|password|secret|token)(?:$|[_-])/i;
1396
- var CREDENTIAL_PATTERNS = [
1397
- [/\b(authorization\s*[:=]\s*)(?:bearer|basic)\s+[A-Za-z0-9._~+/=-]+/gi, "$1[redacted]"],
1398
- [/\b(bearer\s+)[A-Za-z0-9._~+/=-]{12,}/gi, "$1[redacted]"],
1399
- [/\b(sk-[A-Za-z0-9_-]{16,})\b/g, "[redacted]"],
1400
- [/\b(gh[pousr]_[A-Za-z0-9_]{16,})\b/g, "[redacted]"],
1401
- [/\b(AKIA[0-9A-Z]{16})\b/g, "[redacted]"],
1402
- [/\b((?:api[_-]?key|access[_-]?token|refresh[_-]?token|password|secret)\s*[:=]\s*)[^\s"',}]+/gi, "$1[redacted]"]
1403
- ];
1404
- function redactArtifactForStorage(value, env = process.env) {
1405
- return redactValue(value, env);
1406
- }
1407
- function redactValue(value, env) {
1408
- if (typeof value === "string") return redactString(value, env);
1409
- if (Array.isArray(value)) return value.map((entry) => redactValue(entry, env));
1410
- if (value !== null && typeof value === "object") {
1411
- const out = {};
1412
- for (const [key, entry] of Object.entries(value)) {
1413
- out[key] = SENSITIVE_KEY.test(key) ? "[redacted]" : redactValue(entry, env);
1414
- }
1415
- return out;
1416
- }
1417
- return value;
1418
- }
1419
- function redactString(value, env) {
1420
- let out = stripHomePrefix(value, env.HOME);
1421
- for (const [pattern, replacement] of CREDENTIAL_PATTERNS) {
1422
- out = out.replace(pattern, replacement);
1423
- }
1424
- return out;
1425
- }
1426
- function stripHomePrefix(value, home) {
1427
- if (home === void 0 || home.length === 0) return value;
1428
- const normalized = home.replace(/\/+$/g, "");
1429
- if (normalized.length === 0) return value;
1430
- return value.split(normalized).join("$HOME");
1431
- }
1432
-
1433
- // src/domains/eval/store.ts
1434
- var NODE_SIGNALS = /* @__PURE__ */ new Set([
1435
- "SIGHUP",
1436
- "SIGINT",
1437
- "SIGQUIT",
1438
- "SIGILL",
1439
- "SIGTRAP",
1440
- "SIGABRT",
1441
- "SIGIOT",
1442
- "SIGBUS",
1443
- "SIGFPE",
1444
- "SIGKILL",
1445
- "SIGUSR1",
1446
- "SIGSEGV",
1447
- "SIGUSR2",
1448
- "SIGPIPE",
1449
- "SIGALRM",
1450
- "SIGTERM",
1451
- "SIGCHLD",
1452
- "SIGSTKFLT",
1453
- "SIGCONT",
1454
- "SIGSTOP",
1455
- "SIGTSTP",
1456
- "SIGTTIN",
1457
- "SIGTTOU",
1458
- "SIGURG",
1459
- "SIGXCPU",
1460
- "SIGXFSZ",
1461
- "SIGVTALRM",
1462
- "SIGPROF",
1463
- "SIGWINCH",
1464
- "SIGIO",
1465
- "SIGPOLL",
1466
- "SIGPWR",
1467
- "SIGSYS",
1468
- "SIGUNUSED"
1469
- ]);
1470
- function evalRoot(dataDir) {
1471
- return join(dataDir, "evals");
1472
- }
1473
- function evalArtifactPath(dataDir, evalId) {
1474
- assertSafeId(evalId, "eval");
1475
- return join(evalRoot(dataDir), `${evalId}.json`);
1476
- }
1477
- function createEvalId(startedAt, taskFileHash) {
1478
- const stamp = startedAt.toISOString().replace(/[-:.]/g, "");
1479
- return `eval-${stamp}-${taskFileHash.slice(0, 8)}`;
1480
- }
1481
- async function writeEvalArtifact(dataDir, artifact) {
1482
- const path = evalArtifactPath(dataDir, artifact.evalId);
1483
- const redacted = redactArtifactForStorage({
1484
- ...artifact,
1485
- paths: { ...artifact.paths, artifact: path }
1486
- });
1487
- safeResourceWrite(path, `${JSON.stringify(redacted, null, 2)}
1488
- `, { encoding: "utf8" });
1489
- return path;
1490
- }
1491
- async function loadEvalArtifact(dataDir, evalId) {
1492
- let raw;
1493
- try {
1494
- raw = await readFile(evalArtifactPath(dataDir, evalId), "utf8");
1495
- } catch (error) {
1496
- if (isErrorWithCode(error) && error.code === "ENOENT") throw new Error(`eval artifact not found: ${evalId}`);
1497
- throw error;
1498
- }
1499
- const source = evalArtifactPath(dataDir, evalId);
1500
- const parsed = parseJson(raw, source);
1501
- return parseArtifact(parsed, source);
1502
- }
1503
- function parseArtifact(value, source) {
1504
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1505
- if (value.version !== 1) throw new Error(`${source}.version: expected 1`);
1506
- const results = readArray(value, source, "results").map(
1507
- (entry, index) => parseRecord(entry, `${source}.results[${index}]`)
1508
- );
1509
- return {
1510
- version: 1,
1511
- evalId: readString(value, source, "evalId"),
1512
- taskFile: readString(value, source, "taskFile"),
1513
- taskFileHash: readString(value, source, "taskFileHash"),
1514
- clio: parseClioProvenance(readRequiredArtifactField(value, source, "clio"), `${source}.clio`),
1515
- environment: parseEnvironmentProvenance(
1516
- readRequiredArtifactField(value, source, "environment"),
1517
- `${source}.environment`
1518
- ),
1519
- target: readOptionalNullableString(value, source, "target"),
1520
- model: readOptionalNullableString(value, source, "model"),
1521
- thinking: readOptionalNullableString(value, source, "thinking"),
1522
- paths: parseArtifactPaths(readRequiredArtifactField(value, source, "paths"), `${source}.paths`),
1523
- repeat: readNumber(value, source, "repeat"),
1524
- startedAt: readString(value, source, "startedAt"),
1525
- endedAt: readString(value, source, "endedAt"),
1526
- summary: parseSummary(value.summary, `${source}.summary`),
1527
- results
1528
- };
1529
- }
1530
- function parseSummary(value, source) {
1531
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1532
- return {
1533
- runs: readNumber(value, source, "runs"),
1534
- passed: readNumber(value, source, "passed"),
1535
- failed: readNumber(value, source, "failed"),
1536
- passRate: readNumber(value, source, "passRate"),
1537
- tokens: readNumber(value, source, "tokens"),
1538
- costUsd: readNumber(value, source, "costUsd"),
1539
- wallTimeMs: readNumber(value, source, "wallTimeMs"),
1540
- harness: value.harness === void 0 ? { ...ZERO_EVAL_HARNESS_METRICS } : parseHarnessMetrics(value.harness, `${source}.harness`),
1541
- failureClasses: readArray(value, source, "failureClasses").map(
1542
- (entry, index) => parseFailureClassCount(entry, `${source}.failureClasses[${index}]`)
1543
- )
1544
- };
1545
- }
1546
- function parseRecord(value, source) {
1547
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1548
- const failureClass = readOptionalFailureClass(value, source, "failureClass");
1549
- const commands = readArray(value, source, "commands").map(
1550
- (entry, index) => parseCommand(entry, `${source}.commands[${index}]`)
1551
- );
1552
- const record2 = {
1553
- taskId: readString(value, source, "taskId"),
1554
- runId: readString(value, source, "runId"),
1555
- repeatIndex: readNumber(value, source, "repeatIndex"),
1556
- cwd: readString(value, source, "cwd"),
1557
- prompt: readString(value, source, "prompt"),
1558
- tags: readStringArray(value, source, "tags"),
1559
- pass: readBoolean(value, source, "pass"),
1560
- exitCode: readNumber(value, source, "exitCode"),
1561
- tokens: readNumber(value, source, "tokens"),
1562
- costUsd: readNumber(value, source, "costUsd"),
1563
- wallTimeMs: readNumber(value, source, "wallTimeMs"),
1564
- harness: value.harness === void 0 ? evalHarnessMetricsFromCommands(commands) : parseHarnessMetrics(value.harness, `${source}.harness`),
1565
- commands
1566
- };
1567
- if (failureClass !== void 0) record2.failureClass = failureClass;
1568
- const receiptPath = readOptionalString(value, source, "receiptPath");
1569
- if (receiptPath !== void 0) record2.receiptPath = receiptPath;
1570
- const evidenceId = readOptionalString(value, source, "evidenceId");
1571
- if (evidenceId !== void 0) record2.evidenceId = evidenceId;
1572
- const paths = value.paths === void 0 ? void 0 : parseRunPaths(value.paths, `${source}.paths`);
1573
- if (paths !== void 0) record2.paths = paths;
1574
- return record2;
1575
- }
1576
- function parseClioProvenance(value, source) {
1577
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1578
- return {
1579
- version: readString(value, source, "version"),
1580
- commit: readNullableString(value, source, "commit"),
1581
- entry: readString(value, source, "entry")
1582
- };
1583
- }
1584
- function parseEnvironmentProvenance(value, source) {
1585
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1586
- return {
1587
- platform: readString(value, source, "platform"),
1588
- node: readString(value, source, "node")
1589
- };
1590
- }
1591
- function parseArtifactPaths(value, source) {
1592
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1593
- const out = {
1594
- taskFile: readString(value, source, "taskFile"),
1595
- receipts: readStringArray(value, source, "receipts"),
1596
- sessionLedgers: readStringArray(value, source, "sessionLedgers")
1597
- };
1598
- const artifact = readOptionalString(value, source, "artifact");
1599
- if (artifact !== void 0) out.artifact = artifact;
1600
- const evidence = readOptionalString(value, source, "evidence");
1601
- if (evidence !== void 0) out.evidence = evidence;
1602
- return out;
1603
- }
1604
- function parseRunPaths(value, source) {
1605
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1606
- const out = {};
1607
- const receipt = readOptionalString(value, source, "receipt");
1608
- if (receipt !== void 0) out.receipt = receipt;
1609
- const sessionLedger = readOptionalString(value, source, "sessionLedger");
1610
- if (sessionLedger !== void 0) out.sessionLedger = sessionLedger;
1611
- const evidence = readOptionalString(value, source, "evidence");
1612
- if (evidence !== void 0) out.evidence = evidence;
1613
- return out;
1614
- }
1615
- function readRequiredArtifactField(record2, source, field) {
1616
- const value = record2[field];
1617
- if (value === void 0) {
1618
- throw new Error(
1619
- `eval artifact has an invalid schema: missing required field '${field}' in ${source}. Re-run the evaluation suite to generate a complete artifact.`
1620
- );
1621
- }
1622
- return value;
1623
- }
1624
- function parseHarnessMetrics(value, source) {
1625
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1626
- return {
1627
- receiptCount: readNumber(value, source, "receiptCount"),
1628
- toolCalls: readNumber(value, source, "toolCalls"),
1629
- retries: readNumber(value, source, "retries"),
1630
- safetyBlocks: readNumber(value, source, "safetyBlocks"),
1631
- correctionLatencyMs: readNumber(value, source, "correctionLatencyMs"),
1632
- validationEvidence: readNumber(value, source, "validationEvidence")
1633
- };
1634
- }
1635
- function parseCommand(value, source) {
1636
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1637
- const phase = readString(value, source, "phase");
1638
- if (phase !== "setup" && phase !== "verifier") throw new Error(`${source}.phase: expected setup or verifier`);
1639
- return {
1640
- phase,
1641
- index: readNumber(value, source, "index"),
1642
- command: readString(value, source, "command"),
1643
- exitCode: readNumber(value, source, "exitCode"),
1644
- signal: readSignal(value.signal, `${source}.signal`),
1645
- timedOut: readBoolean(value, source, "timedOut"),
1646
- wallTimeMs: readNumber(value, source, "wallTimeMs"),
1647
- stdout: readStringAllowEmpty(value, source, "stdout"),
1648
- stderr: readStringAllowEmpty(value, source, "stderr")
1649
- };
1650
- }
1651
- function readSignal(value, source) {
1652
- if (value === null) return null;
1653
- if (typeof value === "string" && NODE_SIGNALS.has(value)) return value;
1654
- throw new Error(`${source}: expected signal or null`);
1655
- }
1656
- function parseFailureClassCount(value, source) {
1657
- if (!isRecord(value)) throw new Error(`${source}: expected object`);
1658
- return {
1659
- failureClass: readFailureClass(value, source, "failureClass"),
1660
- count: readNumber(value, source, "count")
1661
- };
1662
- }
1663
- function readFailureClass(record2, source, field) {
1664
- const value = record2[field];
1665
- if (value === "setup_failed" || value === "verifier_failed" || value === "timeout" || value === "cwd_missing" || value === "command_error") {
1666
- return value;
1667
- }
1668
- throw new Error(`${source}.${field}: expected failure class`);
1669
- }
1670
- function readOptionalFailureClass(record2, source, field) {
1671
- if (record2[field] === void 0) return void 0;
1672
- return readFailureClass(record2, source, field);
1673
- }
1674
- function readString(record2, source, field) {
1675
- const value = record2[field];
1676
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
1677
- return value;
1678
- }
1679
- function readStringAllowEmpty(record2, source, field) {
1680
- const value = record2[field];
1681
- if (typeof value !== "string") throw new Error(`${source}.${field}: expected string`);
1682
- return value;
1683
- }
1684
- function readOptionalString(record2, source, field) {
1685
- const value = record2[field];
1686
- if (value === void 0) return void 0;
1687
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
1688
- return value;
1689
- }
1690
- function readNullableString(record2, source, field) {
1691
- const value = record2[field];
1692
- if (value === null) return null;
1693
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
1694
- return value;
1695
- }
1696
- function readOptionalNullableString(record2, source, field) {
1697
- const value = record2[field];
1698
- if (value === void 0 || value === null) return null;
1699
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
1700
- return value;
1701
- }
1702
- function readStringArray(record2, source, field) {
1703
- const value = readArray(record2, source, field);
1704
- const out = [];
1705
- for (let index = 0; index < value.length; index += 1) {
1706
- const entry = value[index];
1707
- if (typeof entry !== "string") throw new Error(`${source}.${field}[${index}]: expected string`);
1708
- out.push(entry);
1709
- }
1710
- return out;
1711
- }
1712
- function readNumber(record2, source, field) {
1713
- const value = record2[field];
1714
- if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`${source}.${field}: expected number`);
1715
- return value;
1716
- }
1717
- function readBoolean(record2, source, field) {
1718
- const value = record2[field];
1719
- if (typeof value !== "boolean") throw new Error(`${source}.${field}: expected boolean`);
1720
- return value;
1721
- }
1722
- function readArray(record2, source, field) {
1723
- const value = record2[field];
1724
- if (!Array.isArray(value)) throw new Error(`${source}.${field}: expected array`);
1725
- return value;
1726
- }
1727
- function parseJson(raw, source) {
1728
- try {
1729
- return JSON.parse(raw);
1730
- } catch (error) {
1731
- const message = error instanceof Error ? error.message : String(error);
1732
- throw new Error(`${source}: invalid JSON: ${message}`);
1733
- }
1734
- }
1735
- function isRecord(value) {
1736
- return typeof value === "object" && value !== null && !Array.isArray(value);
1737
- }
1738
- function isErrorWithCode(error) {
1739
- return error instanceof Error && "code" in error && typeof error.code === "string";
1740
- }
1741
-
1742
- // src/domains/eval/artifacts/store.ts
1743
- import { readFile as readFile2 } from "node:fs/promises";
1744
- import { join as join2 } from "node:path";
1745
- function evalArtifactPathV4(dataDir, evalId) {
1746
- assertSafeId(evalId, "eval");
1747
- return join2(evalRoot(dataDir), `${evalId}.json`);
1748
- }
1749
- async function writeEvalArtifactV4(dataDir, artifact, out) {
1750
- const path = out === void 0 ? evalArtifactPathV4(dataDir, artifact.evalId) : out.endsWith(".json") ? out : join2(out, `${artifact.evalId}.json`);
1751
- safeResourceWrite(path, `${JSON.stringify(redactArtifactForStorage(artifact), null, 2)}
1752
- `, { encoding: "utf8" });
1753
- return path;
1754
- }
1755
- async function loadEvalArtifactV4(dataDir, evalId) {
1756
- let raw;
1757
- try {
1758
- raw = await readFile2(evalArtifactPathV4(dataDir, evalId), "utf8");
1759
- } catch (error) {
1760
- if (error.code === "ENOENT") throw new Error(`eval artifact not found: ${evalId}`);
1761
- throw error;
1762
- }
1763
- return parseEvalArtifactV4(JSON.parse(raw), evalId);
1764
- }
1765
- function parseEvalArtifactV4(value, source) {
1766
- if (!isRecord2(value)) throw new Error(`${source}: expected object`);
1767
- if (value.version !== 4) throw new Error(`${source}.version: expected current version 4`);
1768
- const summary = asRecord(value.summary, `${source}.summary`);
1769
- const matrix = asRecord(value.matrix, `${source}.matrix`);
1770
- const suite = asRecord(value.suite, `${source}.suite`);
1771
- return {
1772
- version: 4,
1773
- evalId: readString2(value, source, "evalId"),
1774
- suite: { id: readString2(suite, `${source}.suite`, "id"), hash: readString2(suite, `${source}.suite`, "hash") },
1775
- clio: {
1776
- version: readString2(asRecord(value.clio, `${source}.clio`), `${source}.clio`, "version"),
1777
- commit: readNullableString2(asRecord(value.clio, `${source}.clio`), `${source}.clio`, "commit"),
1778
- entry: readString2(asRecord(value.clio, `${source}.clio`), `${source}.clio`, "entry")
1779
- },
1780
- environment: {
1781
- platform: readString2(asRecord(value.environment, `${source}.environment`), `${source}.environment`, "platform"),
1782
- node: readString2(asRecord(value.environment, `${source}.environment`), `${source}.environment`, "node")
1783
- },
1784
- matrix: {
1785
- target: readString2(matrix, `${source}.matrix`, "target"),
1786
- model: readNullableString2(matrix, `${source}.matrix`, "model"),
1787
- thinking: readNullableString2(matrix, `${source}.matrix`, "thinking")
1788
- },
1789
- summary: {
1790
- runs: readNumber2(summary, `${source}.summary`, "runs"),
1791
- passed: readNumber2(summary, `${source}.summary`, "passed"),
1792
- failed: readNumber2(summary, `${source}.summary`, "failed"),
1793
- passRate: readNumber2(summary, `${source}.summary`, "passRate"),
1794
- tokens: parseTokenAccounting(summary.tokens, `${source}.summary.tokens`),
1795
- wallTimeMs: readNumber2(summary, `${source}.summary`, "wallTimeMs")
1796
- },
1797
- results: readArray2(value, source, "results").map((entry, index) => parseResult(entry, `${source}.results[${index}]`))
1798
- };
1799
- }
1800
- function parseTokenAccounting(value, source) {
1801
- const record2 = asRecord(value, source);
1802
- const measured = readBoolean2(record2, source, "measured");
1803
- const runs = readNumber2(record2, source, "runs");
1804
- const measuredRuns = readNumber2(record2, source, "measuredRuns");
1805
- const countFields = ["input", "output", "total", "cacheRead", "cacheWrite"];
1806
- if (!measured) {
1807
- if (measuredRuns !== 0) throw new Error(`${source}.measuredRuns: expected 0 when unmeasured`);
1808
- const present = countFields.filter((field) => field in record2);
1809
- if (present.length > 0) throw new Error(`${source}: unmeasured accounting carries no counts (${present.join(", ")})`);
1810
- return { measured: false, runs, measuredRuns: 0 };
1811
- }
1812
- if (measuredRuns <= 0) throw new Error(`${source}.measuredRuns: expected a positive count when measured`);
1813
- return {
1814
- measured: true,
1815
- runs,
1816
- measuredRuns,
1817
- input: readNumber2(record2, source, "input"),
1818
- output: readNumber2(record2, source, "output"),
1819
- total: readNumber2(record2, source, "total"),
1820
- cacheRead: readNumber2(record2, source, "cacheRead"),
1821
- cacheWrite: readNumber2(record2, source, "cacheWrite")
1822
- };
1823
- }
1824
- function parseResult(value, source) {
1825
- const record2 = asRecord(value, source);
1826
- const target = asRecord(record2.target, `${source}.target`);
1827
- return {
1828
- assignmentId: readNullableString2(record2, source, "assignmentId"),
1829
- terminalReceiptDigest: readNullableDigest(record2, source, "terminalReceiptDigest"),
1830
- taskId: readString2(record2, source, "taskId"),
1831
- repeatIndex: readNumber2(record2, source, "repeatIndex"),
1832
- target: {
1833
- id: readString2(target, `${source}.target`, "id"),
1834
- model: readNullableString2(target, `${source}.target`, "model"),
1835
- thinking: readNullableString2(target, `${source}.target`, "thinking")
1836
- },
1837
- pass: readBoolean2(record2, source, "pass"),
1838
- failureClass: readNullableString2(record2, source, "failureClass"),
1839
- metrics: asRecord(record2.metrics, `${source}.metrics`),
1840
- artifacts: asRecord(record2.artifacts, `${source}.artifacts`)
1841
- };
1842
- }
1843
- function asRecord(value, source) {
1844
- if (isRecord2(value)) return value;
1845
- throw new Error(`${source}: expected object`);
1846
- }
1847
- function isRecord2(value) {
1848
- return typeof value === "object" && value !== null && !Array.isArray(value);
1849
- }
1850
- function readString2(record2, source, field) {
1851
- const value = record2[field];
1852
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string`);
1853
- return value;
1854
- }
1855
- function readNullableString2(record2, source, field) {
1856
- const value = record2[field];
1857
- if (value === null) return null;
1858
- if (typeof value !== "string" || value.length === 0) throw new Error(`${source}.${field}: expected string or null`);
1859
- return value;
1860
- }
1861
- function readNullableDigest(record2, source, field) {
1862
- const value = readNullableString2(record2, source, field);
1863
- if (value !== null && !/^[0-9a-f]{64}$/u.test(value))
1864
- throw new Error(`${source}.${field}: expected sha256 digest or null`);
1865
- return value;
1866
- }
1867
- function readNumber2(record2, source, field) {
1868
- const value = record2[field];
1869
- if (typeof value !== "number" || !Number.isFinite(value)) throw new Error(`${source}.${field}: expected number`);
1870
- return value;
1871
- }
1872
- function readBoolean2(record2, source, field) {
1873
- const value = record2[field];
1874
- if (typeof value !== "boolean") throw new Error(`${source}.${field}: expected boolean`);
1875
- return value;
1876
- }
1877
- function readArray2(record2, source, field) {
1878
- const value = record2[field];
1879
- if (!Array.isArray(value)) throw new Error(`${source}.${field}: expected array`);
1880
- return value;
1881
- }
1882
-
1883
- // src/domains/eval/provenance.ts
1884
- import { spawnSync } from "node:child_process";
1885
- function evalClioProvenance(options = {}) {
1886
- return {
1887
- version: readClioVersion(),
1888
- commit: options.commit === void 0 ? currentClioCommit() : options.commit,
1889
- entry: options.entry ?? process.argv[1] ?? "unknown"
1890
- };
1891
- }
1892
- function evalEnvironmentProvenance() {
1893
- return {
1894
- platform: `${process.platform}-${process.arch}`,
1895
- node: process.version
1896
- };
1897
- }
1898
- function currentClioCommit() {
1899
- const result = spawnSync("git", ["rev-parse", "HEAD"], {
1900
- cwd: resolvePackageRoot(),
1901
- encoding: "utf8",
1902
- stdio: ["ignore", "pipe", "ignore"],
1903
- timeout: 1e3
1904
- });
1905
- if (result.status !== 0 || typeof result.stdout !== "string") return null;
1906
- const value = result.stdout.trim();
1907
- return value.length > 0 ? value : null;
1908
- }
1909
-
1910
- // src/domains/eval/task-file.ts
1911
- import { createHash as createHash3 } from "node:crypto";
1912
- import { readFile as readFile3 } from "node:fs/promises";
1913
- import { dirname, isAbsolute, relative, resolve } from "node:path";
1914
- import { parse as parseYaml } from "yaml";
1915
-
1916
- // src/domains/eval/types.ts
1917
- var EVAL_TASK_FILE_VERSION = 1;
1918
-
1919
- // src/domains/eval/task-file.ts
1920
- var TASK_KEYS = /* @__PURE__ */ new Set(["id", "prompt", "cwd", "setup", "verifier", "timeoutMs", "tags"]);
1921
- async function loadEvalTaskFile(path) {
1922
- const resolved = resolve(path);
1923
- const raw = await readFile3(resolved, "utf8");
1924
- const result = parseEvalTaskFileYaml(raw);
1925
- if (!result.valid) {
1926
- throw new EvalTaskFileError(result.issues);
1927
- }
1928
- const baseDir = dirname(resolved);
1929
- const cwdIssues = validateTaskCwds(result.taskFile.tasks, baseDir);
1930
- if (cwdIssues.length > 0) throw new EvalTaskFileError(cwdIssues);
1931
- return {
1932
- path: resolved,
1933
- baseDir,
1934
- contentHash: sha256Hex(raw),
1935
- taskFile: result.taskFile
1936
- };
1937
- }
1938
- function parseEvalTaskFileYaml(raw) {
1939
- let parsed;
1940
- try {
1941
- parsed = parseYaml(raw);
1942
- } catch (error) {
1943
- const message = error instanceof Error ? error.message : String(error);
1944
- return { valid: false, issues: [{ path: "$", message: `invalid YAML: ${message}` }] };
1945
- }
1946
- return validateEvalTaskFile(parsed);
1947
- }
1948
- function validateEvalTaskFile(value) {
1949
- const issues = [];
1950
- if (!isRecord3(value)) {
1951
- return { valid: false, issues: [{ path: "$", message: "expected object" }] };
1952
- }
1953
- if (value.version !== EVAL_TASK_FILE_VERSION) {
1954
- issues.push({ path: "$.version", message: "expected version 1" });
1955
- }
1956
- if (!Array.isArray(value.tasks)) {
1957
- issues.push({ path: "$.tasks", message: "expected non-empty array" });
1958
- return { valid: false, issues };
1959
- }
1960
- if (value.tasks.length === 0) {
1961
- issues.push({ path: "$.tasks", message: "expected non-empty array" });
1962
- }
1963
- const tasks = [];
1964
- const seenIds = /* @__PURE__ */ new Set();
1965
- for (let index = 0; index < value.tasks.length; index += 1) {
1966
- const task = parseTask(value.tasks[index], `$.tasks[${index}]`, issues);
1967
- if (task === null) continue;
1968
- if (seenIds.has(task.id)) {
1969
- issues.push({ path: `$.tasks[${index}].id`, message: `duplicate task id: ${task.id}` });
1970
- }
1971
- seenIds.add(task.id);
1972
- tasks.push(task);
1973
- }
1974
- if (issues.length > 0) return { valid: false, issues };
1975
- return { valid: true, taskFile: { version: 1, tasks } };
1976
- }
1977
- var EvalTaskFileError = class extends Error {
1978
- issues;
1979
- constructor(issues) {
1980
- super(`eval task file invalid (${issues.length} ${issues.length === 1 ? "issue" : "issues"})`);
1981
- this.name = "EvalTaskFileError";
1982
- this.issues = [...issues];
1983
- }
1984
- };
1985
- function parseTask(value, path, issues) {
1986
- if (!isRecord3(value)) {
1987
- issues.push({ path, message: "expected object" });
1988
- return null;
1989
- }
1990
- for (const key of Object.keys(value).sort((a, b) => a.localeCompare(b))) {
1991
- if (!TASK_KEYS.has(key)) issues.push({ path: `${path}.${key}`, message: "unknown field" });
1992
- }
1993
- const id = readNonEmptyString(value, path, "id", issues);
1994
- if (id !== null && !/^[A-Za-z0-9._-]+$/.test(id)) {
1995
- issues.push({ path: `${path}.id`, message: "expected id with letters, numbers, dots, underscores, or hyphens" });
1996
- }
1997
- const prompt = readNonEmptyString(value, path, "prompt", issues);
1998
- const cwd = readNonEmptyString(value, path, "cwd", issues);
1999
- if (cwd !== null && isAbsolute(cwd)) {
2000
- issues.push({ path: `${path}.cwd`, message: "expected repo-local relative path" });
2001
- }
2002
- const setup = readStringArray2(value, path, "setup", issues, true);
2003
- const verifier = readStringArray2(value, path, "verifier", issues, false);
2004
- if (verifier !== null && verifier.length === 0) {
2005
- issues.push({ path: `${path}.verifier`, message: "expected at least one command" });
2006
- }
2007
- const timeoutMs = readPositiveInteger(value, path, "timeoutMs", issues);
2008
- const tags = readStringArray2(value, path, "tags", issues, true);
2009
- if (id === null || prompt === null || cwd === null || setup === null || verifier === null || timeoutMs === null) {
2010
- return null;
2011
- }
2012
- return { id, prompt, cwd, setup, verifier, timeoutMs, tags: tags ?? [] };
2013
- }
2014
- function validateTaskCwds(tasks, baseDir) {
2015
- const issues = [];
2016
- for (let index = 0; index < tasks.length; index += 1) {
2017
- const task = tasks[index];
2018
- if (task === void 0) continue;
2019
- const resolved = resolve(baseDir, task.cwd);
2020
- const rel = relative(baseDir, resolved);
2021
- if (rel === "" || !rel.startsWith("..") && !isAbsolute(rel)) continue;
2022
- issues.push({ path: `$.tasks[${index}].cwd`, message: "cwd must stay within the task file directory" });
2023
- }
2024
- return issues;
2025
- }
2026
- function readNonEmptyString(record2, path, field, issues) {
2027
- const value = record2[field];
2028
- if (typeof value !== "string" || value.trim().length === 0) {
2029
- issues.push({ path: `${path}.${field}`, message: "expected non-empty string" });
2030
- return null;
2031
- }
2032
- return value;
2033
- }
2034
- function readStringArray2(record2, path, field, issues, allowMissing) {
2035
- const value = record2[field];
2036
- if (value === void 0 && allowMissing) return [];
2037
- if (!Array.isArray(value)) {
2038
- issues.push({ path: `${path}.${field}`, message: "expected string array" });
2039
- return null;
2040
- }
2041
- const out = [];
2042
- for (let index = 0; index < value.length; index += 1) {
2043
- const entry = value[index];
2044
- if (typeof entry !== "string" || entry.trim().length === 0) {
2045
- issues.push({ path: `${path}.${field}[${index}]`, message: "expected non-empty string" });
2046
- continue;
2047
- }
2048
- out.push(entry);
2049
- }
2050
- return out;
2051
- }
2052
- function readPositiveInteger(record2, path, field, issues) {
2053
- const value = record2[field];
2054
- if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
2055
- issues.push({ path: `${path}.${field}`, message: "expected positive integer" });
2056
- return null;
2057
- }
2058
- return value;
2059
- }
2060
- function isRecord3(value) {
2061
- return typeof value === "object" && value !== null && !Array.isArray(value);
2062
- }
2063
- function sha256Hex(content) {
2064
- return createHash3("sha256").update(content, "utf8").digest("hex");
2065
- }
2066
-
2067
1055
  export {
2068
1056
  isExecutionRole,
2069
1057
  deriveExecutionRole,
@@ -2094,22 +1082,6 @@ export {
2094
1082
  parseRoutingIntent,
2095
1083
  defaultRoutingIntent,
2096
1084
  routingIntentRejection,
2097
- explainRouteDecision,
2098
- withReceiptIntegrity,
2099
- isReceiptIntegrity,
2100
- verifyReceiptIntegrity,
2101
- redactArtifactForStorage,
2102
- ZERO_EVAL_HARNESS_METRICS,
2103
- sumEvalHarnessMetrics,
2104
- createEvalId,
2105
- writeEvalArtifact,
2106
- loadEvalArtifact,
2107
- writeEvalArtifactV4,
2108
- loadEvalArtifactV4,
2109
- parseEvalArtifactV4,
2110
- evalClioProvenance,
2111
- evalEnvironmentProvenance,
2112
- loadEvalTaskFile,
2113
- EvalTaskFileError
1085
+ explainRouteDecision
2114
1086
  };
2115
- //# sourceMappingURL=chunk-7BHLZB3A.js.map
1087
+ //# sourceMappingURL=chunk-GGXXDWE4.js.map