@iowarp/clio-coder 0.4.6 → 0.4.8

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 (1142) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +79 -0
  3. package/CONTRIBUTING.md +178 -96
  4. package/NOTICE +8 -0
  5. package/README.md +100 -47
  6. package/dist/acp-JWPQZM2D.js +130 -0
  7. package/dist/agents-4GCDIRVX.js +149 -0
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  13. package/dist/assets/web-notices/hono-LICENSE +21 -0
  14. package/dist/auth-SYAKTDQE.js +551 -0
  15. package/dist/background-OW67WMYR.js +37 -0
  16. package/dist/builtins-TKS63VNV.js +22 -0
  17. package/dist/chunk-2JSCCEKO.js +85 -0
  18. package/dist/chunk-2SXGG2IV.js +391 -0
  19. package/dist/chunk-2U2U5POA.js +59 -0
  20. package/dist/chunk-2ZWLMA3T.js +658 -0
  21. package/dist/chunk-36XSBPXL.js +579 -0
  22. package/dist/chunk-3IQOZRQ6.js +396 -0
  23. package/dist/chunk-3XE4NRLF.js +324 -0
  24. package/dist/chunk-44U2OUSM.js +243 -0
  25. package/dist/chunk-4P6M2TTE.js +119 -0
  26. package/dist/chunk-526ABLHD.js +1219 -0
  27. package/dist/chunk-5C2OQHLR.js +674 -0
  28. package/dist/chunk-5D2FNBMG.js +185 -0
  29. package/dist/chunk-5EQO5NWP.js +243 -0
  30. package/dist/chunk-5HULHKT2.js +32 -0
  31. package/dist/chunk-5UG6EZI3.js +66 -0
  32. package/dist/chunk-5W4FRA5Q.js +22283 -0
  33. package/dist/chunk-6R5MBXBJ.js +386 -0
  34. package/dist/chunk-6TKOFFGE.js +1058 -0
  35. package/dist/chunk-6UJ7RDI7.js +1143 -0
  36. package/dist/chunk-6X7VOCDY.js +44 -0
  37. package/dist/chunk-7QQRPB2E.js +915 -0
  38. package/dist/chunk-ARRUMZ7X.js +1377 -0
  39. package/dist/chunk-ATB3Q7YO.js +663 -0
  40. package/dist/chunk-AUHVBIDW.js +19 -0
  41. package/dist/chunk-BE4I3UJ2.js +668 -0
  42. package/dist/chunk-BFPHMSK7.js +169 -0
  43. package/dist/chunk-BHJMMCXS.js +466 -0
  44. package/dist/chunk-BIY22UUK.js +1322 -0
  45. package/dist/chunk-D55WO5J7.js +110 -0
  46. package/dist/chunk-DVJL77SO.js +162 -0
  47. package/dist/chunk-E2NSPYLC.js +814 -0
  48. package/dist/chunk-EFXMQYI6.js +4484 -0
  49. package/dist/chunk-EPYATQMG.js +2718 -0
  50. package/dist/chunk-EXKUF426.js +1801 -0
  51. package/dist/chunk-F7Y6QTPL.js +689 -0
  52. package/dist/chunk-FB3KTE2J.js +1710 -0
  53. package/dist/chunk-FNVPQQYT.js +117 -0
  54. package/dist/chunk-GEVQNST4.js +101 -0
  55. package/dist/chunk-GEYX2NZ5.js +697 -0
  56. package/dist/chunk-GJBJHJNY.js +2120 -0
  57. package/dist/chunk-GM4TY6VN.js +1233 -0
  58. package/dist/chunk-GVU4CXPJ.js +5191 -0
  59. package/dist/chunk-H5DPSUBB.js +637 -0
  60. package/dist/chunk-H77XBUBM.js +688 -0
  61. package/dist/chunk-HMGAKB7E.js +380 -0
  62. package/dist/chunk-HP7KJ5O2.js +797 -0
  63. package/dist/chunk-HVCAY2FH.js +67 -0
  64. package/dist/chunk-ICYIUNO4.js +35 -0
  65. package/dist/chunk-IILXVWJY.js +223 -0
  66. package/dist/chunk-JCVIL6TY.js +595 -0
  67. package/dist/chunk-JIMWEYWO.js +63 -0
  68. package/dist/chunk-JLBVCROW.js +562 -0
  69. package/dist/chunk-JOBN2YQQ.js +176 -0
  70. package/dist/chunk-JOL2QRLE.js +152 -0
  71. package/dist/chunk-JRA6OBHY.js +974 -0
  72. package/dist/chunk-JV25I7ID.js +1865 -0
  73. package/dist/chunk-JYKUMHCQ.js +705 -0
  74. package/dist/chunk-K3W6BF5C.js +283 -0
  75. package/dist/chunk-K45LHSCI.js +194 -0
  76. package/dist/chunk-K53E2PTW.js +1289 -0
  77. package/dist/chunk-K5UJD6MM.js +39 -0
  78. package/dist/chunk-KGP3UQGJ.js +200 -0
  79. package/dist/chunk-KKRXONXG.js +43 -0
  80. package/dist/chunk-KWJXCL2X.js +103 -0
  81. package/dist/chunk-L75H5B3B.js +446 -0
  82. package/dist/chunk-LLCGGVSW.js +108 -0
  83. package/dist/chunk-LZCCBLRC.js +57 -0
  84. package/dist/chunk-LZDLYSUN.js +197 -0
  85. package/dist/chunk-MATCRH3M.js +667 -0
  86. package/dist/chunk-MEHBW2SP.js +132 -0
  87. package/dist/chunk-MUXNDNMZ.js +659 -0
  88. package/dist/chunk-MWMW53WW.js +7346 -0
  89. package/dist/chunk-MZDPF35R.js +45 -0
  90. package/dist/chunk-MZKYVIWW.js +188 -0
  91. package/dist/chunk-O2QJDRWP.js +362 -0
  92. package/dist/chunk-O3HSB2YL.js +693 -0
  93. package/dist/chunk-OEMFEL26.js +891 -0
  94. package/dist/chunk-OH3YYA3B.js +15 -0
  95. package/dist/chunk-OPC4DQD6.js +634 -0
  96. package/dist/chunk-ORRNGQDV.js +207 -0
  97. package/dist/chunk-P4JS3MH5.js +165 -0
  98. package/dist/chunk-P7GTE4FX.js +308 -0
  99. package/dist/chunk-PAQVETLA.js +962 -0
  100. package/dist/chunk-PFZJMXIY.js +146 -0
  101. package/dist/chunk-PGEFOTJB.js +1974 -0
  102. package/dist/chunk-PJ5H5B7A.js +3151 -0
  103. package/dist/chunk-PMUUAABD.js +604 -0
  104. package/dist/chunk-Q32C6AWI.js +236 -0
  105. package/dist/chunk-QGIC5SX5.js +139 -0
  106. package/dist/chunk-QLAGXTTV.js +482 -0
  107. package/dist/chunk-QLKCCC2J.js +573 -0
  108. package/dist/chunk-QWUSS2QP.js +3630 -0
  109. package/dist/chunk-QYSAZMSH.js +47 -0
  110. package/dist/chunk-R5NRX5N4.js +123 -0
  111. package/dist/chunk-RAUOKUZV.js +1572 -0
  112. package/dist/chunk-RBES4TCZ.js +302 -0
  113. package/dist/chunk-RFCKPS2V.js +26 -0
  114. package/dist/chunk-RFULVPBX.js +318 -0
  115. package/dist/chunk-RKFNU5UA.js +404 -0
  116. package/dist/chunk-RM3XJX7P.js +1148 -0
  117. package/dist/chunk-RNLAPBJL.js +386 -0
  118. package/dist/chunk-RPMNIFRY.js +65 -0
  119. package/dist/chunk-RRZFRIJP.js +42 -0
  120. package/dist/chunk-RXI7K4J5.js +4493 -0
  121. package/dist/chunk-SER7RRAE.js +4271 -0
  122. package/dist/chunk-STC6CWUZ.js +402 -0
  123. package/dist/chunk-TEHVMHOK.js +97 -0
  124. package/dist/chunk-TOPICHGR.js +33 -0
  125. package/dist/chunk-U3TPUXOQ.js +2653 -0
  126. package/dist/chunk-UB33F3YW.js +709 -0
  127. package/dist/chunk-UDAK6GR2.js +175 -0
  128. package/dist/chunk-USBBEKHW.js +177 -0
  129. package/dist/chunk-V4ZKOKRB.js +13433 -0
  130. package/dist/chunk-W5RM7YAH.js +78 -0
  131. package/dist/chunk-W7KNI3F5.js +215 -0
  132. package/dist/chunk-WFTSK7N3.js +637 -0
  133. package/dist/chunk-WJWNZXRM.js +395 -0
  134. package/dist/chunk-WLHX3MM5.js +63 -0
  135. package/dist/chunk-WS4FOGLY.js +686 -0
  136. package/dist/chunk-WTZVSMQZ.js +52 -0
  137. package/dist/chunk-WWRV5RJI.js +165 -0
  138. package/dist/chunk-X6FLVUM5.js +141 -0
  139. package/dist/chunk-XC5POIL4.js +68 -0
  140. package/dist/chunk-XTLJDC2X.js +1013 -0
  141. package/dist/chunk-XW2UZICE.js +372 -0
  142. package/dist/chunk-Y3JU5RPK.js +8 -0
  143. package/dist/chunk-YGIV24MF.js +1018 -0
  144. package/dist/chunk-YJCCMYYT.js +125 -0
  145. package/dist/chunk-YKIIWURD.js +36 -0
  146. package/dist/chunk-YQ3GFEUY.js +341 -0
  147. package/dist/chunk-YXANQGCX.js +179 -0
  148. package/dist/chunk-YXFKLMX2.js +222 -0
  149. package/dist/chunk-ZST3FRCV.js +132 -0
  150. package/dist/cli/index.js +40 -40
  151. package/dist/clio-BPBAPZGA.js +26 -0
  152. package/dist/code-nav-KBQ3RIFK.js +686 -0
  153. package/dist/components-6DKAXWFN.js +674 -0
  154. package/dist/config-FWL5JK2H.js +270 -0
  155. package/dist/config-graph-ACDB26L2.js +156 -0
  156. package/dist/configure-ZIZ4YV62.js +85 -0
  157. package/dist/context-EZZPT2ZV.js +1074 -0
  158. package/dist/context-VIL5MFRH.js +282 -0
  159. package/dist/context-Z3GOBHDK.js +344 -0
  160. package/dist/context-clear-ZPB3L7MN.js +188 -0
  161. package/dist/context-index-W6A4V7OC.js +120 -0
  162. package/dist/context-map-DKL3QT6D.js +555 -0
  163. package/dist/context-working-set-2GLBVF7L.js +1559 -0
  164. package/dist/detail-VSBWYSGZ.js +119 -0
  165. package/dist/dispatch-runner-EEEHGKX4.js +2442 -0
  166. package/dist/docs-VMMWFVHL.js +101 -0
  167. package/dist/doctor-V5L4IQGP.js +812 -0
  168. package/dist/eval-VJYJ2BV3.js +5050 -0
  169. package/dist/eval-inventory-CX24K2JT.js +260 -0
  170. package/dist/evals-J2H5V6DD.js +104 -0
  171. package/dist/evidence-POWAEBEW.js +229 -0
  172. package/dist/evidence-XCCCLS36.js +242 -0
  173. package/dist/evidence-Y35YSXH6.js +388 -0
  174. package/dist/evolve-GPG72VB6.js +613 -0
  175. package/dist/extensions-YIZ7W3DA.js +308 -0
  176. package/dist/fleet-2MDCQ2VK.js +264 -0
  177. package/dist/fleet-W2AF3TOJ.js +919 -0
  178. package/dist/fleet-commands-WS56G26H.js +75 -0
  179. package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
  180. package/dist/fleet-graph-ELTBXBAV.js +136 -0
  181. package/dist/fleet-inspect-45IK73L4.js +308 -0
  182. package/dist/fleet-preflight-T5NCZKHE.js +22 -0
  183. package/dist/fleet-validate-VG4JBLA4.js +91 -0
  184. package/dist/fleet-verify-VTSABAYO.js +206 -0
  185. package/dist/fleet-view-XC7WMKSS.js +123 -0
  186. package/dist/init-VTJNNTIP.js +329 -0
  187. package/dist/install-6PIF6F6W.js +19 -0
  188. package/dist/interop-IU6BNA7C.js +246 -0
  189. package/dist/inventory-QPQUTUUZ.js +123 -0
  190. package/dist/library-HUTAS57T.js +492 -0
  191. package/dist/library-LF7DLU6S.js +306 -0
  192. package/dist/library-Q3NWL5CM.js +75 -0
  193. package/dist/library-import-PPW4YUC5.js +183 -0
  194. package/dist/library-inventory-DIRVFRZU.js +56 -0
  195. package/dist/library-validation-XHUZ3INE.js +42 -0
  196. package/dist/memory-Z2LSKNV6.js +516 -0
  197. package/dist/models-3FTREYPY.js +302 -0
  198. package/dist/monitor-HF2MQRB3.js +781 -0
  199. package/dist/orchestrator-UYPA6W4S.js +41502 -0
  200. package/dist/panes-736XB73K.js +74 -0
  201. package/dist/panes-C4P3PIWT.js +103 -0
  202. package/dist/paths-JQ4QYIYB.js +67 -0
  203. package/dist/preload-XSLRYH3Y.js +120 -0
  204. package/dist/reset-V7QSPZYE.js +345 -0
  205. package/dist/resources-OJGDFHYT.js +181 -0
  206. package/dist/run-T354SMDW.js +892 -0
  207. package/dist/settings-MWZXO6RV.js +72 -0
  208. package/dist/share-Y5ZKJPND.js +293 -0
  209. package/dist/skills-4GLZC4LN.js +100 -0
  210. package/dist/skills-eval-L5T7GODM.js +1074 -0
  211. package/dist/skills-inventory-LASKXEZI.js +138 -0
  212. package/dist/slash-commands-OIMRU36D.js +95 -0
  213. package/dist/steer-KMAM2Y2C.js +77 -0
  214. package/dist/support-AWC3XKPX.js +38 -0
  215. package/dist/system-CD75NYBU.js +116 -0
  216. package/dist/targets-VSZX2J2S.js +1116 -0
  217. package/dist/tasks-AN567LYH.js +36 -0
  218. package/dist/terminal-lease-6KTWNHVY.js +418 -0
  219. package/dist/tools-AGRK3V5J.js +28 -0
  220. package/dist/trace-P4MQZD33.js +524 -0
  221. package/dist/tui-primitives-A6MUW32V.js +18 -0
  222. package/dist/uninstall-BRUTEPIC.js +432 -0
  223. package/dist/upgrade-SBCGHQGJ.js +307 -0
  224. package/dist/usage-BIDVTO6V.js +1061 -0
  225. package/dist/verifiers-LTGCAMXS.js +630 -0
  226. package/dist/verify-OZU4LLNP.js +30 -0
  227. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  228. package/dist/web/client/assets/abnfDiagram-VCTEODGH-C5wfoHm3.js +1 -0
  229. package/dist/web/client/assets/arc-oH91sfLl.js +1 -0
  230. package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +1 -0
  231. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +36 -0
  232. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  233. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  234. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  235. package/dist/web/client/assets/blockDiagram-I7D4REHJ-wi0_CYHL.js +129 -0
  236. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DV7NYc2W.js +38 -0
  237. package/dist/web/client/assets/channel-CiUWbHN9.js +1 -0
  238. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  239. package/dist/web/client/assets/chunk-4HAMMTFA-Bhsegh3F.js +62 -0
  240. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  241. package/dist/web/client/assets/chunk-75Z2AOVW-RQCckcQG.js +2 -0
  242. package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +125 -0
  243. package/dist/web/client/assets/chunk-F27PBJKO-BcNqv2x1.js +1 -0
  244. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  245. package/dist/web/client/assets/chunk-GMAD6QVW-Bq8JWiZT.js +72 -0
  246. package/dist/web/client/assets/chunk-GVQU2GXP-DbchrAeJ.js +1 -0
  247. package/dist/web/client/assets/chunk-IMKFNOWR-DrpvjocK.js +231 -0
  248. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  249. package/dist/web/client/assets/chunk-L3NEJ4N5-DHLmTnCe.js +1 -0
  250. package/dist/web/client/assets/chunk-OSK3NFVY-CsRbtN9n.js +10 -0
  251. package/dist/web/client/assets/chunk-P2QGCYS3-aqPbxoMh.js +1 -0
  252. package/dist/web/client/assets/chunk-POPQ4Y6H-Dl5vw0h0.js +1 -0
  253. package/dist/web/client/assets/chunk-PWAF6VOD-D7OBRSdO.js +1 -0
  254. package/dist/web/client/assets/chunk-SHT3W25Y-CdKCIwuB.js +168 -0
  255. package/dist/web/client/assets/chunk-SVP7TREG-B94Nu_1-.js +88 -0
  256. package/dist/web/client/assets/chunk-TICWLB2K-jjRQI_hk.js +206 -0
  257. package/dist/web/client/assets/chunk-XXDRQBXY-azkbKE37.js +1 -0
  258. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  259. package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +1 -0
  260. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +1 -0
  261. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  262. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  263. package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +1 -0
  264. package/dist/web/client/assets/cynefin-OW5HDTMX--i9RDU5f.js +1 -0
  265. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-cRcvyBdp.js +62 -0
  266. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  267. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  268. package/dist/web/client/assets/dagre-GXQ25YYZ-C9mZmAPe.js +4 -0
  269. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  270. package/dist/web/client/assets/diagram-S7CK7UJ4-Oj_zlLDY.js +30 -0
  271. package/dist/web/client/assets/diagram-UQ7AKVKN-BWKbbfcR.js +41 -0
  272. package/dist/web/client/assets/diagram-VSXAHHWV-C3N3f7DO.js +3 -0
  273. package/dist/web/client/assets/diagram-VX7I27RA-CtDKDAWe.js +24 -0
  274. package/dist/web/client/assets/diagram-Z3DM3KII-B8bkBRCz.js +24 -0
  275. package/dist/web/client/assets/dist-D0_q-A2b.js +1 -0
  276. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-CskW-Whx.js +1 -0
  277. package/dist/web/client/assets/erDiagram-RLTQ6QDP-C-83cgCW.js +99 -0
  278. package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +1 -0
  279. package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +1 -0
  280. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +292 -0
  281. package/dist/web/client/assets/gitGraph-4MIJSDKK-B40cQtBE.js +1 -0
  282. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CH-7P7Di.js +106 -0
  283. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  284. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  285. package/dist/web/client/assets/index-FSIC94pi.js +83 -0
  286. package/dist/web/client/assets/info-A6RAGUB7-eCCE9D_Q.js +1 -0
  287. package/dist/web/client/assets/infoDiagram-27XIBGKW-DRnvqMjM.js +2 -0
  288. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  289. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-DBA_55wp.js +70 -0
  290. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-C-ewpNl7.js +139 -0
  291. package/dist/web/client/assets/kanban-definition-UXKFOSKX-B1taGsu0.js +89 -0
  292. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  293. package/dist/web/client/assets/line-lZ0kyxDI.js +1 -0
  294. package/dist/web/client/assets/linear-DIc8FgZj.js +1 -0
  295. package/dist/web/client/assets/mermaid-parser.core-SXolxpXw.js +7 -0
  296. package/dist/web/client/assets/mermaid.core-DXgQtkNg.js +44 -0
  297. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-DXJas9K7.js +96 -0
  298. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  299. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  300. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  301. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  302. package/dist/web/client/assets/packet-AYTQ26CC-OqVl_07o.js +1 -0
  303. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  304. package/dist/web/client/assets/pegDiagram-XKGWAZYB-CPE_zdfN.js +1 -0
  305. package/dist/web/client/assets/pie-WAS4IAKB-DAxnMBLe.js +1 -0
  306. package/dist/web/client/assets/pieDiagram-E7YTZNPT-Uwjpufxv.js +39 -0
  307. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  308. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  309. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  310. package/dist/web/client/assets/prism-core-BngLtbUd.js +1 -0
  311. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  312. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  313. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  314. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  315. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  316. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  317. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  318. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  319. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  320. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  321. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  322. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  323. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  324. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  325. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  326. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  327. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  328. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  329. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  330. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  331. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  332. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  333. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  334. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  335. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  336. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  337. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-Bjs4yjgs.js +7 -0
  338. package/dist/web/client/assets/radar-RG4KPBEZ-CuCKjHM3.js +1 -0
  339. package/dist/web/client/assets/railroad-74A4TZTK-CnQK-Cc1.js +1 -0
  340. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +1 -0
  341. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +1 -0
  342. package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +1 -0
  343. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-BDDIPNLL.js +1 -0
  344. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-B5Ydyxc1.js +84 -0
  345. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  346. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-Bw2Qym75.js +40 -0
  347. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-BZf36nO0.js +162 -0
  348. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  349. package/dist/web/client/assets/src-yeptRXpt.js +1 -0
  350. package/dist/web/client/assets/stateDiagram-D77RDMKH-DnH6JRkp.js +1 -0
  351. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +1 -0
  352. package/dist/web/client/assets/swimlanes-42K2YHIH-D9PZmtZg.js +1 -0
  353. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +8 -0
  354. package/dist/web/client/assets/timeline-definition-24CTP7MA-CrkZZBo7.js +120 -0
  355. package/dist/web/client/assets/treeView-Q6P3EWNA-C9zDShoC.js +1 -0
  356. package/dist/web/client/assets/treemap-WGGIJYW6-B-plj9yK.js +1 -0
  357. package/dist/web/client/assets/vennDiagram-4TSXK5OY-VeOdaphN.js +34 -0
  358. package/dist/web/client/assets/wardley-WFR3VGLG-Wl1P_m6L.js +1 -0
  359. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-B85-R9t2.js +78 -0
  360. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BrD8OW8m.js +7 -0
  361. package/dist/web/client/clio-coder-logo.webp +0 -0
  362. package/dist/web/client/icon-192.png +0 -0
  363. package/dist/web/client/icon-512.png +0 -0
  364. package/dist/web/client/index.html +4 -0
  365. package/dist/web/client/manifest.webmanifest +15 -0
  366. package/dist/web/client/offline.css +55 -0
  367. package/dist/web/client/offline.html +5 -0
  368. package/dist/web/client/offline.js +27 -0
  369. package/dist/web/client/sw.js +34 -0
  370. package/dist/web/ops-worker.js +37 -0
  371. package/dist/web/reads-worker.js +1726 -0
  372. package/dist/web/server.js +8499 -0
  373. package/dist/web-EU6ATJWA.js +13 -0
  374. package/dist/web-fetch-U22Q7HV4.js +788 -0
  375. package/dist/wiki-generate-LZRLFG6I.js +623 -0
  376. package/dist/with-panes-X5CZOGML.js +628 -0
  377. package/dist/worker/entry.js +300 -93
  378. package/docs/README.md +58 -14
  379. package/docs/architecture/acp.md +5 -9
  380. package/docs/architecture/alcf-provider.md +0 -3
  381. package/docs/architecture/architecture.md +8 -10
  382. package/docs/architecture/artifact-placement.md +0 -3
  383. package/docs/architecture/artifact-versions.md +3 -6
  384. package/docs/architecture/capacity-and-scheduling.md +0 -3
  385. package/docs/architecture/context-engine.md +35 -4
  386. package/docs/architecture/context-working-set.md +0 -3
  387. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  388. package/docs/architecture/dispatch-typed-intent.md +0 -3
  389. package/docs/architecture/evidence-and-memory.md +0 -3
  390. package/docs/architecture/library.md +30 -0
  391. package/docs/architecture/middleware-and-components.md +1 -4
  392. package/docs/architecture/model-catalog.md +21 -4
  393. package/docs/architecture/observability.md +0 -3
  394. package/docs/architecture/pi-boundary.md +23 -8
  395. package/docs/architecture/prompt-envelope-and-tools.md +6 -9
  396. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  397. package/docs/architecture/safety-model.md +21 -5
  398. package/docs/architecture/session-lifecycle.md +12 -4
  399. package/docs/architecture/time-conventions.md +0 -3
  400. package/docs/architecture/trace-store.md +28 -20
  401. package/docs/architecture/tui-design.md +108 -12
  402. package/docs/architecture/worker-context.md +104 -0
  403. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  404. package/docs/guide/authoring-plugins.md +158 -0
  405. package/docs/guide/built-in-agents.md +5 -8
  406. package/docs/guide/commands-and-modes.md +162 -61
  407. package/docs/guide/configuration-and-targets.md +198 -5
  408. package/docs/guide/configuration-reference.md +36 -38
  409. package/docs/guide/environment-variables.md +2 -5
  410. package/docs/guide/exit-codes-and-output.md +1 -4
  411. package/docs/guide/extensions-and-sharing.md +92 -55
  412. package/docs/guide/fleet-dispatch.md +31 -7
  413. package/docs/guide/glossary.md +1 -4
  414. package/docs/guide/harness-extensions.md +289 -0
  415. package/docs/guide/installation-and-lifecycle.md +10 -13
  416. package/docs/guide/interop.md +241 -0
  417. package/docs/guide/panes-and-files.md +3 -6
  418. package/docs/guide/plugins.md +77 -0
  419. package/docs/guide/proactive-memory.md +0 -3
  420. package/docs/guide/resource-library.md +109 -45
  421. package/docs/guide/skills-marketplace.md +34 -73
  422. package/docs/guide/tool-usage.md +19 -10
  423. package/docs/guide/troubleshooting.md +1 -4
  424. package/docs/history/config-knobs-audit.md +0 -3
  425. package/docs/history/release-cut-checklist.md +0 -3
  426. package/docs/process/development-pipeline.md +14 -17
  427. package/docs/process/documentation-coverage.md +31 -4
  428. package/docs/process/documentation-guide.md +28 -27
  429. package/docs/process/eval-runner.md +8 -6
  430. package/docs/process/evals-internal.md +0 -3
  431. package/docs/process/evolution.md +0 -3
  432. package/docs/process/fleet-demo-runbook.md +0 -3
  433. package/docs/process/git-commit-provenance.md +0 -3
  434. package/docs/process/performance-methodology.md +2 -5
  435. package/docs/process/release-cut-checklist.md +114 -217
  436. package/docs/process/scientific-validation.md +23 -3
  437. package/evals/scalar-decision-machinery.ts +1 -1
  438. package/examples/extensions/README.md +67 -0
  439. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  440. package/examples/extensions/lab-status/extension.mjs +68 -0
  441. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  442. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  443. package/examples/extensions/measurements/summarize.cjs +23 -0
  444. package/library/README.md +109 -0
  445. package/library/_authoring/templates/agent/README.md +28 -0
  446. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  447. package/library/_authoring/templates/agent/plugin.json +23 -0
  448. package/library/_authoring/templates/fleet/README.md +29 -0
  449. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  450. package/library/_authoring/templates/fleet/plugin.json +23 -0
  451. package/library/_authoring/templates/plugin/README.md +37 -0
  452. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  453. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  454. package/library/_authoring/templates/plugin/plugin.json +42 -0
  455. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  456. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  457. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  458. package/library/_authoring/templates/prompt/README.md +28 -0
  459. package/library/_authoring/templates/prompt/plugin.json +23 -0
  460. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  461. package/library/_authoring/templates/skill/README.md +24 -0
  462. package/library/_authoring/templates/skill/SKILL.md +39 -0
  463. package/library/_authoring/templates/skill/evals.md +30 -0
  464. package/library/_authoring/templates/skill/plugin.json +23 -0
  465. package/library/agents/README.md +7 -0
  466. package/library/fleets/README.md +7 -0
  467. package/library/plugins/materio/README.md +137 -0
  468. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  469. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  470. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  471. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  472. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  473. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  474. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  475. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  476. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  477. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  478. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  479. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  480. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  481. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  482. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  483. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  484. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  485. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  486. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  487. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  488. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  489. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  490. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  491. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  492. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  493. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  494. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  495. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  496. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  497. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  498. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  499. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  500. package/library/plugins/materio/assets/actions/help.md +140 -0
  501. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  502. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  503. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  504. package/library/plugins/materio/assets/actions/progress.md +125 -0
  505. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  506. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  507. package/library/plugins/materio/assets/actions/settings.md +38 -0
  508. package/library/plugins/materio/assets/actions/status.md +112 -0
  509. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  510. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  511. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  512. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  513. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  514. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  515. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  516. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  517. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  518. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  519. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  520. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  521. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  522. package/library/plugins/materio/assets/templates/config.json +5 -0
  523. package/library/plugins/materio/evals/scripts.yaml +29 -0
  524. package/library/plugins/materio/plugin.json +530 -0
  525. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  526. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  527. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  528. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  529. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  530. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  531. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  532. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  533. package/library/plugins/materio/tests/test_research_state.py +291 -0
  534. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  535. package/library/prompts/README.md +7 -0
  536. package/library/registry.yaml +921 -0
  537. package/library/skills/README.md +120 -0
  538. package/library/skills/coding/ast-grep/SKILL.md +213 -0
  539. package/library/skills/coding/ast-grep/evals.md +82 -0
  540. package/library/skills/coding/ast-grep/plugin.json +23 -0
  541. package/library/skills/coding/coding-standards/SKILL.md +164 -0
  542. package/library/skills/coding/coding-standards/evals.md +57 -0
  543. package/library/skills/coding/coding-standards/plugin.json +23 -0
  544. package/library/skills/coding/prototype/SKILL.md +151 -0
  545. package/library/skills/coding/prototype/evals.md +61 -0
  546. package/library/skills/coding/prototype/plugin.json +23 -0
  547. package/library/skills/coding/tdd/SKILL.md +134 -0
  548. package/library/skills/coding/tdd/evals.md +61 -0
  549. package/library/skills/coding/tdd/plugin.json +23 -0
  550. package/library/skills/context/context-handoff/SKILL.md +176 -0
  551. package/library/skills/context/context-handoff/evals.md +101 -0
  552. package/library/skills/context/context-handoff/plugin.json +23 -0
  553. package/library/skills/context/context-prime/SKILL.md +131 -0
  554. package/library/skills/context/context-prime/evals.md +99 -0
  555. package/library/skills/context/context-prime/plugin.json +23 -0
  556. package/library/skills/git/branch-closeout/SKILL.md +132 -0
  557. package/library/skills/git/branch-closeout/plugin.json +23 -0
  558. package/library/skills/git/file-ticket/SKILL.md +126 -0
  559. package/library/skills/git/file-ticket/plugin.json +23 -0
  560. package/library/skills/git/fix-issue/SKILL.md +136 -0
  561. package/library/skills/git/fix-issue/plugin.json +23 -0
  562. package/library/skills/git/resolve-merge-conflicts/SKILL.md +151 -0
  563. package/library/skills/git/resolve-merge-conflicts/evals.md +85 -0
  564. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  565. package/library/skills/git/ship/SKILL.md +134 -0
  566. package/library/skills/git/ship/plugin.json +23 -0
  567. package/library/skills/git/worktree-create/SKILL.md +127 -0
  568. package/library/skills/git/worktree-create/plugin.json +23 -0
  569. package/library/skills/git/worktree-merge/SKILL.md +147 -0
  570. package/library/skills/git/worktree-merge/plugin.json +23 -0
  571. package/library/skills/meta/clio-coder-dev/SKILL.md +101 -0
  572. package/library/skills/meta/clio-coder-dev/evals.md +46 -0
  573. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  574. package/library/skills/meta/clio-coder-test/SKILL.md +156 -0
  575. package/library/skills/meta/clio-coder-test/evals.md +62 -0
  576. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  577. package/library/skills/meta/clio-coder-test/references/test-map.md +97 -0
  578. package/library/skills/meta/credentials/SKILL.md +132 -0
  579. package/library/skills/meta/credentials/evals.md +104 -0
  580. package/library/skills/meta/credentials/plugin.json +23 -0
  581. package/library/skills/meta/find-skills/SKILL.md +85 -0
  582. package/library/skills/meta/find-skills/evals.md +65 -0
  583. package/library/skills/meta/find-skills/plugin.json +23 -0
  584. package/library/skills/meta/herdr/SKILL.md +133 -0
  585. package/library/skills/meta/herdr/evals.md +38 -0
  586. package/library/skills/meta/herdr/plugin.json +23 -0
  587. package/library/skills/meta/skill-craft/SKILL.md +139 -0
  588. package/library/skills/meta/skill-craft/evals.md +49 -0
  589. package/library/skills/meta/skill-craft/plugin.json +23 -0
  590. package/library/skills/planning/archify/SKILL.md +196 -0
  591. package/library/skills/planning/archify/plugin.json +23 -0
  592. package/library/skills/planning/architecture/SKILL.md +184 -0
  593. package/library/skills/planning/architecture/evals.md +101 -0
  594. package/library/skills/planning/architecture/plugin.json +23 -0
  595. package/library/skills/planning/backlog/SKILL.md +212 -0
  596. package/library/skills/planning/backlog/evals.md +185 -0
  597. package/library/skills/planning/backlog/plugin.json +23 -0
  598. package/library/skills/planning/prd/SKILL.md +129 -0
  599. package/library/skills/planning/prd/evals.md +103 -0
  600. package/library/skills/planning/prd/plugin.json +23 -0
  601. package/library/skills/planning/product-intent/SKILL.md +173 -0
  602. package/library/skills/planning/product-intent/evals.md +106 -0
  603. package/library/skills/planning/product-intent/plugin.json +23 -0
  604. package/library/skills/planning/tech-spec/SKILL.md +172 -0
  605. package/library/skills/planning/tech-spec/evals.md +120 -0
  606. package/library/skills/planning/tech-spec/plugin.json +23 -0
  607. package/library/skills/registry.yaml +144 -0
  608. package/library/skills/remote.yaml +13 -0
  609. package/library/skills/research/arxiv-literature/SKILL.md +168 -0
  610. package/library/skills/research/arxiv-literature/evals.md +108 -0
  611. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  612. package/library/skills/research/experiment-protocol/SKILL.md +148 -0
  613. package/library/skills/research/experiment-protocol/evals.md +114 -0
  614. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  615. package/library/skills/research/scientific-debugging/SKILL.md +149 -0
  616. package/library/skills/research/scientific-debugging/evals.md +156 -0
  617. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  618. package/library/skills/research/scientific-modernization/SKILL.md +170 -0
  619. package/library/skills/research/scientific-modernization/evals.md +111 -0
  620. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  621. package/library/skills/skill-marketplace.json +507 -0
  622. package/library/skills/workflow/cut-it/SKILL.md +153 -0
  623. package/library/skills/workflow/cut-it/evals.md +143 -0
  624. package/library/skills/workflow/cut-it/plugin.json +23 -0
  625. package/library/skills/workflow/design-council/SKILL.md +233 -0
  626. package/library/skills/workflow/design-council/evals.md +258 -0
  627. package/library/skills/workflow/design-council/plugin.json +23 -0
  628. package/library/skills/workflow/grill-me/SKILL.md +267 -0
  629. package/library/skills/workflow/grill-me/evals.md +231 -0
  630. package/library/skills/workflow/grill-me/plugin.json +23 -0
  631. package/library/skills/workflow/workflow-distiller/SKILL.md +204 -0
  632. package/library/skills/workflow/workflow-distiller/evals.md +233 -0
  633. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  634. package/package.json +23 -14
  635. package/src/cli/agents.ts +1 -1
  636. package/src/cli/config-inspect.ts +1 -1
  637. package/src/cli/configure.ts +2 -2
  638. package/src/cli/docs.ts +65 -328
  639. package/src/cli/eval.ts +40 -6
  640. package/src/cli/extensions.ts +74 -8
  641. package/src/cli/fleet-preflight.ts +2 -0
  642. package/src/cli/fleet.ts +2 -0
  643. package/src/cli/index.ts +4 -4
  644. package/src/cli/interop-inspect.ts +61 -33
  645. package/src/cli/interop.ts +79 -9
  646. package/src/cli/library-import.ts +139 -0
  647. package/src/cli/library.ts +418 -120
  648. package/src/cli/run.ts +26 -9
  649. package/src/cli/skills-eval.ts +43 -6
  650. package/src/cli/skills-inventory.ts +6 -2
  651. package/src/cli/skills.ts +44 -491
  652. package/src/cli/trace.ts +4 -65
  653. package/src/cli/uninstall.ts +26 -0
  654. package/src/cli/usage.ts +3 -0
  655. package/src/cli/web.ts +79 -0
  656. package/src/core/bus-events.ts +8 -4
  657. package/src/core/config.ts +71 -0
  658. package/src/core/defaults.ts +1 -1
  659. package/src/core/domain-loader.ts +37 -28
  660. package/src/core/recent-models.ts +2 -2
  661. package/src/core/session-routing.ts +3 -3
  662. package/src/core/state-file-lock.ts +1 -1
  663. package/src/core/termination.ts +13 -9
  664. package/src/core/tool-names.ts +5 -0
  665. package/src/domains/agents/contract.ts +1 -1
  666. package/src/domains/agents/extension.ts +53 -9
  667. package/src/domains/agents/fleet-commands.ts +92 -1
  668. package/src/domains/agents/fleet-contract.ts +87 -19
  669. package/src/domains/agents/recipe.ts +5 -4
  670. package/src/domains/agents/registry.ts +80 -24
  671. package/src/domains/config/extension.ts +5 -4
  672. package/src/domains/config/keybindings.ts +155 -95
  673. package/src/domains/context/worker/contract.ts +91 -0
  674. package/src/domains/context/worker/pressure.ts +120 -0
  675. package/src/domains/context/worker/recall.ts +62 -0
  676. package/src/domains/context/worker/select.ts +164 -0
  677. package/src/domains/context/worker/snapshot.ts +35 -0
  678. package/src/domains/context/worker/store.ts +16 -0
  679. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  680. package/src/domains/dispatch/active-route-planner.ts +2 -0
  681. package/src/domains/dispatch/backoff.ts +1 -0
  682. package/src/domains/dispatch/code-step.ts +12 -2
  683. package/src/domains/dispatch/contract.ts +3 -0
  684. package/src/domains/dispatch/execution-plan.ts +2 -0
  685. package/src/domains/dispatch/extension.ts +184 -39
  686. package/src/domains/dispatch/fleet-plan.ts +10 -0
  687. package/src/domains/dispatch/fleet-run.ts +1 -0
  688. package/src/domains/dispatch/index.ts +1 -0
  689. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  690. package/src/domains/dispatch/receipt-integrity.ts +7 -0
  691. package/src/domains/dispatch/state.ts +2 -2
  692. package/src/domains/dispatch/types.ts +7 -0
  693. package/src/domains/dispatch/validation.ts +12 -0
  694. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  695. package/src/domains/eval/metrics/tracked.ts +22 -2
  696. package/src/domains/evidence/failure-attribution.ts +1 -0
  697. package/src/domains/evidence/trust-status.ts +22 -3
  698. package/src/domains/extensions/command-schema.ts +145 -0
  699. package/src/domains/extensions/command-tools.ts +15 -0
  700. package/src/domains/extensions/compatibility.ts +7 -0
  701. package/src/domains/extensions/contract.ts +0 -4
  702. package/src/domains/extensions/discovery.ts +69 -205
  703. package/src/domains/extensions/extension.ts +0 -4
  704. package/src/domains/extensions/index.ts +1 -5
  705. package/src/domains/extensions/manager.ts +1 -6
  706. package/src/domains/extensions/operator-commands.ts +29 -0
  707. package/src/domains/extensions/operator-runtime.ts +485 -0
  708. package/src/domains/extensions/public-api.ts +53 -0
  709. package/src/domains/extensions/runtime-child.mjs +114 -0
  710. package/src/domains/extensions/runtime-process.ts +306 -0
  711. package/src/domains/extensions/runtime-schema.ts +146 -0
  712. package/src/domains/extensions/snapshot-access.ts +21 -0
  713. package/src/domains/extensions/snapshot.ts +4 -32
  714. package/src/domains/extensions/state.ts +5 -83
  715. package/src/domains/extensions/types.ts +33 -34
  716. package/src/domains/interop/adopt.ts +546 -0
  717. package/src/domains/interop/detect.ts +50 -12
  718. package/src/domains/interop/foreign.ts +554 -0
  719. package/src/domains/interop/import.ts +277 -0
  720. package/src/domains/interop/index.ts +24 -0
  721. package/src/domains/interop/install.ts +6 -0
  722. package/src/domains/interop/inventory.ts +351 -0
  723. package/src/domains/interop/projection.ts +360 -0
  724. package/src/domains/interop/registry.ts +106 -3
  725. package/src/domains/interop/types.ts +51 -0
  726. package/src/domains/lifecycle/migrations/index.ts +0 -2
  727. package/src/domains/lifecycle/naming-resources.ts +1 -1
  728. package/src/domains/middleware/hooks.ts +2 -2
  729. package/src/domains/middleware/marketplace-offer.ts +1 -1
  730. package/src/domains/mux/contract.ts +1 -1
  731. package/src/domains/observability/background-memory-usage.ts +3 -0
  732. package/src/domains/observability/compaction-usage.ts +2 -0
  733. package/src/domains/observability/cost.ts +5 -0
  734. package/src/domains/observability/extension.ts +1 -0
  735. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  736. package/src/domains/observability/trace-store.ts +65 -5
  737. package/src/domains/plugins/catalog.ts +204 -0
  738. package/src/domains/plugins/contract.ts +24 -0
  739. package/src/domains/plugins/discovery.ts +316 -0
  740. package/src/domains/plugins/extension.ts +40 -0
  741. package/src/domains/plugins/index.ts +77 -0
  742. package/src/domains/plugins/integrity.ts +6 -0
  743. package/src/domains/plugins/manifest.ts +3 -0
  744. package/src/domains/plugins/resources.ts +102 -0
  745. package/src/domains/plugins/state.ts +753 -0
  746. package/src/domains/plugins/types.ts +217 -0
  747. package/src/domains/prompts/extension.ts +4 -10
  748. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  749. package/src/domains/providers/cache-deployment.ts +147 -0
  750. package/src/domains/providers/catalog.ts +12 -7
  751. package/src/domains/providers/extension.ts +27 -5
  752. package/src/domains/providers/index.ts +1 -0
  753. package/src/domains/providers/plugins.ts +3 -13
  754. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  755. package/src/domains/providers/types/target-descriptor.ts +17 -0
  756. package/src/domains/resources/common-loader.ts +9 -6
  757. package/src/domains/resources/index.ts +67 -0
  758. package/src/domains/resources/library-actions.ts +836 -0
  759. package/src/domains/resources/library-evals.ts +38 -0
  760. package/src/domains/resources/library-inventory.ts +1048 -0
  761. package/src/domains/resources/library-types.ts +50 -0
  762. package/src/domains/resources/library-validation.ts +634 -0
  763. package/src/domains/resources/library.ts +437 -156
  764. package/src/domains/resources/package-references.ts +66 -0
  765. package/src/domains/resources/prompts/loader.ts +75 -41
  766. package/src/domains/resources/skills/install.ts +2 -2
  767. package/src/domains/resources/skills/loader.ts +77 -22
  768. package/src/domains/resources/skills/marketplace.ts +48 -57
  769. package/src/domains/resources/skills/promotion.ts +2 -2
  770. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  771. package/src/domains/safety/action-classifier.ts +2 -2
  772. package/src/domains/safety/default-path-policy.ts +3 -1
  773. package/src/domains/safety/policy-engine.ts +1 -1
  774. package/src/domains/safety/protected-artifacts.ts +21 -5
  775. package/src/domains/safety/skill-authority.ts +5 -2
  776. package/src/domains/session/compaction/compact.ts +4 -1
  777. package/src/domains/session/entries.ts +1 -0
  778. package/src/domains/session/usage.ts +6 -7
  779. package/src/domains/share/archive.ts +1 -1
  780. package/src/engine/acp/server.ts +11 -0
  781. package/src/engine/ai.ts +2 -0
  782. package/src/engine/apis/openai-completions.ts +61 -6
  783. package/src/engine/notices/pi-tui-LICENSE +21 -0
  784. package/src/engine/prewarm.ts +232 -0
  785. package/src/engine/provider-diagnostics.ts +6 -1
  786. package/src/engine/tui.ts +3 -0
  787. package/src/engine/worker-runtime.ts +58 -14
  788. package/src/engine/worker-tools.ts +5 -0
  789. package/src/entry/orchestrator.ts +46 -21
  790. package/src/entry/plugin-reload.ts +18 -0
  791. package/src/interactive/application-controller.ts +67 -21
  792. package/src/interactive/chat-loop-messages.ts +3 -0
  793. package/src/interactive/chat-loop.ts +32 -11
  794. package/src/interactive/chat-panel.ts +5 -1
  795. package/src/interactive/clio-editor.ts +53 -21
  796. package/src/interactive/command-output.ts +56 -1
  797. package/src/interactive/editor-submit.ts +65 -28
  798. package/src/interactive/fleet-run-preview.ts +2 -0
  799. package/src/interactive/follow-up-queue-panel.ts +3 -3
  800. package/src/interactive/footer/dashboard.ts +4 -1
  801. package/src/interactive/footer/notifications.ts +2 -2
  802. package/src/interactive/footer/widgets.ts +2 -2
  803. package/src/interactive/interactive-application.ts +209 -21
  804. package/src/interactive/interactive-input-runtime.ts +254 -7
  805. package/src/interactive/interactive-presentation.ts +41 -12
  806. package/src/interactive/interactive-slash-runtime.ts +37 -8
  807. package/src/interactive/keybinding-manager.ts +156 -79
  808. package/src/interactive/keyboard-owner.ts +37 -0
  809. package/src/interactive/leader-key.ts +49 -102
  810. package/src/interactive/leader-menu.ts +45 -0
  811. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  812. package/src/interactive/overlay-frame.ts +15 -0
  813. package/src/interactive/overlay-key-routing.ts +46 -47
  814. package/src/interactive/overlay-lifecycle.ts +30 -15
  815. package/src/interactive/overlay-resource-openers.ts +56 -46
  816. package/src/interactive/overlays/ask-user.ts +630 -556
  817. package/src/interactive/overlays/extension-panel.ts +70 -0
  818. package/src/interactive/overlays/extensions.ts +28 -5
  819. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  820. package/src/interactive/overlays/help-reference.ts +89 -40
  821. package/src/interactive/overlays/interop.ts +122 -3
  822. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  823. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  824. package/src/interactive/overlays/library-model.ts +574 -0
  825. package/src/interactive/overlays/library-review.ts +557 -0
  826. package/src/interactive/overlays/library-tabs.ts +3 -15
  827. package/src/interactive/overlays/library.ts +602 -0
  828. package/src/interactive/overlays/list-overlay.ts +218 -39
  829. package/src/interactive/overlays/model-selector.ts +28 -25
  830. package/src/interactive/overlays/session-selector.ts +9 -3
  831. package/src/interactive/overlays/settings.ts +25 -18
  832. package/src/interactive/overlays/tree-selector.ts +16 -11
  833. package/src/interactive/permission-hint.ts +13 -0
  834. package/src/interactive/permission-overlay.ts +77 -28
  835. package/src/interactive/prewarm.ts +11 -197
  836. package/src/interactive/prompt-source-label.ts +21 -0
  837. package/src/interactive/renderers/reference-card.ts +35 -0
  838. package/src/interactive/renderers/worker-entry.ts +35 -3
  839. package/src/interactive/session-usage-reseed.ts +2 -0
  840. package/src/interactive/side-question.ts +2 -0
  841. package/src/interactive/slash-autocomplete.ts +99 -1
  842. package/src/interactive/slash-commands.ts +390 -67
  843. package/src/interactive/slash-spec.ts +0 -1
  844. package/src/interactive/terminal-lease.ts +44 -12
  845. package/src/interactive/turn-context.ts +1 -0
  846. package/src/interactive/turn-persistence.ts +3 -0
  847. package/src/interactive/turn-prewarm.ts +126 -19
  848. package/src/interactive/turn-queues.ts +8 -7
  849. package/src/interactive/turn-runtime.ts +15 -1
  850. package/src/interactive/view/view-overlay.ts +19 -14
  851. package/src/interactive/welcome-dashboard.ts +525 -408
  852. package/src/tools/bootstrap.ts +8 -0
  853. package/src/tools/builtin-tool-catalog.ts +15 -6
  854. package/src/tools/context/index.ts +58 -5
  855. package/src/tools/context/library.ts +465 -0
  856. package/src/tools/context/surface.ts +20 -6
  857. package/src/tools/core-bootstrap.ts +3 -0
  858. package/src/tools/dispatch-admission.ts +24 -1
  859. package/src/tools/dispatch-arguments.ts +8 -0
  860. package/src/tools/dispatch-plan.ts +32 -0
  861. package/src/tools/dispatch-schema.ts +31 -1
  862. package/src/tools/dispatch-types.ts +3 -0
  863. package/src/tools/dispatch.ts +1 -1
  864. package/src/tools/harness-extensions.ts +169 -0
  865. package/src/tools/observation.ts +4 -0
  866. package/src/tools/policy.ts +7 -1
  867. package/src/tools/registry.ts +31 -3
  868. package/src/tools/worker-evidence.ts +5 -0
  869. package/src/worker/context-seed.ts +192 -0
  870. package/src/worker/entry.ts +1 -0
  871. package/src/worker/spec-contract.ts +35 -1
  872. package/dist/acp-UVEVWSDL.js +0 -130
  873. package/dist/agents-VWY37DTK.js +0 -148
  874. package/dist/auth-PCV2XQDV.js +0 -551
  875. package/dist/builtins-PD652MTK.js +0 -22
  876. package/dist/chunk-22PQ4TX4.js +0 -360
  877. package/dist/chunk-24T2YZ7A.js +0 -22648
  878. package/dist/chunk-2AKYFREM.js +0 -1008
  879. package/dist/chunk-2QPI3TR3.js +0 -162
  880. package/dist/chunk-3BJGMT2D.js +0 -324
  881. package/dist/chunk-3HQVBIKD.js +0 -308
  882. package/dist/chunk-3JLFK5MW.js +0 -193
  883. package/dist/chunk-3O2ZAUGQ.js +0 -283
  884. package/dist/chunk-3QKXHCGS.js +0 -59
  885. package/dist/chunk-3T4DXWP6.js +0 -668
  886. package/dist/chunk-3UW3KU4A.js +0 -21
  887. package/dist/chunk-3WBALRQH.js +0 -5076
  888. package/dist/chunk-4DU2TVI4.js +0 -108
  889. package/dist/chunk-4U4TKZFR.js +0 -5052
  890. package/dist/chunk-4VMV6OS6.js +0 -101
  891. package/dist/chunk-536HXRFE.js +0 -1257
  892. package/dist/chunk-5CMARGPF.js +0 -477
  893. package/dist/chunk-5CY4Q6QI.js +0 -141
  894. package/dist/chunk-5QRX7SLS.js +0 -1018
  895. package/dist/chunk-5VTJP36Q.js +0 -36
  896. package/dist/chunk-5ZSZEYJK.js +0 -119
  897. package/dist/chunk-6HAO6X5B.js +0 -197
  898. package/dist/chunk-6OII3LOK.js +0 -404
  899. package/dist/chunk-6RYDAVQT.js +0 -4338
  900. package/dist/chunk-6VRRJT7L.js +0 -146
  901. package/dist/chunk-6YA46L5A.js +0 -386
  902. package/dist/chunk-77CZRFTE.js +0 -634
  903. package/dist/chunk-7JSSKXG2.js +0 -1215
  904. package/dist/chunk-7WUZEB2M.js +0 -165
  905. package/dist/chunk-7YJWEF2L.js +0 -974
  906. package/dist/chunk-ACCKVSHU.js +0 -44
  907. package/dist/chunk-B3MOMLJ4.js +0 -433
  908. package/dist/chunk-BBV5TKE6.js +0 -35
  909. package/dist/chunk-BLTEAUCB.js +0 -668
  910. package/dist/chunk-BS4GAMUB.js +0 -233
  911. package/dist/chunk-BT7HGDOX.js +0 -3151
  912. package/dist/chunk-CBSKDFWL.js +0 -101
  913. package/dist/chunk-CXQ37WJH.js +0 -45
  914. package/dist/chunk-DXLUVUD4.js +0 -1490
  915. package/dist/chunk-DZK63TZJ.js +0 -1334
  916. package/dist/chunk-E7RF4KBO.js +0 -266
  917. package/dist/chunk-ECOMVOHP.js +0 -139
  918. package/dist/chunk-EHOSNVVM.js +0 -59
  919. package/dist/chunk-F5Z7EWMN.js +0 -4484
  920. package/dist/chunk-FQOOGXBH.js +0 -579
  921. package/dist/chunk-GLYBJ4RQ.js +0 -396
  922. package/dist/chunk-HHVJNVUJ.js +0 -179
  923. package/dist/chunk-HL26ADLH.js +0 -77
  924. package/dist/chunk-HPTJF6DG.js +0 -2465
  925. package/dist/chunk-HXHFDHB6.js +0 -962
  926. package/dist/chunk-HZ2T2YED.js +0 -1687
  927. package/dist/chunk-HZFBVU5X.js +0 -666
  928. package/dist/chunk-I2K2NCZQ.js +0 -659
  929. package/dist/chunk-IGLVVNEG.js +0 -402
  930. package/dist/chunk-IKRWLEDA.js +0 -1567
  931. package/dist/chunk-J2FYEQ5L.js +0 -33
  932. package/dist/chunk-JMPL7NUB.js +0 -108
  933. package/dist/chunk-K2HL3GBL.js +0 -998
  934. package/dist/chunk-KAFMW7WM.js +0 -386
  935. package/dist/chunk-KTFSFCVN.js +0 -46
  936. package/dist/chunk-LIN2K3EL.js +0 -66
  937. package/dist/chunk-LUL5Z66S.js +0 -221
  938. package/dist/chunk-LVFANMOH.js +0 -466
  939. package/dist/chunk-LY4N4TTL.js +0 -117
  940. package/dist/chunk-LZBMXNLP.js +0 -1196
  941. package/dist/chunk-M6TAYK66.js +0 -807
  942. package/dist/chunk-N2OKBREN.js +0 -243
  943. package/dist/chunk-NC4KV7EL.js +0 -39
  944. package/dist/chunk-NF3BK5WR.js +0 -42
  945. package/dist/chunk-NNWJYUNO.js +0 -573
  946. package/dist/chunk-NTK3WTHM.js +0 -141
  947. package/dist/chunk-ODUTYZIU.js +0 -688
  948. package/dist/chunk-OQM5IVJY.js +0 -1377
  949. package/dist/chunk-P5JMBPDJ.js +0 -7192
  950. package/dist/chunk-P5SC4DLJ.js +0 -47
  951. package/dist/chunk-P6M7RKMI.js +0 -97
  952. package/dist/chunk-PWWSIB2A.js +0 -52
  953. package/dist/chunk-PZN2LQY6.js +0 -674
  954. package/dist/chunk-Q7NNUHQV.js +0 -705
  955. package/dist/chunk-QCOV5DFY.js +0 -911
  956. package/dist/chunk-QNWRHOMF.js +0 -692
  957. package/dist/chunk-QRFXEO6Y.js +0 -17
  958. package/dist/chunk-QXFBABFJ.js +0 -380
  959. package/dist/chunk-RGZNQ5CT.js +0 -657
  960. package/dist/chunk-SRZOW5L2.js +0 -1865
  961. package/dist/chunk-SXQKNKRA.js +0 -223
  962. package/dist/chunk-T334FW2H.js +0 -362
  963. package/dist/chunk-T52TPHYC.js +0 -318
  964. package/dist/chunk-TJFDL26W.js +0 -658
  965. package/dist/chunk-TN5FW4XY.js +0 -172
  966. package/dist/chunk-U7H5WRG5.js +0 -123
  967. package/dist/chunk-UFYNOQK4.js +0 -302
  968. package/dist/chunk-URBGEOH3.js +0 -32
  969. package/dist/chunk-USZA7GWL.js +0 -341
  970. package/dist/chunk-UUQ5G6EZ.js +0 -697
  971. package/dist/chunk-VAHLPXPY.js +0 -399
  972. package/dist/chunk-VANN3GDP.js +0 -2488
  973. package/dist/chunk-VHMX7SXF.js +0 -1289
  974. package/dist/chunk-WJIMKGD6.js +0 -132
  975. package/dist/chunk-WKUYQBCG.js +0 -795
  976. package/dist/chunk-WNGF5AJX.js +0 -1911
  977. package/dist/chunk-WV6TDAPN.js +0 -3627
  978. package/dist/chunk-X3BI7HTV.js +0 -562
  979. package/dist/chunk-XWMSPJYN.js +0 -149
  980. package/dist/chunk-YPRSNUTC.js +0 -395
  981. package/dist/chunk-ZS43Y2FT.js +0 -438
  982. package/dist/clio-QQCMTUZE.js +0 -26
  983. package/dist/code-nav-GUPM6766.js +0 -686
  984. package/dist/components-TNIKXCBH.js +0 -674
  985. package/dist/config-IIM7YOD3.js +0 -621
  986. package/dist/configure-4ZM5HWJX.js +0 -73
  987. package/dist/context-44BZLJ3J.js +0 -344
  988. package/dist/context-AIDVQKMW.js +0 -278
  989. package/dist/context-OL5P3HEP.js +0 -1031
  990. package/dist/context-clear-OQV76MYP.js +0 -184
  991. package/dist/context-index-HP2JFUWA.js +0 -120
  992. package/dist/context-map-INTXD54D.js +0 -555
  993. package/dist/context-working-set-ZUW3EGLS.js +0 -1556
  994. package/dist/detail-UXPWRANG.js +0 -115
  995. package/dist/dispatch-runner-P3ZW6G77.js +0 -2438
  996. package/dist/docs-BL7ROUFN.js +0 -292
  997. package/dist/doctor-JJVGPZWT.js +0 -797
  998. package/dist/eval-V2RTN3UH.js +0 -4972
  999. package/dist/eval-inventory-QOYZERXJ.js +0 -315
  1000. package/dist/evidence-35PYWGSO.js +0 -225
  1001. package/dist/evidence-CIGGKI6J.js +0 -383
  1002. package/dist/evolve-33SM3NJP.js +0 -609
  1003. package/dist/extensions-YVRHX6ZI.js +0 -229
  1004. package/dist/fleet-LFO7SIPC.js +0 -908
  1005. package/dist/fleet-commands-RLK72GU3.js +0 -75
  1006. package/dist/fleet-decisions-3SBSCTCW.js +0 -159
  1007. package/dist/fleet-graph-JZIBCGMW.js +0 -134
  1008. package/dist/fleet-inspect-2L5YGGZJ.js +0 -469
  1009. package/dist/fleet-preflight-QRSHIIDE.js +0 -22
  1010. package/dist/fleet-validate-LIAVKDUU.js +0 -92
  1011. package/dist/fleet-verify-JIK3OQZR.js +0 -202
  1012. package/dist/fleet-view-IWHYGQKK.js +0 -118
  1013. package/dist/init-NJEDOTQW.js +0 -321
  1014. package/dist/interop-RVCAYECG.js +0 -115
  1015. package/dist/inventory-74UL7UHU.js +0 -118
  1016. package/dist/library-CTKZA7K3.js +0 -226
  1017. package/dist/memory-I76I5VUH.js +0 -512
  1018. package/dist/models-D4YDIQZQ.js +0 -289
  1019. package/dist/monitor-NKVD55HX.js +0 -775
  1020. package/dist/orchestrator-I6OATVPK.js +0 -39518
  1021. package/dist/panes-7BTYH3XQ.js +0 -103
  1022. package/dist/panes-WPOMEMRH.js +0 -74
  1023. package/dist/paths-J3KN7UAO.js +0 -67
  1024. package/dist/preload-EJAWJEIO.js +0 -116
  1025. package/dist/reset-4XMQKDNZ.js +0 -345
  1026. package/dist/resources-TVYVXK3Q.js +0 -125
  1027. package/dist/run-OWQNNSJU.js +0 -872
  1028. package/dist/share-NPZZMUXG.js +0 -290
  1029. package/dist/skills-OXFEAWMT.js +0 -510
  1030. package/dist/skills-eval-J5TCKSJA.js +0 -1034
  1031. package/dist/skills-inventory-7II4DM57.js +0 -133
  1032. package/dist/slash-commands-MDSDSWYF.js +0 -92
  1033. package/dist/steer-S7D7IKPU.js +0 -77
  1034. package/dist/support-5VAEC32W.js +0 -38
  1035. package/dist/targets-KILZEOCE.js +0 -1109
  1036. package/dist/tasks-R6P6OV22.js +0 -36
  1037. package/dist/terminal-lease-LZCG2KN3.js +0 -405
  1038. package/dist/tools-6OCQ6SVB.js +0 -28
  1039. package/dist/trace-JHLXWUMN.js +0 -572
  1040. package/dist/tui-primitives-RCY2HN7G.js +0 -17
  1041. package/dist/uninstall-FXYMFFRT.js +0 -407
  1042. package/dist/upgrade-D2OZH6IQ.js +0 -307
  1043. package/dist/usage-PIASNUS4.js +0 -1052
  1044. package/dist/verifiers-LTHUY2PX.js +0 -630
  1045. package/dist/verify-HYF7KBVE.js +0 -30
  1046. package/dist/web-fetch-MQN4FH3X.js +0 -788
  1047. package/dist/wiki-generate-RK7JQ5NP.js +0 -615
  1048. package/dist/with-panes-OFTNAR4Y.js +0 -628
  1049. package/skills/README.md +0 -418
  1050. package/skills/coding/ast-grep/SKILL.md +0 -213
  1051. package/skills/coding/ast-grep/evals.md +0 -82
  1052. package/skills/coding/coding-standards/SKILL.md +0 -164
  1053. package/skills/coding/coding-standards/evals.md +0 -57
  1054. package/skills/coding/prototype/SKILL.md +0 -151
  1055. package/skills/coding/prototype/evals.md +0 -61
  1056. package/skills/coding/tdd/SKILL.md +0 -134
  1057. package/skills/coding/tdd/evals.md +0 -61
  1058. package/skills/context/context-handoff/SKILL.md +0 -176
  1059. package/skills/context/context-handoff/evals.md +0 -101
  1060. package/skills/context/context-prime/SKILL.md +0 -131
  1061. package/skills/context/context-prime/evals.md +0 -99
  1062. package/skills/git/branch-closeout/SKILL.md +0 -132
  1063. package/skills/git/file-ticket/SKILL.md +0 -126
  1064. package/skills/git/fix-issue/SKILL.md +0 -136
  1065. package/skills/git/resolve-merge-conflicts/SKILL.md +0 -151
  1066. package/skills/git/resolve-merge-conflicts/evals.md +0 -85
  1067. package/skills/git/ship/SKILL.md +0 -134
  1068. package/skills/git/worktree-create/SKILL.md +0 -127
  1069. package/skills/git/worktree-merge/SKILL.md +0 -147
  1070. package/skills/meta/clio-coder-dev/SKILL.md +0 -101
  1071. package/skills/meta/clio-coder-dev/evals.md +0 -46
  1072. package/skills/meta/clio-coder-test/SKILL.md +0 -146
  1073. package/skills/meta/clio-coder-test/evals.md +0 -48
  1074. package/skills/meta/clio-coder-test/references/test-map.md +0 -96
  1075. package/skills/meta/credentials/SKILL.md +0 -132
  1076. package/skills/meta/credentials/evals.md +0 -104
  1077. package/skills/meta/find-skills/SKILL.md +0 -78
  1078. package/skills/meta/find-skills/evals.md +0 -47
  1079. package/skills/meta/herdr/SKILL.md +0 -133
  1080. package/skills/meta/herdr/evals.md +0 -38
  1081. package/skills/meta/skill-craft/SKILL.md +0 -125
  1082. package/skills/meta/skill-craft/evals.md +0 -41
  1083. package/skills/planning/archify/SKILL.md +0 -196
  1084. package/skills/planning/architecture/SKILL.md +0 -184
  1085. package/skills/planning/architecture/evals.md +0 -101
  1086. package/skills/planning/backlog/SKILL.md +0 -212
  1087. package/skills/planning/backlog/evals.md +0 -185
  1088. package/skills/planning/prd/SKILL.md +0 -129
  1089. package/skills/planning/prd/evals.md +0 -103
  1090. package/skills/planning/product-intent/SKILL.md +0 -173
  1091. package/skills/planning/product-intent/evals.md +0 -106
  1092. package/skills/planning/tech-spec/SKILL.md +0 -172
  1093. package/skills/planning/tech-spec/evals.md +0 -120
  1094. package/skills/registry.yaml +0 -144
  1095. package/skills/remote.yaml +0 -13
  1096. package/skills/research/arxiv-literature/SKILL.md +0 -168
  1097. package/skills/research/arxiv-literature/evals.md +0 -108
  1098. package/skills/research/experiment-protocol/SKILL.md +0 -148
  1099. package/skills/research/experiment-protocol/evals.md +0 -114
  1100. package/skills/research/scientific-debugging/SKILL.md +0 -149
  1101. package/skills/research/scientific-debugging/evals.md +0 -156
  1102. package/skills/research/scientific-modernization/SKILL.md +0 -170
  1103. package/skills/research/scientific-modernization/evals.md +0 -111
  1104. package/skills/skill-marketplace.json +0 -507
  1105. package/skills/workflow/cut-it/SKILL.md +0 -153
  1106. package/skills/workflow/cut-it/evals.md +0 -143
  1107. package/skills/workflow/design-council/SKILL.md +0 -233
  1108. package/skills/workflow/design-council/evals.md +0 -258
  1109. package/skills/workflow/grill-me/SKILL.md +0 -267
  1110. package/skills/workflow/grill-me/evals.md +0 -231
  1111. package/skills/workflow/workflow-distiller/SKILL.md +0 -201
  1112. package/skills/workflow/workflow-distiller/evals.md +0 -225
  1113. package/src/domains/extensions/resource-path.ts +0 -27
  1114. package/src/domains/extensions/resources.ts +0 -37
  1115. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  1116. package/src/interactive/overlays/agents.ts +0 -70
  1117. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  1118. package/src/interactive/overlays/prompts.ts +0 -89
  1119. package/src/interactive/overlays/skills-hub.ts +0 -615
  1120. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  1121. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  1122. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  1123. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  1124. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  1125. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  1126. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  1127. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  1128. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  1129. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  1130. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  1131. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  1132. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  1133. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  1134. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  1135. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  1136. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  1137. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  1138. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  1139. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  1140. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  1141. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  1142. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -1,102 +1,122 @@
1
- import { existsSync, readdirSync, statSync } from "node:fs";
2
- import { basename, join } from "node:path";
3
1
  import type { ClioSettings } from "../core/config.js";
4
2
  import { readClioVersion } from "../core/package-root.js";
5
- import { loadProjectClioMd } from "../domains/context/clio-md.js";
6
- import { readCodewiki, readCodewikiAsync } from "../domains/context/codewiki/artifact.js";
7
- import { renderCodewikiDigest } from "../domains/context/codewiki/digest.js";
8
- import { listWikiPages } from "../domains/context/wiki/layout.js";
9
- import {
10
- type WikiStaleness,
11
- wikiCompleteness,
12
- wikiStaleness,
13
- wikiStalenessAsync,
14
- } from "../domains/context/wiki/staleness.js";
15
- import type { TaskMemoryOperatorStatus } from "../domains/memory/index.js";
16
- import type { ObservabilityContract } from "../domains/observability/index.js";
17
- import {
18
- type CapabilityFlags,
19
- type ProvidersContract,
20
- resolveModelCapabilities,
21
- resolveModelRuntimeCapabilitiesForProviders,
22
- type TargetStatus,
23
- } from "../domains/providers/index.js";
24
- import type { ContextUsageSnapshot } from "../domains/session/context-accounting.js";
3
+ import type { ContextState } from "../domains/context/index.js";
4
+ import type { ProvidersContract, TargetStatus } from "../domains/providers/index.js";
5
+ import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
25
6
  import type { WorkspaceSnapshot } from "../domains/session/workspace/index.js";
26
- import { type Component, truncateToWidth } from "../engine/tui.js";
27
- import { relative } from "./format-time.js";
28
- import { brandMark, clioTheme, formatTargetLabel, frame, GLYPH, sectionTag } from "./theme/index.js";
7
+ import { type Component, truncateToWidth, visibleWidth } from "../engine/tui.js";
8
+ import {
9
+ brandMark,
10
+ type ClioTheme,
11
+ type ClioToken,
12
+ clioTheme,
13
+ collapseHomePath,
14
+ formatTargetLabel,
15
+ GLYPH,
16
+ padAnsi,
17
+ } from "./theme/index.js";
18
+
19
+ /**
20
+ * What the route can honestly be said to be.
21
+ *
22
+ * `checking` is its own state and is never spelled as ready or unavailable. A
23
+ * target that is configured but not yet probed reports
24
+ * `health.status === "unknown"` with `available` still true, and printing that
25
+ * as either verdict is a claim the process has not earned. `available === false`
26
+ * is a different thing: it is a configuration or auth-level refusal that holds
27
+ * without any probe (see `authStatusFor` in domains/providers/extension.ts), so
28
+ * it is reported as unavailable immediately.
29
+ */
30
+ export type WelcomeRouteState = "checking" | "ready" | "degraded" | "unavailable" | "unset";
31
+
32
+ /**
33
+ * Project-context state, mirroring `ContextState["clioMd"]` plus the honest
34
+ * fourth answer for "the authoritative read has not happened yet". `stale` is
35
+ * carried through rather than folded into `ok`, because a stale CLIO-CODER.md
36
+ * has a different next step than a current one.
37
+ */
38
+ export type WelcomeProjectContextState = "checking" | "ok" | "stale" | "none" | "malformed";
29
39
 
30
40
  export interface WelcomeDashboardDeps {
31
- providers: ProvidersContract;
32
- observability: ObservabilityContract;
33
- getContextUsage?: () => ContextUsageSnapshot;
41
+ providers: Pick<ProvidersContract, "list">;
34
42
  getSettings?: () => Readonly<ClioSettings>;
35
43
  getWorkspaceSnapshot?: () => WorkspaceSnapshot | null;
36
- getExtensionStats?: () => { active: number; installed: number };
37
- getTaskMemoryStatus?: () => TaskMemoryOperatorStatus;
38
- /** Overridable repository probe. Tests count calls through it; production uses the default. */
39
- readRepositoryFacts?: (cwd: string) => WelcomeRepositoryFacts;
40
- /** Called when an off-render probe lands, so the layer that owns the frame can ask for one. */
44
+ /**
45
+ * The authoritative project-context reader from the context domain. It is
46
+ * synchronous on a cache miss (it walks ancestors for CLIO-CODER.md), so it
47
+ * is never called from `render`; the dashboard refreshes it off the frame and
48
+ * paints `checking` until the first reading lands.
49
+ */
50
+ getContextState?: (cwd: string) => ContextState;
51
+ /** Effective label for the submit binding; null when unbound or disabled. */
52
+ getSubmitKeyLabel?: () => string | null;
53
+ /** Called when an off-render refresh lands, so the frame owner can ask for one. */
41
54
  onFactsRefreshed?: () => void;
42
- }
43
-
44
- /**
45
- * The part of the banner that costs subprocesses and disk reads rather than a
46
- * map lookup: CLIO-CODER.md presence, the codewiki, wiki staleness and completeness,
47
- * and the handoff directory. None of it can change as a result of drawing a
48
- * frame, and re-deriving it per frame ran three `git` subprocesses and a full
49
- * codewiki parse inside the render timer.
50
- */
51
- export interface WelcomeRepositoryFacts {
52
- clioMdStatus: string;
53
- hasCodewiki: boolean;
54
- codewikiCount: number;
55
- wikiPageCount: number;
56
- wikiStatus: string;
57
- wikiDigestExcerpt: string[];
58
- handoffCount: number;
59
- handoffFreshness: string;
60
55
  /**
61
- * True while the first probe is still in flight. The rows that depend on it
62
- * render dim placeholders rather than wrong values, and keep their row count,
63
- * because the banner sits at line 0 and a height change there forces pi-tui
64
- * to clear and repaint the entire buffer once the transcript has scrolled.
56
+ * How the off-render refresh is deferred. Production yields to the event loop
57
+ * so no filesystem work ever runs on the render call stack; tests inject a
58
+ * synchronous runner for determinism.
65
59
  */
66
- pending?: boolean;
60
+ scheduleRefresh?: (run: () => void) => void;
61
+ now?: () => number;
67
62
  }
68
63
 
69
64
  export interface WelcomeDashboardStats {
70
- activeTargets: number;
71
- totalTargets: number;
65
+ cwd: string;
66
+ workspace: WorkspaceSnapshot | null;
72
67
  /** Null when unset. `formatTargetLabel` owns the one spelling for that. */
73
68
  targetLabel: string | null;
74
69
  modelLabel: string | null;
75
- thinkingLevel: string;
76
- cwd: string;
77
- workspace: WorkspaceSnapshot | null;
78
- currentAvailable: boolean;
79
- targetHealthLabel: string | null;
80
- activeCapabilities: string[];
81
- extensions: { active: number; installed: number } | null;
82
- autonomy: string;
83
- toolProfile: string;
84
- compactionThreshold: string;
85
- clioMdStatus: string;
86
- hasCodewiki: boolean;
87
- codewikiCount: number;
88
- wikiPageCount: number;
89
- wikiStatus: string;
90
- wikiDigestExcerpt: string[];
91
- handoffCount: number;
92
- handoffFreshness: string;
93
- taskMemory: TaskMemoryOperatorStatus | null;
94
- /** Mirrors `WelcomeRepositoryFacts.pending`; drives the dim placeholder rows. */
95
- factsPending?: boolean;
70
+ route: WelcomeRouteState;
71
+ /** The actionable half of a failure. Null whenever the route is fine. */
72
+ routeReason: string | null;
73
+ /** `checking` in session mode: the collapsed row does not show it, so it is not read. */
74
+ projectContext: WelcomeProjectContextState;
75
+ /** Null in session mode: the collapsed row prints no key hint. */
76
+ submitKeyLabel: string | null;
77
+ }
78
+
79
+ export type WelcomeDashboardMode = "launchpad" | "session";
80
+
81
+ export interface WelcomeDashboardComponent extends Component {
82
+ collapseToSessionHeader(): boolean;
83
+ resetToLaunchpad(): boolean;
84
+ /** Stop off-render refreshes from requesting frames after teardown. */
85
+ dispose(): void;
96
86
  }
97
87
 
98
- function activeStatus(status: TargetStatus): boolean {
99
- return status.available && status.health.status !== "down";
88
+ /**
89
+ * How long a project-context reading is trusted, and how soon a reading that
90
+ * could not be taken is retried. The retry is shorter than the trust window so a
91
+ * transient failure resolves quickly, and longer than a frame so a permanently
92
+ * failing read cannot become a per-frame scan.
93
+ *
94
+ * A failure never renews the trust window. Once reads have been failing for
95
+ * longer than the window, the header stops asserting the last value and says
96
+ * `checking` instead, so a stale `ok` cannot outlive the evidence for it.
97
+ */
98
+ export const WELCOME_PROJECT_CONTEXT_TTL_MS = 10_000;
99
+ export const WELCOME_PROJECT_CONTEXT_RETRY_MS = 2_000;
100
+
101
+ /** Columns the route's failure reason is allowed before it is cut. */
102
+ const ROUTE_REASON_MAX = 48;
103
+ /** The route text is shrunk to this before a failure reason is cut instead. */
104
+ const ROUTE_TARGET_FLOOR = 12;
105
+ /** Below this a reason is dropped; the action row still names the fault. */
106
+ const ROUTE_REASON_FLOOR = 8;
107
+
108
+ /**
109
+ * Neutralize a string that came from outside this process before it is styled.
110
+ *
111
+ * Provider reasons, upstream error bodies, branch names, model ids and paths all
112
+ * reach the header from somewhere the header does not control, and a header is a
113
+ * bad place to discover that a payload can move the cursor. `sanitizeCallTargetText`
114
+ * is the project's existing one-line sanitizer (OSC and CSI stripped, C0 and DEL
115
+ * neutralized, whitespace collapsed); this is a thin alias so the intent reads at
116
+ * every call site.
117
+ */
118
+ function plainOneLine(value: string): string {
119
+ return sanitizeCallTargetText(value);
100
120
  }
101
121
 
102
122
  function findCurrentStatus(
@@ -108,363 +128,387 @@ function findCurrentStatus(
108
128
  return statuses.find((status) => status.target.id === targetId) ?? null;
109
129
  }
110
130
 
111
- function capabilityLabels(caps: CapabilityFlags | null): string[] {
112
- if (!caps) return [];
113
- const out: string[] = [];
114
- if (caps.tools) out.push("tools");
115
- if (caps.reasoning) out.push("reasoning");
116
- if (caps.vision) out.push("vision");
117
- if (caps.fim) out.push("fim");
118
- if (caps.embeddings) out.push("embed");
119
- if (typeof caps.contextWindow === "number" && caps.contextWindow > 0)
120
- out.push(`${Math.round(caps.contextWindow / 1000)}k ctx`);
121
- return out.slice(0, 5);
131
+ /**
132
+ * One short line an operator can act on. Reasons arrive as anything from
133
+ * `ECONNREFUSED 127.0.0.1:1234` to a multi-line upstream body, so the text is
134
+ * sanitized to one line and then cut by terminal columns — not by code units,
135
+ * which would split a surrogate pair or a combining sequence.
136
+ */
137
+ function shortRouteReason(status: TargetStatus): string | null {
138
+ const cleaned = plainOneLine(status.health.lastError ?? status.reason ?? "");
139
+ if (cleaned.length === 0) return null;
140
+ return visibleWidth(cleaned) > ROUTE_REASON_MAX
141
+ ? truncateToWidth(cleaned, ROUTE_REASON_MAX, GLYPH.ellipsis, false)
142
+ : cleaned;
122
143
  }
123
144
 
124
- function selectedModelCapabilities(
125
- status: TargetStatus | null,
126
- settings: Readonly<ClioSettings> | undefined,
127
- providers: ProvidersContract,
128
- ): CapabilityFlags | null {
129
- if (!status) return null;
130
- const wireModelId = settings?.chat?.model ?? status.target.defaultModel ?? null;
131
- const detectedReasoning =
132
- wireModelId && typeof providers.getDetectedReasoning === "function"
133
- ? providers.getDetectedReasoning(status.target.id, wireModelId)
134
- : null;
135
- return resolveModelCapabilities(status, wireModelId, providers.knowledgeBase, { detectedReasoning });
145
+ function deriveRoute(
146
+ current: TargetStatus | null,
147
+ targetLabel: string | null,
148
+ modelLabel: string | null,
149
+ ): { route: WelcomeRouteState; routeReason: string | null } {
150
+ // A route needs both halves. A configured target with no model and no default
151
+ // model cannot answer a prompt, so it is unset rather than ready: the previous
152
+ // header advertised `dynamo · no model · ready`, which was never true.
153
+ if (targetLabel === null || modelLabel === null) return { route: "unset", routeReason: null };
154
+ // A target id that matches no listed target is a real misconfiguration, not an
155
+ // unprobed one.
156
+ if (current === null) return { route: "unavailable", routeReason: "no such target in settings" };
157
+ // `available: false` is decided from configuration and auth without probing.
158
+ if (!current.available || current.health.status === "down")
159
+ return { route: "unavailable", routeReason: shortRouteReason(current) };
160
+ if (current.health.status === "degraded") return { route: "degraded", routeReason: shortRouteReason(current) };
161
+ if (current.health.status === "healthy") return { route: "ready", routeReason: null };
162
+ // "unknown": configured and permitted, but no probe has returned a verdict.
163
+ return { route: "checking", routeReason: null };
136
164
  }
137
165
 
138
- function healthReadout(status: TargetStatus | null): string | null {
139
- if (!status || status.health.status === "unknown") return null;
140
- const latency =
141
- typeof status.health.latencyMs === "number" && Number.isFinite(status.health.latencyMs)
142
- ? ` ${Math.round(status.health.latencyMs)}ms`
143
- : "";
144
- if (activeStatus(status)) return `${status.health.status}${latency}`;
145
- const reason = status.health.lastError ?? status.reason;
146
- return reason && reason !== status.health.status ? `${status.health.status}: ${reason}` : status.health.status;
166
+ function normalizeProjectContext(state: ContextState | null | undefined): WelcomeProjectContextState | null {
167
+ const value = state?.clioMd;
168
+ if (value === "ok" || value === "stale" || value === "none" || value === "malformed") return value;
169
+ return null;
147
170
  }
148
171
 
172
+ // ---------------------------------------------------------------------------
173
+ // Width fitting. Every measurement goes through pi's `visibleWidth`, so ANSI,
174
+ // CJK, emoji and combining sequences are counted in terminal columns rather
175
+ // than in code units.
176
+ // ---------------------------------------------------------------------------
177
+
149
178
  /**
150
- * Extract bare entry-point paths from the codewiki digest. The digest lists
151
- * `- <path> (<lang>, <loc> loc): <summary>` bullets under an `entry points:`
152
- * header; the one-line banner row has no room for bullets, loc counts, or
153
- * summaries, so only the paths survive.
179
+ * Head-truncate a path so the leaf stays whole: `…/iowarp/clio-coder`. The leaf
180
+ * identifies a workspace, and two sibling worktrees differ only there, so it is
181
+ * the last thing given up.
154
182
  */
155
- function entryPointExcerpt(codewikiDigest: string): string[] {
156
- const lines = codewikiDigest.split(/\r?\n/);
157
- const start = lines.findIndex((line) => line.trim() === "entry points:");
158
- if (start === -1) return [];
159
- const out: string[] = [];
160
- for (const line of lines.slice(start + 1)) {
161
- const trimmed = line.trim();
162
- if (trimmed === "key symbols:" || trimmed === "dependencies:") break;
163
- if (!trimmed.startsWith("- ")) continue;
164
- const item = trimmed.slice(2);
165
- const parenIndex = item.indexOf(" (");
166
- out.push(parenIndex === -1 ? item : item.slice(0, parenIndex));
183
+ function fitPathTail(path: string, max: number): string {
184
+ if (max <= 0) return "";
185
+ if (visibleWidth(path) <= max) return path;
186
+ const segments = path.split("/").filter((segment) => segment.length > 0);
187
+ const leaf = segments.at(-1) ?? path;
188
+ let best = leaf;
189
+ for (let index = segments.length - 2; index >= 0; index -= 1) {
190
+ const candidate = `${segments[index]}/${best}`;
191
+ if (visibleWidth(`${GLYPH.ellipsis}/${candidate}`) > max) break;
192
+ best = candidate;
167
193
  }
168
- return out.slice(0, 4);
194
+ const marked = `${GLYPH.ellipsis}/${best}`;
195
+ if (visibleWidth(marked) <= max) return marked;
196
+ return truncateToWidth(leaf, max, GLYPH.ellipsis, false);
169
197
  }
170
198
 
171
- const NO_WIKI_STATUS = "no wiki; run clio-coder context wiki";
172
-
173
- function clioMdStatusFor(cwd: string): string {
174
- const loaded = loadProjectClioMd(cwd);
175
- if (loaded.errors.length > 0) return "malformed";
176
- return loaded.files.length > 0 ? "ok" : "none";
199
+ interface Unit {
200
+ text: string;
201
+ /** Lower survives longer. Units at or below `protectRank` are never dropped. */
202
+ rank: number;
177
203
  }
178
204
 
179
- /** Shape the wiki rows from a staleness verdict the caller already paid for. */
180
- function wikiFactsFrom(cwd: string, staleness: WikiStaleness): { wikiPageCount: number; wikiStatus: string } {
181
- if (staleness.state === "absent") return { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
182
- const wikiPageCount = listWikiPages(cwd).length;
183
- const completeness = wikiCompleteness(cwd);
184
- const freshness =
185
- staleness.state === "stale"
186
- ? `stale, ${staleness.changedFiles} changed file${staleness.changedFiles === 1 ? "" : "s"}`
187
- : "fresh";
188
- // An incomplete wiki reports what it owes even when it is current,
189
- // otherwise a half-finished run reads as a finished one.
190
- return {
191
- wikiPageCount,
192
- wikiStatus:
193
- completeness && completeness.owed > 0
194
- ? `${freshness}, ${completeness.pagesWritten}/${completeness.pagesPlanned} pages`
195
- : freshness,
205
+ /**
206
+ * Fit `units` into `maxWidth` by dropping whole low-priority units rather than
207
+ * tail-truncating the joined string. Display order is the order given and is
208
+ * independent of rank, so a unit can be shown first and still be the first to go.
209
+ * Protected units that still overflow are truncated with an ellipsis, so the most
210
+ * important fact is partly visible rather than absent — which is what the previous
211
+ * header got wrong: it appended everything and clipped, making the route the first
212
+ * casualty of a long path.
213
+ */
214
+ function fitByPriority(theme: ClioTheme, units: ReadonlyArray<Unit>, maxWidth: number, protectRank = 0): string {
215
+ const separator = " · ";
216
+ const sep = theme.fg("dim", separator);
217
+ const sepWidth = visibleWidth(separator);
218
+ const kept = units.map((unit) => ({ ...unit, dropped: false }));
219
+ const total = (): number => {
220
+ const live = kept.filter((unit) => !unit.dropped);
221
+ if (live.length === 0) return 0;
222
+ return live.reduce((sum, unit) => sum + visibleWidth(unit.text), 0) + sepWidth * (live.length - 1);
196
223
  };
197
- }
198
-
199
- function handoffFacts(cwd: string): { handoffCount: number; handoffFreshness: string } {
200
- const handoffsDir = join(cwd, ".clio-coder", "handoffs");
201
- if (!existsSync(handoffsDir)) return { handoffCount: 0, handoffFreshness: "none" };
202
- try {
203
- const files = readdirSync(handoffsDir).filter((f) => f.startsWith("handoff-") && f.endsWith(".md"));
204
- if (files.length === 0) return { handoffCount: 0, handoffFreshness: "none" };
205
- let newestMtime = 0;
206
- for (const file of files) {
207
- const mtime = statSync(join(handoffsDir, file)).mtimeMs;
208
- if (mtime > newestMtime) newestMtime = mtime;
209
- }
210
- return {
211
- handoffCount: files.length,
212
- handoffFreshness: newestMtime > 0 ? relative(newestMtime) : "none",
213
- };
214
- } catch {
215
- return { handoffCount: 0, handoffFreshness: "none" };
224
+ while (total() > maxWidth) {
225
+ const droppable = kept.filter((unit) => !unit.dropped && unit.rank > protectRank);
226
+ let worst = droppable[0];
227
+ if (worst === undefined) break;
228
+ for (const unit of droppable) if (unit.rank > worst.rank) worst = unit;
229
+ worst.dropped = true;
216
230
  }
231
+ const joined = kept
232
+ .filter((unit) => !unit.dropped)
233
+ .map((unit) => unit.text)
234
+ .join(sep);
235
+ return visibleWidth(joined) <= maxWidth ? joined : truncateToWidth(joined, maxWidth, GLYPH.ellipsis, false);
217
236
  }
218
237
 
219
- function readWelcomeRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
220
- const codewiki = readCodewiki(cwd);
221
- const wiki = codewiki ? wikiFactsFrom(cwd, wikiStaleness(cwd)) : { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
222
- return {
223
- clioMdStatus: clioMdStatusFor(cwd),
224
- hasCodewiki: codewiki !== null,
225
- codewikiCount: codewiki ? codewiki.files.filter((file) => file.lang !== "config").length : 0,
226
- ...wiki,
227
- wikiDigestExcerpt: codewiki ? entryPointExcerpt(renderCodewikiDigest(codewiki)) : [],
228
- ...handoffFacts(cwd),
229
- };
238
+ function workspacePath(stats: WelcomeDashboardStats): string {
239
+ return plainOneLine(collapseHomePath(stats.cwd));
230
240
  }
231
241
 
232
- /**
233
- * The same facts without blocking a frame. The sync form costs a codewiki parse
234
- * of a multi-megabyte artifact plus up to four `git` subprocesses, measured at
235
- * 219 ms, and it used to run on the render call stack every ten seconds.
236
- */
237
- async function readWelcomeRepositoryFactsAsync(cwd: string): Promise<WelcomeRepositoryFacts> {
238
- const codewiki = await readCodewikiAsync(cwd);
239
- const wiki = codewiki
240
- ? wikiFactsFrom(cwd, await wikiStalenessAsync(cwd))
241
- : { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
242
- return {
243
- clioMdStatus: clioMdStatusFor(cwd),
244
- hasCodewiki: codewiki !== null,
245
- codewikiCount: codewiki ? codewiki.files.filter((file) => file.lang !== "config").length : 0,
246
- ...wiki,
247
- wikiDigestExcerpt: codewiki ? entryPointExcerpt(renderCodewikiDigest(codewiki)) : [],
248
- ...handoffFacts(cwd),
249
- };
242
+ function workspaceBranch(stats: WelcomeDashboardStats): string | null {
243
+ const workspace = stats.workspace;
244
+ if (workspace?.isGit !== true || !workspace.branch) return null;
245
+ const branch = plainOneLine(workspace.branch);
246
+ return branch.length === 0 ? null : branch;
250
247
  }
251
248
 
252
249
  /**
253
- * What the banner paints before the first probe returns. Everything here is one
254
- * `existsSync` or cheaper. `hasCodewiki` is resolved for real rather than
255
- * guessed, because it decides whether the Wiki row exists at all and the whole
256
- * point of a placeholder is that the banner never changes height.
250
+ * The workspace as `path · branch`, giving up the branch before the path's leaf.
251
+ * A branch name can be far longer than the directory it belongs to, and a header
252
+ * showing `feature/some-very-long-branch` while hiding which checkout it belongs
253
+ * to has kept the less useful half.
257
254
  */
258
- function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
259
- return {
260
- clioMdStatus: clioMdStatusFor(cwd),
261
- hasCodewiki: existsSync(join(cwd, ".clio-coder", "codewiki.json")),
262
- codewikiCount: 0,
263
- wikiPageCount: 0,
264
- wikiStatus: NO_WIKI_STATUS,
265
- wikiDigestExcerpt: [],
266
- handoffCount: 0,
267
- handoffFreshness: "none",
268
- pending: true,
269
- };
255
+ function workspaceLabel(theme: ClioTheme, stats: WelcomeDashboardStats, room: number): string {
256
+ if (room <= 0) return "";
257
+ const path = workspacePath(stats);
258
+ const branch = workspaceBranch(stats);
259
+ const paint = (text: string): string => theme.fg("muted", text);
260
+ if (branch === null) return paint(fitPathTail(path, room));
261
+
262
+ const dirty = stats.workspace?.dirty === true;
263
+ const branchText = `${theme.fg("info", branch)}${dirty ? theme.fg("warning", "*") : ""}`;
264
+ const pathRoom = room - visibleWidth(branch) - (dirty ? 1 : 0) - 3;
265
+ // Keep the branch only while the path's leaf survives whole beside it.
266
+ if (pathRoom > 0) {
267
+ const fitted = fitPathTail(path, pathRoom);
268
+ const leaf =
269
+ path
270
+ .split("/")
271
+ .filter((segment) => segment.length > 0)
272
+ .at(-1) ?? path;
273
+ if (fitted.endsWith(leaf)) return `${paint(fitted)}${theme.fg("dim", " · ")}${branchText}`;
274
+ }
275
+ return paint(fitPathTail(path, room));
270
276
  }
271
277
 
272
- function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): WelcomeDashboardStats {
273
- const settings = deps.getSettings?.();
274
- const statuses = deps.providers.list();
275
- const current = findCurrentStatus(statuses, settings);
276
- // Left null when unset; formatTargetLabel owns the one spelling for that.
277
- const targetLabel = current?.target.id ?? settings?.chat?.target ?? null;
278
- const modelLabel = settings?.chat?.model ?? current?.target.defaultModel ?? null;
279
- const workspace = deps.getWorkspaceSnapshot?.() ?? null;
280
- const cwd = workspace?.cwd ?? process.cwd();
281
- const currentAvailable = current ? activeStatus(current) : false;
282
- const activeCapabilities = capabilityLabels(selectedModelCapabilities(current, settings, deps.providers));
283
- const thinkingLevel =
284
- resolveModelRuntimeCapabilitiesForProviders(
285
- deps.providers,
286
- settings?.chat?.target,
287
- settings?.chat?.model,
288
- settings?.chat?.thinkingLevel ?? "off",
289
- )?.thinking.display ??
290
- settings?.chat?.thinkingLevel ??
291
- "off";
292
-
293
- const autonomy = settings?.safety.autonomy ?? "auto-edit";
294
- const toolProfile = settings?.integrations.externalAgents?.defaults?.toolGovernance ?? "clio-coder-policy";
295
- const threshold = settings?.context.compaction?.threshold;
296
- const compactionThreshold =
297
- typeof threshold === "number" && Number.isFinite(threshold) ? `${Math.round(threshold * 100)}%` : "80%";
298
-
299
- const {
300
- clioMdStatus,
301
- hasCodewiki,
302
- codewikiCount,
303
- wikiPageCount,
304
- wikiStatus,
305
- wikiDigestExcerpt,
306
- handoffCount,
307
- handoffFreshness,
308
- pending,
309
- } = (deps.readRepositoryFacts ?? readWelcomeRepositoryFacts)(cwd);
310
-
311
- return {
312
- activeTargets: statuses.filter(activeStatus).length,
313
- totalTargets: statuses.length,
314
- targetLabel,
315
- modelLabel,
316
- thinkingLevel,
317
- cwd,
318
- workspace,
319
- currentAvailable,
320
- targetHealthLabel: healthReadout(current),
321
- activeCapabilities,
322
- extensions: deps.getExtensionStats?.() ?? null,
323
- autonomy,
324
- toolProfile,
325
- compactionThreshold,
326
- clioMdStatus,
327
- hasCodewiki,
328
- codewikiCount,
329
- wikiPageCount,
330
- wikiStatus,
331
- wikiDigestExcerpt,
332
- handoffCount,
333
- handoffFreshness,
334
- taskMemory: deps.getTaskMemoryStatus?.() ?? null,
335
- ...(pending ? { factsPending: true } : {}),
336
- };
278
+ function routeToken(route: WelcomeRouteState): ClioToken {
279
+ if (route === "ready") return "success";
280
+ if (route === "degraded") return "warning";
281
+ if (route === "unavailable") return "error";
282
+ return "dim";
337
283
  }
338
284
 
339
- const MID_MIN = 64;
340
-
341
- export type WelcomeDashboardMode = "launchpad" | "session";
285
+ function routeGlyph(route: WelcomeRouteState): string {
286
+ if (route === "ready") return GLYPH.ok;
287
+ if (route === "degraded") return GLYPH.warnInline;
288
+ if (route === "unavailable") return GLYPH.error;
289
+ return GLYPH.queued;
290
+ }
342
291
 
343
- export interface WelcomeDashboardComponent extends Component {
344
- collapseToSessionHeader(): boolean;
345
- resetToLaunchpad(): boolean;
292
+ /**
293
+ * The route Clio will use, and — only when there is one — why it cannot answer.
294
+ *
295
+ * A failure reason is given room by shrinking the route text down to a floor
296
+ * before the reason is cut at all, because a failure is least useful exactly
297
+ * where the old header made it least visible. Below the floor the reason is
298
+ * truncated rather than dropped, and only when neither fits does the row fall
299
+ * back to the route alone; the action row still names the fault there.
300
+ */
301
+ function routeRow(theme: ClioTheme, stats: WelcomeDashboardStats, room: number): string {
302
+ const target = plainOneLine(formatTargetLabel(stats.targetLabel, stats.modelLabel));
303
+ if (stats.route === "unset") return theme.fg("warning", truncateToWidth(target, room, GLYPH.ellipsis, false));
304
+ const token = routeToken(stats.route);
305
+ // A glyph rather than a word, so the verdicts stay distinct with no color.
306
+ const prefix = `${theme.fg(token, routeGlyph(stats.route))} `;
307
+ const available = room - 2;
308
+ if (available <= 0) return theme.fg(token, routeGlyph(stats.route));
309
+ const muted = (text: string): string => theme.fg("muted", text);
310
+ const reason = stats.routeReason;
311
+ if (reason === null) return `${prefix}${muted(truncateToWidth(target, available, GLYPH.ellipsis, false))}`;
312
+
313
+ const reasonWidth = visibleWidth(reason);
314
+ if (visibleWidth(target) + 1 + reasonWidth <= available) return `${prefix}${muted(target)} ${theme.fg(token, reason)}`;
315
+ const targetRoom = available - reasonWidth - 1;
316
+ if (targetRoom >= ROUTE_TARGET_FLOOR)
317
+ return `${prefix}${muted(truncateToWidth(target, targetRoom, GLYPH.ellipsis, false))} ${theme.fg(token, reason)}`;
318
+ const floor = Math.min(ROUTE_TARGET_FLOOR, available);
319
+ const reasonRoom = available - floor - 1;
320
+ if (reasonRoom >= ROUTE_REASON_FLOOR) {
321
+ return `${prefix}${muted(truncateToWidth(target, floor, GLYPH.ellipsis, false))} ${theme.fg(token, truncateToWidth(reason, reasonRoom, GLYPH.ellipsis, false))}`;
322
+ }
323
+ return `${prefix}${muted(truncateToWidth(target, available, GLYPH.ellipsis, false))}`;
346
324
  }
347
325
 
348
- function workspaceValue(stats: WelcomeDashboardStats): string {
349
- const workspace = stats.workspace;
350
- const location = basename(stats.cwd) || stats.cwd;
351
- if (!workspace) return location;
352
- const branch = workspace.branch ? ` · git ${workspace.branch}${workspace.dirty ? "*" : ""}` : "";
353
- return `${location}${branch}`;
326
+ /**
327
+ * The one next step, chosen by what actually blocks work.
328
+ *
329
+ * Route faults outrank project-context state: a task cannot be answered by a
330
+ * route that does not respond. A missing CLIO-CODER.md is guidance rather than a
331
+ * blocker, so it keeps the invitation to work alongside the suggestion. A
332
+ * malformed one is a real fault and points at the read-only `/context` view,
333
+ * never at a command that would regenerate the file the operator still has to
334
+ * repair by hand.
335
+ */
336
+ function actionRow(theme: ClioTheme, stats: WelcomeDashboardStats, room: number): string {
337
+ const say = (token: ClioToken, text: string): string =>
338
+ theme.fg(token, truncateToWidth(text, room, GLYPH.ellipsis, false));
339
+ if (stats.route === "unset") {
340
+ // Name the half that is missing; both are fixed at the same surface.
341
+ const detail = stats.targetLabel === null ? "no route selected" : "no model selected";
342
+ return say("warning", `${detail} · /model`);
343
+ }
344
+ if (stats.route === "unavailable") return say("error", "route unavailable · /settings targets");
345
+ if (stats.route === "degraded") return say("warning", "route degraded · /settings targets");
346
+ if (stats.projectContext === "malformed") return say("warning", "CLIO-CODER.md malformed · /context to inspect");
347
+ if (stats.projectContext === "none") return say("dim", "describe a task · /context init to index this repo");
348
+ if (stats.projectContext === "stale") return say("dim", "describe a task · /context refresh to update it");
349
+ // A printed key must be a key that works, so an unbound submit says nothing.
350
+ const send = stats.submitKeyLabel === null ? null : `${stats.submitKeyLabel} to send`;
351
+ return say("dim", ["describe a task", send, "/ for commands"].filter((part) => part !== null).join(" · "));
354
352
  }
355
353
 
356
- function routeValue(stats: WelcomeDashboardStats): string {
357
- const target = formatTargetLabel(stats.targetLabel, stats.modelLabel);
358
- if (stats.currentAvailable) {
359
- const health = stats.targetHealthLabel ? ` · ${stats.targetHealthLabel}` : "";
360
- return `${target} · ready${health}`;
354
+ /**
355
+ * The masthead: identity flush left, workspace flush right, a frame-colored rule
356
+ * between them. Exactly one line at every width. The identity gives up its
357
+ * version before its name, because `Clio Coder` identifies the tool and `v0.4.7`
358
+ * only dates it, and gives up its name before its wordmark.
359
+ */
360
+ function mastheadRow(theme: ClioTheme, stats: WelcomeDashboardStats, version: string, width: number): string {
361
+ const mark = brandMark(theme);
362
+ const name = theme.style("title", "Clio Coder", { bold: true });
363
+ const identities = [`${mark} ${name} ${theme.fg("dim", `v${version}`)}`, `${mark} ${name}`, mark];
364
+ for (const identity of identities) {
365
+ const identityWidth = visibleWidth(identity);
366
+ // one space, at least two fill columns, one space
367
+ const room = width - identityWidth - 4;
368
+ if (room < 6) continue;
369
+ const workspace = workspaceLabel(theme, stats, room);
370
+ if (workspace.length === 0) continue;
371
+ const fill = width - identityWidth - visibleWidth(workspace) - 2;
372
+ if (fill < 2) continue;
373
+ return `${identity} ${theme.fg("frame", "─".repeat(fill))} ${workspace}`;
374
+ }
375
+ // Too narrow to pair them. The wordmark holds column 0 and the workspace takes
376
+ // what is left; below that, the wordmark alone.
377
+ const markWidth = visibleWidth(mark);
378
+ if (width >= markWidth + 3) {
379
+ const workspace = workspaceLabel(theme, stats, width - markWidth - 1);
380
+ if (workspace.length > 0) return `${mark} ${workspace}`;
361
381
  }
362
- return `${target} · unavailable`;
382
+ return truncateToWidth(mark, width, "", false);
363
383
  }
364
384
 
365
- function nextValue(stats: WelcomeDashboardStats): string {
366
- if (stats.factsPending === true) return `ctx checking ${GLYPH.ellipsis}`;
367
- if (stats.clioMdStatus !== "ok") return "ctx missing · /context init";
368
- return "ctx ready · type a task";
385
+ /**
386
+ * The collapsed session header: one live line naming where Clio is working and
387
+ * which route answers.
388
+ *
389
+ * It stays live rather than freezing at first submit, because the operator can
390
+ * change model mid-session and an unlabeled frozen route would be read as the
391
+ * current one. Readiness, latency and onboarding are dropped: the footer and the
392
+ * composer rail own those, and this line's job after the first prompt is
393
+ * identity. Identity sits next to the wordmark when it fits and is the first
394
+ * thing dropped when it does not — display order and drop order are separate.
395
+ */
396
+ function sessionRow(theme: ClioTheme, stats: WelcomeDashboardStats, version: string, width: number): string {
397
+ const mark = brandMark(theme);
398
+ const markWidth = visibleWidth(mark);
399
+ if (width <= markWidth + 1) return truncateToWidth(mark, width, "", false);
400
+ const room = width - markWidth - 1;
401
+ const branch = workspaceBranch(stats);
402
+ const units: Unit[] = [
403
+ { text: `${theme.style("title", "Clio Coder", { bold: true })} ${theme.fg("dim", `v${version}`)}`, rank: 3 },
404
+ { text: theme.fg("muted", plainOneLine(formatTargetLabel(stats.targetLabel, stats.modelLabel))), rank: 0 },
405
+ { text: theme.fg("muted", fitPathTail(workspacePath(stats), Math.max(8, Math.floor(room * 0.5)))), rank: 1 },
406
+ ...(branch
407
+ ? [
408
+ {
409
+ text: `${theme.fg("info", branch)}${stats.workspace?.dirty === true ? theme.fg("warning", "*") : ""}`,
410
+ rank: 2,
411
+ },
412
+ ]
413
+ : []),
414
+ ];
415
+ return `${mark} ${fitByPriority(theme, units, room)}`;
369
416
  }
370
417
 
371
418
  /**
372
- * The launchpad has one fixed row per decision the operator needs to make.
373
- * Repository facts may replace text inside NEXT, never rows. After submission,
374
- * the session header is exactly one line for every width and fact state, and
375
- * it carries the same three facts in order: where Clio is working, which
376
- * route answers, and what the context is ready for. Maturity caveats belong
377
- * in the README, not in a line the operator reads on every turn.
419
+ * Three rows in launchpad mode and one in session mode, at every width and in
420
+ * every fact state. The row count never moves, because the banner sits at line 0
421
+ * and a height change there forces pi-tui to clear and repaint the whole buffer
422
+ * once the transcript has scrolled and because a header that grows a row when
423
+ * a probe lands makes the first seconds of a session jump.
378
424
  */
379
425
  function buildWelcomeDashboardLines(
380
426
  stats: WelcomeDashboardStats,
427
+ version: string,
381
428
  width: number,
382
- mode: WelcomeDashboardMode = "launchpad",
429
+ mode: WelcomeDashboardMode,
383
430
  ): string[] {
384
431
  const theme = clioTheme();
385
432
  const safeWidth = Math.max(1, width);
386
- const title = `${brandMark(theme)} ${theme.style("title", "Clio Coder", { bold: true })} ${theme.fg("dim", `v${readClioVersion()}`)}`;
387
- const tag = (label: string): string => sectionTag(theme, "accentDeep", label, 9);
388
- const row = (label: string, value: string): string => ` ${tag(label)} ${value}`;
389
- const workspace = theme.fg("muted", workspaceValue(stats));
390
- const route = theme.fg(stats.currentAvailable ? "success" : "warning", routeValue(stats));
391
- const next = theme.fg(stats.clioMdStatus === "ok" && !stats.factsPending ? "success" : "warning", nextValue(stats));
392
-
393
- if (mode === "session") {
394
- const header = [title, workspace, route, theme.fg("muted", nextValue(stats))].join(" · ");
395
- return [truncateToWidth(header, safeWidth, GLYPH.ellipsis, true)];
396
- }
397
-
398
- const body = [row("WORKSPACE", workspace), row("ROUTE", route), row("NEXT", next)];
399
- if (safeWidth >= MID_MIN) return frame(theme, title, body, safeWidth);
400
- return [title, ...body].map((line) => truncateToWidth(line, safeWidth, GLYPH.ellipsis, true));
433
+ if (mode === "session") return [padAnsi(sessionRow(theme, stats, version, safeWidth), safeWidth)];
434
+ const indent = safeWidth >= 12 ? " " : "";
435
+ const room = Math.max(1, safeWidth - indent.length);
436
+ return [
437
+ mastheadRow(theme, stats, version, safeWidth),
438
+ `${indent}${routeRow(theme, stats, room)}`,
439
+ `${indent}${actionRow(theme, stats, room)}`,
440
+ ].map((line) => padAnsi(line, safeWidth));
401
441
  }
402
442
 
403
443
  /**
404
- * How long a repository probe is trusted. The probe costs three `git`
405
- * subprocesses, a codewiki parse, and a workspace walk, and the render timer
406
- * asks for a frame every 16ms; at that rate an uncached banner spent 38% of the
407
- * process's CPU re-reading facts that had not changed, on the same event loop
408
- * that decodes the model stream. Ten seconds is far longer than a frame and far
409
- * shorter than a person's patience for a stale `changed files` count, and any
410
- * command that can actually change these facts drops the cache outright.
411
- */
412
- export const WELCOME_REPOSITORY_FACTS_TTL_MS = 10_000;
413
-
414
- /**
415
- * Everything in `WelcomeDashboardStats` that can change what the banner prints,
416
- * flattened to one comparable string. Cheap enough to build per frame; the
417
- * alternative was rebuilding seven framed rows, which cost 1.67 ms/frame and was
418
- * 94% of all time spent inside the root container's render.
444
+ * Everything that can change what the banner prints, flattened to one comparable
445
+ * string. Deliberately short: the previous signature folded in extension counts,
446
+ * task-memory size, capabilities and wiki facts that no render path read, so
447
+ * unrelated background activity invalidated the render cache and rebuilt rows
448
+ * that could not have differed.
419
449
  */
420
450
  function statsSignature(stats: WelcomeDashboardStats): string {
421
- const w = stats.workspace;
451
+ const workspace = stats.workspace;
422
452
  return [
423
- stats.activeTargets,
424
- stats.totalTargets,
453
+ stats.cwd,
454
+ workspace && `${workspace.isGit}\x01${workspace.branch}\x01${workspace.dirty}`,
425
455
  stats.targetLabel,
426
456
  stats.modelLabel,
427
- stats.thinkingLevel,
428
- stats.cwd,
429
- w && `${w.branch}\x01${w.dirty}\x01${w.projectType}\x01${w.isGit}\x01${w.remoteUrl}`,
430
- stats.currentAvailable,
431
- stats.targetHealthLabel,
432
- stats.activeCapabilities.join(","),
433
- stats.extensions && `${stats.extensions.active}/${stats.extensions.installed}`,
434
- stats.autonomy,
435
- stats.toolProfile,
436
- stats.compactionThreshold,
437
- stats.clioMdStatus,
438
- stats.hasCodewiki,
439
- stats.codewikiCount,
440
- stats.wikiPageCount,
441
- stats.wikiStatus,
442
- stats.wikiDigestExcerpt.join(","),
443
- stats.handoffCount,
444
- stats.handoffFreshness,
445
- stats.taskMemory && `${stats.taskMemory.enabled}\x01${stats.taskMemory.tier}\x01${stats.taskMemory.size}`,
446
- stats.factsPending === true,
457
+ stats.route,
458
+ stats.routeReason,
459
+ stats.projectContext,
460
+ stats.submitKeyLabel,
447
461
  ].join("\0");
448
462
  }
449
463
 
464
+ interface ProjectContextReading {
465
+ cwd: string;
466
+ state: WelcomeProjectContextState;
467
+ /** When the last *successful* read landed. Never renewed by a failure. */
468
+ readAt: number;
469
+ /** When the last attempt finished, successful or not. Paces retries. */
470
+ attemptedAt: number;
471
+ /** When the current failure streak began; null while reads succeed. */
472
+ failingSince: number | null;
473
+ }
474
+
450
475
  export class WelcomeDashboard implements WelcomeDashboardComponent {
451
- private cachedFacts: { cwd: string; at: number; facts: WelcomeRepositoryFacts } | null = null;
452
476
  private cachedRender: { width: number; signature: string; lines: string[] } | null = null;
453
- /** Single-flight latch: a probe slower than the TTL must not stack refreshes. */
454
- private refreshing = false;
477
+ private context: ProjectContextReading | null = null;
478
+ /** Single-flight latch: a read slower than the TTL must not stack refreshes. */
479
+ private contextRefreshing = false;
480
+ private pendingTimer: ReturnType<typeof setTimeout> | null = null;
481
+ private disposed = false;
455
482
  private mode: WelcomeDashboardMode = "launchpad";
456
-
457
- constructor(
458
- private readonly deps: WelcomeDashboardDeps,
459
- private readonly now: () => number = () => Date.now(),
460
- ) {}
483
+ private readonly now: () => number;
484
+ private readonly schedule: (run: () => void) => void;
485
+ /**
486
+ * Read once, here, rather than inside a frame: resolving it walks up for
487
+ * package.json and parses it, which is filesystem work the render path must
488
+ * not do even once.
489
+ */
490
+ private readonly version: string;
491
+
492
+ constructor(private readonly deps: WelcomeDashboardDeps) {
493
+ this.now = deps.now ?? ((): number => Date.now());
494
+ this.schedule =
495
+ deps.scheduleRefresh ??
496
+ ((run: () => void): void => {
497
+ this.pendingTimer = setTimeout(() => {
498
+ this.pendingTimer = null;
499
+ run();
500
+ }, 0);
501
+ this.pendingTimer.unref?.();
502
+ });
503
+ this.version = readClioVersion();
504
+ }
461
505
 
462
506
  render(width: number): string[] {
463
- const stats = deriveWelcomeDashboardStats({ ...this.deps, readRepositoryFacts: (cwd) => this.facts(cwd) });
507
+ const stats = this.stats();
464
508
  const signature = `${this.mode}\0${statsSignature(stats)}`;
465
509
  const cached = this.cachedRender;
466
510
  if (cached !== null && cached.width === width && cached.signature === signature) return cached.lines;
467
- const lines = buildWelcomeDashboardLines(stats, width, this.mode);
511
+ const lines = buildWelcomeDashboardLines(stats, this.version, width, this.mode);
468
512
  this.cachedRender = { width, signature, lines };
469
513
  return lines;
470
514
  }
@@ -485,50 +529,123 @@ export class WelcomeDashboard implements WelcomeDashboardComponent {
485
529
  return true;
486
530
  }
487
531
 
488
- /** Drops the repository probe and the rendered lines so the next frame re-reads both. */
532
+ /**
533
+ * Drops the rendered lines only. The project-context reading is not
534
+ * width-dependent, and pi cascades `invalidate` on terminal cell-dimension
535
+ * reports; dropping the reading there would flash the header back to
536
+ * `checking` for a fact that had not changed.
537
+ */
489
538
  invalidate(): void {
490
- this.cachedFacts = null;
491
539
  this.cachedRender = null;
492
540
  }
493
541
 
494
542
  /**
495
- * Returns immediately, always. On a miss it hands back a placeholder (or the
496
- * last known reading) and schedules the real probe off the render path. The
497
- * probe used to run here, synchronously, inside `Container.render`.
543
+ * After this, a refresh already in flight lands on the floor: it neither
544
+ * writes state nor asks for a frame from a presentation that is being torn
545
+ * down.
546
+ */
547
+ dispose(): void {
548
+ this.disposed = true;
549
+ if (this.pendingTimer !== null) {
550
+ clearTimeout(this.pendingTimer);
551
+ this.pendingTimer = null;
552
+ }
553
+ }
554
+
555
+ private stats(): WelcomeDashboardStats {
556
+ const settings = this.deps.getSettings?.();
557
+ const statuses = this.deps.providers.list();
558
+ const current = findCurrentStatus(statuses, settings);
559
+ const targetLabel = current?.target.id ?? settings?.chat?.target ?? null;
560
+ const modelLabel = settings?.chat?.model ?? current?.target.defaultModel ?? null;
561
+ const workspace = this.deps.getWorkspaceSnapshot?.() ?? null;
562
+ const cwd = workspace?.cwd ?? process.cwd();
563
+ const { route, routeReason } = deriveRoute(current, targetLabel, modelLabel);
564
+ // The collapsed row prints neither of these, so it does not pay for them:
565
+ // no background context read, and no cache invalidation when either
566
+ // changes while the header cannot show it. `/new` returns to the launchpad
567
+ // and the check resumes on the next frame.
568
+ const launchpad = this.mode === "launchpad";
569
+ return {
570
+ cwd,
571
+ workspace,
572
+ targetLabel,
573
+ modelLabel,
574
+ route,
575
+ routeReason,
576
+ projectContext: launchpad ? this.projectContext(cwd) : "checking",
577
+ submitKeyLabel: launchpad ? (this.deps.getSubmitKeyLabel?.() ?? null) : null,
578
+ };
579
+ }
580
+
581
+ /**
582
+ * Returns immediately, always, and never touches the filesystem. On a miss it
583
+ * reports `checking` and schedules the authoritative read off the frame. A
584
+ * reading is only ever served for the cwd it was taken in, so a directory
585
+ * change reports `checking` again rather than the previous repository's answer.
498
586
  */
499
- private facts(cwd: string): WelcomeRepositoryFacts {
587
+ private projectContext(cwd: string): WelcomeProjectContextState {
588
+ const cached = this.context;
589
+ if (cached === null || cached.cwd !== cwd) {
590
+ this.scheduleContextRefresh(cwd);
591
+ return "checking";
592
+ }
500
593
  const at = this.now();
501
- const cached = this.cachedFacts;
502
- // A changed cwd is a different repository, not a stale reading of this one.
503
- const usable = cached !== null && cached.cwd === cwd;
504
- if (usable && at - cached.at < WELCOME_REPOSITORY_FACTS_TTL_MS) return cached.facts;
505
- // A test-injected probe is synchronous by contract and cheap by construction.
506
- const override = this.deps.readRepositoryFacts;
507
- if (override) {
508
- const facts = override(cwd);
509
- this.cachedFacts = { cwd, at, facts };
510
- return facts;
594
+ // Reads that have been failing for longer than the trust window stop
595
+ // standing in for a current one. Without this a stale `ok` survives every
596
+ // failed refresh forever.
597
+ if (cached.failingSince !== null && at - cached.failingSince >= WELCOME_PROJECT_CONTEXT_TTL_MS) {
598
+ if (at - cached.attemptedAt >= WELCOME_PROJECT_CONTEXT_RETRY_MS) this.scheduleContextRefresh(cwd);
599
+ return "checking";
511
600
  }
512
- this.scheduleFactsRefresh(cwd);
513
- return usable ? cached.facts : placeholderRepositoryFacts(cwd);
601
+ if (at - cached.readAt < WELCOME_PROJECT_CONTEXT_TTL_MS) return cached.state;
602
+ const due = cached.failingSince === null ? cached.attemptedAt : cached.attemptedAt + WELCOME_PROJECT_CONTEXT_RETRY_MS;
603
+ if (at >= due) this.scheduleContextRefresh(cwd);
604
+ // A refresh is in flight or pending; keep showing the last real reading
605
+ // rather than flickering to `checking` on every TTL boundary.
606
+ return cached.state;
514
607
  }
515
608
 
516
- private scheduleFactsRefresh(cwd: string): void {
517
- if (this.refreshing) return;
518
- this.refreshing = true;
519
- void readWelcomeRepositoryFactsAsync(cwd)
520
- .then((facts) => {
521
- this.cachedFacts = { cwd, at: this.now(), facts };
522
- this.cachedRender = null;
523
- this.deps.onFactsRefreshed?.();
524
- })
525
- .catch(() => {
526
- // A failed probe leaves the last known facts in place and retries on the
527
- // next frame past the TTL; the banner is not worth surfacing an error for.
528
- })
529
- .finally(() => {
530
- this.refreshing = false;
531
- });
609
+ private scheduleContextRefresh(cwd: string): void {
610
+ const read = this.deps.getContextState;
611
+ if (read === undefined || this.contextRefreshing || this.disposed) return;
612
+ this.contextRefreshing = true;
613
+ this.schedule(() => {
614
+ if (this.disposed) {
615
+ this.contextRefreshing = false;
616
+ return;
617
+ }
618
+ let resolved: WelcomeProjectContextState | null = null;
619
+ try {
620
+ resolved = normalizeProjectContext(read(cwd));
621
+ } catch {
622
+ // A read that threw proves nothing about the workspace. Never turn it
623
+ // into `ok` or `none`.
624
+ resolved = null;
625
+ } finally {
626
+ this.contextRefreshing = false;
627
+ }
628
+ if (this.disposed) return;
629
+ const at = this.now();
630
+ // A reading belongs to the directory it was taken in. If cwd moved while
631
+ // this was in flight, the entry is still filed under its own cwd and the
632
+ // next frame will report `checking` for the new one.
633
+ const previous = this.context !== null && this.context.cwd === cwd ? this.context : null;
634
+ this.context =
635
+ resolved === null
636
+ ? {
637
+ cwd,
638
+ state: previous?.state ?? "checking",
639
+ // Deliberately not renewed: a failure must not extend the trust
640
+ // window of the value it failed to confirm.
641
+ readAt: previous?.readAt ?? 0,
642
+ attemptedAt: at,
643
+ failingSince: previous?.failingSince ?? at,
644
+ }
645
+ : { cwd, state: resolved, readAt: at, attemptedAt: at, failingSince: null };
646
+ this.cachedRender = null;
647
+ this.deps.onFactsRefreshed?.();
648
+ });
532
649
  }
533
650
  }
534
651