@iowarp/clio-coder 0.4.7 → 0.4.9

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 (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
@@ -19,6 +19,7 @@ import type {
19
19
  LibraryResource,
20
20
  LibraryResourceKind,
21
21
  } from "../../domains/resources/index.js";
22
+ import { sanitizeCallTargetText, sanitizeMultilineDisplayText } from "../../domains/safety/call-target.js";
22
23
  import { clioTheme, GLYPH } from "../theme/index.js";
23
24
  import type { ListOverlayItem } from "./list-overlay.js";
24
25
 
@@ -113,13 +114,19 @@ export function libraryStatusLine(
113
114
  const theme = clioTheme();
114
115
  const mode = view.mode === "browse" ? "Browse" : "Installed";
115
116
  const scope = view.scope === "user" ? "User" : "Project";
116
- const core = `${mode} · ${scope}`;
117
- if (width < 34) return theme.fg("accent", `${mode}·${scope}`);
118
- const parts = [theme.fg("accent", core)];
119
- if (view.member) parts.push(theme.fg("dim", `members of ${view.member.ref}`));
120
- if (width >= 56) parts.push(theme.fg("dim", `${counts.rows} row${counts.rows === 1 ? "" : "s"}`));
121
- if (counts.notices > 0) parts.push(theme.fg("warning", `${counts.notices} notice${counts.notices === 1 ? "" : "s"}`));
117
+ const unit = view.member ? "member" : view.mode === "browse" ? "package" : "entry";
118
+ const plural = unit === "entry" ? "entries" : `${unit}s`;
119
+ const total = `${counts.rows} ${counts.rows === 1 ? unit : plural}`;
120
+ if (width < 34) return theme.fg("accent", `${mode}·Actions:${scope}`);
121
+ const parts =
122
+ width < 72
123
+ ? [theme.fg("accent", width >= 48 ? `${mode} ${total}` : total), theme.fg("dim", `s:${scope}`)]
124
+ : [theme.fg("accent", `${mode} · Actions: ${scope}`), theme.fg("dim", total)];
125
+ if (counts.notices > 0)
126
+ parts.push(theme.fg("warning", `n:${counts.notices} ${counts.notices === 1 ? "notice" : "notices"}`));
127
+ else if (width < 72) parts.push(theme.fg("dim", "n notices"));
122
128
  if (counts.truncated) parts.push(theme.fg("warning", "incomplete results"));
129
+ if (view.member && width >= 72) parts.push(theme.fg("dim", `members of ${sanitizeCallTargetText(view.member.ref)}`));
123
130
  return parts.join(theme.fg("frame", " │ "));
124
131
  }
125
132
 
@@ -178,7 +185,7 @@ export function libraryRowActions(subject: LibraryRowSubject, view: LibraryView)
178
185
  enable: !!here,
179
186
  update: !!here,
180
187
  use: false,
181
- open: true,
188
+ open: subject.record.copies.length > 0,
182
189
  reasons,
183
190
  };
184
191
  }
@@ -246,7 +253,7 @@ export function libraryRowActions(subject: LibraryRowSubject, view: LibraryView)
246
253
  enable: !!owner && selected,
247
254
  update: !!owner && selected,
248
255
  use: usable,
249
- open: !!owner,
256
+ open: false,
250
257
  reasons,
251
258
  };
252
259
  }
@@ -256,7 +263,7 @@ function copyStateWord(copy: LibraryCopy): string {
256
263
  if (copy.state === "loadable") return theme.fg("success", "loadable");
257
264
  if (copy.state === "disabled") return theme.fg("warning", "disabled");
258
265
  if (copy.state === "shadowed") return theme.fg("dim", "shadowed");
259
- return theme.fg("error", copy.state);
266
+ return theme.fg("error", sanitizeCallTargetText(copy.state));
260
267
  }
261
268
 
262
269
  function availabilityWord(resource: LibraryResource): string {
@@ -264,15 +271,33 @@ function availabilityWord(resource: LibraryResource): string {
264
271
  if (resource.availability === "available") return theme.fg("success", "available");
265
272
  if (resource.availability === "untrusted") return theme.fg("warning", "untrusted");
266
273
  if (resource.availability === "shadowed") return theme.fg("dim", "shadowed");
267
- return theme.fg("error", resource.availability);
274
+ return theme.fg("error", sanitizeCallTargetText(resource.availability));
268
275
  }
269
276
 
270
- function metaOf(parts: ReadonlyArray<string | undefined>): string {
271
- return parts.filter((part): part is string => !!part && part.length > 0).join(" · ");
277
+ /** Plain fields are external text; callbacks compose only trusted semantic styling. */
278
+ function metaOf(parts: ReadonlyArray<string | (() => string) | undefined>): string {
279
+ return parts
280
+ .map((part) => (typeof part === "function" ? part() : part === undefined ? "" : sanitizeCallTargetText(part)))
281
+ .filter(Boolean)
282
+ .join(" · ");
272
283
  }
273
284
 
274
285
  function packageDetail(record: LibraryPackageRecord, view: LibraryView, actions: LibraryRowActions): string[] {
275
- const lines = [`# ${record.name}`, `**Kind:** ${record.kind}`, `**Origin:** ${libraryOriginLabel(record.origin)}`];
286
+ const provider = record.kind !== view.category;
287
+ const hints = (record.provides ?? []).filter((hint) => view.category === "plugin" || hint.kind === view.category);
288
+ const lines = [
289
+ `# ${record.name}`,
290
+ `**Kind:** ${record.kind}${provider ? ` provider package for ${view.category} recipes` : " package"}`,
291
+ `**Actions (${view.scope}):** ${libraryActionSummary(actions)}`,
292
+ "b shows loaded recipes in Installed. Tab toggles detail; PgUp/PgDn scroll.",
293
+ ...(provider ? ["Catalog hints describe potential recipes, not loaded resources."] : []),
294
+ ...(hints.length
295
+ ? [
296
+ `**Catalog hints (${view.category === "plugin" ? "all kinds" : view.category}):** ${hints.map((hint) => `${hint.kind}:${hint.name}`).join(", ")}`,
297
+ ]
298
+ : []),
299
+ `**Origin:** ${libraryOriginLabel(record.origin)}`,
300
+ ];
276
301
  const detail = libraryOriginDetail(record.origin);
277
302
  if (detail) lines.push(`**Source:** \`${detail}\``);
278
303
  lines.push(`**Format:** ${libraryFormatLabel(record.format)}`);
@@ -285,8 +310,8 @@ function packageDetail(record: LibraryPackageRecord, view: LibraryView, actions:
285
310
  );
286
311
  lines.push(`**Selected scope:** ${view.scope}`);
287
312
  if (record.requires?.length) lines.push(`**Requires:** ${record.requires.join(", ")}`);
288
- if (record.provides?.length)
289
- lines.push(`**Catalog hints:** ${record.provides.map((hint) => `${hint.kind}:${hint.name}`).join(", ")}`);
313
+ if (view.category !== "plugin" && (record.provides?.length ?? 0) > hints.length)
314
+ lines.push("Other recipe kinds are listed in the Plugins category.");
290
315
  if (record.provides === undefined && record.copies.length === 0)
291
316
  lines.push("**Contents:** unknown until this package is inspected or installed.");
292
317
  for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
@@ -379,9 +404,51 @@ export interface LibraryRowSet {
379
404
  truncated: boolean;
380
405
  }
381
406
 
382
- function push(set: LibraryRowSet, id: string, subject: LibraryRowSubject, item: Omit<ListOverlayItem, "id">): void {
407
+ function libraryActionSummary(actions: LibraryRowActions): string {
408
+ return [
409
+ actions.use ? "v use" : undefined,
410
+ actions.open ? "Enter members" : "Enter detail",
411
+ actions.install ? "i review install" : undefined,
412
+ actions.enable ? "e review enable/disable" : undefined,
413
+ actions.update ? "u review update" : undefined,
414
+ actions.remove ? "r review remove" : undefined,
415
+ ]
416
+ .filter(Boolean)
417
+ .join(" · ");
418
+ }
419
+
420
+ function push(
421
+ set: LibraryRowSet,
422
+ view: LibraryView,
423
+ id: string,
424
+ subject: LibraryRowSubject,
425
+ item: Omit<ListOverlayItem, "id">,
426
+ ): void {
383
427
  set.subjects.set(id, subject);
384
- set.items.push({ id, ...item });
428
+ const detail = item.detail;
429
+ set.items.push({
430
+ id,
431
+ ...item,
432
+ label:
433
+ subject.kind === "notice"
434
+ ? clioTheme().fg("warning", sanitizeCallTargetText(item.label))
435
+ : sanitizeCallTargetText(item.label),
436
+ ...(detail
437
+ ? {
438
+ detail: (width: number) => {
439
+ const lines = detail(width).map((line) => sanitizeMultilineDisplayText(line).text);
440
+ if (subject.kind !== "package" && subject.kind !== "notice")
441
+ lines.splice(
442
+ 1,
443
+ 0,
444
+ `**Actions:** ${libraryActionSummary(libraryRowActions(subject, view))}`,
445
+ "Tab toggles detail. PgUp/PgDn scroll.",
446
+ );
447
+ return lines;
448
+ },
449
+ }
450
+ : {}),
451
+ });
385
452
  }
386
453
 
387
454
  /**
@@ -472,11 +539,11 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
472
539
  for (const member of options.inspection.resources) {
473
540
  const subject: LibraryRowSubject = { kind: "member", owner, member };
474
541
  const actions = libraryRowActions(subject, view);
475
- push(set, `mem:${owner.ref}@${owner.scope}#${member.kind}:${member.name}`, subject, {
542
+ push(set, view, `mem:${owner.ref}@${owner.scope}#${member.kind}:${member.name}`, subject, {
476
543
  label: member.name,
477
544
  meta: metaOf([
478
545
  member.kind,
479
- member.valid ? theme.fg("success", "valid") : theme.fg("error", "invalid"),
546
+ () => (member.valid ? theme.fg("success", "valid") : theme.fg("error", "invalid")),
480
547
  member.componentId ? `component ${member.componentId}` : undefined,
481
548
  ]),
482
549
  group: LIBRARY_GROUP_MEMBERS,
@@ -488,7 +555,7 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
488
555
  kind: "notice",
489
556
  message: `${item.kind} ${item.id} is declared package metadata, not a recipe. It runs only on an explicit request.`,
490
557
  };
491
- push(set, `note:ancillary:${item.kind}:${item.id}`, subject, {
558
+ push(set, view, `note:ancillary:${item.kind}:${item.id}`, subject, {
492
559
  label: `${item.kind}: ${item.id}`,
493
560
  meta: theme.fg("dim", "companion file"),
494
561
  group: LIBRARY_GROUP_NOTICES,
@@ -498,7 +565,7 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
498
565
  }
499
566
  for (const diagnostic of options.inspection.diagnostics) {
500
567
  const subject: LibraryRowSubject = { kind: "notice", message: diagnostic };
501
- push(set, `note:member-diag:${set.notices}`, subject, {
568
+ push(set, view, `note:member-diag:${set.notices}`, subject, {
502
569
  label: `${theme.fg("warning", GLYPH.warnInline)} ${diagnostic}`,
503
570
  meta: theme.fg("dim", "inspection"),
504
571
  group: LIBRARY_GROUP_NOTICES,
@@ -512,15 +579,20 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
512
579
  const actions = libraryRowActions(subject, view);
513
580
  const here = record.copies.find((copy) => copy.scope === view.scope);
514
581
  const hints = (record.provides ?? []).filter((hint) => view.category === "plugin" || hint.kind === view.category);
515
- push(set, `pkg:${record.ref}`, subject, {
516
- label: record.name,
582
+ push(set, view, `pkg:${record.ref}`, subject, {
583
+ label: record.kind !== view.category ? `${record.name} [${record.kind}]` : record.name,
517
584
  meta: metaOf([
585
+ here ? `${here.scope} ${here.state}` : `not installed (${view.scope})`,
586
+ hints.length > 0 ? `${hints.length} ${view.category === "plugin" ? "recipe" : view.category} hints` : undefined,
518
587
  libraryOriginLabel(record.origin),
519
588
  record.version ? `v${record.version}` : undefined,
520
- here ? theme.fg("success", `${here.scope} ${here.state}`) : theme.fg("dim", "not in this scope"),
521
- hints.length > 0 ? `${hints.length} hinted` : undefined,
522
589
  ]),
523
- group: record.copies.length > 0 ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_AVAILABLE,
590
+ group:
591
+ record.kind !== view.category
592
+ ? "Provider packages"
593
+ : record.copies.length > 0
594
+ ? LIBRARY_GROUP_INSTALLED
595
+ : LIBRARY_GROUP_AVAILABLE,
524
596
  detail: () => packageDetail(record, view, actions),
525
597
  });
526
598
  }
@@ -528,13 +600,13 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
528
600
  for (const copy of inventory.copies) {
529
601
  const subject: LibraryRowSubject = { kind: "copy", copy };
530
602
  const actions = libraryRowActions(subject, view);
531
- push(set, `copy:${copy.ref}@${copy.scope}`, subject, {
603
+ push(set, view, `copy:${copy.ref}@${copy.scope}`, subject, {
532
604
  label: copy.name,
533
605
  meta: metaOf([
534
- libraryOriginLabel(copy.origin),
535
606
  copy.scope,
536
- copyStateWord(copy),
537
- copy.trust === "foreign" ? theme.fg("warning", "foreign") : undefined,
607
+ () => copyStateWord(copy),
608
+ libraryOriginLabel(copy.origin),
609
+ copy.trust === "foreign" ? () => theme.fg("warning", "foreign") : undefined,
538
610
  ]),
539
611
  group: LIBRARY_GROUP_INSTALLED,
540
612
  detail: () => copyDetail(copy, view, actions),
@@ -543,12 +615,12 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
543
615
  for (const resource of inventory.resources) {
544
616
  const subject: LibraryRowSubject = { kind: "recipe", resource };
545
617
  const actions = libraryRowActions(subject, view);
546
- push(set, `res:${resource.key}`, subject, {
618
+ push(set, view, `res:${resource.key}`, subject, {
547
619
  label: resource.name,
548
620
  meta: metaOf([
549
- libraryOriginLabel(resource.origin),
621
+ () => availabilityWord(resource),
550
622
  resource.owner ? resource.owner.ref : resource.source.class,
551
- availabilityWord(resource),
623
+ libraryOriginLabel(resource.origin),
552
624
  ]),
553
625
  group: resource.owner ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_UNMANAGED,
554
626
  detail: () => resourceDetail(resource, actions),
@@ -562,11 +634,18 @@ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
562
634
  (entry): entry is string => entry !== undefined,
563
635
  )) {
564
636
  const subject: LibraryRowSubject = { kind: "notice", message };
565
- push(set, `note:${set.notices}`, subject, {
637
+ push(set, view, `note:${set.notices}`, subject, {
566
638
  label: `${theme.fg("warning", GLYPH.warnInline)} ${message}`,
567
639
  meta: theme.fg("dim", "library"),
568
640
  group: LIBRARY_GROUP_NOTICES,
569
- detail: () => ["# Library notice", "", message],
641
+ detail: () => [
642
+ "# Library notice",
643
+ "",
644
+ "Discovery notices cover all categories.",
645
+ "From browse focus, n returns to resources. Esc clears a filter or leaves search focus before returning to the parent browser.",
646
+ "",
647
+ message,
648
+ ],
570
649
  });
571
650
  set.notices += 1;
572
651
  }
@@ -48,10 +48,10 @@ export const LIBRARY_TITLE = "Library";
48
48
 
49
49
  /** @internal exported for contract tests */
50
50
  export const LIBRARY_EMPTY_BROWSE =
51
- "No packages of this kind in the index. Register one with clio-coder library register <path>, or press o to import from another local agent.";
51
+ "No packages of this kind in the index. Browse counts packages, not runnable recipes. Press b for loaded recipes in Installed. Register one with clio-coder library register <path>, or press o to import from another local agent.";
52
52
  /** @internal exported for contract tests */
53
53
  export const LIBRARY_EMPTY_INSTALLED =
54
- "Nothing of this kind is installed or loaded here. Press b for Browse to see what can be installed.";
54
+ "No entries of this kind are listed by the Library inventory. Action scope selects a package destination, not which recipes can run. Press b for installable packages.";
55
55
 
56
56
  export interface LibraryOverlayDeps {
57
57
  /** The package lifecycle. Plans are reviewed before anything is written. */
@@ -204,13 +204,17 @@ export function openLibraryOverlay(tui: TUI, deps: LibraryOverlayDeps): OverlayH
204
204
  ...(failure ? { failure } : {}),
205
205
  });
206
206
  if (category === view.category) rowSet = set;
207
- return set.items;
207
+ return set.items.filter((item) => set.subjects.get(item.id)?.kind !== "notice");
208
208
  };
209
209
 
210
210
  const tabs: ListOverlayTab[] = LIBRARY_TABS.map((tab) => ({
211
211
  id: tab.id,
212
212
  label: tab.label,
213
213
  items: () => rowsFor(tab.id),
214
+ countLabel: (count) => {
215
+ const unit = view.member && tab.id === view.category ? "member" : view.mode === "browse" ? "package" : "entry";
216
+ return `${count} ${count === 1 ? unit : unit === "entry" ? "entries" : `${unit}s`}`;
217
+ },
214
218
  }));
215
219
 
216
220
  // eslint-disable-next-line prefer-const -- the action closures need the handle they are opened from.
@@ -429,8 +433,45 @@ export function openLibraryOverlay(tui: TUI, deps: LibraryOverlayDeps): OverlayH
429
433
  handle.refreshTabs();
430
434
  };
431
435
 
436
+ /** A child keeps the resource browser's cursor, search draft and focus intact. */
437
+ const openNotices = (): void => {
438
+ if (busy) return;
439
+ busy = true;
440
+ const items = rowSet.items.filter((item) => rowSet.subjects.get(item.id)?.kind === "notice");
441
+ const close = (): void => {
442
+ child = null;
443
+ busy = false;
444
+ notices.hide();
445
+ if (closed) return;
446
+ handle.setHidden(false);
447
+ handle.focus();
448
+ };
449
+ handle.setHidden(true);
450
+ const notices = (deps.openList ?? openListOverlay)(tui, {
451
+ markerId: "library",
452
+ title: "Library notices",
453
+ items,
454
+ filterable: true,
455
+ explicitSearch: true,
456
+ fullScreen: true,
457
+ layout: "split",
458
+ status: () => `${items.length} ${items.length === 1 ? "notice" : "notices"} · browse focus: n back`,
459
+ emptyMessage:
460
+ "No notices in this view. From browse focus, n returns to resources. Esc clears a filter or leaves search focus before returning to the parent browser.",
461
+ globalHints: [{ key: "n", verb: "resources", critical: true }],
462
+ globalActions: { n: close },
463
+ onClose: close,
464
+ });
465
+ child = { hide: () => notices.hide(), release: () => {} };
466
+ notices.toggleDetail();
467
+ };
468
+
432
469
  const status = (width: number): string =>
433
- libraryStatusLine(view, { rows: rowSet.items.length, notices: rowSet.notices, truncated: rowSet.truncated }, width);
470
+ libraryStatusLine(
471
+ view,
472
+ { rows: rowSet.items.length - rowSet.notices, notices: rowSet.notices, truncated: rowSet.truncated },
473
+ width,
474
+ );
434
475
 
435
476
  /**
436
477
  * The keys the selected row actually offers.
@@ -447,7 +488,7 @@ export function openLibraryOverlay(tui: TUI, deps: LibraryOverlayDeps): OverlayH
447
488
  const actions = libraryRowActions(subject, view);
448
489
  const entries: Array<{ key: string; verb: string }> = [];
449
490
  if (actions.use) entries.push({ key: "v", verb: "use" });
450
- if (actions.open) entries.push({ key: "Enter", verb: "members" });
491
+ entries.push({ key: "Enter", verb: actions.open ? "members" : "detail" });
451
492
  if (actions.install) entries.push({ key: "i", verb: "install" });
452
493
  if (actions.enable)
453
494
  entries.push({
@@ -497,10 +538,12 @@ export function openLibraryOverlay(tui: TUI, deps: LibraryOverlayDeps): OverlayH
497
538
  globalHints: [
498
539
  { key: "b", verb: "browse/installed", short: "view", critical: true },
499
540
  { key: "s", verb: "user/project", short: "scope", critical: true },
541
+ { key: "n", verb: "notices", critical: true },
500
542
  { key: "o", verb: "import" },
501
543
  { key: "R", verb: "refresh" },
502
544
  ],
503
545
  globalActions: {
546
+ n: openNotices,
504
547
  b: () => {
505
548
  view.mode = view.mode === "browse" ? "installed" : "browse";
506
549
  view.member = undefined;
@@ -547,6 +590,10 @@ export function openLibraryOverlay(tui: TUI, deps: LibraryOverlayDeps): OverlayH
547
590
  onClose: deps.onClose,
548
591
  });
549
592
 
593
+ // The narrow layout opens with the selected inspector visible. Tab retains
594
+ // its existing toggle; wide layouts already draw detail beside the list.
595
+ handle.toggleDetail();
596
+
550
597
  /**
551
598
  * What `/library <verb> <ref>` asked for, run after the caller has this
552
599
  * handle.
@@ -45,6 +45,8 @@ export interface ListOverlayTab {
45
45
  id: string;
46
46
  label: string;
47
47
  items: () => ReadonlyArray<ListOverlayItem>;
48
+ /** Optional footer count wording; defaults to the count followed by the tab label. */
49
+ countLabel?: (count: number) => string;
48
50
  }
49
51
 
50
52
  export interface ListOverlayOptions {
@@ -381,7 +383,8 @@ export class ListOverlayView implements Component {
381
383
  const tab = this.activeTab();
382
384
  if (tab === undefined) return null;
383
385
  const count = this.tabCounts.get(tab.id) ?? this.items.length;
384
- return { key: "←→", verb: `tab · ${count} ${tab.label.toLowerCase()}`, short: "tab", critical: true };
386
+ const countLabel = tab.countLabel?.(count) ?? `${count} ${tab.label.toLowerCase()}`;
387
+ return { key: "←→", verb: `tab · ${countLabel}`, short: "tab", critical: true };
385
388
  }
386
389
 
387
390
  getHint(): string {
@@ -1,4 +1,5 @@
1
1
  import { basename } from "node:path";
2
+ import { sanitizeCallTargetText } from "../../domains/safety/call-target.js";
2
3
  import type { SessionContract, SessionMeta } from "../../domains/session/contract.js";
3
4
  import {
4
5
  getKeybindings,
@@ -22,15 +23,12 @@ export const SESSION_ESCAPE_GRACE_MS = 75;
22
23
  const ESC = String.fromCharCode(27);
23
24
 
24
25
  /**
25
- * SelectList allocates the primary column to the label and uses any
26
- * remaining width for the description. The picker treats the meta strip
27
- * (status glyph, time, count, target) as the primary column and the
28
- * conversation preview as the description, so users scan the right column
29
- * for the topic they remember.
26
+ * Identity owns the primary column. SelectList drops the secondary metadata
27
+ * when space is tight, so the task remains recognizable at narrow widths.
30
28
  */
31
29
  const SESSION_LAYOUT: SelectListLayoutOptions = {
32
- minPrimaryColumnWidth: 52,
33
- maxPrimaryColumnWidth: 60,
30
+ minPrimaryColumnWidth: 32,
31
+ maxPrimaryColumnWidth: 52,
34
32
  };
35
33
 
36
34
  /**
@@ -44,20 +42,21 @@ export function formatRelativeTime(iso: string | null | undefined, now: number =
44
42
  }
45
43
 
46
44
  function shortTarget(meta: SessionMeta): string {
47
- const target = meta.target?.trim();
48
- const model = meta.model?.trim();
45
+ const target = sanitizeCallTargetText(meta.target ?? "");
46
+ const model = sanitizeCallTargetText(meta.model ?? "");
49
47
  if (!target && !model) return "no target";
50
48
  if (target && model) return `${target}/${model}`;
51
- return target ?? model ?? "no target";
49
+ return target || model || "no target";
52
50
  }
53
51
 
54
52
  function previewLine(meta: SessionMeta): string {
55
- const explicit = meta.firstMessagePreview?.trim();
53
+ const explicit = sanitizeCallTargetText(meta.firstMessagePreview ?? "");
56
54
  if (explicit) return explicit;
57
- const name = meta.name?.trim();
55
+ const name = sanitizeCallTargetText(meta.name ?? "");
58
56
  if (name) return `(${name})`;
59
- const cwdLeaf = meta.cwd ? basename(meta.cwd) : "";
60
- return cwdLeaf ? `(no preview · ${cwdLeaf})` : "(no preview)";
57
+ const cwdLeaf = sanitizeCallTargetText(meta.cwd ? basename(meta.cwd) : "");
58
+ const id = sanitizeCallTargetText(meta.id) || "Unnamed session";
59
+ return `${id} · ${cwdLeaf || "no preview"}`;
61
60
  }
62
61
 
63
62
  function metaStrip(meta: SessionMeta, now: number): string {
@@ -70,17 +69,17 @@ function metaStrip(meta: SessionMeta, now: number): string {
70
69
  }
71
70
 
72
71
  /**
73
- * Pure builder used by the /resume overlay. Each row carries a meta strip
74
- * (status, last-activity, msg count, target/model) in the primary column
75
- * and the first user-message preview in the description column.
72
+ * The first message or fallback identity stays visible as metadata yields.
73
+ * Keep the canonical ID as the selection value, independent of display text.
76
74
  */
77
75
  function buildSessionItems(sessions: ReadonlyArray<SessionMeta>, now: number = Date.now()): SelectItem[] {
78
76
  return sessions.map((meta) => {
79
- const labels = meta.labels && meta.labels.length > 0 ? ` labels: ${meta.labels.join(", ")}` : "";
77
+ const labels = meta.labels?.map(sanitizeCallTargetText).filter(Boolean).join(", ");
78
+ const details = [metaStrip(meta, now), labels ? `labels: ${labels}` : ""].filter(Boolean);
80
79
  return {
81
80
  value: meta.id,
82
- label: metaStrip(meta, now),
83
- description: `${previewLine(meta)}${labels}`,
81
+ label: previewLine(meta),
82
+ description: details.join(" · "),
84
83
  };
85
84
  });
86
85
  }
@@ -128,6 +127,7 @@ function createSessionOverlayBox(
128
127
  const allSessions = [...sessions];
129
128
  let filtered = [...sessions];
130
129
  let lastQuery = "";
130
+ let selectedSessionId: string | undefined;
131
131
  let list = buildList(filtered);
132
132
  let pendingEscape = "";
133
133
  let pendingEscapeTimer: ReturnType<typeof setTimeout> | null = null;
@@ -173,15 +173,20 @@ function createSessionOverlayBox(
173
173
  }
174
174
 
175
175
  function applyFilter(): void {
176
+ // Keep identity through reordering and an empty-result query/undo.
177
+ selectedSessionId = list.getSelectedItem()?.value ?? selectedSessionId;
176
178
  filtered = filterSessions(allSessions, lastQuery);
177
179
  list = buildList(filtered);
180
+ const selectedIndex = filtered.findIndex((session) => session.id === selectedSessionId);
181
+ if (selectedIndex >= 0) list.setSelectedIndex(selectedIndex);
182
+ selectedSessionId = list.getSelectedItem()?.value ?? selectedSessionId;
178
183
  rebuildChildren();
179
184
  }
180
185
 
181
186
  function commitSelection(): void {
182
- const first = filtered[0];
183
- if (!first) return;
184
- onSelect(first.id);
187
+ const selected = list.getSelectedItem();
188
+ if (!selected) return;
189
+ onSelect(selected.value);
185
190
  closeOverlay();
186
191
  }
187
192
 
@@ -230,6 +230,7 @@ export const SETTINGS_LABELS_BY_ID = {
230
230
  "retry.baseDelayMs": "Base delay (ms)",
231
231
  "retry.maxDelayMs": "Max delay (ms)",
232
232
  "retry.streamStallMs": "Stream stall timeout (ms)",
233
+ "retry.firstTokenStallMs": "First token timeout (ms)",
233
234
  "terminal.showTerminalProgress": "Terminal progress badges",
234
235
  "terminal.outputVerbosity": "Output style",
235
236
  "terminal.tuiMode": "TUI mode",
@@ -347,7 +348,14 @@ export const SETTINGS_SECTION_ROWS = {
347
348
  "context.workingSet.protectLastTurns",
348
349
  "context.workingSet.minEvictableTokens",
349
350
  ],
350
- retry: ["retry.enabled", "retry.maxRetries", "retry.baseDelayMs", "retry.maxDelayMs", "retry.streamStallMs"],
351
+ retry: [
352
+ "retry.enabled",
353
+ "retry.maxRetries",
354
+ "retry.baseDelayMs",
355
+ "retry.maxDelayMs",
356
+ "retry.streamStallMs",
357
+ "retry.firstTokenStallMs",
358
+ ],
351
359
  terminal: [
352
360
  "terminal.showTerminalProgress",
353
361
  "terminal.outputVerbosity",
@@ -450,6 +458,7 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
450
458
  "retry.baseDelayMs": "Initial retry delay in milliseconds.",
451
459
  "retry.maxDelayMs": "Maximum retry delay in milliseconds.",
452
460
  "retry.streamStallMs": "Silence on an in-flight stream past this long is treated as a wedged backend.",
461
+ "retry.firstTokenStallMs": "Silence allowed before a call's first token, for backends that load the model on demand.",
453
462
  "terminal.showTerminalProgress": "Emit OSC 9;4 progress badges during agent turns.",
454
463
  "terminal.outputVerbosity": "How much reasoning, tool input, and live tool output appears in the transcript.",
455
464
  "terminal.tuiMode": "Use regular terminal scrollback or a fullscreen transcript with a sticky composer and footer.",
@@ -508,6 +517,8 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
508
517
  "Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes).",
509
518
  "retry.streamStallMs":
510
519
  "Measured from the last token received, not from the request, so a slow-but-alive stream is never aborted. The retry then follows the same enabled/maxRetries/delay settings above. Whole milliseconds · default: 180000 (three minutes).",
520
+ "retry.firstTokenStallMs":
521
+ "Measured from the request until the first token. A local server that slept reloads the model and prefills cold first, so this window is longer than the stream stall timeout; the larger of the two applies. 0 never aborts a call that has not started streaming. Whole milliseconds · default: 600000 (ten minutes).",
511
522
  "library.catalog":
512
523
  "Absolute path, or blank for the catalog in your config directory. The catalog is the index `clio-coder library` reads; installed resources land in the usual skill and resource roots either way. Default: blank.",
513
524
  "library.remote":
@@ -1925,6 +1936,9 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1925
1936
  settingItem("retry.streamStallMs", String(retry.streamStallMs), {
1926
1937
  values: ["60000", "120000", "180000", "300000", "600000"],
1927
1938
  }),
1939
+ settingItem("retry.firstTokenStallMs", String(retry.firstTokenStallMs), {
1940
+ values: ["180000", "300000", "600000", "900000", "1800000"],
1941
+ }),
1928
1942
  settingItem("terminal.showTerminalProgress", String(terminal.terminalProgress), {
1929
1943
  values: ["false", "true"],
1930
1944
  }),
@@ -2752,6 +2766,11 @@ function applySettingChange(settings: ClioSettings, id: string, value: string):
2752
2766
  settings.chat.retry.streamStallMs = next;
2753
2767
  });
2754
2768
  return;
2769
+ case "retry.firstTokenStallMs":
2770
+ applyNonNegativeInteger(value, (next) => {
2771
+ settings.chat.retry.firstTokenStallMs = next;
2772
+ });
2773
+ return;
2755
2774
  case "library.catalog":
2756
2775
  case "library.remote": {
2757
2776
  const key = id.slice("library.".length) as "catalog" | "remote";