@iowarp/clio-coder 0.4.4 → 0.4.6

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 (598) hide show
  1. package/CHANGELOG.md +116 -2
  2. package/CONTRIBUTING.md +39 -24
  3. package/NOTICE +16 -0
  4. package/README.md +343 -403
  5. package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
  6. package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
  9. package/dist/builtins-PD652MTK.js +22 -0
  10. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  11. package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
  12. package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
  13. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  14. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  15. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  16. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  17. package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
  18. package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
  19. package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
  20. package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
  21. package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
  22. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  23. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  24. package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
  25. package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
  26. package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
  27. package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
  28. package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
  29. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  30. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  31. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  32. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  33. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  34. package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
  35. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  36. package/dist/chunk-5ZSZEYJK.js +119 -0
  37. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  38. package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
  39. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  40. package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
  41. package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
  42. package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
  43. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  44. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  45. package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
  46. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  47. package/dist/chunk-7WUZEB2M.js +165 -0
  48. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  49. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  50. package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
  51. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  52. package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
  53. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  54. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  55. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  56. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  57. package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
  58. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  59. package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
  60. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  61. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  62. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  63. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  64. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  65. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  66. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  67. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  68. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  69. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  70. package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
  71. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  72. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  73. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  74. package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
  75. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  76. package/dist/chunk-ECOMVOHP.js +139 -0
  77. package/dist/chunk-EFSEIZE6.js +56 -0
  78. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  79. package/dist/chunk-EM2WNQS2.js +93 -0
  80. package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
  81. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  82. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  83. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  84. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  85. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  86. package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
  87. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  88. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  89. package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
  90. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  91. package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
  92. package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
  93. package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
  94. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  95. package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
  96. package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
  97. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  98. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  99. package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
  100. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  101. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  102. package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
  103. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  104. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  105. package/dist/chunk-KPRLAMP4.js +32 -0
  106. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  107. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  108. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  109. package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
  110. package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
  111. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  112. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  113. package/dist/chunk-LUL5Z66S.js +221 -0
  114. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  115. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  116. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  117. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  118. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  119. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  120. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  121. package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
  122. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  123. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  124. package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
  125. package/dist/chunk-NTK3WTHM.js +141 -0
  126. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  127. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  128. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  129. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  130. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  131. package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
  132. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  133. package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
  134. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  135. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  136. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  137. package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
  138. package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
  139. package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
  140. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  141. package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
  142. package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
  143. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  144. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  145. package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
  146. package/dist/chunk-R2CT5YDO.js +66 -0
  147. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  148. package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
  149. package/dist/chunk-SD7SHNDW.js +15 -0
  150. package/dist/chunk-SL2RDHKO.js +19 -0
  151. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  152. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  153. package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
  154. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  155. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  156. package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
  157. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  158. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  159. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  160. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  161. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  162. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  163. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  164. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  165. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  166. package/dist/chunk-USZA7GWL.js +341 -0
  167. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
  170. package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
  171. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  172. package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
  173. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  174. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  175. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  176. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  177. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  178. package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
  179. package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
  180. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  181. package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
  182. package/dist/chunk-WXA2CFJO.js +23 -0
  183. package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
  184. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  185. package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
  186. package/dist/chunk-YGDMBK7O.js +567 -0
  187. package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
  188. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  189. package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
  190. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  191. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  192. package/dist/cli/index.js +44 -44
  193. package/dist/clio-QQCMTUZE.js +26 -0
  194. package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
  195. package/dist/codewiki/build-worker.js +76 -29
  196. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  197. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  198. package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
  199. package/dist/configure-4ZM5HWJX.js +73 -0
  200. package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
  201. package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
  202. package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
  203. package/dist/context-clear-OQV76MYP.js +184 -0
  204. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  205. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  206. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
  207. package/dist/detail-UXPWRANG.js +115 -0
  208. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
  209. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  210. package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
  211. package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
  212. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  213. package/dist/evidence-35PYWGSO.js +225 -0
  214. package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
  215. package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
  216. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  217. package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
  218. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
  219. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  220. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
  221. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
  222. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  223. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  224. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
  225. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
  226. package/dist/fleet-view-IWHYGQKK.js +118 -0
  227. package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
  228. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  229. package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
  230. package/dist/inventory-74UL7UHU.js +118 -0
  231. package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
  232. package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
  233. package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
  234. package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
  235. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
  236. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  237. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  238. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  239. package/dist/preload-EJAWJEIO.js +116 -0
  240. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  241. package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
  242. package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
  243. package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
  244. package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
  245. package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
  246. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
  247. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
  248. package/dist/slash-commands-MDSDSWYF.js +92 -0
  249. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  250. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  251. package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
  252. package/dist/tasks-R6P6OV22.js +36 -0
  253. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
  254. package/dist/tools-6OCQ6SVB.js +28 -0
  255. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  256. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  257. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  258. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  259. package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
  260. package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
  261. package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
  262. package/dist/verify-HYF7KBVE.js +30 -0
  263. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  264. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  265. package/dist/wiki-generate-RK7JQ5NP.js +615 -0
  266. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  267. package/dist/worker/entry.js +108 -95
  268. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  269. package/docs/README.md +7 -6
  270. package/docs/architecture/acp.md +10 -0
  271. package/docs/architecture/architecture.md +5 -5
  272. package/docs/architecture/context-engine.md +45 -60
  273. package/docs/architecture/context-working-set.md +7 -9
  274. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  275. package/docs/architecture/evidence-and-memory.md +10 -0
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  278. package/docs/architecture/session-lifecycle.md +4 -4
  279. package/docs/architecture/tui-design.md +45 -30
  280. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  281. package/docs/guide/commands-and-modes.md +75 -61
  282. package/docs/guide/configuration-and-targets.md +126 -26
  283. package/docs/guide/configuration-reference.md +22 -7
  284. package/docs/guide/environment-variables.md +6 -2
  285. package/docs/guide/fleet-dispatch.md +13 -6
  286. package/docs/guide/glossary.md +1 -1
  287. package/docs/guide/installation-and-lifecycle.md +79 -20
  288. package/docs/guide/proactive-memory.md +1 -1
  289. package/docs/guide/skills-marketplace.md +11 -3
  290. package/docs/guide/tool-usage.md +9 -2
  291. package/docs/process/development-pipeline.md +11 -11
  292. package/docs/process/documentation-coverage.md +1 -1
  293. package/docs/process/documentation-guide.md +2 -2
  294. package/docs/process/eval-runner.md +15 -0
  295. package/docs/process/evals-internal.md +1 -1
  296. package/docs/process/release-cut-checklist.md +24 -12
  297. package/evals/README.md +4 -0
  298. package/evals/behavioral-corpus-grader.mjs +147 -14
  299. package/evals/behavioral-model-negative-control.yaml +1 -0
  300. package/evals/behavioral-model.yaml +266 -1
  301. package/evals/fixtures/docs-retrieval.json +102 -0
  302. package/evals/fixtures/scalar-decision.json +17 -0
  303. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  304. package/evals/fixtures/source-explanation.json +74 -0
  305. package/evals/fixtures/tool-arguments.json +18 -0
  306. package/evals/fixtures/tool-surface/read.txt +4 -0
  307. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  308. package/evals/no-edit-memory-grader.mjs +149 -0
  309. package/evals/scalar-decision-grader.py +41 -0
  310. package/evals/scalar-decision-machinery.ts +145 -0
  311. package/evals/source-explanation-grader.mjs +118 -0
  312. package/evals/tool-surface-grader.mjs +53 -0
  313. package/evals/tool-surface-model.yaml +274 -0
  314. package/package.json +14 -14
  315. package/skills/README.md +6 -6
  316. package/skills/registry.yaml +1 -1
  317. package/skills/skill-marketplace.json +1 -1
  318. package/src/cli/ask.ts +10 -10
  319. package/src/cli/bootstrap-generate.ts +6 -0
  320. package/src/cli/config-inspect.ts +24 -7
  321. package/src/cli/config-trust.ts +62 -0
  322. package/src/cli/config.ts +8 -0
  323. package/src/cli/configure-editor.ts +51 -0
  324. package/src/cli/configure-interop.ts +1 -1
  325. package/src/cli/configure-oauth.ts +1 -1
  326. package/src/cli/configure-onboarding.ts +232 -96
  327. package/src/cli/configure-prompts.ts +76 -0
  328. package/src/cli/configure-quick.ts +274 -0
  329. package/src/cli/configure-target.ts +14 -2
  330. package/src/cli/configure.ts +413 -174
  331. package/src/cli/context-map.ts +75 -14
  332. package/src/cli/context.ts +46 -17
  333. package/src/cli/eval.ts +17 -3
  334. package/src/cli/modes/print.ts +32 -4
  335. package/src/cli/oauth-manual-input.ts +1 -1
  336. package/src/cli/reset.ts +2 -0
  337. package/src/cli/run.ts +16 -14
  338. package/src/cli/select.ts +35 -4
  339. package/src/cli/skills-eval.ts +10 -8
  340. package/src/cli/steer-channel.ts +31 -18
  341. package/src/cli/targets.ts +83 -31
  342. package/src/cli/tasks.ts +10 -1
  343. package/src/cli/upgrade.ts +11 -8
  344. package/src/cli/usage.ts +24 -0
  345. package/src/cli/wiki-generate.ts +239 -96
  346. package/src/core/bash-exec.ts +43 -15
  347. package/src/core/bus-events.ts +15 -0
  348. package/src/core/config.ts +39 -15
  349. package/src/core/defaults.ts +38 -15
  350. package/src/{interactive → core}/external-editor.ts +4 -4
  351. package/src/core/file-references.ts +11 -1
  352. package/src/core/incomplete-installation.ts +3 -1
  353. package/src/core/settings-layers.ts +21 -5
  354. package/src/core/termination.ts +26 -9
  355. package/src/core/untrusted-content.ts +16 -0
  356. package/src/core/workspace-trust.ts +179 -0
  357. package/src/domains/agents/builtins/coder.md +4 -2
  358. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  359. package/src/domains/agents/builtins/documenter.md +7 -4
  360. package/src/domains/agents/builtins/researcher.md +1 -0
  361. package/src/domains/agents/builtins/scout.md +7 -1
  362. package/src/domains/agents/result-contract.ts +199 -26
  363. package/src/domains/config/classify.ts +1 -1
  364. package/src/domains/config/keybindings.ts +3 -31
  365. package/src/domains/context/bootstrap-prompt.ts +11 -9
  366. package/src/domains/context/bootstrap.ts +74 -39
  367. package/src/domains/context/clio-md.ts +88 -26
  368. package/src/domains/context/codewiki/build-operation.ts +121 -0
  369. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  370. package/src/domains/context/codewiki/build-worker.ts +3 -35
  371. package/src/domains/context/codewiki/coordinator.ts +36 -6
  372. package/src/domains/context/codewiki/indexer.ts +59 -19
  373. package/src/domains/context/contract.ts +6 -2
  374. package/src/domains/context/extension.ts +72 -10
  375. package/src/domains/context/fingerprint.ts +39 -34
  376. package/src/domains/context/index.ts +7 -1
  377. package/src/domains/context/prompt-context.ts +55 -14
  378. package/src/domains/context/refresh.ts +9 -57
  379. package/src/domains/context/wiki/assemble.ts +14 -10
  380. package/src/domains/context/wiki/evidence.ts +209 -0
  381. package/src/domains/context/wiki/generate.ts +201 -67
  382. package/src/domains/context/wiki/meta.ts +10 -2
  383. package/src/domains/context/wiki/plan-store.ts +70 -14
  384. package/src/domains/context/wiki/plan.ts +71 -14
  385. package/src/domains/context/wiki/prompts.ts +42 -1
  386. package/src/domains/context/wiki/source-content.ts +106 -0
  387. package/src/domains/context/wiki/staleness.ts +33 -22
  388. package/src/domains/context/working-set/contract.ts +8 -2
  389. package/src/domains/context/working-set/engine.ts +17 -4
  390. package/src/domains/context/working-set/fold.ts +15 -2
  391. package/src/domains/context/working-set/marker.ts +2 -1
  392. package/src/domains/context/working-set/project.ts +18 -7
  393. package/src/domains/context/working-set/recall.ts +82 -56
  394. package/src/domains/dispatch/active-route-planner.ts +6 -3
  395. package/src/domains/dispatch/admission-queue.ts +19 -7
  396. package/src/domains/dispatch/admission.ts +3 -3
  397. package/src/domains/dispatch/budget-envelope.ts +47 -82
  398. package/src/domains/dispatch/capacity-lease.ts +57 -19
  399. package/src/domains/dispatch/contract.ts +10 -2
  400. package/src/domains/dispatch/event-pump.ts +28 -7
  401. package/src/domains/dispatch/execution-role.ts +49 -2
  402. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  403. package/src/domains/dispatch/extension.ts +190 -105
  404. package/src/domains/dispatch/fleet-run.ts +20 -0
  405. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  406. package/src/domains/dispatch/parallel-writers.ts +34 -0
  407. package/src/domains/dispatch/reservation-store.ts +8 -34
  408. package/src/domains/dispatch/route-approval.ts +3 -3
  409. package/src/domains/dispatch/route-observer.ts +4 -2
  410. package/src/domains/dispatch/route-quality.ts +6 -1
  411. package/src/domains/dispatch/types.ts +4 -3
  412. package/src/domains/dispatch/worker-spawn.ts +58 -21
  413. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  414. package/src/domains/eval/compare/behavioral.ts +81 -14
  415. package/src/domains/eval/compare/compare.ts +15 -5
  416. package/src/domains/eval/compare/envelope.ts +12 -5
  417. package/src/domains/eval/metrics/context.ts +24 -1
  418. package/src/domains/eval/metrics/tracked.ts +4 -28
  419. package/src/domains/eval/reports/comparison.ts +9 -9
  420. package/src/domains/eval/runners/clio-run.ts +5 -1
  421. package/src/domains/eval/schema/suite.ts +2 -0
  422. package/src/domains/eval/schema/validate.ts +1 -0
  423. package/src/domains/eval/suites/run.ts +189 -13
  424. package/src/domains/eval/verifiers/integrity.ts +39 -0
  425. package/src/domains/eval/verifiers/patch.ts +58 -2
  426. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  427. package/src/domains/evidence/build.ts +4 -2
  428. package/src/domains/interop/registry.ts +2 -2
  429. package/src/domains/middleware/hooks-io.ts +45 -26
  430. package/src/domains/middleware/hooks.ts +6 -0
  431. package/src/domains/middleware/injection-screen.ts +23 -0
  432. package/src/domains/middleware/rules.ts +5 -1
  433. package/src/domains/middleware/stalled-turn.ts +18 -3
  434. package/src/domains/middleware/task-board-reminder.ts +4 -2
  435. package/src/domains/middleware/task-nudge.ts +4 -1
  436. package/src/domains/mux/contract.ts +34 -1
  437. package/src/domains/mux/dock-controller.ts +8 -1
  438. package/src/domains/mux/index.ts +1 -0
  439. package/src/domains/mux/socket-client.ts +13 -3
  440. package/src/domains/observability/contract.ts +2 -2
  441. package/src/domains/observability/projection.ts +30 -9
  442. package/src/domains/prompts/compiler.ts +10 -2
  443. package/src/domains/prompts/contract.ts +7 -4
  444. package/src/domains/prompts/extension.ts +28 -64
  445. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  446. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  447. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  448. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  449. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  450. package/src/domains/prompts/preload-prefix.ts +31 -0
  451. package/src/domains/prompts/preload.ts +135 -61
  452. package/src/domains/providers/auth/backend-file.ts +15 -11
  453. package/src/domains/providers/auth/storage.ts +3 -5
  454. package/src/domains/providers/catalog.ts +18 -3
  455. package/src/domains/providers/probe/fingerprint.ts +13 -6
  456. package/src/domains/providers/probe/reasoning.ts +2 -0
  457. package/src/domains/providers/runtime-resolution.ts +11 -9
  458. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  459. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  460. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  461. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  462. package/src/domains/resources/skills/promotion.ts +8 -1
  463. package/src/domains/safety/action-classifier.ts +9 -0
  464. package/src/domains/safety/autonomy.ts +10 -1
  465. package/src/domains/safety/contract.ts +5 -1
  466. package/src/domains/safety/default-path-policy.ts +11 -0
  467. package/src/domains/safety/extension.ts +11 -2
  468. package/src/domains/safety/policy-engine.ts +189 -32
  469. package/src/domains/safety/project-policy.ts +7 -2
  470. package/src/domains/safety/workspace-trust.ts +43 -0
  471. package/src/domains/session/compaction/compact.ts +384 -21
  472. package/src/domains/session/compaction/cut-point.ts +42 -5
  473. package/src/domains/session/compaction/tokens.ts +9 -1
  474. package/src/domains/session/decision-board.ts +43 -33
  475. package/src/domains/session/entries.ts +169 -4
  476. package/src/domains/session/prompt-manifest.ts +47 -8
  477. package/src/domains/session/task-board.ts +21 -3
  478. package/src/domains/user-tasks/handoff.ts +16 -0
  479. package/src/engine/acp/adapter.ts +44 -12
  480. package/src/engine/acp/server.ts +1 -0
  481. package/src/engine/acp/transport.ts +2 -1
  482. package/src/engine/acp/types.ts +6 -1
  483. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  484. package/src/engine/api-registry.ts +19 -2
  485. package/src/engine/apis/openai-completions.ts +13 -6
  486. package/src/engine/apis/output-budget.ts +26 -10
  487. package/src/engine/claude/sdk-runtime.ts +4 -3
  488. package/src/engine/env-api-keys.ts +2 -1
  489. package/src/engine/external-subprocess.ts +14 -3
  490. package/src/engine/loop-guard.ts +19 -2
  491. package/src/engine/provider-diagnostics.ts +129 -0
  492. package/src/engine/provider-payload.ts +3 -1
  493. package/src/engine/worker-runtime.ts +13 -2
  494. package/src/engine/worker-tools.ts +5 -1
  495. package/src/entry/extension-reload.ts +1 -0
  496. package/src/entry/orchestrator.ts +53 -15
  497. package/src/interactive/application-controller.ts +1 -31
  498. package/src/interactive/chat-loop-messages.ts +12 -4
  499. package/src/interactive/chat-loop.ts +115 -45
  500. package/src/interactive/chat-panel.ts +163 -637
  501. package/src/interactive/chat-renderer.ts +73 -30
  502. package/src/interactive/context-recall-command.ts +2 -1
  503. package/src/interactive/dispatch-board.ts +18 -5
  504. package/src/interactive/editor-submit.ts +21 -31
  505. package/src/interactive/footer/dashboard.ts +8 -3
  506. package/src/interactive/footer/widgets.ts +50 -91
  507. package/src/interactive/interactive-application.ts +24 -44
  508. package/src/interactive/interactive-event-projection.ts +9 -45
  509. package/src/interactive/interactive-input-runtime.ts +3 -28
  510. package/src/interactive/interactive-presentation.ts +45 -16
  511. package/src/interactive/interactive-slash-runtime.ts +5 -40
  512. package/src/interactive/layout.ts +31 -5
  513. package/src/interactive/model-session-replay.ts +2 -2
  514. package/src/interactive/overlay-frame.ts +1 -0
  515. package/src/interactive/overlay-general-openers.ts +5 -1
  516. package/src/interactive/overlay-lifecycle.ts +1 -0
  517. package/src/interactive/overlay-session-lifecycle.ts +7 -1
  518. package/src/interactive/overlays/ask-user.ts +1 -0
  519. package/src/interactive/overlays/message-picker.ts +1 -1
  520. package/src/interactive/overlays/settings.ts +9 -8
  521. package/src/interactive/renderers/preview.ts +16 -0
  522. package/src/interactive/renderers/tool-execution.ts +84 -161
  523. package/src/interactive/renderers/worker-entry.ts +74 -43
  524. package/src/interactive/slash-autocomplete.ts +1 -6
  525. package/src/interactive/slash-commands.ts +16 -46
  526. package/src/interactive/status/controller.ts +0 -5
  527. package/src/interactive/status/state-machine.ts +44 -26
  528. package/src/interactive/status/types.ts +3 -0
  529. package/src/interactive/status/verbs.ts +13 -12
  530. package/src/interactive/transcript-detail.ts +50 -112
  531. package/src/interactive/turn-context.ts +221 -53
  532. package/src/interactive/turn-middleware.ts +3 -1
  533. package/src/interactive/turn-persistence.ts +3 -0
  534. package/src/interactive/turn-runtime.ts +11 -2
  535. package/src/interactive/turn-state.ts +10 -9
  536. package/src/interactive/view/artifacts.ts +4 -0
  537. package/src/interactive/view/view-overlay.ts +44 -34
  538. package/src/interactive/watch-pane.ts +18 -4
  539. package/src/interactive/worker-stream.ts +7 -7
  540. package/src/tools/agent-tools.ts +6 -3
  541. package/src/tools/bash.ts +1 -1
  542. package/src/tools/builtin-tool-catalog.ts +9 -2
  543. package/src/tools/codewiki/code-nav.ts +4 -10
  544. package/src/tools/compete-judge-task.ts +71 -0
  545. package/src/tools/compete-worktrees.ts +34 -0
  546. package/src/tools/context/index.ts +32 -7
  547. package/src/tools/context/surface.ts +15 -4
  548. package/src/tools/decide.ts +1 -1
  549. package/src/tools/dispatch-admission.ts +12 -1
  550. package/src/tools/dispatch-arguments.ts +38 -1
  551. package/src/tools/dispatch-plan.ts +7 -7
  552. package/src/tools/dispatch-runner.ts +48 -32
  553. package/src/tools/dispatch-schema.ts +30 -23
  554. package/src/tools/dispatch-scout-admission.ts +10 -44
  555. package/src/tools/dispatch-scout.ts +2 -3
  556. package/src/tools/find.ts +13 -4
  557. package/src/tools/grep.ts +13 -1
  558. package/src/tools/ls.ts +7 -1
  559. package/src/tools/monitor.ts +26 -11
  560. package/src/tools/network-policy.ts +11 -24
  561. package/src/tools/observation.ts +39 -2
  562. package/src/tools/presentation.ts +1 -1
  563. package/src/tools/read.ts +112 -15
  564. package/src/tools/registry.ts +55 -18
  565. package/src/tools/result-shaping.ts +110 -2
  566. package/src/tools/tasks.ts +33 -7
  567. package/src/tools/verify/frontend.ts +67 -30
  568. package/src/tools/verify/numeric.ts +10 -5
  569. package/src/tools/web-fetch-network.ts +179 -0
  570. package/src/tools/web-fetch-surface.ts +2 -1
  571. package/src/tools/web-fetch.ts +15 -13
  572. package/src/tools/worker-evidence.ts +27 -0
  573. package/src/worker/spec-contract.ts +12 -8
  574. package/dist/builtins-WGALA46I.js +0 -22
  575. package/dist/chunk-2WZ546HR.js +0 -792
  576. package/dist/chunk-5PSMVOLM.js +0 -56
  577. package/dist/chunk-EL24TAU4.js +0 -1560
  578. package/dist/chunk-IZXGRF7P.js +0 -4048
  579. package/dist/chunk-JVCV3ICN.js +0 -47
  580. package/dist/chunk-MNJGS2IN.js +0 -33
  581. package/dist/chunk-O5CVSAG5.js +0 -122
  582. package/dist/chunk-ODGTEFFI.js +0 -50
  583. package/dist/chunk-OQE5J4C6.js +0 -73
  584. package/dist/chunk-UUVG37B4.js +0 -244
  585. package/dist/chunk-V6HJFQZE.js +0 -228
  586. package/dist/clio-QLICPCF5.js +0 -25
  587. package/dist/configure-VEPX4NMX.js +0 -55
  588. package/dist/context-clear-S4ZJCQUX.js +0 -182
  589. package/dist/detail-A7JAVSIG.js +0 -98
  590. package/dist/evidence-4F5USFKH.js +0 -208
  591. package/dist/fleet-view-MN2VG4MR.js +0 -101
  592. package/dist/inventory-C26CFDRR.js +0 -101
  593. package/dist/preload-P6DGH2PZ.js +0 -13
  594. package/dist/slash-commands-ZXPJD64J.js +0 -92
  595. package/dist/tasks-IPAGMEIX.js +0 -36
  596. package/dist/tools-EFFEAIDP.js +0 -28
  597. package/dist/verify-FWYGPKMR.js +0 -29
  598. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -1,9 +1,11 @@
1
1
  import { execFileSync } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
2
3
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { dirname, join, parse } from "node:path";
4
+ import { dirname, join, parse, resolve } from "node:path";
4
5
  import type { ContextActivityPayload } from "../../core/bus-events.js";
5
6
  import { createTomlFileReader, type TomlFileReader, tomlTableAt } from "../../core/toml.js";
6
- import { classifyProjectPreload, type ProjectPreloadClass } from "../prompts/preload.js";
7
+ import { INTEROP_AGENT_KINDS } from "../interop/registry.js";
8
+ import { type ProjectPreloadClass, selectProjectPreload } from "../prompts/preload.js";
7
9
  import { detectProjectType, type ProjectType } from "../session/workspace/project-type.js";
8
10
  import {
9
11
  type AdoptionScanResult,
@@ -139,7 +141,7 @@ export interface RunBootstrapResult {
139
141
  };
140
142
  /**
141
143
  * How the session compiler will preload the project context that exists
142
- * on disk after this run: full, synopsis (with the limit that forced it),
144
+ * on disk after this run with unknown tool capability: full, partial,
143
145
  * or none. In preview mode this reflects the current on-disk state, since
144
146
  * preview writes nothing.
145
147
  */
@@ -249,6 +251,23 @@ function projectTypeLabel(projectType: ProjectType): string {
249
251
  }
250
252
  }
251
253
 
254
+ /** Only project-wide instructions may become unconditional handbook rules. */
255
+ function handbookInstructionFiles(input: BootstrapGenerateInput): SiblingContextFile[] {
256
+ const projectPaths = new Set(
257
+ INTEROP_AGENT_KINDS.flatMap((kind) => kind.instructionFiles.map((file) => resolve(input.cwd, file))),
258
+ );
259
+ const allowed = new Set(
260
+ input.adoption.sources
261
+ .filter((source) => {
262
+ if (source.kind !== "instructions") return false;
263
+ if (source.scope === "project") return projectPaths.has(source.path);
264
+ return input.adoption.includeGlobal && source.path === resolve(input.adoption.homeDir, ".codex/AGENTS.md");
265
+ })
266
+ .map((source) => source.path),
267
+ );
268
+ return input.siblingFiles.filter((file) => allowed.has(file.path));
269
+ }
270
+
252
271
  function allContextText(files: ReadonlyArray<SiblingContextFile>): string {
253
272
  return files.map((file) => file.content).join("\n\n");
254
273
  }
@@ -308,7 +327,7 @@ function resolveDefaultIdentity(
308
327
  * strictly better than that, and only than that.
309
328
  */
310
329
  function stabilizedIdentity(input: BootstrapGenerateInput, modelIdentity: unknown, tomlFiles: TomlFileReader): string {
311
- const deterministic = resolveDefaultIdentity(input.cwd, input.projectType, input.siblingFiles, tomlFiles);
330
+ const deterministic = resolveDefaultIdentity(input.cwd, input.projectType, handbookInstructionFiles(input), tomlFiles);
312
331
  const model = typeof modelIdentity === "string" ? modelIdentity.trim() : "";
313
332
  if (deterministic.bare && model.length > 0) return model;
314
333
  return deterministic.text;
@@ -423,7 +442,7 @@ function indexedSourceFileCount(codewiki: Codewiki): number {
423
442
  /** Measure how the session compiler will preload the on-disk project context. */
424
443
  function measureProjectPreload(cwd: string): ProjectPreloadClass {
425
444
  const promptContext = renderPromptContext(cwd);
426
- return classifyProjectPreload({ hasClioMd: promptContext.clioMd !== null, text: promptContext.text });
445
+ return selectProjectPreload(promptContext, null).classification;
427
446
  }
428
447
 
429
448
  function packageScripts(cwd: string): Record<string, string> {
@@ -724,12 +743,12 @@ function stabilizeGeneratedOutput(
724
743
  const existing = input.existingClioMd;
725
744
  const conventions: string[] = [];
726
745
  for (const convention of existing?.conventions ?? []) pushUnique(conventions, convention);
727
- for (const convention of inferConventions(input.cwd, input.siblingFiles, input.codewiki)) {
746
+ for (const convention of inferConventions(input.cwd, handbookInstructionFiles(input), input.codewiki)) {
728
747
  pushUnique(conventions, convention);
729
748
  }
730
749
  const invariants: string[] = [];
731
750
  for (const invariant of existing?.invariants ?? []) pushUnique(invariants, invariant);
732
- for (const invariant of inferInvariants(input.siblingFiles)) pushUnique(invariants, invariant);
751
+ for (const invariant of inferInvariants(handbookInstructionFiles(input))) pushUnique(invariants, invariant);
733
752
 
734
753
  const verification = verificationSection(input.cwd, tomlFiles);
735
754
  const inferredSections = inferHeuristicSections(input);
@@ -776,7 +795,7 @@ function stabilizeGeneratedOutput(
776
795
  * precise number is falsified by any single added file and carries no
777
796
  * navigational value the entry-point list does not.
778
797
  */
779
- export function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
798
+ function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
780
799
  const sections: ClioMdSection[] = [];
781
800
  const entryPoints = codewikiEntryPoints(codewiki, 8);
782
801
  if (entryPoints.length > 0) {
@@ -793,7 +812,7 @@ export function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
793
812
 
794
813
  function inferHeuristicSections(input: BootstrapGenerateInput): ClioMdSection[] {
795
814
  const sections: ClioMdSection[] = [...codewikiSections(input.codewiki)];
796
- const invariants = inferInvariants(input.siblingFiles);
815
+ const invariants = inferInvariants(handbookInstructionFiles(input));
797
816
  if (invariants.length > 0) {
798
817
  sections.push({
799
818
  title: "Architecture boundaries",
@@ -827,9 +846,9 @@ function heuristicBootstrapOutputSync(input: BootstrapGenerateInput): BootstrapS
827
846
  const sharedInput = input.tomlFiles ? input : { ...input, tomlFiles };
828
847
  return stabilizeGeneratedOutput(sharedInput, {
829
848
  projectName: projectName(input.cwd, tomlFiles),
830
- identity: resolveDefaultIdentity(input.cwd, input.projectType, input.siblingFiles, tomlFiles).text,
831
- conventions: inferConventions(input.cwd, input.siblingFiles, input.codewiki),
832
- invariants: inferInvariants(input.siblingFiles),
849
+ identity: resolveDefaultIdentity(input.cwd, input.projectType, handbookInstructionFiles(input), tomlFiles).text,
850
+ conventions: inferConventions(input.cwd, handbookInstructionFiles(input), input.codewiki),
851
+ invariants: inferInvariants(handbookInstructionFiles(input)),
833
852
  sections: inferHeuristicSections(input),
834
853
  });
835
854
  }
@@ -852,7 +871,7 @@ function bootstrapOutputFromParsed(parsed: ParsedClioMd): BootstrapStructuredOut
852
871
 
853
872
  function existingClioMdBootstrapOutput(cwd: string): BootstrapStructuredOutput | null {
854
873
  const parsed = tryReadClioMd(cwd);
855
- if (!parsed?.ok) return null;
874
+ if (!parsed?.ok || !parsed.value) return null;
856
875
  return bootstrapOutputFromParsed(parsed.value);
857
876
  }
858
877
 
@@ -1048,15 +1067,16 @@ async function ensureGitignore(cwd: string, input: RunBootstrapInput): Promise<v
1048
1067
  }
1049
1068
 
1050
1069
  function serializeBootstrapOutput(output: BootstrapStructuredOutput): string {
1051
- return serializeClioMd({ ...output, fingerprint: null });
1070
+ const serialized = serializeClioMd({ ...output, fingerprint: null });
1071
+ const parsed = parseClioMd(serialized);
1072
+ if (!parsed.ok) throw new Error(`bootstrap produced invalid CLIO-CODER.md: ${parsed.errors.join("; ")}`);
1073
+ return serialized;
1052
1074
  }
1053
1075
 
1054
1076
  function writeClioMdFile(cwd: string, output: BootstrapStructuredOutput): string {
1055
1077
  const clioMdPath = join(cwd, "CLIO-CODER.md");
1056
1078
  mkdirSync(dirname(clioMdPath), { recursive: true });
1057
1079
  const serialized = serializeBootstrapOutput(output);
1058
- const parsed = parseClioMd(serialized);
1059
- if (!parsed.ok) throw new Error(`bootstrap produced invalid CLIO-CODER.md: ${parsed.errors.join("; ")}`);
1060
1080
  writeFileSync(clioMdPath, serialized, "utf8");
1061
1081
  return clioMdPath;
1062
1082
  }
@@ -1068,11 +1088,31 @@ function timestampForPath(now: Date): string {
1068
1088
  .replace(/\.\d{3}Z$/, "Z");
1069
1089
  }
1070
1090
 
1071
- function writeClioMdProposal(cwd: string, now: Date, output: BootstrapStructuredOutput): string {
1091
+ function writeClioMdProposal(
1092
+ cwd: string,
1093
+ now: Date,
1094
+ output: BootstrapStructuredOutput,
1095
+ generation: BootstrapGenerationTelemetry,
1096
+ existingSource: string | null,
1097
+ ): string {
1072
1098
  const dir = join(cwd, ".clio-coder", "proposals");
1073
1099
  mkdirSync(dir, { recursive: true });
1074
- const proposalPath = join(dir, `CLIO-CODER-${timestampForPath(now)}.md`);
1075
- writeFileSync(proposalPath, serializeBootstrapOutput(output), "utf8");
1100
+ const proposalPath = join(dir, `CLIO-CODER-${timestampForPath(now)}-${randomUUID()}.md`);
1101
+ const serialized = serializeBootstrapOutput(output);
1102
+ writeFileSync(proposalPath, serialized, { encoding: "utf8", flag: "wx" });
1103
+ // Proposal provenance belongs to the candidate, never to the untouched handbook.
1104
+ writeFileSync(
1105
+ `${proposalPath}.json`,
1106
+ `${JSON.stringify({
1107
+ version: 1,
1108
+ createdAt: now.toISOString(),
1109
+ handbookPath: join(cwd, "CLIO-CODER.md"),
1110
+ sourceHash: existingSource === null ? null : createHash("sha256").update(existingSource).digest("hex"),
1111
+ proposalHash: createHash("sha256").update(serialized).digest("hex"),
1112
+ generation: durableGenerationTelemetry(generation),
1113
+ })}\n`,
1114
+ { encoding: "utf8", flag: "wx" },
1115
+ );
1076
1116
  return proposalPath;
1077
1117
  }
1078
1118
 
@@ -1130,17 +1170,13 @@ function writeProjectState(
1130
1170
  codewikiVersion: number,
1131
1171
  fingerprint: Fingerprint,
1132
1172
  generation: BootstrapGenerationTelemetry,
1133
- generated: boolean,
1173
+ published: boolean,
1134
1174
  ): string {
1135
1175
  const statePath = resolveStatePath(cwd);
1136
1176
  const prev = readClioState(cwd);
1137
1177
  // lastBootstrap describes how the CLIO-CODER.md on disk was produced, not what the
1138
- // most recent run happened to do. A run that generated nothing leaves the
1139
- // handbook untouched, so overwriting a recorded `model` provenance with
1140
- // `existing` would claim the handbook has no model authorship behind it.
1141
- const lastBootstrap = generated
1142
- ? durableGenerationTelemetry(generation)
1143
- : (prev?.lastBootstrap ?? durableGenerationTelemetry(generation));
1178
+ // most recent run happened to do. Proposals retain their own generation record.
1179
+ const lastBootstrap = published ? durableGenerationTelemetry(generation) : prev?.lastBootstrap;
1144
1180
  const contextSources = recordAdoption ? adoption.sourceSnapshots : prev?.contextSources;
1145
1181
  const contextSourceHash = contextSources ? adoptionSnapshotsHash(contextSources) : undefined;
1146
1182
  writeClioState(cwd, {
@@ -1151,7 +1187,7 @@ function writeProjectState(
1151
1187
  lastInitAt: now.toISOString(),
1152
1188
  lastSessionAt: now.toISOString(),
1153
1189
  lastIndexedAt: indexedAt,
1154
- lastBootstrap,
1190
+ ...(lastBootstrap ? { lastBootstrap } : {}),
1155
1191
  ...(contextSources ? { contextSources } : {}),
1156
1192
  ...(contextSourceHash ? { contextSourceHash } : {}),
1157
1193
  });
@@ -1304,17 +1340,16 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1304
1340
  ) {
1305
1341
  const detail = existingClioMd && !existingClioMd.ok ? ` (${existingClioMd.error})` : "";
1306
1342
  throw new Error(
1307
- `cannot refresh Imported agent context because CLIO-CODER.md is malformed${detail}; use --apply or --rewrite after reviewing the handbook`,
1343
+ `cannot refresh Imported agent context because CLIO-CODER.md has no structured projection${detail}; use --apply or --rewrite after reviewing the handbook`,
1308
1344
  );
1309
1345
  }
1310
1346
  // A supplied generator *is* the request to generate: both entry points
1311
1347
  // withhold `generate` for --heuristic and --preview and supply it otherwise.
1312
- // An existing CLIO-CODER.md used to suppress generation entirely, so a plain
1313
- // `clio-coder context init` on an initialized repository dispatched nothing, wrote
1314
- // `lastBootstrap.mode: "existing"`, and looked identical to a run that had no
1315
- // route at all. The handbook still reaches the generator as source (see
1316
- // `useExistingClioMdAsSource`), so this refreshes rather than replaces.
1348
+ // For an existing handbook, retain that work as a proposal unless replacement
1349
+ // or adoption was explicitly requested. Generation never implies publication.
1317
1350
  const shouldGenerate = !hadClioMd || replaceClioMd || input.proposeClioMd === true || input.generate !== undefined;
1351
+ const shouldPropose =
1352
+ input.proposeClioMd === true || (hadClioMd && input.generate !== undefined && !replaceClioMd && input.adopt !== true);
1318
1353
  let output: BootstrapStructuredOutput;
1319
1354
  let generation: BootstrapGenerationTelemetry = {
1320
1355
  mode: shouldGenerate ? "heuristic" : existingParsed ? "existing" : "heuristic",
@@ -1427,7 +1462,10 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1427
1462
  status: "started",
1428
1463
  message: hadClioMd ? "preserving CLIO-CODER.md" : "writing CLIO-CODER.md",
1429
1464
  });
1430
- if (!hadClioMd) {
1465
+ if (shouldPropose) {
1466
+ proposalPath = writeClioMdProposal(cwd, now, output, generation, existingClioMdText);
1467
+ action = "proposed";
1468
+ } else if (!hadClioMd) {
1431
1469
  clioMdPath = writeClioMdFile(cwd, output);
1432
1470
  action = "wrote";
1433
1471
  } else if (replaceClioMd) {
@@ -1436,9 +1474,6 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1436
1474
  } else if (input.adopt === true && existingParsed) {
1437
1475
  clioMdPath = writeClioMdFile(cwd, output);
1438
1476
  action = "refreshed";
1439
- } else if (input.proposeClioMd === true) {
1440
- proposalPath = writeClioMdProposal(cwd, now, output);
1441
- action = "proposed";
1442
1477
  }
1443
1478
  progress(input, {
1444
1479
  phase: "clio-md",
@@ -1465,7 +1500,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1465
1500
  codewiki.version,
1466
1501
  codewikiFingerprint,
1467
1502
  generation,
1468
- shouldGenerate,
1503
+ action === "wrote" || action === "refreshed",
1469
1504
  );
1470
1505
  progress(input, {
1471
1506
  phase: "state",
@@ -1489,7 +1524,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1489
1524
  if (preload.mode === "full" && preload.nearLimit) {
1490
1525
  warn(
1491
1526
  input.io,
1492
- ` warning: project context is within 10% of the preload limit (${preload.chars} chars of 8000, ${preload.lines} lines of 220); the next growth may flip it to a synopsis\n`,
1527
+ ` warning: project context is within 10% of the preload limit (${preload.chars} UTF-16 units of 8000, ${preload.lines} rendered lines of 220); further growth may omit authored suffixes\n`,
1493
1528
  );
1494
1529
  }
1495
1530
  progress(input, {
@@ -28,7 +28,10 @@ export interface ParsedClioMd {
28
28
 
29
29
  export interface LoadedClioMdFile {
30
30
  path: string;
31
- value: ParsedClioMd;
31
+ /** Exact UTF-8 authored source for prompt rendering. */
32
+ source: string;
33
+ /** Optional generator-format projection; never the authority for authored text. */
34
+ value: ParsedClioMd | null;
32
35
  }
33
36
 
34
37
  export interface ClioMdLoadError {
@@ -39,9 +42,9 @@ export interface ClioMdLoadError {
39
42
  export interface LoadedProjectClioMd {
40
43
  /** Effective files in ancestor-to-descendant order. */
41
44
  files: LoadedClioMdFile[];
42
- /** Selected files that could not be read or parsed. */
45
+ /** Selected files that could not be read or were empty. */
43
46
  errors: ClioMdLoadError[];
44
- /** The layered effective handbook, or null when no selected file parsed. */
47
+ /** The layered structured projection, or null when no selected file matches the generator format. */
45
48
  value: ParsedClioMd | null;
46
49
  }
47
50
 
@@ -77,10 +80,60 @@ function normalizeInline(value: string): string {
77
80
  .trim();
78
81
  }
79
82
 
83
+ /**
84
+ * The same text with every character inside a fenced code block or an HTML
85
+ * comment replaced by a filler, newlines kept, so offsets into the mask are
86
+ * offsets into the original. Heading scans run on the mask and slice from the
87
+ * source: a `# comment` line in a fenced shell example used to read as a
88
+ * second H1 and reject the whole handbook, and a `## not a heading` inside a
89
+ * fence split into a section whose serialization then rewrote the fence.
90
+ */
91
+ function maskNonHeadingRegions(text: string): string {
92
+ const lines = text.split("\n");
93
+ const out: string[] = [];
94
+ let fence: { char: string; length: number } | null = null;
95
+ let inComment = false;
96
+ for (const line of lines) {
97
+ let masked = false;
98
+ if (fence) {
99
+ masked = true;
100
+ const close = /^\s{0,3}(`{3,}|~{3,})\s*$/.exec(line);
101
+ if (close?.[1] && close[1][0] === fence.char && close[1].length >= fence.length) fence = null;
102
+ } else if (inComment) {
103
+ masked = true;
104
+ if (line.includes("-->")) inComment = false;
105
+ } else {
106
+ const open = /^\s{0,3}(`{3,}|~{3,})/.exec(line);
107
+ if (open?.[1]) {
108
+ fence = { char: open[1][0] ?? "`", length: open[1].length };
109
+ masked = true;
110
+ } else if (/^\s*<!--/.test(line)) {
111
+ masked = true;
112
+ if (!line.includes("-->")) inComment = true;
113
+ }
114
+ }
115
+ // A non-whitespace filler: the heading regexes end in `\s*$`, which would
116
+ // otherwise run through a blank-masked block and swallow it into the
117
+ // heading match.
118
+ out.push(masked ? "_".repeat(line.length) : line);
119
+ }
120
+ return out.join("\n");
121
+ }
122
+
80
123
  function normalizeNestedMarkdown(value: string): string {
81
- return normalizeSource(value)
82
- .trim()
83
- .replace(/^(#{1,2})(\s+)/gm, "###$2");
124
+ const body = normalizeSource(value).trim();
125
+ // Demote authored H1/H2 inside a section body so it cannot outrank the
126
+ // section, but only where a heading scan would see one: a fence or comment
127
+ // keeps its bytes.
128
+ const mask = maskNonHeadingRegions(body);
129
+ let out = "";
130
+ let cursor = 0;
131
+ for (const match of mask.matchAll(/^(#{1,2})(\s+)/gm)) {
132
+ if (match.index === undefined) continue;
133
+ out += body.slice(cursor, match.index) + "###" + (match[2] ?? "");
134
+ cursor = match.index + match[0].length;
135
+ }
136
+ return out + body.slice(cursor);
84
137
  }
85
138
 
86
139
  function charLen(value: string): number {
@@ -112,7 +165,7 @@ function parseFooter(source: string): {
112
165
 
113
166
  const footerEnd = match.index + match[0].length;
114
167
  const trailing = source.slice(footerEnd).trim();
115
- if (trailing.length > 0) warnings.push("trailing content after fingerprint footer ignored");
168
+ if (trailing.length > 0) warnings.push("trailing content after fingerprint footer omitted from structured fields");
116
169
  let parsed: unknown;
117
170
  try {
118
171
  parsed = JSON.parse(match[1] ?? "");
@@ -162,7 +215,7 @@ function validateFooter(value: unknown): ClioMdFingerprintFooter | null {
162
215
  }
163
216
 
164
217
  function readSections(body: string): ClioMdSection[] {
165
- const headings = [...body.matchAll(H2_RE)];
218
+ const headings = [...maskNonHeadingRegions(body).matchAll(H2_RE)];
166
219
  const sections: ClioMdSection[] = [];
167
220
  for (let i = 0; i < headings.length; i += 1) {
168
221
  const heading = headings[i];
@@ -187,7 +240,8 @@ function extraSections(sections: ReadonlyArray<ClioMdSection>): ClioMdSection[]
187
240
  }
188
241
 
189
242
  function identityParagraph(afterH1: string): string {
190
- const beforeFirstSection = afterH1.split(/^##\s+/m)[0] ?? "";
243
+ const firstSection = /^##\s+/m.exec(maskNonHeadingRegions(afterH1));
244
+ const beforeFirstSection = firstSection ? afterH1.slice(0, firstSection.index) : afterH1;
191
245
  const paragraphs = beforeFirstSection
192
246
  .trim()
193
247
  .split(/\n\s*\n/)
@@ -219,7 +273,7 @@ export function parseClioMd(source: string): ClioMdParseResult {
219
273
  warnings.push(...footerResult.warnings);
220
274
  if (footerResult.errors.length > 0) return { ok: false, errors: footerResult.errors, warnings };
221
275
 
222
- const h1Matches = [...footerResult.body.matchAll(H1_RE)];
276
+ const h1Matches = [...maskNonHeadingRegions(footerResult.body).matchAll(H1_RE)];
223
277
  if (h1Matches.length === 0) return { ok: false, errors: ["missing H1 heading"], warnings };
224
278
  if (h1Matches.length > 1) return { ok: false, errors: ["more than one H1 heading"], warnings };
225
279
 
@@ -317,7 +371,9 @@ function escapeXmlAttribute(value: string): string {
317
371
  return value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
318
372
  }
319
373
 
320
- export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?: string): string {
374
+ export function renderProjectContextFragment(parsed: ParsedClioMd | string, sourcePath?: string): string {
375
+ const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
376
+ if (typeof parsed === "string") return `<project-context${source}>\n${parsed}\n</project-context>`;
321
377
  const sections: string[] = [`# ${parsed.projectName}`, parsed.identity];
322
378
  if (parsed.conventions.length > 0) {
323
379
  sections.push("## Conventions", ...parsed.conventions.map((item) => `- ${item}`));
@@ -331,7 +387,6 @@ export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?:
331
387
  if (parsed.importedAgentContext) {
332
388
  sections.push("## Imported agent context", parsed.importedAgentContext);
333
389
  }
334
- const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
335
390
  return `<project-context${source}>\n${sections.join("\n\n")}\n</project-context>`;
336
391
  }
337
392
 
@@ -352,35 +407,40 @@ function selectedClioMdPath(directory: string): string | null {
352
407
  return null;
353
408
  }
354
409
 
355
- function readClioMdPath(filePath: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } {
410
+ function readClioMdPath(
411
+ filePath: string,
412
+ ): { ok: true; source: string; value: ParsedClioMd | null } | { ok: false; error: string } {
356
413
  let content: string;
357
414
  try {
358
415
  content = readFileSync(filePath, "utf8");
359
416
  } catch (err) {
360
417
  return { ok: false, error: err instanceof Error ? err.message : String(err) };
361
418
  }
419
+ if (content.trim().length === 0) return { ok: false, error: "handbook is empty" };
420
+ // Authored Markdown needs no generator schema. Preserve it even when a
421
+ // structured projection cannot be derived; producer validation stays strict.
362
422
  const parsed = parseClioMd(content);
363
- if (!parsed.ok) return { ok: false, error: parsed.errors.join("; ") };
364
- return { ok: true, value: parsed.value };
423
+ return { ok: true, source: content, value: parsed.ok ? parsed.value : null };
365
424
  }
366
425
 
367
426
  function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd | null {
368
- const nearest = files.at(-1)?.value;
427
+ const values = files.flatMap((file) => (file.value ? [file.value] : []));
428
+ const nearest = values.at(-1);
369
429
  if (!nearest) return null;
370
430
  return {
371
431
  projectName: nearest.projectName,
372
- identity: files.map((file) => file.value.identity).join("\n\n"),
373
- conventions: files.flatMap((file) => file.value.conventions),
374
- invariants: files.flatMap((file) => file.value.invariants),
375
- sections: files.flatMap((file) => file.value.sections),
432
+ identity: values.map((value) => value.identity).join("\n\n"),
433
+ conventions: values.flatMap((value) => value.conventions),
434
+ invariants: values.flatMap((value) => value.invariants),
435
+ sections: values.flatMap((value) => value.sections),
376
436
  importedAgentContext:
377
- files
378
- .map((file) => file.value.importedAgentContext)
437
+ values
438
+ .map((value) => value.importedAgentContext)
379
439
  .filter((value): value is string => value !== null)
380
440
  .join("\n\n") || null,
381
441
  fingerprint: nearest.fingerprint,
382
442
  firstInit: nearest.firstInit,
383
- warnings: files.flatMap((file) => file.value.warnings),
443
+ warnings: values.flatMap((value) => value.warnings),
384
444
  };
385
445
  }
386
446
 
@@ -388,7 +448,7 @@ function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd
388
448
  * Load effective project handbooks from filesystem root through `cwd`.
389
449
  * Candidate selection follows pi-coding-agent 0.84's
390
450
  * `loadProjectContextFiles`: an override wins over the base file in the same
391
- * directory. Clio's structured override additionally resets the inherited
451
+ * directory. Clio's override additionally resets the inherited
392
452
  * handbook chain for that subtree, as required by the project-context
393
453
  * contract. Handbooks below the override may add new layers.
394
454
  */
@@ -416,13 +476,15 @@ export function loadProjectClioMd(cwd: string): LoadedProjectClioMd {
416
476
  const errors: ClioMdLoadError[] = [];
417
477
  for (const filePath of selectedPaths) {
418
478
  const read = readClioMdPath(filePath);
419
- if (read.ok) files.push({ path: filePath, value: read.value });
479
+ if (read.ok) files.push({ path: filePath, source: read.source, value: read.value });
420
480
  else errors.push({ path: filePath, error: read.error });
421
481
  }
422
482
  return { files, errors, value: mergeClioMdFiles(files) };
423
483
  }
424
484
 
425
- export function tryReadClioMd(cwd: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } | null {
485
+ export function tryReadClioMd(
486
+ cwd: string,
487
+ ): { ok: true; source: string; value: ParsedClioMd | null } | { ok: false; error: string } | null {
426
488
  const filePath = join(cwd, "CLIO-CODER.md");
427
489
  if (!existsSync(filePath)) return null;
428
490
  return readClioMdPath(filePath);
@@ -0,0 +1,121 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { detectProjectType } from "../../session/workspace/project-type.js";
3
+ import { computeFingerprint, isStale } from "../fingerprint.js";
4
+ import { codewikiNeedsBackfill, readCodewiki } from "./artifact.js";
5
+ import type {
6
+ CodewikiArtifactRef,
7
+ CodewikiBuildWorkerOutcome,
8
+ CodewikiBuildWorkerRequest,
9
+ CodewikiBuildWorkerResult,
10
+ } from "./build-worker-protocol.js";
11
+ import { buildCodewiki, type CodewikiBuildOptions, syncCodewiki, updateCodewikiPaths } from "./indexer.js";
12
+ import type { Codewiki } from "./schema.js";
13
+
14
+ function isArtifactRef(value: Codewiki | CodewikiArtifactRef | null): value is CodewikiArtifactRef {
15
+ return value !== null && "source" in value && value.source === "artifact";
16
+ }
17
+
18
+ /**
19
+ * Worker-side build policy; options use the indexer's source reader for
20
+ * deterministic race tests. The outcome omits the artifact when it was handed
21
+ * in by reference and left unchanged, so the coordinator never receives a
22
+ * clone of what it already holds.
23
+ */
24
+ export async function executeCodewikiBuildOutcome(
25
+ request: CodewikiBuildWorkerRequest,
26
+ options: CodewikiBuildOptions = {},
27
+ ): Promise<CodewikiBuildWorkerOutcome> {
28
+ const handed = request.kind === "build" ? null : request.current;
29
+ // Resolved lazily: the unchanged-ensure path below never needs the artifact's
30
+ // contents, and parsing it there would put the cost back that the reference
31
+ // took out. Read once, then reused by every later step.
32
+ let resolved: Codewiki | null | undefined = isArtifactRef(handed) ? undefined : handed;
33
+ const resolveCurrent = (): Codewiki | null => {
34
+ if (resolved === undefined) resolved = readCodewiki(request.cwd);
35
+ return resolved;
36
+ };
37
+ // A reference the disk no longer honors (deleted or corrupt between the
38
+ // coordinator's read and this resolution) is exactly the "no artifact" case:
39
+ // an ensure rebuilds from source as it would have with `current: null`,
40
+ // and an incremental refuses rather than fabricating an index from one path.
41
+ const requireCurrent = (): Codewiki => {
42
+ const current = resolveCurrent();
43
+ if (!current) throw new Error("codewiki artifact referenced by the coordinator is unreadable; rebuild it");
44
+ return current;
45
+ };
46
+ let unreadable = false;
47
+ const buildOptions: CodewikiBuildOptions = {
48
+ ...options,
49
+ readFile: (path) => {
50
+ try {
51
+ const text = options.readFile ? options.readFile(path) : readFileSync(path, "utf8");
52
+ if (text === null) unreadable = true;
53
+ return text;
54
+ } catch {
55
+ unreadable = true;
56
+ return null;
57
+ }
58
+ },
59
+ };
60
+ if (request.kind === "ensure" && handed !== null) {
61
+ const needsBackfill = isArtifactRef(handed) ? handed.needsBackfill : codewikiNeedsBackfill(handed);
62
+ if (!needsBackfill) {
63
+ const fingerprint = isArtifactRef(handed)
64
+ ? computeFingerprint(request.cwd, null, { artifactLoc: handed.loc })
65
+ : computeFingerprint(request.cwd, handed);
66
+ if (request.previous && !isStale(request.previous, fingerprint)) {
67
+ return { codewiki: isArtifactRef(handed) ? null : handed, fingerprint, changed: false };
68
+ }
69
+ }
70
+ }
71
+ let current: Codewiki | null = handed === null ? null : resolveCurrent();
72
+ if (request.kind === "incremental") {
73
+ const base = requireCurrent();
74
+ current = await updateCodewikiPaths(request.cwd, base, request.paths, buildOptions);
75
+ // An unchanged notification proves nothing about unrelated files. Retain
76
+ // the old global baseline so the next ensure still detects external edits.
77
+ if (current === base && request.previous && !unreadable) {
78
+ return { codewiki: isArtifactRef(handed) ? null : base, fingerprint: request.previous, changed: false };
79
+ }
80
+ }
81
+
82
+ for (let attempt = 0; attempt < 3; attempt += 1) {
83
+ // Both scans bracket all source reads, including sync's cached parse inputs.
84
+ // Never stamp a post-build tree that changed after an earlier file was read.
85
+ const before = computeFingerprint(request.cwd, current);
86
+ unreadable = false;
87
+ current = current
88
+ ? await syncCodewiki(request.cwd, current, buildOptions)
89
+ : await buildCodewiki(
90
+ {
91
+ cwd: request.cwd,
92
+ language:
93
+ (request.kind === "incremental" ? requireCurrent().language : request.language) ??
94
+ detectProjectType(request.cwd),
95
+ },
96
+ buildOptions,
97
+ );
98
+ const after = computeFingerprint(request.cwd, current);
99
+ if (!isStale(before, after) && !unreadable) {
100
+ return { codewiki: current, fingerprint: after, changed: true };
101
+ }
102
+ }
103
+ throw new Error("codewiki source snapshot did not stabilize after 3 attempts; previous index preserved");
104
+ }
105
+
106
+ /**
107
+ * In-process form for callers that hold the artifact: the worker outcome with
108
+ * the handed object substituted wherever the reconciliation left it unchanged.
109
+ */
110
+ export async function executeCodewikiBuild(
111
+ request: CodewikiBuildWorkerRequest,
112
+ options: CodewikiBuildOptions = {},
113
+ ): Promise<CodewikiBuildWorkerResult> {
114
+ const outcome = await executeCodewikiBuildOutcome(request, options);
115
+ if (outcome.codewiki)
116
+ return { codewiki: outcome.codewiki, fingerprint: outcome.fingerprint, changed: outcome.changed };
117
+ const handed = request.kind === "build" ? null : request.current;
118
+ const current = handed && !isArtifactRef(handed) ? handed : readCodewiki(request.cwd);
119
+ if (!current) throw new Error("codewiki reconciliation returned no artifact");
120
+ return { codewiki: current, fingerprint: outcome.fingerprint, changed: outcome.changed };
121
+ }
@@ -1,6 +1,22 @@
1
1
  import type { Fingerprint } from "../fingerprint.js";
2
2
  import type { Codewiki } from "./schema.js";
3
3
 
4
+ /**
5
+ * The committed artifact, named instead of shipped. Structured-cloning a
6
+ * parsed index into the worker and back costs main-thread time proportional to
7
+ * the index size on every reconciliation, including the `code_nav` calls that
8
+ * reconcile nothing. The coordinator already holds the artifact lease, so the
9
+ * file on disk is exactly the object it would have cloned; the worker reads it
10
+ * only on the paths that need its contents.
11
+ */
12
+ export interface CodewikiArtifactRef {
13
+ source: "artifact";
14
+ /** `codewikiNeedsBackfill(current)`, computed where the object is already parsed. */
15
+ needsBackfill: boolean;
16
+ /** Source line total the artifact records, so an unchanged fingerprint matches the committed one exactly. */
17
+ loc: number;
18
+ }
19
+
4
20
  export type CodewikiBuildWorkerRequest =
5
21
  | { kind: "build"; cwd: string; language: Codewiki["language"] }
6
22
  | {
@@ -8,10 +24,17 @@ export type CodewikiBuildWorkerRequest =
8
24
  cwd: string;
9
25
  /** Optional when neither state nor an existing artifact identifies the project. */
10
26
  language?: Codewiki["language"];
11
- current: Codewiki | null;
27
+ current: Codewiki | CodewikiArtifactRef | null;
12
28
  previous: Fingerprint | null;
13
29
  }
14
- | { kind: "incremental"; cwd: string; current: Codewiki; paths: string[] };
30
+ | {
31
+ kind: "incremental";
32
+ cwd: string;
33
+ current: Codewiki | CodewikiArtifactRef;
34
+ paths: string[];
35
+ /** Retained for no-op batches; absence requires global reconciliation. */
36
+ previous?: Fingerprint | null;
37
+ };
15
38
 
16
39
  export interface CodewikiBuildWorkerResult {
17
40
  codewiki: Codewiki;
@@ -19,6 +42,17 @@ export interface CodewikiBuildWorkerResult {
19
42
  changed: boolean;
20
43
  }
21
44
 
45
+ /**
46
+ * What the worker posts back. An unchanged reconciliation of an artifact it
47
+ * was handed by reference leaves `codewiki` null: the caller still holds the
48
+ * object, and returning it would clone the whole artifact a second time.
49
+ */
50
+ export interface CodewikiBuildWorkerOutcome {
51
+ codewiki: Codewiki | null;
52
+ fingerprint: Fingerprint;
53
+ changed: boolean;
54
+ }
55
+
22
56
  export type CodewikiBuildWorkerMessage =
23
- | { ok: true; result: CodewikiBuildWorkerResult }
57
+ | { ok: true; result: CodewikiBuildWorkerOutcome }
24
58
  | { ok: false; error: string; stack?: string };