@iowarp/clio-coder 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -0,0 +1,140 @@
1
+ import {
2
+ type BackendCacheVerdict,
3
+ type BackendCompletionTimings,
4
+ type CacheVerdictCounts,
5
+ emptyCacheVerdictCounts,
6
+ uncachedPrefillTokens,
7
+ } from "../../core/cache-telemetry.js";
8
+ import type { SessionEntry } from "./entries.js";
9
+
10
+ /** Durable prompt-cache facts folded across assistant calls in one ledger slice. */
11
+ export interface PromptCacheTelemetry {
12
+ /** Sum of authoritative backend prefill work, or null when no call reported cache reads. */
13
+ uncachedPrefillTokens: number | null;
14
+ /** Calls contributing to `uncachedPrefillTokens`; distinguishes no evidence from a measured zero. */
15
+ uncachedPrefillCalls: number;
16
+ /** Counts of the verdict persisted on each assistant call. */
17
+ verdictCounts: CacheVerdictCounts;
18
+ /** Number of assistant calls carrying a recognized persisted verdict. */
19
+ verdictCalls: number;
20
+ /** How often each expected cache disturbance was stamped. */
21
+ expectedColdReasonCounts: Readonly<Record<string, number>>;
22
+ }
23
+
24
+ export interface ExpectedColdReasonCount {
25
+ reason: string;
26
+ count: number;
27
+ }
28
+
29
+ function isRecord(value: unknown): value is Record<string, unknown> {
30
+ return value !== null && typeof value === "object" && !Array.isArray(value);
31
+ }
32
+
33
+ function finiteNonNegative(value: unknown): value is number {
34
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
35
+ }
36
+
37
+ function backendTimings(value: unknown): BackendCompletionTimings | null {
38
+ if (!isRecord(value)) return null;
39
+ if (
40
+ !finiteNonNegative(value.promptTokens) ||
41
+ !finiteNonNegative(value.predictedTokens) ||
42
+ !finiteNonNegative(value.promptMs) ||
43
+ !finiteNonNegative(value.predictedMs) ||
44
+ (value.source !== "llamacpp-timings" && value.source !== "lmstudio-timings")
45
+ ) {
46
+ return null;
47
+ }
48
+ const cachedTokens = value.cachedTokens;
49
+ if (cachedTokens !== null && !finiteNonNegative(cachedTokens)) return null;
50
+ if (typeof cachedTokens === "number" && cachedTokens > value.promptTokens) return null;
51
+ return {
52
+ promptTokens: value.promptTokens,
53
+ cachedTokens,
54
+ predictedTokens: value.predictedTokens,
55
+ promptMs: value.promptMs,
56
+ predictedMs: value.predictedMs,
57
+ source: value.source,
58
+ };
59
+ }
60
+
61
+ function cacheVerdict(value: unknown): BackendCacheVerdict | null {
62
+ switch (value) {
63
+ case "hot":
64
+ case "partial":
65
+ case "cold":
66
+ case "small":
67
+ return value;
68
+ default:
69
+ return null;
70
+ }
71
+ }
72
+
73
+ /** True when the fold contains at least one durable cache fact. */
74
+ export function hasPromptCacheTelemetry(telemetry: PromptCacheTelemetry): boolean {
75
+ return (
76
+ telemetry.verdictCalls > 0 ||
77
+ telemetry.uncachedPrefillCalls > 0 ||
78
+ Object.keys(telemetry.expectedColdReasonCounts).length > 0
79
+ );
80
+ }
81
+
82
+ /** Most frequent expected disturbance, with deterministic lexical tie-breaking. */
83
+ export function topExpectedColdReason(telemetry: PromptCacheTelemetry): ExpectedColdReasonCount | null {
84
+ const ranked = Object.entries(telemetry.expectedColdReasonCounts).sort(
85
+ ([leftReason, leftCount], [rightReason, rightCount]) =>
86
+ rightCount - leftCount || leftReason.localeCompare(rightReason),
87
+ );
88
+ const first = ranked[0];
89
+ return first === undefined ? null : { reason: first[0], count: first[1] };
90
+ }
91
+
92
+ /**
93
+ * Fold persisted assistant `promptCache` payloads without reclassifying them.
94
+ * Callers provide the ledger slice they mean, such as one active branch or one
95
+ * report window, so every surface shares parsing while retaining its own scope.
96
+ */
97
+ export function foldPromptCacheTelemetry(entries: ReadonlyArray<SessionEntry>): PromptCacheTelemetry {
98
+ const verdictCounts = emptyCacheVerdictCounts();
99
+ const expectedColdReasonCounts: Record<string, number> = {};
100
+ let verdictCalls = 0;
101
+ let uncachedTotal = 0;
102
+ let uncachedPrefillCalls = 0;
103
+
104
+ for (const entry of entries) {
105
+ if (entry.kind !== "message" || entry.role !== "assistant" || !isRecord(entry.payload)) continue;
106
+ const promptCache = entry.payload.promptCache;
107
+ if (!isRecord(promptCache)) continue;
108
+
109
+ const verdict = cacheVerdict(promptCache.backendVerdict);
110
+ if (verdict !== null) {
111
+ verdictCounts[verdict] += 1;
112
+ verdictCalls += 1;
113
+ }
114
+
115
+ const backend = backendTimings(promptCache.backend);
116
+ const uncached = uncachedPrefillTokens(backend);
117
+ if (uncached !== null) {
118
+ uncachedTotal += uncached;
119
+ uncachedPrefillCalls += 1;
120
+ }
121
+
122
+ if (!Array.isArray(promptCache.expectedColdReasons)) continue;
123
+ const reasons = new Set(
124
+ promptCache.expectedColdReasons.filter(
125
+ (reason): reason is string => typeof reason === "string" && reason.trim().length > 0,
126
+ ),
127
+ );
128
+ for (const reason of reasons) {
129
+ expectedColdReasonCounts[reason] = (expectedColdReasonCounts[reason] ?? 0) + 1;
130
+ }
131
+ }
132
+
133
+ return {
134
+ uncachedPrefillTokens: uncachedPrefillCalls > 0 ? uncachedTotal : null,
135
+ uncachedPrefillCalls,
136
+ verdictCounts,
137
+ verdictCalls,
138
+ expectedColdReasonCounts,
139
+ };
140
+ }
@@ -14,6 +14,21 @@ import type { SessionMeta } from "./contract.js";
14
14
  * stay diffable without recompiling anything.
15
15
  */
16
16
 
17
+ /**
18
+ * Layout version of the compiled prompt these records describe.
19
+ *
20
+ * 1: the order shipped through 0.3.8.
21
+ * 2: stable-prefix-first ordering with one `# Memory` header, and
22
+ * `contextWindowSource` recorded alongside the window the prompt states
23
+ * (issue #249).
24
+ *
25
+ * A record without a `version` field predates the field and is read as 1, so a
26
+ * 0.3.8 manifest still parses. Bump this whenever the compiled text moves for a
27
+ * reason other than its inputs: a resumed session then has the version in hand
28
+ * to explain the one `promptRecompiled` entry its first compile writes.
29
+ */
30
+ export const PROMPT_MANIFEST_VERSION = 2;
31
+
17
32
  export interface PromptManifestSection {
18
33
  id: string;
19
34
  tokenEstimate: number;
@@ -27,6 +42,8 @@ export interface PromptManifestFragment {
27
42
  }
28
43
 
29
44
  export interface SessionPromptCompileRecord {
45
+ /** Prompt layout version; see `PROMPT_MANIFEST_VERSION`. Absent on pre-0.3.9 records. */
46
+ version?: number;
30
47
  /** ISO timestamp of the compile. */
31
48
  at: string;
32
49
  /** Hash of the previously served prompt, null on the first compile. */
@@ -35,6 +52,14 @@ export interface SessionPromptCompileRecord {
35
52
  tokenEstimate: number;
36
53
  /** Thinking dial applied to the live agent when this prompt was compiled. */
37
54
  thinkingLevel: string | null;
55
+ /**
56
+ * The window the prompt's `Context window: N` states, and the layer that
57
+ * answered it. `loaded` is what the backend has this model open at; anything
58
+ * else means the figure can still move once a loaded window is observed, and
59
+ * a later recompile is then explained rather than mysterious.
60
+ */
61
+ contextWindow?: number | null;
62
+ contextWindowSource?: string | null;
38
63
  projectPreload: ProjectPreloadClass | null;
39
64
  sections: PromptManifestSection[];
40
65
  fragments: PromptManifestFragment[];
@@ -102,9 +127,21 @@ function isProjectPreloadClass(value: unknown): value is ProjectPreloadClass {
102
127
  );
103
128
  }
104
129
 
130
+ /** Optional fields added after 0.3.8: absent is valid, present must be well-typed. */
131
+ function isOptional<T>(value: unknown, guard: (candidate: unknown) => candidate is T): boolean {
132
+ return value === undefined || guard(value);
133
+ }
134
+
105
135
  function isSessionPromptCompileRecord(value: unknown): value is SessionPromptCompileRecord {
106
136
  if (!isRecord(value)) return false;
107
137
  return (
138
+ isOptional(value.version, isNonNegativeInteger) &&
139
+ isOptional(value.contextWindow, (candidate): candidate is number | null =>
140
+ candidate === null ? true : isNonNegativeInteger(candidate),
141
+ ) &&
142
+ isOptional(value.contextWindowSource, (candidate): candidate is string | null =>
143
+ candidate === null ? true : typeof candidate === "string",
144
+ ) &&
108
145
  isCanonicalUtcTimestamp(value.at) &&
109
146
  (value.previousHash === null || isSha256(value.previousHash)) &&
110
147
  isSha256(value.systemPromptHash) &&
@@ -118,6 +155,11 @@ function isSessionPromptCompileRecord(value: unknown): value is SessionPromptCom
118
155
  );
119
156
  }
120
157
 
158
+ /** A record written before the field existed describes the 0.3.8 layout. */
159
+ export function promptManifestVersion(record: SessionPromptCompileRecord): number {
160
+ return record.version ?? 1;
161
+ }
162
+
121
163
  export function getPromptManifestFilePath(meta: SessionMeta, stateDir?: string): string {
122
164
  const safeMeta = {
123
165
  ...meta,
@@ -0,0 +1,175 @@
1
+ import { gunzipSync, inflateRawSync } from "node:zlib";
2
+
3
+ /**
4
+ * Just enough zip and tar.gz reading to unpack a pinned release asset.
5
+ *
6
+ * Node ships neither reader, and the alternatives were a dependency or shelling
7
+ * out to `unzip` and `tar`. A dependency for two hundred lines of well-specified
8
+ * format is a poor trade, and shelling out makes the install fail on a machine
9
+ * that has one of the two but not the other, which is exactly the machine a
10
+ * vendored-tool installer exists to serve. Both readers are deliberately narrow:
11
+ * they read the members the registry names and refuse anything they do not
12
+ * understand rather than guessing.
13
+ *
14
+ * The bytes reaching here have already been checksum-verified against the pin,
15
+ * so these are not parsing hostile input. The size cap and the path checks are
16
+ * belt and braces for the day a pin is updated carelessly.
17
+ */
18
+
19
+ /** One file read out of an archive. */
20
+ export interface ArchiveEntry {
21
+ path: string;
22
+ data: Buffer;
23
+ /** Unix mode when the archive records one, otherwise null. */
24
+ mode: number | null;
25
+ }
26
+
27
+ /** Refuse to materialize more than this from one asset. */
28
+ const MAX_TOTAL_UNCOMPRESSED_BYTES = 512 * 1024 * 1024;
29
+
30
+ const ZIP_EOCD_SIGNATURE = 0x06054b50;
31
+ const ZIP_CENTRAL_SIGNATURE = 0x02014b50;
32
+ const ZIP_LOCAL_SIGNATURE = 0x04034b50;
33
+ const ZIP_STORED = 0;
34
+ const ZIP_DEFLATED = 8;
35
+
36
+ /** Every regular file in a zip, keyed by its path inside the archive. */
37
+ export function readZipEntries(buffer: Buffer): Map<string, ArchiveEntry> {
38
+ const eocd = findEndOfCentralDirectory(buffer);
39
+ if (eocd < 0) throw new Error("not a zip archive: end-of-central-directory record not found");
40
+ const entryCount = buffer.readUInt16LE(eocd + 10);
41
+ let cursor = buffer.readUInt32LE(eocd + 16);
42
+ const entries = new Map<string, ArchiveEntry>();
43
+ let total = 0;
44
+
45
+ for (let i = 0; i < entryCount; i += 1) {
46
+ if (cursor + 46 > buffer.length || buffer.readUInt32LE(cursor) !== ZIP_CENTRAL_SIGNATURE) {
47
+ throw new Error(`zip central directory is malformed at entry ${i}`);
48
+ }
49
+ const method = buffer.readUInt16LE(cursor + 10);
50
+ const compressedSize = buffer.readUInt32LE(cursor + 20);
51
+ const uncompressedSize = buffer.readUInt32LE(cursor + 24);
52
+ const nameLength = buffer.readUInt16LE(cursor + 28);
53
+ const extraLength = buffer.readUInt16LE(cursor + 30);
54
+ const commentLength = buffer.readUInt16LE(cursor + 32);
55
+ const externalAttributes = buffer.readUInt32LE(cursor + 38);
56
+ const localOffset = buffer.readUInt32LE(cursor + 42);
57
+ const name = buffer.toString("utf8", cursor + 46, cursor + 46 + nameLength);
58
+ cursor += 46 + nameLength + extraLength + commentLength;
59
+
60
+ if (name.endsWith("/")) continue;
61
+ assertSafeMember(name);
62
+ total += uncompressedSize;
63
+ if (total > MAX_TOTAL_UNCOMPRESSED_BYTES) throw new Error("zip archive expands beyond the size cap");
64
+
65
+ if (localOffset + 30 > buffer.length || buffer.readUInt32LE(localOffset) !== ZIP_LOCAL_SIGNATURE) {
66
+ throw new Error(`zip local header is malformed for ${name}`);
67
+ }
68
+ const localNameLength = buffer.readUInt16LE(localOffset + 26);
69
+ const localExtraLength = buffer.readUInt16LE(localOffset + 28);
70
+ const dataStart = localOffset + 30 + localNameLength + localExtraLength;
71
+ const raw = buffer.subarray(dataStart, dataStart + compressedSize);
72
+ const data =
73
+ method === ZIP_STORED
74
+ ? Buffer.from(raw)
75
+ : method === ZIP_DEFLATED
76
+ ? inflateRawSync(raw)
77
+ : (() => {
78
+ throw new Error(`unsupported zip compression method ${method} for ${name}`);
79
+ })();
80
+ // The high 16 bits of the external attributes carry the unix mode when the
81
+ // archive was produced on a unix host, which is where the executable bit
82
+ // on a release binary lives.
83
+ const unixMode = (externalAttributes >>> 16) & 0o7777;
84
+ entries.set(name, { path: name, data, mode: unixMode === 0 ? null : unixMode });
85
+ }
86
+ return entries;
87
+ }
88
+
89
+ /** Every regular file in a gzipped tar, keyed by its path inside the archive. */
90
+ export function readTarGzEntries(buffer: Buffer): Map<string, ArchiveEntry> {
91
+ const tar = gunzipSync(buffer);
92
+ const entries = new Map<string, ArchiveEntry>();
93
+ let offset = 0;
94
+ let total = 0;
95
+ let pendingLongName: string | null = null;
96
+
97
+ while (offset + 512 <= tar.length) {
98
+ const header = tar.subarray(offset, offset + 512);
99
+ // Two consecutive zero blocks end the archive; one is enough to stop.
100
+ if (header.every((byte) => byte === 0)) break;
101
+ const rawName = readTarString(header, 0, 100);
102
+ const prefix = readTarString(header, 345, 155);
103
+ const size = readTarOctal(header, 124, 12);
104
+ const mode = readTarOctal(header, 100, 8);
105
+ const typeFlag = String.fromCharCode(header[156] ?? 0);
106
+ const dataStart = offset + 512;
107
+ const padded = Math.ceil(size / 512) * 512;
108
+ offset = dataStart + padded;
109
+
110
+ // GNU long-name extension: this block's payload is the next block's name.
111
+ if (typeFlag === "L") {
112
+ pendingLongName = tar.toString("utf8", dataStart, dataStart + size).replace(/\0+$/, "");
113
+ continue;
114
+ }
115
+ // PAX headers and directories carry no file content Clio wants.
116
+ if (typeFlag === "x" || typeFlag === "g" || typeFlag === "5") {
117
+ pendingLongName = null;
118
+ continue;
119
+ }
120
+ if (typeFlag !== "0" && typeFlag !== "\0") {
121
+ pendingLongName = null;
122
+ continue;
123
+ }
124
+
125
+ const name = pendingLongName ?? (prefix.length > 0 ? `${prefix}/${rawName}` : rawName);
126
+ pendingLongName = null;
127
+ if (name.length === 0 || name.endsWith("/")) continue;
128
+ assertSafeMember(name);
129
+ total += size;
130
+ if (total > MAX_TOTAL_UNCOMPRESSED_BYTES) throw new Error("tar archive expands beyond the size cap");
131
+ entries.set(name, {
132
+ path: name,
133
+ data: Buffer.from(tar.subarray(dataStart, dataStart + size)),
134
+ mode: mode === 0 ? null : mode & 0o7777,
135
+ });
136
+ }
137
+ return entries;
138
+ }
139
+
140
+ function findEndOfCentralDirectory(buffer: Buffer): number {
141
+ // The record is at the very end unless a zip comment follows it, and the
142
+ // comment length field is 16 bits, so 22 + 65535 bytes is the whole search.
143
+ const start = Math.max(0, buffer.length - (22 + 0xffff));
144
+ for (let i = buffer.length - 22; i >= start; i -= 1) {
145
+ if (buffer.readUInt32LE(i) === ZIP_EOCD_SIGNATURE) return i;
146
+ }
147
+ return -1;
148
+ }
149
+
150
+ function readTarString(header: Buffer, offset: number, length: number): string {
151
+ const slice = header.subarray(offset, offset + length);
152
+ const end = slice.indexOf(0);
153
+ return slice.toString("utf8", 0, end === -1 ? slice.length : end);
154
+ }
155
+
156
+ function readTarOctal(header: Buffer, offset: number, length: number): number {
157
+ const text = readTarString(header, offset, length).trim();
158
+ if (text.length === 0) return 0;
159
+ const value = Number.parseInt(text, 8);
160
+ return Number.isNaN(value) ? 0 : value;
161
+ }
162
+
163
+ /**
164
+ * An archive member's path is used to look up a registry-named member, never to
165
+ * build a write path, but a member escaping the archive root still means the
166
+ * asset is not what the pin says it is.
167
+ */
168
+ function assertSafeMember(name: string): void {
169
+ if (name.startsWith("/") || name.startsWith("\\") || /^[A-Za-z]:/.test(name)) {
170
+ throw new Error(`archive member has an absolute path: ${name}`);
171
+ }
172
+ if (name.split(/[/\\]/).includes("..")) {
173
+ throw new Error(`archive member escapes the archive root: ${name}`);
174
+ }
175
+ }
@@ -0,0 +1,28 @@
1
+ import type { DomainContract } from "../../core/domain-loader.js";
2
+ import type { ToolInstallOptions, ToolInstallResult } from "./install.js";
3
+ import type { ToolRemoveOptions, ToolRemoveResult } from "./remove.js";
4
+ import type { PinnedTool, ToolResolution, ToolStatus } from "./types.js";
5
+
6
+ export interface ToolchainContract extends DomainContract {
7
+ /** The pinned table, in registry order. */
8
+ list(): ReadonlyArray<PinnedTool>;
9
+ /** One row by id. */
10
+ get(id: string): PinnedTool | null;
11
+ /** Resolve an executable name through PATH, then the vendored pin, then none. */
12
+ resolve(name: string): ToolResolution;
13
+ /** Per-entry state for one row. */
14
+ status(id: string): ToolStatus | null;
15
+ /** Per-entry state for every row. */
16
+ statuses(): ToolStatus[];
17
+ /**
18
+ * Download and vendor one tool. Only ever called from an explicit operator
19
+ * command; nothing on a startup path may reach it.
20
+ */
21
+ install(id: string, options?: ToolInstallOptions): Promise<ToolInstallResult>;
22
+ /**
23
+ * Delete every vendored version of one tool. Nothing outside
24
+ * `<data>/tools/<id>` is reachable, and a tool with nothing installed is a
25
+ * successful no-op rather than an error.
26
+ */
27
+ remove(id: string, options?: ToolRemoveOptions): ToolRemoveResult;
28
+ }
@@ -0,0 +1,47 @@
1
+ import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
2
+ import type { ToolchainContract } from "./contract.js";
3
+ import type { ToolInstallOptions } from "./install.js";
4
+ import { findPinnedTool, PINNED_TOOLS } from "./registry.js";
5
+ import { removeTool, type ToolRemoveOptions } from "./remove.js";
6
+ import { resolveToolBinary, toolStatus, toolStatuses } from "./resolve.js";
7
+
8
+ export function createToolchainBundle(_context: DomainContext): DomainBundle<ToolchainContract> {
9
+ const extension: DomainExtension = {
10
+ start() {
11
+ // Nothing to start. Resolution is on demand and installs are operator
12
+ // commands, so loading the domain touches neither the network nor disk.
13
+ return undefined;
14
+ },
15
+ };
16
+ const contract: ToolchainContract = {
17
+ list() {
18
+ return PINNED_TOOLS;
19
+ },
20
+ get(id) {
21
+ return findPinnedTool(id);
22
+ },
23
+ resolve(name) {
24
+ return resolveToolBinary(name);
25
+ },
26
+ status(id) {
27
+ const entry = findPinnedTool(id);
28
+ return entry === null ? null : toolStatus(entry);
29
+ },
30
+ statuses() {
31
+ return toolStatuses();
32
+ },
33
+ async install(id: string, options: ToolInstallOptions = {}) {
34
+ // Imported lazily so the installer's archive readers stay out of every
35
+ // graph that only ever resolves a binary.
36
+ const { installTool } = await import("./install.js");
37
+ return installTool(id, options);
38
+ },
39
+ remove(id: string, options: ToolRemoveOptions = {}) {
40
+ // Statically imported, unlike install: removal is a readdir and an
41
+ // unlink, so it carries none of the archive readers that keep the
42
+ // installer off graphs which only ever resolve a binary.
43
+ return removeTool(id, options);
44
+ },
45
+ };
46
+ return { extension, contract };
47
+ }
@@ -0,0 +1,39 @@
1
+ import type { DomainModule } from "../../core/domain-loader.js";
2
+ import type { ToolchainContract } from "./contract.js";
3
+ import { createToolchainBundle } from "./extension.js";
4
+ import { ToolchainManifest } from "./manifest.js";
5
+
6
+ export const ToolchainDomainModule: DomainModule<ToolchainContract> = {
7
+ manifest: ToolchainManifest,
8
+ createExtension: createToolchainBundle,
9
+ };
10
+
11
+ export type { ToolchainContract } from "./contract.js";
12
+ export type { ToolFetcher, ToolInstallOptions, ToolInstallResult } from "./install.js";
13
+ export { installPinnedTool, installTool } from "./install.js";
14
+ export { ToolchainManifest } from "./manifest.js";
15
+ export { toolchainRoot, toolVersionDir, vendoredBinaryPath } from "./paths.js";
16
+ export { currentToolPlatform, findPinnedTool, findPinnedToolByBinary, PINNED_TOOLS } from "./registry.js";
17
+ export type { ToolRemoveOptions, ToolRemoveResult } from "./remove.js";
18
+ export { installedToolVersions, pruneSupersededVersions, removeTool, STALE_STAGING_MS } from "./remove.js";
19
+ export {
20
+ describeFloorRejection,
21
+ describeResolution,
22
+ installRemedy,
23
+ resolveEntryBinary,
24
+ resolveToolBinary,
25
+ toolStatus,
26
+ toolStatuses,
27
+ } from "./resolve.js";
28
+ export type {
29
+ PinnedTool,
30
+ PinnedToolDocument,
31
+ PinnedToolDownload,
32
+ ToolArchiveKind,
33
+ ToolPathCandidate,
34
+ ToolPlatform,
35
+ ToolResolution,
36
+ ToolSource,
37
+ ToolStatus,
38
+ } from "./types.js";
39
+ export { compareVersions, parseVersion, resetVersionProbeCache, satisfiesMinimum } from "./version.js";