@iowarp/clio-coder 0.4.7 → 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 (485) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +66 -45
  5. package/dist/{acp-W3Y3TRHD.js → acp-JWPQZM2D.js} +14 -14
  6. package/dist/{agents-J4ICNLQ3.js → agents-4GCDIRVX.js} +55 -54
  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-SYAKTDQE.js} +22 -22
  11. package/dist/background-OW67WMYR.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-TKS63VNV.js} +4 -4
  13. package/dist/chunk-2JSCCEKO.js +85 -0
  14. package/dist/{chunk-QKWL7SYE.js → chunk-2SXGG2IV.js} +49 -38
  15. package/dist/{chunk-MZHXENL7.js → chunk-2U2U5POA.js} +5 -5
  16. package/dist/{chunk-NCCQ6DVS.js → chunk-2ZWLMA3T.js} +6 -6
  17. package/dist/{chunk-FQOOGXBH.js → chunk-36XSBPXL.js} +7 -7
  18. package/dist/{chunk-5AJPUR72.js → chunk-3IQOZRQ6.js} +7 -7
  19. package/dist/{chunk-4MFBBY2Z.js → chunk-44U2OUSM.js} +3 -3
  20. package/dist/{chunk-5ZSZEYJK.js → chunk-4P6M2TTE.js} +2 -2
  21. package/dist/{chunk-IZYTT3CD.js → chunk-526ABLHD.js} +6 -6
  22. package/dist/{chunk-BO4XV5VX.js → chunk-5C2OQHLR.js} +4 -4
  23. package/dist/chunk-5D2FNBMG.js +185 -0
  24. package/dist/{chunk-M6Z2V6YU.js → chunk-5HULHKT2.js} +5 -5
  25. package/dist/{chunk-PFLOULP3.js → chunk-5UG6EZI3.js} +4 -4
  26. package/dist/{chunk-WN552PKN.js → chunk-5W4FRA5Q.js} +280 -900
  27. package/dist/{chunk-KAFMW7WM.js → chunk-6R5MBXBJ.js} +1 -1
  28. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  29. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  30. package/dist/{chunk-GXIWHXDB.js → chunk-6X7VOCDY.js} +3 -3
  31. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  32. package/dist/{chunk-34XHRVKG.js → chunk-ARRUMZ7X.js} +2 -2
  33. package/dist/{chunk-3T4DXWP6.js → chunk-ATB3Q7YO.js} +1 -6
  34. package/dist/chunk-AUHVBIDW.js +19 -0
  35. package/dist/{chunk-L3Z5ANCV.js → chunk-BE4I3UJ2.js} +7 -7
  36. package/dist/chunk-BFPHMSK7.js +169 -0
  37. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  38. package/dist/{chunk-D2T66PDV.js → chunk-BIY22UUK.js} +35 -203
  39. package/dist/{chunk-VMATUZB6.js → chunk-D55WO5J7.js} +11 -11
  40. package/dist/{chunk-2O2LVQQK.js → chunk-E2NSPYLC.js} +4 -4
  41. package/dist/{chunk-IJMW64DX.js → chunk-EFXMQYI6.js} +32 -32
  42. package/dist/{chunk-GVZFCJHE.js → chunk-EPYATQMG.js} +18 -18
  43. package/dist/{chunk-MZNWZUJM.js → chunk-EXKUF426.js} +11 -11
  44. package/dist/{chunk-IMOD2YPV.js → chunk-F7Y6QTPL.js} +9 -19
  45. package/dist/{chunk-IQCNVLO6.js → chunk-FB3KTE2J.js} +10 -7
  46. package/dist/{chunk-3LXJOICS.js → chunk-FNVPQQYT.js} +2 -2
  47. package/dist/{chunk-UUQ5G6EZ.js → chunk-GEYX2NZ5.js} +2 -2
  48. package/dist/{chunk-CP3HIR5H.js → chunk-GJBJHJNY.js} +19 -18
  49. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  50. package/dist/{chunk-WT5TRMO4.js → chunk-GVU4CXPJ.js} +179 -65
  51. package/dist/{chunk-TZ6UVP2H.js → chunk-H5DPSUBB.js} +8 -8
  52. package/dist/{chunk-EUEXGXXR.js → chunk-H77XBUBM.js} +5 -5
  53. package/dist/{config-YXARKGTX.js → chunk-HMGAKB7E.js} +15 -259
  54. package/dist/{chunk-EUZRMP4Y.js → chunk-HP7KJ5O2.js} +19 -19
  55. package/dist/chunk-HVCAY2FH.js +67 -0
  56. package/dist/{chunk-CPXGJI2A.js → chunk-ICYIUNO4.js} +4 -4
  57. package/dist/{chunk-GI5RRMAH.js → chunk-IILXVWJY.js} +7 -7
  58. package/dist/{chunk-MNQN3X6Y.js → chunk-JCVIL6TY.js} +5 -5
  59. package/dist/chunk-JIMWEYWO.js +63 -0
  60. package/dist/{chunk-C3G5PNUO.js → chunk-JLBVCROW.js} +25 -25
  61. package/dist/chunk-JOBN2YQQ.js +176 -0
  62. package/dist/chunk-JOL2QRLE.js +152 -0
  63. package/dist/{chunk-N37QC5FV.js → chunk-JRA6OBHY.js} +5 -5
  64. package/dist/{chunk-C6GEXX4L.js → chunk-JV25I7ID.js} +7 -7
  65. package/dist/{chunk-SEDI5K5B.js → chunk-JYKUMHCQ.js} +16 -16
  66. package/dist/{chunk-UA6W4XFJ.js → chunk-K3W6BF5C.js} +2 -2
  67. package/dist/chunk-K45LHSCI.js +194 -0
  68. package/dist/{chunk-UA3W4FGC.js → chunk-K53E2PTW.js} +5 -5
  69. package/dist/{chunk-VCRVEDUC.js → chunk-K5UJD6MM.js} +5 -5
  70. package/dist/{chunk-65BGHOUR.js → chunk-KGP3UQGJ.js} +5 -5
  71. package/dist/chunk-KKRXONXG.js +43 -0
  72. package/dist/{chunk-LBFQMYS3.js → chunk-KWJXCL2X.js} +5 -3
  73. package/dist/{chunk-RTLNFZMD.js → chunk-L75H5B3B.js} +3 -3
  74. package/dist/{chunk-G4LGUTOE.js → chunk-LLCGGVSW.js} +6 -6
  75. package/dist/{chunk-HRAKUPIH.js → chunk-LZCCBLRC.js} +5 -5
  76. package/dist/{chunk-WURGVOZJ.js → chunk-LZDLYSUN.js} +18 -14
  77. package/dist/{chunk-ISNCCX42.js → chunk-MATCRH3M.js} +7 -6
  78. package/dist/{chunk-BAU36233.js → chunk-MEHBW2SP.js} +7 -7
  79. package/dist/{chunk-BQQ5MXUC.js → chunk-MUXNDNMZ.js} +3 -3
  80. package/dist/{chunk-NO7J45X6.js → chunk-MWMW53WW.js} +90 -51
  81. package/dist/chunk-MZDPF35R.js +45 -0
  82. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  83. package/dist/{chunk-T334FW2H.js → chunk-O2QJDRWP.js} +5 -5
  84. package/dist/{chunk-T7QQBNLH.js → chunk-O3HSB2YL.js} +9 -7
  85. package/dist/{chunk-WB7POC6M.js → chunk-OEMFEL26.js} +6 -6
  86. package/dist/{chunk-77CZRFTE.js → chunk-OPC4DQD6.js} +2 -2
  87. package/dist/{chunk-4UHVS5T7.js → chunk-ORRNGQDV.js} +8 -8
  88. package/dist/{chunk-TZHN5ITX.js → chunk-P4JS3MH5.js} +5 -5
  89. package/dist/{chunk-WBVKKTUT.js → chunk-P7GTE4FX.js} +2 -2
  90. package/dist/{chunk-6TAATXXH.js → chunk-PAQVETLA.js} +6 -6
  91. package/dist/{chunk-6CA2BHOR.js → chunk-PFZJMXIY.js} +4 -4
  92. package/dist/{chunk-4QKAITQT.js → chunk-PGEFOTJB.js} +70 -7
  93. package/dist/{chunk-MBJO5VNZ.js → chunk-PJ5H5B7A.js} +25 -25
  94. package/dist/{chunk-DO7M3LSX.js → chunk-PMUUAABD.js} +43 -96
  95. package/dist/{chunk-A67NR5AT.js → chunk-Q32C6AWI.js} +11 -8
  96. package/dist/{chunk-ECOMVOHP.js → chunk-QGIC5SX5.js} +2 -2
  97. package/dist/{chunk-5CMARGPF.js → chunk-QLAGXTTV.js} +7 -2
  98. package/dist/{chunk-GFQ7P2UF.js → chunk-QLKCCC2J.js} +9 -9
  99. package/dist/{chunk-SELG4SUR.js → chunk-QWUSS2QP.js} +7 -4
  100. package/dist/{chunk-P5SC4DLJ.js → chunk-QYSAZMSH.js} +2 -2
  101. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-R5NRX5N4.js} +5 -41
  102. package/dist/{chunk-DLIYANB7.js → chunk-RAUOKUZV.js} +11 -11
  103. package/dist/{chunk-UFYNOQK4.js → chunk-RBES4TCZ.js} +7 -7
  104. package/dist/{chunk-T52TPHYC.js → chunk-RFULVPBX.js} +4 -4
  105. package/dist/{chunk-TLTGZTXI.js → chunk-RKFNU5UA.js} +3 -3
  106. package/dist/{chunk-T4TY5GG3.js → chunk-RM3XJX7P.js} +3 -3
  107. package/dist/{chunk-6YA46L5A.js → chunk-RNLAPBJL.js} +2 -2
  108. package/dist/chunk-RPMNIFRY.js +65 -0
  109. package/dist/{chunk-DACXIVVF.js → chunk-RRZFRIJP.js} +5 -5
  110. package/dist/{chunk-CE64C5K5.js → chunk-RXI7K4J5.js} +61 -61
  111. package/dist/{chunk-CULVKYTK.js → chunk-STC6CWUZ.js} +5 -5
  112. package/dist/{chunk-6YHPAAZR.js → chunk-TEHVMHOK.js} +3 -3
  113. package/dist/{chunk-VTYHHQ57.js → chunk-TOPICHGR.js} +2 -2
  114. package/dist/{chunk-UWD3JD5X.js → chunk-UB33F3YW.js} +10 -10
  115. package/dist/{chunk-TN5FW4XY.js → chunk-UDAK6GR2.js} +12 -9
  116. package/dist/chunk-USBBEKHW.js +177 -0
  117. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  118. package/dist/{chunk-6LRLOJHQ.js → chunk-W7KNI3F5.js} +11 -62
  119. package/dist/chunk-WFTSK7N3.js +637 -0
  120. package/dist/{chunk-YPRSNUTC.js → chunk-WJWNZXRM.js} +2 -2
  121. package/dist/chunk-WS4FOGLY.js +686 -0
  122. package/dist/{chunk-ZGIGW4ZG.js → chunk-WTZVSMQZ.js} +5 -5
  123. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  124. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  125. package/dist/chunk-XC5POIL4.js +68 -0
  126. package/dist/{chunk-XZ6UFQ52.js → chunk-XTLJDC2X.js} +22 -17
  127. package/dist/{chunk-7EEGBKV4.js → chunk-YGIV24MF.js} +8 -8
  128. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  129. package/dist/{chunk-4N2RZ4TO.js → chunk-YKIIWURD.js} +3 -3
  130. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  131. package/dist/{chunk-KS7ETA3P.js → chunk-YXANQGCX.js} +6 -6
  132. package/dist/{chunk-HOX4YZ2K.js → chunk-YXFKLMX2.js} +5 -5
  133. package/dist/chunk-ZST3FRCV.js +132 -0
  134. package/dist/cli/index.js +39 -37
  135. package/dist/{clio-L2P7S2R2.js → clio-BPBAPZGA.js} +9 -9
  136. package/dist/{code-nav-B5LNX4KU.js → code-nav-KBQ3RIFK.js} +33 -33
  137. package/dist/{components-63MMQKUT.js → components-6DKAXWFN.js} +10 -10
  138. package/dist/config-FWL5JK2H.js +270 -0
  139. package/dist/config-graph-ACDB26L2.js +156 -0
  140. package/dist/{configure-LMVQJ46J.js → configure-ZIZ4YV62.js} +48 -48
  141. package/dist/{context-7HJEWTTP.js → context-EZZPT2ZV.js} +49 -49
  142. package/dist/{context-YG2LZDYZ.js → context-VIL5MFRH.js} +86 -84
  143. package/dist/{context-XSZKKFBW.js → context-Z3GOBHDK.js} +16 -16
  144. package/dist/{context-clear-AC5NXHM2.js → context-clear-ZPB3L7MN.js} +72 -70
  145. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  146. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  147. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-2GLBVF7L.js} +23 -22
  148. package/dist/{detail-H73BEF2N.js → detail-VSBWYSGZ.js} +73 -71
  149. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-EEEHGKX4.js} +78 -76
  150. package/dist/docs-VMMWFVHL.js +101 -0
  151. package/dist/{doctor-EQYJOGUG.js → doctor-V5L4IQGP.js} +63 -62
  152. package/dist/{eval-4P7O6CCE.js → eval-VJYJ2BV3.js} +80 -65
  153. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  154. package/dist/evals-J2H5V6DD.js +104 -0
  155. package/dist/{evidence-D6GUSYJW.js → evidence-POWAEBEW.js} +72 -70
  156. package/dist/evidence-XCCCLS36.js +242 -0
  157. package/dist/{evidence-O76QF7TZ.js → evidence-Y35YSXH6.js} +80 -78
  158. package/dist/{evolve-H47BCETS.js → evolve-GPG72VB6.js} +74 -72
  159. package/dist/{extensions-NNL3ZOCU.js → extensions-YIZ7W3DA.js} +12 -11
  160. package/dist/fleet-2MDCQ2VK.js +264 -0
  161. package/dist/{fleet-KMNS6NOM.js → fleet-W2AF3TOJ.js} +127 -123
  162. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-WS56G26H.js} +11 -11
  163. package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
  164. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-ELTBXBAV.js} +22 -22
  165. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-45IK73L4.js} +84 -248
  166. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-T5NCZKHE.js} +4 -4
  167. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-VG4JBLA4.js} +26 -26
  168. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-VTSABAYO.js} +72 -70
  169. package/dist/{fleet-view-BHJFW26B.js → fleet-view-XC7WMKSS.js} +75 -73
  170. package/dist/{init-XAT5N5YM.js → init-VTJNNTIP.js} +95 -92
  171. package/dist/install-6PIF6F6W.js +19 -0
  172. package/dist/{interop-FVECHFKG.js → interop-IU6BNA7C.js} +25 -25
  173. package/dist/{inventory-7KFQGLCV.js → inventory-QPQUTUUZ.js} +75 -73
  174. package/dist/{library-NY2XOT75.js → library-HUTAS57T.js} +33 -33
  175. package/dist/{library-QAPAO23R.js → library-LF7DLU6S.js} +13 -13
  176. package/dist/library-Q3NWL5CM.js +75 -0
  177. package/dist/{library-import-5Y6MAS3R.js → library-import-PPW4YUC5.js} +25 -25
  178. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-DIRVFRZU.js} +19 -19
  179. package/dist/{library-validation-EQUH25DC.js → library-validation-XHUZ3INE.js} +17 -17
  180. package/dist/{memory-DYVTTCP6.js → memory-Z2LSKNV6.js} +74 -72
  181. package/dist/{models-MASFJ6Y2.js → models-3FTREYPY.js} +53 -52
  182. package/dist/{monitor-YMP4NXJJ.js → monitor-HF2MQRB3.js} +83 -80
  183. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-UYPA6W4S.js} +498 -358
  184. package/dist/{panes-NICTHQCV.js → panes-736XB73K.js} +14 -14
  185. package/dist/{panes-D3Y2KFG5.js → panes-C4P3PIWT.js} +4 -4
  186. package/dist/{paths-PSFAUIGO.js → paths-JQ4QYIYB.js} +6 -6
  187. package/dist/{preload-5Q7VXRFJ.js → preload-XSLRYH3Y.js} +72 -70
  188. package/dist/{reset-7NKZK7JN.js → reset-V7QSPZYE.js} +9 -9
  189. package/dist/{resources-NILSIZAT.js → resources-OJGDFHYT.js} +22 -22
  190. package/dist/{run-BPZGEBZV.js → run-T354SMDW.js} +129 -125
  191. package/dist/settings-MWZXO6RV.js +72 -0
  192. package/dist/{share-EZ6ERBMH.js → share-Y5ZKJPND.js} +26 -26
  193. package/dist/{skills-BTVVNYVM.js → skills-4GLZC4LN.js} +28 -28
  194. package/dist/{skills-eval-UY34MNK7.js → skills-eval-L5T7GODM.js} +87 -85
  195. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-LASKXEZI.js} +22 -22
  196. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-OIMRU36D.js} +49 -49
  197. package/dist/{steer-2B3EQGFH.js → steer-KMAM2Y2C.js} +4 -4
  198. package/dist/{support-L2SOL3IE.js → support-AWC3XKPX.js} +8 -8
  199. package/dist/system-CD75NYBU.js +116 -0
  200. package/dist/{targets-44VKGFLN.js → targets-VSZX2J2S.js} +66 -65
  201. package/dist/{tasks-3KODKFU7.js → tasks-AN567LYH.js} +14 -14
  202. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-6KTWNHVY.js} +3 -3
  203. package/dist/{tools-3UB7TEVR.js → tools-AGRK3V5J.js} +13 -13
  204. package/dist/{trace-TAMIU4OJ.js → trace-P4MQZD33.js} +18 -67
  205. package/dist/{uninstall-QYVRPEM4.js → uninstall-BRUTEPIC.js} +37 -12
  206. package/dist/{upgrade-7PMKM2JH.js → upgrade-SBCGHQGJ.js} +22 -21
  207. package/dist/{usage-6EQV7EQK.js → usage-BIDVTO6V.js} +93 -87
  208. package/dist/{verifiers-JLITWSHU.js → verifiers-LTGCAMXS.js} +12 -12
  209. package/dist/{verify-T7NAEVIG.js → verify-OZU4LLNP.js} +9 -9
  210. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  211. package/dist/web/client/assets/abnfDiagram-VCTEODGH-C5wfoHm3.js +1 -0
  212. package/dist/web/client/assets/arc-oH91sfLl.js +1 -0
  213. package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +1 -0
  214. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +36 -0
  215. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  216. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  217. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  218. package/dist/web/client/assets/blockDiagram-I7D4REHJ-wi0_CYHL.js +129 -0
  219. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DV7NYc2W.js +38 -0
  220. package/dist/web/client/assets/channel-CiUWbHN9.js +1 -0
  221. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  222. package/dist/web/client/assets/chunk-4HAMMTFA-Bhsegh3F.js +62 -0
  223. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  224. package/dist/web/client/assets/chunk-75Z2AOVW-RQCckcQG.js +2 -0
  225. package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +125 -0
  226. package/dist/web/client/assets/chunk-F27PBJKO-BcNqv2x1.js +1 -0
  227. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  228. package/dist/web/client/assets/chunk-GMAD6QVW-Bq8JWiZT.js +72 -0
  229. package/dist/web/client/assets/chunk-GVQU2GXP-DbchrAeJ.js +1 -0
  230. package/dist/web/client/assets/chunk-IMKFNOWR-DrpvjocK.js +231 -0
  231. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  232. package/dist/web/client/assets/chunk-L3NEJ4N5-DHLmTnCe.js +1 -0
  233. package/dist/web/client/assets/chunk-OSK3NFVY-CsRbtN9n.js +10 -0
  234. package/dist/web/client/assets/chunk-P2QGCYS3-aqPbxoMh.js +1 -0
  235. package/dist/web/client/assets/chunk-POPQ4Y6H-Dl5vw0h0.js +1 -0
  236. package/dist/web/client/assets/chunk-PWAF6VOD-D7OBRSdO.js +1 -0
  237. package/dist/web/client/assets/chunk-SHT3W25Y-CdKCIwuB.js +168 -0
  238. package/dist/web/client/assets/chunk-SVP7TREG-B94Nu_1-.js +88 -0
  239. package/dist/web/client/assets/chunk-TICWLB2K-jjRQI_hk.js +206 -0
  240. package/dist/web/client/assets/chunk-XXDRQBXY-azkbKE37.js +1 -0
  241. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  242. package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +1 -0
  243. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +1 -0
  244. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  245. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  246. package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +1 -0
  247. package/dist/web/client/assets/cynefin-OW5HDTMX--i9RDU5f.js +1 -0
  248. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-cRcvyBdp.js +62 -0
  249. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  250. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  251. package/dist/web/client/assets/dagre-GXQ25YYZ-C9mZmAPe.js +4 -0
  252. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  253. package/dist/web/client/assets/diagram-S7CK7UJ4-Oj_zlLDY.js +30 -0
  254. package/dist/web/client/assets/diagram-UQ7AKVKN-BWKbbfcR.js +41 -0
  255. package/dist/web/client/assets/diagram-VSXAHHWV-C3N3f7DO.js +3 -0
  256. package/dist/web/client/assets/diagram-VX7I27RA-CtDKDAWe.js +24 -0
  257. package/dist/web/client/assets/diagram-Z3DM3KII-B8bkBRCz.js +24 -0
  258. package/dist/web/client/assets/dist-D0_q-A2b.js +1 -0
  259. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-CskW-Whx.js +1 -0
  260. package/dist/web/client/assets/erDiagram-RLTQ6QDP-C-83cgCW.js +99 -0
  261. package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +1 -0
  262. package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +1 -0
  263. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +292 -0
  264. package/dist/web/client/assets/gitGraph-4MIJSDKK-B40cQtBE.js +1 -0
  265. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CH-7P7Di.js +106 -0
  266. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  267. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  268. package/dist/web/client/assets/index-FSIC94pi.js +83 -0
  269. package/dist/web/client/assets/info-A6RAGUB7-eCCE9D_Q.js +1 -0
  270. package/dist/web/client/assets/infoDiagram-27XIBGKW-DRnvqMjM.js +2 -0
  271. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  272. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-DBA_55wp.js +70 -0
  273. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-C-ewpNl7.js +139 -0
  274. package/dist/web/client/assets/kanban-definition-UXKFOSKX-B1taGsu0.js +89 -0
  275. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  276. package/dist/web/client/assets/line-lZ0kyxDI.js +1 -0
  277. package/dist/web/client/assets/linear-DIc8FgZj.js +1 -0
  278. package/dist/web/client/assets/mermaid-parser.core-SXolxpXw.js +7 -0
  279. package/dist/web/client/assets/mermaid.core-DXgQtkNg.js +44 -0
  280. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-DXJas9K7.js +96 -0
  281. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  282. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  283. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  284. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  285. package/dist/web/client/assets/packet-AYTQ26CC-OqVl_07o.js +1 -0
  286. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  287. package/dist/web/client/assets/pegDiagram-XKGWAZYB-CPE_zdfN.js +1 -0
  288. package/dist/web/client/assets/pie-WAS4IAKB-DAxnMBLe.js +1 -0
  289. package/dist/web/client/assets/pieDiagram-E7YTZNPT-Uwjpufxv.js +39 -0
  290. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  291. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  292. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  293. package/dist/web/client/assets/prism-core-BngLtbUd.js +1 -0
  294. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  295. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  296. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  297. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  298. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  299. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  300. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  301. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  302. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  303. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  304. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  305. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  306. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  307. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  308. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  309. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  310. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  311. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  312. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  313. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  314. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  315. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  316. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  317. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  318. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  319. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  320. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-Bjs4yjgs.js +7 -0
  321. package/dist/web/client/assets/radar-RG4KPBEZ-CuCKjHM3.js +1 -0
  322. package/dist/web/client/assets/railroad-74A4TZTK-CnQK-Cc1.js +1 -0
  323. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +1 -0
  324. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +1 -0
  325. package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +1 -0
  326. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-BDDIPNLL.js +1 -0
  327. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-B5Ydyxc1.js +84 -0
  328. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  329. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-Bw2Qym75.js +40 -0
  330. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-BZf36nO0.js +162 -0
  331. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  332. package/dist/web/client/assets/src-yeptRXpt.js +1 -0
  333. package/dist/web/client/assets/stateDiagram-D77RDMKH-DnH6JRkp.js +1 -0
  334. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +1 -0
  335. package/dist/web/client/assets/swimlanes-42K2YHIH-D9PZmtZg.js +1 -0
  336. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +8 -0
  337. package/dist/web/client/assets/timeline-definition-24CTP7MA-CrkZZBo7.js +120 -0
  338. package/dist/web/client/assets/treeView-Q6P3EWNA-C9zDShoC.js +1 -0
  339. package/dist/web/client/assets/treemap-WGGIJYW6-B-plj9yK.js +1 -0
  340. package/dist/web/client/assets/vennDiagram-4TSXK5OY-VeOdaphN.js +34 -0
  341. package/dist/web/client/assets/wardley-WFR3VGLG-Wl1P_m6L.js +1 -0
  342. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-B85-R9t2.js +78 -0
  343. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BrD8OW8m.js +7 -0
  344. package/dist/web/client/clio-coder-logo.webp +0 -0
  345. package/dist/web/client/icon-192.png +0 -0
  346. package/dist/web/client/icon-512.png +0 -0
  347. package/dist/web/client/index.html +4 -0
  348. package/dist/web/client/manifest.webmanifest +15 -0
  349. package/dist/web/client/offline.css +55 -0
  350. package/dist/web/client/offline.html +5 -0
  351. package/dist/web/client/offline.js +27 -0
  352. package/dist/web/client/sw.js +34 -0
  353. package/dist/web/ops-worker.js +37 -0
  354. package/dist/web/reads-worker.js +1726 -0
  355. package/dist/web/server.js +8499 -0
  356. package/dist/web-EU6ATJWA.js +13 -0
  357. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-U22Q7HV4.js} +3 -3
  358. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-LZRLFG6I.js} +98 -95
  359. package/dist/{with-panes-CHFC7HGI.js → with-panes-X5CZOGML.js} +9 -9
  360. package/dist/worker/entry.js +68 -68
  361. package/docs/README.md +27 -26
  362. package/docs/architecture/acp.md +5 -9
  363. package/docs/architecture/alcf-provider.md +0 -3
  364. package/docs/architecture/architecture.md +0 -3
  365. package/docs/architecture/artifact-placement.md +0 -3
  366. package/docs/architecture/artifact-versions.md +0 -3
  367. package/docs/architecture/capacity-and-scheduling.md +0 -3
  368. package/docs/architecture/context-engine.md +0 -3
  369. package/docs/architecture/context-working-set.md +0 -3
  370. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  371. package/docs/architecture/dispatch-typed-intent.md +0 -3
  372. package/docs/architecture/evidence-and-memory.md +0 -3
  373. package/docs/architecture/library.md +0 -2
  374. package/docs/architecture/middleware-and-components.md +0 -3
  375. package/docs/architecture/model-catalog.md +1 -4
  376. package/docs/architecture/observability.md +0 -3
  377. package/docs/architecture/pi-boundary.md +6 -9
  378. package/docs/architecture/prompt-envelope-and-tools.md +1 -4
  379. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  380. package/docs/architecture/safety-model.md +0 -3
  381. package/docs/architecture/session-lifecycle.md +0 -3
  382. package/docs/architecture/time-conventions.md +0 -3
  383. package/docs/architecture/trace-store.md +28 -20
  384. package/docs/architecture/tui-design.md +1 -4
  385. package/docs/architecture/worker-context.md +1 -3
  386. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  387. package/docs/guide/authoring-plugins.md +1 -3
  388. package/docs/guide/built-in-agents.md +0 -3
  389. package/docs/guide/commands-and-modes.md +2 -6
  390. package/docs/guide/configuration-and-targets.md +197 -4
  391. package/docs/guide/configuration-reference.md +9 -4
  392. package/docs/guide/environment-variables.md +0 -3
  393. package/docs/guide/exit-codes-and-output.md +0 -3
  394. package/docs/guide/extensions-and-sharing.md +0 -3
  395. package/docs/guide/fleet-dispatch.md +0 -3
  396. package/docs/guide/glossary.md +0 -3
  397. package/docs/guide/harness-extensions.md +0 -2
  398. package/docs/guide/installation-and-lifecycle.md +1 -4
  399. package/docs/guide/interop.md +0 -2
  400. package/docs/guide/panes-and-files.md +0 -3
  401. package/docs/guide/plugins.md +0 -3
  402. package/docs/guide/proactive-memory.md +0 -3
  403. package/docs/guide/resource-library.md +0 -2
  404. package/docs/guide/skills-marketplace.md +0 -2
  405. package/docs/guide/tool-usage.md +0 -3
  406. package/docs/guide/troubleshooting.md +0 -3
  407. package/docs/history/config-knobs-audit.md +0 -3
  408. package/docs/history/release-cut-checklist.md +0 -3
  409. package/docs/process/development-pipeline.md +0 -3
  410. package/docs/process/documentation-coverage.md +3 -3
  411. package/docs/process/documentation-guide.md +15 -22
  412. package/docs/process/eval-runner.md +0 -3
  413. package/docs/process/evals-internal.md +0 -3
  414. package/docs/process/evolution.md +0 -3
  415. package/docs/process/fleet-demo-runbook.md +0 -3
  416. package/docs/process/git-commit-provenance.md +0 -3
  417. package/docs/process/performance-methodology.md +1 -4
  418. package/docs/process/release-cut-checklist.md +114 -221
  419. package/docs/process/scientific-validation.md +1 -4
  420. package/library/registry.yaml +2 -2
  421. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  422. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  423. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  424. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  425. package/library/skills/registry.yaml +2 -2
  426. package/library/skills/skill-marketplace.json +1 -1
  427. package/package.json +13 -11
  428. package/src/cli/docs.ts +65 -328
  429. package/src/cli/index.ts +3 -1
  430. package/src/cli/trace.ts +4 -65
  431. package/src/cli/uninstall.ts +26 -0
  432. package/src/cli/usage.ts +3 -0
  433. package/src/cli/web.ts +79 -0
  434. package/src/core/bus-events.ts +3 -4
  435. package/src/core/config.ts +71 -0
  436. package/src/core/domain-loader.ts +37 -28
  437. package/src/core/termination.ts +13 -9
  438. package/src/domains/agents/contract.ts +1 -1
  439. package/src/domains/agents/extension.ts +18 -10
  440. package/src/domains/config/extension.ts +5 -4
  441. package/src/domains/dispatch/extension.ts +75 -12
  442. package/src/domains/dispatch/index.ts +1 -0
  443. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  444. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  445. package/src/domains/dispatch/state.ts +1 -2
  446. package/src/domains/dispatch/types.ts +2 -0
  447. package/src/domains/eval/metrics/tracked.ts +22 -2
  448. package/src/domains/extensions/operator-runtime.ts +3 -1
  449. package/src/domains/middleware/hooks.ts +2 -2
  450. package/src/domains/observability/background-memory-usage.ts +3 -0
  451. package/src/domains/observability/compaction-usage.ts +2 -0
  452. package/src/domains/observability/cost.ts +5 -0
  453. package/src/domains/observability/extension.ts +1 -0
  454. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  455. package/src/domains/observability/trace-store.ts +65 -5
  456. package/src/domains/prompts/extension.ts +4 -17
  457. package/src/domains/providers/cache-deployment.ts +147 -0
  458. package/src/domains/providers/catalog.ts +12 -7
  459. package/src/domains/providers/extension.ts +27 -5
  460. package/src/domains/providers/index.ts +1 -0
  461. package/src/domains/providers/plugins.ts +3 -13
  462. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  463. package/src/domains/providers/types/target-descriptor.ts +17 -0
  464. package/src/domains/session/compaction/compact.ts +4 -1
  465. package/src/domains/session/entries.ts +1 -0
  466. package/src/domains/session/usage.ts +6 -7
  467. package/src/engine/acp/server.ts +11 -0
  468. package/src/engine/ai.ts +2 -0
  469. package/src/engine/apis/openai-completions.ts +9 -4
  470. package/src/engine/prewarm.ts +232 -0
  471. package/src/engine/provider-diagnostics.ts +6 -1
  472. package/src/entry/orchestrator.ts +20 -16
  473. package/src/interactive/chat-loop-messages.ts +3 -0
  474. package/src/interactive/chat-loop.ts +2 -8
  475. package/src/interactive/prewarm.ts +11 -197
  476. package/src/interactive/session-usage-reseed.ts +2 -0
  477. package/src/interactive/side-question.ts +2 -0
  478. package/src/interactive/turn-context.ts +1 -0
  479. package/src/interactive/turn-persistence.ts +3 -0
  480. package/src/interactive/turn-prewarm.ts +126 -19
  481. package/src/interactive/turn-runtime.ts +14 -0
  482. package/src/tools/builtin-tool-catalog.ts +8 -4
  483. package/src/tools/registry.ts +12 -2
  484. package/src/worker/spec-contract.ts +27 -0
  485. package/dist/docs-BL7ROUFN.js +0 -292
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iowarp/clio-coder",
3
- "version": "0.4.7",
3
+ "version": "0.4.8",
4
4
  "description": "The terminal coding agent for people who maintain the code that science runs on, with user-chosen models and inspectable evidence.",
5
5
  "keywords": [
6
6
  "ai",
@@ -57,7 +57,6 @@
57
57
  ".claude-plugin/marketplace.json",
58
58
  "evals/**",
59
59
  "docs/**/*.md",
60
- "!docs/html/**",
61
60
  "README.md",
62
61
  "CHANGELOG.md",
63
62
  "CONTRIBUTING.md",
@@ -72,8 +71,8 @@
72
71
  "access": "public"
73
72
  },
74
73
  "scripts": {
75
- "build": "tsup && node --import tsx scripts/build-codewiki-asset.ts",
76
- "dev": "tsup --watch",
74
+ "build": "node --import tsx scripts/build.ts && node --import tsx scripts/build-codewiki-asset.ts",
75
+ "dev": "node --import tsx scripts/build.ts --watch",
77
76
  "clean": "rm -rf dist",
78
77
  "typecheck": "tsc -p tsconfig.tests.json",
79
78
  "format": "biome format --write .",
@@ -82,18 +81,21 @@
82
81
  "pi:surface-snapshot": "node --import tsx scripts/pi-surface-diff.ts --write",
83
82
  "test:file": "node --import tsx --import ./tests/harness/tmp-root.ts --test",
84
83
  "pretest": "test -f dist/cli/index.js || pnpm run build",
85
- "test": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/smoke/*.test.ts",
86
- "test:trace-viewer": "pnpm --filter @iowarp/clio-trace-viewer test",
87
- "trace:ui": "node apps/trace-viewer/server.mjs",
88
- "ci": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run test && pnpm run test:trace-viewer",
89
- "ci:release": "pnpm run ci && node scripts/check-release.mjs",
84
+ "test": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/contracts/*.test.ts tests/smoke/acp-boundary.test.ts tests/smoke/real-binary-boot.test.ts tests/smoke/process-lifecycle.test.ts",
85
+ "test:web": "pnpm --filter @iowarp/clio-coder-web test",
86
+ "ci": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run test && pnpm run test:web",
87
+ "ci:release": "node scripts/release-candidate.mjs qualify",
90
88
  "install:local": "bash scripts/install-local.sh",
91
89
  "smoke:real-home": "bash scripts/smoke-real-home.sh",
92
- "prepublishOnly": "CLIO_CODER_RELEASE_CONTEXT=publish pnpm run ci:release",
90
+ "prepublishOnly": "node scripts/release-candidate.mjs preflight",
93
91
  "skills:pin": "node --import tsx scripts/pin-skills.ts",
94
92
  "skills:check": "node --import tsx scripts/pin-skills.ts --check",
95
93
  "library:pin": "node --import tsx scripts/pin-library.ts",
96
- "library:check": "node --import tsx scripts/pin-library.ts --check"
94
+ "library:check": "node --import tsx scripts/pin-library.ts --check",
95
+ "test:full": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/extended/*.test.ts tests/smoke/*.test.ts tests/extended-smoke/*.test.ts",
96
+ "test:package": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/smoke/installed-package.test.ts tests/smoke/native-call-timing.test.ts",
97
+ "release:preflight": "node scripts/release-candidate.mjs preflight",
98
+ "test:web:full": "pnpm --filter @iowarp/clio-coder-web test:full"
97
99
  },
98
100
  "optionalDependencies": {
99
101
  "@anthropic-ai/claude-agent-sdk": "0.3.186"
package/src/cli/docs.ts CHANGED
@@ -1,354 +1,91 @@
1
- import { spawn } from "node:child_process";
2
- import { createReadStream, readdirSync, realpathSync, statSync } from "node:fs";
3
- import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
4
- import type { AddressInfo } from "node:net";
5
- import { relative, resolve } from "node:path";
6
- import chalk from "chalk";
1
+ import { readdirSync } from "node:fs";
2
+ import { basename, join } from "node:path";
7
3
  import { resolvePackageRoot } from "../core/package-root.js";
8
- import { printError, printHeader } from "./argv.js";
9
-
10
- // Human-facing viewer over the source-checkout HTML blueprints. It binds an ephemeral
11
- // static file server to 127.0.0.1 only, serves docs/html/index.html as the
12
- // menu plus the blueprint pages, prints the URL, and runs until SIGINT. It
13
- // uses only Node's built-in http and fs: zero new dependencies, no daemon, no
14
- // persisted state, no telemetry, and no external network. The static-path
15
- // resolution and the menu synthesis are pure functions so they unit-test
16
- // without binding a port.
17
-
18
- const HOST = "127.0.0.1";
4
+ import { printError } from "./argv.js";
5
+ import { runWebCommand } from "./web.js";
19
6
 
20
7
  const HELP = `clio-coder docs [topic] [--no-open]
21
8
 
22
- Serve Clio Coder's interactive HTML documentation locally and open it in a
23
- browser. The blueprints live in docs/html of a source checkout; the npm package
24
- ships the categorized Markdown reference tree under docs/ and excludes HTML.
25
- The server binds an ephemeral port on
26
- 127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
27
- Press Ctrl+C to stop it.
9
+ Open the documentation in the Clio Coder web app. Pages, navigation and outlines
10
+ are rendered from the same Markdown reference shipped with Clio.
28
11
 
29
12
  Arguments:
30
- [topic] deep-link a specific blueprint (for example: safety, configuration,
31
- tools). Omit to open the documentation menu.
13
+ [topic] a topic such as safety, configuration, or fleet_dispatch, or a
14
+ document path such as architecture/safety-model.md.
15
+ Omit to open the documentation map.
32
16
 
33
17
  Flags:
34
- --no-open do not launch a browser; just print the URL.
18
+ --no-open print the private launch link without opening a browser.
35
19
  --help, -h this message.
36
- `;
37
-
38
- const CONTENT_TYPES: Readonly<Record<string, string>> = {
39
- ".html": "text/html; charset=utf-8",
40
- ".htm": "text/html; charset=utf-8",
41
- ".css": "text/css; charset=utf-8",
42
- ".js": "text/javascript; charset=utf-8",
43
- ".mjs": "text/javascript; charset=utf-8",
44
- ".json": "application/json; charset=utf-8",
45
- ".svg": "image/svg+xml",
46
- ".png": "image/png",
47
- ".webp": "image/webp",
48
- ".jpg": "image/jpeg",
49
- ".jpeg": "image/jpeg",
50
- ".gif": "image/gif",
51
- ".ico": "image/x-icon",
52
- ".woff": "font/woff",
53
- ".woff2": "font/woff2",
54
- ".ttf": "font/ttf",
55
- ".map": "application/json; charset=utf-8",
56
- ".txt": "text/plain; charset=utf-8",
57
- };
58
-
59
- export interface DocsMenuEntry {
60
- /** Short deep-link key, for example `safety`. */
61
- topic: string;
62
- /** Real on-disk file name, for example `safety_blueprint.html`. */
63
- file: string;
64
- /** Human label, for example `Safety`. */
65
- label: string;
66
- }
67
-
68
- /** Resolve the source-checkout HTML root. The npm package deliberately excludes it. */
69
- function resolveDocsHtmlDir(): string {
70
- return resolve(resolvePackageRoot(), "docs", "html");
71
- }
72
20
 
73
- /** Content-type for a file path by extension. Pure. Defaults to octet-stream. */
74
- function contentTypeFor(filePath: string): string {
75
- const dot = filePath.lastIndexOf(".");
76
- if (dot === -1) return "application/octet-stream";
77
- return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
78
- }
79
-
80
- /**
81
- * Map a request URL to a safe relative path under the html root. Pure: no disk
82
- * access. Strips the query and fragment, decodes percent-escapes, defaults `/`
83
- * to `index.html`, and rejects any traversal segment so a request can never
84
- * escape the served directory.
85
- */
86
- function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
87
- const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
88
- let decoded: string;
89
- try {
90
- decoded = decodeURIComponent(pathPart);
91
- } catch {
92
- return { ok: false, reason: "bad-request" };
93
- }
94
- if (decoded.includes("\0")) return { ok: false, reason: "forbidden" };
95
- const segments = decoded.split(/[/\\]/).filter((segment) => segment.length > 0 && segment !== ".");
96
- if (segments.length === 0) return { ok: true, relative: "index.html" };
97
- for (const segment of segments) {
98
- if (segment === "..") return { ok: false, reason: "forbidden" };
99
- }
100
- return { ok: true, relative: segments.join("/") };
101
- }
102
-
103
- function titleize(topic: string): string {
104
- return topic
105
- .split(/[-_]+/)
106
- .filter((word) => word.length > 0)
107
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
108
- .join(" ");
109
- }
110
-
111
- /**
112
- * Synthesize the deep-linkable topic menu from a directory listing. Pure: takes
113
- * the file-name list, not the directory. `index.html` is the menu itself and is
114
- * excluded; a trailing `_blueprint` is stripped from the topic key.
115
- */
116
- function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
117
- const entries: DocsMenuEntry[] = [];
118
- for (const name of fileNames) {
119
- if (!name.toLowerCase().endsWith(".html")) continue;
120
- if (name.toLowerCase() === "index.html") continue;
121
- const topic = name.replace(/\.html$/i, "").replace(/_blueprint$/i, "");
122
- entries.push({ topic, file: name, label: titleize(topic) });
123
- }
124
- entries.sort((a, b) => a.topic.localeCompare(b.topic));
125
- return entries;
126
- }
127
-
128
- /**
129
- * Resolve a user-supplied `[topic]` to a real file name. Pure. Accepts the bare
130
- * topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
131
- * `.html` name, case-insensitively. Returns null when nothing matches.
132
- */
133
- function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
134
- const wanted = topic
135
- .trim()
136
- .toLowerCase()
137
- .replace(/\.html$/i, "");
138
- if (wanted.length === 0) return null;
139
- for (const candidate of [`${wanted}.html`, `${wanted}_blueprint.html`]) {
140
- const match = fileNames.find((name) => name.toLowerCase() === candidate);
141
- if (match) return match;
142
- }
143
- const hit = synthesizeMenu(fileNames).find((entry) => entry.topic.toLowerCase() === wanted);
144
- return hit ? hit.file : null;
145
- }
146
-
147
- function isWithin(child: string, parent: string): boolean {
148
- const rel = relative(parent, child);
149
- return rel === "" || (!rel.startsWith("..") && !rel.startsWith(`..${"/"}`) && !/^([A-Za-z]:)?[/\\]/.test(rel));
150
- }
151
-
152
- function listHtmlFiles(htmlDir: string): string[] {
153
- try {
154
- return readdirSync(htmlDir)
155
- .filter((name) => name.toLowerCase().endsWith(".html"))
156
- .sort((a, b) => a.localeCompare(b));
157
- } catch {
158
- return [];
159
- }
160
- }
21
+ Reuses your installed background app when available. Otherwise starts a local
22
+ foreground web server on 127.0.0.1; press Ctrl+C to stop it. No background service
23
+ is installed by this command. Your current directory does not affect the docs.
24
+ `;
161
25
 
162
- /** Build the static request handler for one html root. */
163
- export function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
164
- const root = realpathSync(resolve(htmlDir));
165
- return (req, res) => {
166
- if (req.method !== "GET" && req.method !== "HEAD") {
167
- res.writeHead(405, { "content-type": "text/plain; charset=utf-8", allow: "GET, HEAD" });
168
- res.end("method not allowed");
169
- return;
170
- }
171
- const resolved = resolveRequestPath(req.url ?? "/");
172
- if (!resolved.ok) {
173
- const status = resolved.reason === "forbidden" ? 403 : 400;
174
- res.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
175
- res.end(resolved.reason);
176
- return;
177
- }
178
- const requestedTarget = resolve(root, resolved.relative);
179
- if (!isWithin(requestedTarget, root)) {
180
- res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
181
- res.end("forbidden");
182
- return;
183
- }
184
- let size: number | null = null;
185
- let target: string | null = null;
186
- try {
187
- target = realpathSync(requestedTarget);
188
- if (!isWithin(target, root)) {
189
- res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
190
- res.end("forbidden");
191
- return;
192
- }
193
- const stat = statSync(target);
194
- if (stat.isFile()) size = stat.size;
195
- } catch {
196
- size = null;
197
- }
198
- if (size === null || target === null) {
199
- res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
200
- res.end("not found");
201
- return;
202
- }
203
- const headers = {
204
- "content-type": contentTypeFor(target),
205
- "content-length": String(size),
206
- "cache-control": "no-store",
207
- };
208
- if (req.method === "HEAD") {
209
- res.writeHead(200, headers);
210
- res.end();
211
- return;
212
- }
213
- res.writeHead(200, headers);
214
- const stream = createReadStream(target);
215
- stream.on("error", () => {
216
- if (!res.writableEnded) res.end();
217
- });
218
- stream.pipe(res);
26
+ const key = (value: string) => value.toLowerCase().replace(/_/g, "-");
27
+ const route = (path: string) => `/docs/${path.split("/").map(encodeURIComponent).join("/")}`;
28
+
29
+ /** Resolve only catalogued destinations; ambiguous basenames require a full path. */
30
+ export function docsTopicRoute(topic: string | undefined, pages: readonly string[]): string | undefined {
31
+ if (topic === undefined) return "/docs";
32
+ if (!topic || /[\\\0?#]/.test(topic) || topic.startsWith("/") || topic.split("/").includes("..")) return;
33
+ const wanted = key(topic.replace(/^docs\//, ""));
34
+ const topics: Record<string, string> = {
35
+ safety: "architecture/safety-model.md",
36
+ configuration: "guide/configuration-and-targets.md",
37
+ trace: "architecture/trace-store.md",
219
38
  };
220
- }
221
-
222
- export interface DocsServerHandle {
223
- server: Server;
224
- url: string;
225
- port: number;
226
- close(): Promise<void>;
227
- }
228
-
229
- export interface StartDocsServerOptions {
230
- htmlDir: string;
231
- /** Bind host. Defaults to 127.0.0.1 and is never widened. */
232
- host?: string;
233
- /** Bind port. Defaults to 0 (ephemeral). */
234
- port?: number;
235
- }
236
-
237
- /** Start the viewer bound to 127.0.0.1 on an ephemeral port. */
238
- async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
239
- const host = options.host ?? HOST;
240
- const server = createServer(createDocsRequestHandler(options.htmlDir));
241
- await new Promise<void>((resolveListen, rejectListen) => {
242
- const onError = (err: Error): void => rejectListen(err);
243
- server.once("error", onError);
244
- server.listen(options.port ?? 0, host, () => {
245
- server.removeListener("error", onError);
246
- resolveListen();
247
- });
248
- });
249
- const address = server.address() as AddressInfo;
250
- const port = address.port;
251
- return {
252
- server,
253
- port,
254
- url: `http://${host}:${port}/`,
255
- close: () => new Promise<void>((resolveClose) => server.close(() => resolveClose())),
39
+ const preferred = topics[wanted];
40
+ if (preferred && pages.includes(preferred)) return route(preferred);
41
+ const exact = pages.find((path) => key(path) === wanted || key(path.replace(/\.md$/i, "")) === wanted);
42
+ if (exact) return route(exact);
43
+ const name = wanted.replace(/\.md$/, "");
44
+ const exactNames = pages.filter((path) => key(basename(path).replace(/\.md$/i, "")) === name);
45
+ const matches = exactNames.length
46
+ ? exactNames
47
+ : pages.filter((path) => key(basename(path).replace(/\.md$/i, "")).startsWith(`${name}-`));
48
+ const match = matches[0];
49
+ return matches.length === 1 && match ? route(match) : undefined;
50
+ }
51
+
52
+ function catalog(root: string) {
53
+ const pages: string[] = [];
54
+ const scan = (path: string) => {
55
+ for (const entry of readdirSync(join(root, path), { withFileTypes: true })) {
56
+ const name = path ? `${path}/${entry.name}` : entry.name;
57
+ if (name === "html") continue;
58
+ if (entry.isDirectory()) scan(name);
59
+ else if (entry.isFile() && /\.md$/i.test(name)) pages.push(name);
60
+ }
256
61
  };
62
+ scan("");
63
+ return pages;
257
64
  }
258
65
 
259
- function openBrowser(url: string): void {
260
- const platform = process.platform;
261
- const command = platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
262
- const args = platform === "win32" ? ["/c", "start", "", url] : [url];
263
- try {
264
- const child = spawn(command, args, { stdio: "ignore", detached: true });
265
- child.on("error", () => {
266
- // Best-effort: the printed URL is the fallback when no opener exists.
267
- });
268
- child.unref();
269
- } catch {
270
- // Best-effort: never fail the command because a browser could not launch.
271
- }
272
- }
273
-
274
- export function waitForShutdown(): Promise<void> {
275
- return new Promise((resolveShutdown) => {
276
- const onSignal = (): void => {
277
- process.removeListener("SIGINT", onSignal);
278
- process.removeListener("SIGTERM", onSignal);
279
- resolveShutdown();
280
- };
281
- process.once("SIGINT", onSignal);
282
- process.once("SIGTERM", onSignal);
283
- });
284
- }
285
-
286
- export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<number> {
66
+ export async function runDocsCommand(args: readonly string[] = []): Promise<number> {
287
67
  if (args.includes("--help") || args.includes("-h")) {
288
68
  process.stdout.write(HELP);
289
69
  return 0;
290
70
  }
291
- let noOpen = false;
292
- const positionals: string[] = [];
293
- for (const arg of args) {
294
- if (arg === "--no-open") {
295
- noOpen = true;
296
- continue;
297
- }
298
- if (arg.startsWith("-")) {
299
- printError(`unknown flag: ${arg}`);
300
- process.stdout.write(HELP);
301
- return 2;
302
- }
303
- positionals.push(arg);
304
- }
305
- if (positionals.length > 1) {
306
- printError("docs accepts at most one [topic]");
307
- process.stdout.write(HELP);
71
+ const positionals = args.filter((arg) => arg !== "--no-open");
72
+ const unknownFlag = positionals.find((arg) => arg.startsWith("-"));
73
+ if (unknownFlag || positionals.length > 1) {
74
+ printError(unknownFlag ? `unknown flag: ${unknownFlag}` : "docs accepts at most one [topic]");
308
75
  return 2;
309
76
  }
310
-
311
- let htmlDir: string;
312
77
  try {
313
- htmlDir = resolveDocsHtmlDir();
314
- } catch (err) {
315
- printError(`could not resolve the docs HTML root: ${err instanceof Error ? err.message : String(err)}`);
316
- return 1;
317
- }
318
- const files = listHtmlFiles(htmlDir);
319
- if (files.length === 0) {
320
- printError(`no HTML docs at ${htmlDir}`);
321
- process.stdout.write(
322
- ` the npm package ships only the categorized Markdown reference tree: ${resolve(resolvePackageRoot(), "docs")}\n` +
323
- " the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
324
- );
325
- return 1;
326
- }
327
-
328
- let landing = "index.html";
329
- const topic = positionals[0];
330
- if (topic !== undefined) {
331
- const file = topicToFile(topic, files);
332
- if (!file) {
333
- printError(`unknown docs topic: ${topic}`);
334
- const topics = synthesizeMenu(files).map((entry) => entry.topic);
335
- if (topics.length > 0) process.stdout.write(` available topics: ${topics.join(", ")}\n`);
78
+ const pages = catalog(join(resolvePackageRoot(), "docs"));
79
+ const path = docsTopicRoute(positionals[0], pages);
80
+ if (!path) {
81
+ printError(
82
+ `Unknown or ambiguous docs topic: ${positionals[0]}. Run clio-coder docs to browse the documentation map.`,
83
+ );
336
84
  return 2;
337
85
  }
338
- landing = file;
86
+ return runWebCommand(["--path", path, "--reuse-background", args.includes("--no-open") ? "--no-open" : "--open"]);
87
+ } catch (error) {
88
+ printError(error instanceof Error ? error.message : "Could not open the documentation.");
89
+ return 1;
339
90
  }
340
-
341
- const handle = await startDocsServer({ htmlDir });
342
- const landingUrl = landing === "index.html" ? handle.url : `${handle.url}${landing}`;
343
- printHeader("Clio docs viewer");
344
- process.stdout.write(` serving HTML root ${htmlDir}\n`);
345
- process.stdout.write(` open ${chalk.cyan(landingUrl)}\n`);
346
- process.stdout.write(" bound to 127.0.0.1 only: no external network, no daemon, no state.\n");
347
- process.stdout.write(" press Ctrl+C to stop.\n");
348
- if (!noOpen) openBrowser(landingUrl);
349
-
350
- await waitForShutdown();
351
- await handle.close();
352
- process.stdout.write("docs viewer stopped.\n");
353
- return 0;
354
91
  }
package/src/cli/index.ts CHANGED
@@ -29,6 +29,7 @@ science. CLIO stands for Context Layer for Input/Output, named for the Greek mus
29
29
 
30
30
  Usage:
31
31
  clio-coder start interactive repository chat
32
+ clio-coder web [--open] start the browser application
32
33
  clio-coder acp serve Clio as an ACP v1 agent over stdio
33
34
  clio-coder --acp alias for clio-coder acp
34
35
  clio-coder run [flags] <task> run one headless main-agent turn
@@ -75,7 +76,7 @@ Usage:
75
76
  clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
76
77
  clio-coder interop inspect --json detected external coding agents and how far each one is wired
77
78
  clio-coder panes install|theme install the pane multiplexer (alias for 'tools install herdr'), or print Clio's theme as a herdr block
78
- clio-coder docs [topic] serve the HTML docs of a source checkout on 127.0.0.1 (--no-open to skip browser)
79
+ clio-coder docs [topic] open documentation in the web app (--no-open to print the launch link)
79
80
  clio-coder dev <command> harness instruments; run 'clio-coder dev' for the list
80
81
  clio-coder --help, -h this message
81
82
  clio-coder --help --all this message plus every command under 'clio-coder dev'
@@ -260,6 +261,7 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
260
261
  ["library", async (subArgs) => (await import("./library.js")).runLibraryCommand(subArgs)],
261
262
  ["tasks", async (subArgs) => (await import("./tasks.js")).runTasksCommand(subArgs)],
262
263
  ["verifiers", async (subArgs) => (await import("./verifiers.js")).runVerifiersCommand(subArgs)],
264
+ ["web", async (subArgs) => (await import("./web.js")).runWebCommand(subArgs)],
263
265
  ["docs", async (subArgs) => (await import("./docs.js")).runDocsCommand(subArgs)],
264
266
  ["share", async (subArgs) => (await import("./share.js")).runShareCommand(subArgs)],
265
267
  ["export", async (subArgs) => (await import("./share.js")).runExportCommand(subArgs)],
package/src/cli/trace.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import { existsSync } from "node:fs";
2
- import { access } from "node:fs/promises";
3
2
  import { resolve } from "node:path";
4
- import { fileURLToPath, pathToFileURL } from "node:url";
5
3
  import { clioStatePath } from "../core/xdg.js";
6
4
  import type { CodeStepRecord } from "../domains/dispatch/code-step.js";
7
5
  import { codeStepDir, readCodeStepRecords } from "../domains/dispatch/code-step-store.js";
@@ -29,10 +27,8 @@ const HELP = `Usage:
29
27
  clio-coder trace code-steps <rootId> [--json] deterministic code steps of one fleet root
30
28
  clio-coder trace prune [--max-age-days N] [--max-bytes N] [--db PATH] [--json]
31
29
  clio-coder trace sql <SELECT query> [--db PATH]
32
- clio-coder trace ui [--db PATH] [--port N] source checkout only
33
30
 
34
- The viewer ships with the repository, not the npm package, so from an installed
35
- Clio the subcommands above are the way in. They read the same database, except
31
+ The subcommands above read the same database, except
36
32
  code-steps, which reads the per-root record files under the state directory's
37
33
  code-steps/ tree (a code step is a subprocess, not a model run, so it never
38
34
  enters the SQLite mirror).
@@ -51,7 +47,6 @@ interface ParsedTraceArgs {
51
47
  dbExplicit: boolean;
52
48
  follow: boolean;
53
49
  limit: number;
54
- port: number;
55
50
  json: boolean;
56
51
  maxAgeDays: number | undefined;
57
52
  maxBytes: number | undefined;
@@ -63,7 +58,6 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
63
58
  let dbExplicit = false;
64
59
  let follow = false;
65
60
  let limit = DEFAULT_TRACE_LIMIT;
66
- let port = 0;
67
61
  let json = false;
68
62
  let maxAgeDays: number | undefined;
69
63
  let maxBytes: number | undefined;
@@ -71,13 +65,7 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
71
65
  const arg = args[index];
72
66
  if (arg === "--follow") follow = true;
73
67
  else if (arg === "--json") json = true;
74
- else if (
75
- arg === "--db" ||
76
- arg === "--limit" ||
77
- arg === "--port" ||
78
- arg === "--max-age-days" ||
79
- arg === "--max-bytes"
80
- ) {
68
+ else if (arg === "--db" || arg === "--limit" || arg === "--max-age-days" || arg === "--max-bytes") {
81
69
  const value = args[index + 1];
82
70
  if (value === undefined) throw new Error(`${arg} requires a value`);
83
71
  index += 1;
@@ -85,25 +73,23 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
85
73
  db = resolve(value);
86
74
  dbExplicit = true;
87
75
  } else if (arg === "--limit") limit = parseInteger(value, "--limit", 1, 500);
88
- else if (arg === "--port") port = parseInteger(value, "--port", 0, 65_535);
89
76
  else if (arg === "--max-age-days") maxAgeDays = parseInteger(value, arg, 1, 36_500);
90
77
  else maxBytes = parseInteger(value, arg, 1024 * 1024, Number.MAX_SAFE_INTEGER);
91
78
  } else if (arg?.startsWith("--db=")) {
92
79
  db = resolve(arg.slice(5));
93
80
  dbExplicit = true;
94
81
  } else if (arg?.startsWith("--limit=")) limit = parseInteger(arg.slice(8), "--limit", 1, 500);
95
- else if (arg?.startsWith("--port=")) port = parseInteger(arg.slice(7), "--port", 0, 65_535);
96
82
  else if (arg?.startsWith("--max-age-days=")) maxAgeDays = parseInteger(arg.slice(15), "--max-age-days", 1, 36_500);
97
83
  else if (arg?.startsWith("--max-bytes="))
98
84
  maxBytes = parseInteger(arg.slice(12), "--max-bytes", 1024 * 1024, Number.MAX_SAFE_INTEGER);
99
85
  else if (arg?.startsWith("-")) throw new Error(`unknown trace flag: ${arg}`);
100
86
  else if (arg !== undefined) positional.push(arg);
101
87
  }
102
- return { positional, db, dbExplicit, follow, limit, port, json, maxAgeDays, maxBytes };
88
+ return { positional, db, dbExplicit, follow, limit, json, maxAgeDays, maxBytes };
103
89
  }
104
90
 
105
91
  /** Every subcommand `trace` answers to. Anything else is a usage error. */
106
- const TRACE_COMMANDS = new Set(["runs", "inspect", "phases", "tail", "procs", "code-steps", "prune", "sql", "ui"]);
92
+ const TRACE_COMMANDS = new Set(["runs", "inspect", "phases", "tail", "procs", "code-steps", "prune", "sql"]);
107
93
 
108
94
  /** The subcommands whose first positional is a run id. */
109
95
  const TRACE_COMMANDS_NEEDING_RUN_ID = new Set(["phases", "tail", "procs"]);
@@ -169,8 +155,6 @@ export async function runTraceCommand(args: string[]): Promise<number> {
169
155
  }
170
156
  }
171
157
 
172
- if (command === "ui") return runTraceUi(parsed.db, parsed.port);
173
-
174
158
  // Code-step records live in flat per-root JSON files beside the ledger, not
175
159
  // in the SQLite mirror, so this answers before the database is consulted and
176
160
  // ignores --db. An absent root directory is the empty state: the root either
@@ -187,7 +171,6 @@ export async function runTraceCommand(args: string[]): Promise<number> {
187
171
  !parsed.dbExplicit &&
188
172
  !parsed.follow &&
189
173
  parsed.limit === DEFAULT_TRACE_LIMIT &&
190
- parsed.port === 0 &&
191
174
  parsed.maxAgeDays === undefined &&
192
175
  parsed.maxBytes === undefined,
193
176
  );
@@ -379,50 +362,6 @@ function printProcesses(rows: TraceProcessRow[]): void {
379
362
  }
380
363
  }
381
364
 
382
- async function runTraceUi(db: string, port: number): Promise<number> {
383
- const candidates = [
384
- fileURLToPath(new URL("../apps/trace-viewer/server.mjs", import.meta.url)),
385
- fileURLToPath(new URL("../../apps/trace-viewer/server.mjs", import.meta.url)),
386
- ];
387
- const entry = await firstExisting(candidates);
388
- if (entry === null) {
389
- process.stderr.write(
390
- "trace viewer is available only from a source checkout; apps/trace-viewer/server.mjs was not found\n" +
391
- " the npm package does not carry the viewer, so an installed clio cannot start it\n" +
392
- ` the same run is readable here: clio-coder trace runs --db ${db}\n` +
393
- " from a checkout of the repository: npm run trace:ui\n",
394
- );
395
- return 1;
396
- }
397
- const module = (await import(pathToFileURL(entry).href)) as {
398
- startTraceViewer(options: { db: string; port: number }): Promise<{ url: string; close(): Promise<void> }>;
399
- };
400
- const server = await module.startTraceViewer({ db, port });
401
- process.stdout.write(`Trace viewer: ${server.url}\n`);
402
- await new Promise<void>((resolveStop) => {
403
- const stop = (): void => {
404
- process.off("SIGINT", stop);
405
- process.off("SIGTERM", stop);
406
- void server.close().finally(resolveStop);
407
- };
408
- process.on("SIGINT", stop);
409
- process.on("SIGTERM", stop);
410
- });
411
- return 0;
412
- }
413
-
414
- async function firstExisting(paths: string[]): Promise<string | null> {
415
- for (const path of paths) {
416
- try {
417
- await access(path);
418
- return path;
419
- } catch {
420
- // Try the next source-checkout location.
421
- }
422
- }
423
- return null;
424
- }
425
-
426
365
  function parseInteger(value: string, flag: string, min: number, max: number): number {
427
366
  const parsed = Number(value);
428
367
  if (!Number.isInteger(parsed) || parsed < min || parsed > max)