@iowarp/clio-coder 0.4.4 → 0.4.5

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 (555) hide show
  1. package/CHANGELOG.md +92 -2
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
  5. package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
  17. package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/{chunk-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
  24. package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
  27. package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
  34. package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
  43. package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
  66. package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
  79. package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
  80. package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
  93. package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
  101. package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
  135. package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
  137. package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
  139. package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/chunk-SD7SHNDW.js +15 -0
  141. package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
  154. package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
  177. package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +44 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
  195. package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
  198. package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
  206. package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
  207. package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
  208. package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
  212. package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
  213. package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
  214. package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
  215. package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
  216. package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
  221. package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
  229. package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
  230. package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
  231. package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
  232. package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
  233. package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
  235. package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
  239. package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
  241. package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
  242. package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
  243. package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
  244. package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
  256. package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
  257. package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
  258. package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -88
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +7 -6
  267. package/docs/architecture/acp.md +10 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/context-engine.md +44 -59
  270. package/docs/architecture/context-working-set.md +7 -9
  271. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  272. package/docs/architecture/evidence-and-memory.md +10 -0
  273. package/docs/architecture/pi-boundary.md +37 -7
  274. package/docs/architecture/prompt-envelope-and-tools.md +7 -7
  275. package/docs/architecture/session-lifecycle.md +4 -4
  276. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  277. package/docs/guide/commands-and-modes.md +49 -36
  278. package/docs/guide/configuration-and-targets.md +7 -2
  279. package/docs/guide/configuration-reference.md +13 -3
  280. package/docs/guide/environment-variables.md +6 -2
  281. package/docs/guide/fleet-dispatch.md +12 -0
  282. package/docs/guide/installation-and-lifecycle.md +35 -9
  283. package/docs/guide/proactive-memory.md +1 -1
  284. package/docs/guide/skills-marketplace.md +11 -3
  285. package/docs/guide/tool-usage.md +9 -2
  286. package/docs/process/development-pipeline.md +10 -10
  287. package/docs/process/documentation-guide.md +2 -2
  288. package/docs/process/eval-runner.md +15 -0
  289. package/docs/process/evals-internal.md +1 -1
  290. package/docs/process/release-cut-checklist.md +6 -6
  291. package/evals/README.md +4 -0
  292. package/evals/behavioral-corpus-grader.mjs +147 -14
  293. package/evals/behavioral-model-negative-control.yaml +1 -0
  294. package/evals/behavioral-model.yaml +266 -1
  295. package/evals/fixtures/docs-retrieval.json +102 -0
  296. package/evals/fixtures/scalar-decision.json +17 -0
  297. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  298. package/evals/fixtures/source-explanation.json +74 -0
  299. package/evals/fixtures/tool-arguments.json +18 -0
  300. package/evals/fixtures/tool-surface/read.txt +4 -0
  301. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  302. package/evals/no-edit-memory-grader.mjs +149 -0
  303. package/evals/scalar-decision-grader.py +41 -0
  304. package/evals/scalar-decision-machinery.ts +145 -0
  305. package/evals/source-explanation-grader.mjs +118 -0
  306. package/evals/tool-surface-grader.mjs +53 -0
  307. package/evals/tool-surface-model.yaml +274 -0
  308. package/package.json +14 -14
  309. package/skills/README.md +6 -6
  310. package/skills/registry.yaml +1 -1
  311. package/skills/skill-marketplace.json +1 -1
  312. package/src/cli/bootstrap-generate.ts +6 -0
  313. package/src/cli/config-inspect.ts +24 -7
  314. package/src/cli/config-trust.ts +62 -0
  315. package/src/cli/config.ts +8 -0
  316. package/src/cli/context-map.ts +75 -14
  317. package/src/cli/context.ts +46 -17
  318. package/src/cli/eval.ts +17 -3
  319. package/src/cli/modes/print.ts +32 -4
  320. package/src/cli/run.ts +16 -14
  321. package/src/cli/skills-eval.ts +10 -8
  322. package/src/cli/steer-channel.ts +31 -18
  323. package/src/cli/targets.ts +83 -31
  324. package/src/cli/tasks.ts +10 -1
  325. package/src/cli/upgrade.ts +9 -6
  326. package/src/cli/usage.ts +24 -0
  327. package/src/cli/wiki-generate.ts +239 -96
  328. package/src/core/bash-exec.ts +43 -15
  329. package/src/core/bus-events.ts +15 -0
  330. package/src/core/config.ts +33 -14
  331. package/src/core/defaults.ts +5 -4
  332. package/src/core/file-references.ts +11 -1
  333. package/src/core/incomplete-installation.ts +3 -1
  334. package/src/core/settings-layers.ts +21 -5
  335. package/src/core/termination.ts +26 -9
  336. package/src/core/untrusted-content.ts +16 -0
  337. package/src/core/workspace-trust.ts +179 -0
  338. package/src/domains/agents/builtins/coder.md +4 -2
  339. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  340. package/src/domains/agents/builtins/documenter.md +7 -4
  341. package/src/domains/agents/builtins/researcher.md +1 -0
  342. package/src/domains/agents/builtins/scout.md +7 -1
  343. package/src/domains/agents/result-contract.ts +199 -26
  344. package/src/domains/context/bootstrap-prompt.ts +11 -9
  345. package/src/domains/context/bootstrap.ts +74 -39
  346. package/src/domains/context/clio-md.ts +88 -26
  347. package/src/domains/context/codewiki/build-operation.ts +121 -0
  348. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  349. package/src/domains/context/codewiki/build-worker.ts +3 -35
  350. package/src/domains/context/codewiki/coordinator.ts +36 -6
  351. package/src/domains/context/codewiki/indexer.ts +59 -19
  352. package/src/domains/context/contract.ts +6 -2
  353. package/src/domains/context/extension.ts +72 -10
  354. package/src/domains/context/fingerprint.ts +39 -34
  355. package/src/domains/context/index.ts +7 -1
  356. package/src/domains/context/prompt-context.ts +55 -14
  357. package/src/domains/context/refresh.ts +9 -57
  358. package/src/domains/context/wiki/assemble.ts +14 -10
  359. package/src/domains/context/wiki/evidence.ts +209 -0
  360. package/src/domains/context/wiki/generate.ts +201 -67
  361. package/src/domains/context/wiki/meta.ts +10 -2
  362. package/src/domains/context/wiki/plan-store.ts +70 -14
  363. package/src/domains/context/wiki/plan.ts +71 -14
  364. package/src/domains/context/wiki/prompts.ts +42 -1
  365. package/src/domains/context/wiki/source-content.ts +106 -0
  366. package/src/domains/context/wiki/staleness.ts +33 -22
  367. package/src/domains/context/working-set/contract.ts +8 -2
  368. package/src/domains/context/working-set/engine.ts +17 -4
  369. package/src/domains/context/working-set/fold.ts +15 -2
  370. package/src/domains/context/working-set/marker.ts +2 -1
  371. package/src/domains/context/working-set/project.ts +18 -7
  372. package/src/domains/context/working-set/recall.ts +82 -56
  373. package/src/domains/dispatch/active-route-planner.ts +6 -3
  374. package/src/domains/dispatch/admission-queue.ts +19 -7
  375. package/src/domains/dispatch/admission.ts +3 -3
  376. package/src/domains/dispatch/budget-envelope.ts +47 -82
  377. package/src/domains/dispatch/capacity-lease.ts +57 -19
  378. package/src/domains/dispatch/contract.ts +10 -2
  379. package/src/domains/dispatch/event-pump.ts +28 -7
  380. package/src/domains/dispatch/execution-role.ts +49 -2
  381. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  382. package/src/domains/dispatch/extension.ts +190 -105
  383. package/src/domains/dispatch/fleet-run.ts +20 -0
  384. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  385. package/src/domains/dispatch/parallel-writers.ts +34 -0
  386. package/src/domains/dispatch/reservation-store.ts +8 -34
  387. package/src/domains/dispatch/route-approval.ts +3 -3
  388. package/src/domains/dispatch/route-observer.ts +4 -2
  389. package/src/domains/dispatch/route-quality.ts +6 -1
  390. package/src/domains/dispatch/types.ts +4 -3
  391. package/src/domains/dispatch/worker-spawn.ts +58 -21
  392. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  393. package/src/domains/eval/compare/behavioral.ts +81 -14
  394. package/src/domains/eval/compare/compare.ts +15 -5
  395. package/src/domains/eval/compare/envelope.ts +12 -5
  396. package/src/domains/eval/metrics/context.ts +24 -1
  397. package/src/domains/eval/metrics/tracked.ts +4 -28
  398. package/src/domains/eval/reports/comparison.ts +9 -9
  399. package/src/domains/eval/runners/clio-run.ts +5 -1
  400. package/src/domains/eval/schema/suite.ts +2 -0
  401. package/src/domains/eval/schema/validate.ts +1 -0
  402. package/src/domains/eval/suites/run.ts +189 -13
  403. package/src/domains/eval/verifiers/integrity.ts +39 -0
  404. package/src/domains/eval/verifiers/patch.ts +58 -2
  405. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  406. package/src/domains/evidence/build.ts +4 -2
  407. package/src/domains/interop/registry.ts +2 -2
  408. package/src/domains/middleware/hooks-io.ts +45 -26
  409. package/src/domains/middleware/hooks.ts +6 -0
  410. package/src/domains/middleware/injection-screen.ts +23 -0
  411. package/src/domains/middleware/rules.ts +5 -1
  412. package/src/domains/middleware/stalled-turn.ts +18 -3
  413. package/src/domains/middleware/task-board-reminder.ts +4 -2
  414. package/src/domains/middleware/task-nudge.ts +4 -1
  415. package/src/domains/mux/contract.ts +34 -1
  416. package/src/domains/mux/dock-controller.ts +8 -1
  417. package/src/domains/mux/index.ts +1 -0
  418. package/src/domains/mux/socket-client.ts +13 -3
  419. package/src/domains/observability/contract.ts +2 -2
  420. package/src/domains/observability/projection.ts +30 -9
  421. package/src/domains/prompts/compiler.ts +10 -2
  422. package/src/domains/prompts/contract.ts +7 -4
  423. package/src/domains/prompts/extension.ts +28 -64
  424. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  425. package/src/domains/prompts/fragments/operating/contract.md +10 -0
  426. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  427. package/src/domains/prompts/fragments/wiki/page.md +28 -15
  428. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  429. package/src/domains/prompts/preload-prefix.ts +31 -0
  430. package/src/domains/prompts/preload.ts +135 -61
  431. package/src/domains/providers/auth/backend-file.ts +15 -11
  432. package/src/domains/providers/auth/storage.ts +3 -5
  433. package/src/domains/providers/catalog.ts +18 -3
  434. package/src/domains/providers/runtime-resolution.ts +11 -9
  435. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  436. package/src/domains/resources/skills/promotion.ts +8 -1
  437. package/src/domains/safety/action-classifier.ts +9 -0
  438. package/src/domains/safety/autonomy.ts +10 -1
  439. package/src/domains/safety/contract.ts +5 -1
  440. package/src/domains/safety/default-path-policy.ts +11 -0
  441. package/src/domains/safety/extension.ts +11 -2
  442. package/src/domains/safety/policy-engine.ts +189 -32
  443. package/src/domains/safety/project-policy.ts +7 -2
  444. package/src/domains/safety/workspace-trust.ts +43 -0
  445. package/src/domains/session/compaction/compact.ts +384 -21
  446. package/src/domains/session/compaction/cut-point.ts +42 -5
  447. package/src/domains/session/compaction/tokens.ts +9 -1
  448. package/src/domains/session/decision-board.ts +43 -33
  449. package/src/domains/session/entries.ts +169 -4
  450. package/src/domains/session/prompt-manifest.ts +47 -8
  451. package/src/domains/session/task-board.ts +21 -3
  452. package/src/domains/user-tasks/handoff.ts +16 -0
  453. package/src/engine/acp/adapter.ts +44 -12
  454. package/src/engine/acp/server.ts +1 -0
  455. package/src/engine/acp/transport.ts +2 -1
  456. package/src/engine/acp/types.ts +6 -1
  457. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  458. package/src/engine/api-registry.ts +19 -2
  459. package/src/engine/apis/openai-completions.ts +13 -6
  460. package/src/engine/apis/output-budget.ts +26 -10
  461. package/src/engine/claude/sdk-runtime.ts +4 -3
  462. package/src/engine/env-api-keys.ts +2 -1
  463. package/src/engine/external-subprocess.ts +14 -3
  464. package/src/engine/loop-guard.ts +19 -2
  465. package/src/engine/provider-diagnostics.ts +129 -0
  466. package/src/engine/provider-payload.ts +3 -1
  467. package/src/engine/worker-runtime.ts +13 -2
  468. package/src/engine/worker-tools.ts +5 -1
  469. package/src/entry/extension-reload.ts +1 -0
  470. package/src/entry/orchestrator.ts +53 -15
  471. package/src/interactive/chat-loop-messages.ts +12 -4
  472. package/src/interactive/chat-loop.ts +115 -45
  473. package/src/interactive/chat-renderer.ts +60 -0
  474. package/src/interactive/context-recall-command.ts +2 -1
  475. package/src/interactive/dispatch-board.ts +17 -2
  476. package/src/interactive/editor-submit.ts +13 -0
  477. package/src/interactive/interactive-application.ts +8 -2
  478. package/src/interactive/interactive-event-projection.ts +7 -1
  479. package/src/interactive/interactive-presentation.ts +15 -7
  480. package/src/interactive/interactive-slash-runtime.ts +2 -0
  481. package/src/interactive/layout.ts +2 -1
  482. package/src/interactive/model-session-replay.ts +2 -2
  483. package/src/interactive/overlay-frame.ts +1 -0
  484. package/src/interactive/overlay-general-openers.ts +3 -1
  485. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  486. package/src/interactive/overlays/ask-user.ts +1 -0
  487. package/src/interactive/overlays/message-picker.ts +1 -1
  488. package/src/interactive/renderers/tool-execution.ts +17 -1
  489. package/src/interactive/renderers/worker-entry.ts +25 -10
  490. package/src/interactive/slash-commands.ts +9 -7
  491. package/src/interactive/turn-context.ts +221 -53
  492. package/src/interactive/turn-middleware.ts +3 -1
  493. package/src/interactive/turn-persistence.ts +3 -0
  494. package/src/interactive/turn-runtime.ts +11 -2
  495. package/src/interactive/turn-state.ts +10 -9
  496. package/src/interactive/watch-pane.ts +18 -4
  497. package/src/interactive/worker-stream.ts +7 -7
  498. package/src/tools/agent-tools.ts +6 -3
  499. package/src/tools/bash.ts +1 -1
  500. package/src/tools/builtin-tool-catalog.ts +9 -2
  501. package/src/tools/codewiki/code-nav.ts +4 -10
  502. package/src/tools/compete-judge-task.ts +71 -0
  503. package/src/tools/compete-worktrees.ts +34 -0
  504. package/src/tools/context/index.ts +32 -7
  505. package/src/tools/context/surface.ts +15 -4
  506. package/src/tools/decide.ts +1 -1
  507. package/src/tools/dispatch-admission.ts +12 -1
  508. package/src/tools/dispatch-arguments.ts +38 -1
  509. package/src/tools/dispatch-plan.ts +7 -7
  510. package/src/tools/dispatch-runner.ts +48 -32
  511. package/src/tools/dispatch-schema.ts +30 -23
  512. package/src/tools/dispatch-scout-admission.ts +10 -44
  513. package/src/tools/dispatch-scout.ts +2 -3
  514. package/src/tools/find.ts +13 -4
  515. package/src/tools/grep.ts +13 -1
  516. package/src/tools/ls.ts +7 -1
  517. package/src/tools/monitor.ts +26 -11
  518. package/src/tools/network-policy.ts +11 -24
  519. package/src/tools/observation.ts +39 -2
  520. package/src/tools/read.ts +112 -15
  521. package/src/tools/registry.ts +54 -17
  522. package/src/tools/result-shaping.ts +110 -2
  523. package/src/tools/tasks.ts +33 -7
  524. package/src/tools/verify/frontend.ts +67 -30
  525. package/src/tools/verify/numeric.ts +6 -1
  526. package/src/tools/web-fetch-network.ts +179 -0
  527. package/src/tools/web-fetch-surface.ts +2 -1
  528. package/src/tools/web-fetch.ts +15 -13
  529. package/src/tools/worker-evidence.ts +27 -0
  530. package/src/worker/spec-contract.ts +12 -8
  531. package/dist/builtins-WGALA46I.js +0 -22
  532. package/dist/chunk-2WZ546HR.js +0 -792
  533. package/dist/chunk-5PSMVOLM.js +0 -56
  534. package/dist/chunk-EL24TAU4.js +0 -1560
  535. package/dist/chunk-IZXGRF7P.js +0 -4048
  536. package/dist/chunk-JVCV3ICN.js +0 -47
  537. package/dist/chunk-MNJGS2IN.js +0 -33
  538. package/dist/chunk-O5CVSAG5.js +0 -122
  539. package/dist/chunk-ODGTEFFI.js +0 -50
  540. package/dist/chunk-OQE5J4C6.js +0 -73
  541. package/dist/chunk-UUVG37B4.js +0 -244
  542. package/dist/chunk-V6HJFQZE.js +0 -228
  543. package/dist/clio-QLICPCF5.js +0 -25
  544. package/dist/configure-VEPX4NMX.js +0 -55
  545. package/dist/context-clear-S4ZJCQUX.js +0 -182
  546. package/dist/detail-A7JAVSIG.js +0 -98
  547. package/dist/evidence-4F5USFKH.js +0 -208
  548. package/dist/fleet-view-MN2VG4MR.js +0 -101
  549. package/dist/inventory-C26CFDRR.js +0 -101
  550. package/dist/preload-P6DGH2PZ.js +0 -13
  551. package/dist/slash-commands-ZXPJD64J.js +0 -92
  552. package/dist/tasks-IPAGMEIX.js +0 -36
  553. package/dist/tools-EFFEAIDP.js +0 -28
  554. package/dist/verify-FWYGPKMR.js +0 -29
  555. package/dist/wiki-generate-743CIGJW.js +0 -476
@@ -1,43 +1,11 @@
1
1
  import { parentPort, workerData } from "node:worker_threads";
2
- import { detectProjectType } from "../../session/workspace/project-type.js";
3
- import { computeFingerprint, isStale } from "../fingerprint.js";
4
- import { codewikiNeedsBackfill } from "./artifact.js";
5
- import type {
6
- CodewikiBuildWorkerMessage,
7
- CodewikiBuildWorkerRequest,
8
- CodewikiBuildWorkerResult,
9
- } from "./build-worker-protocol.js";
10
- import { buildCodewiki, syncCodewiki, updateCodewikiPaths } from "./indexer.js";
11
-
12
- async function execute(request: CodewikiBuildWorkerRequest): Promise<CodewikiBuildWorkerResult> {
13
- if (request.kind === "build") {
14
- const codewiki = await buildCodewiki({ cwd: request.cwd, language: request.language });
15
- return { codewiki, fingerprint: computeFingerprint(request.cwd, codewiki), changed: true };
16
- }
17
- if (request.kind === "incremental") {
18
- const codewiki = await updateCodewikiPaths(request.cwd, request.current, request.paths);
19
- return {
20
- codewiki,
21
- fingerprint: computeFingerprint(request.cwd, codewiki),
22
- changed: codewiki !== request.current,
23
- };
24
- }
25
- if (request.current && !codewikiNeedsBackfill(request.current)) {
26
- const currentFingerprint = computeFingerprint(request.cwd, request.current);
27
- if (request.previous && !isStale(request.previous, currentFingerprint)) {
28
- return { codewiki: request.current, fingerprint: currentFingerprint, changed: false };
29
- }
30
- }
31
- const codewiki = request.current
32
- ? await syncCodewiki(request.cwd, request.current)
33
- : await buildCodewiki({ cwd: request.cwd, language: request.language ?? detectProjectType(request.cwd) });
34
- return { codewiki, fingerprint: computeFingerprint(request.cwd, codewiki), changed: true };
35
- }
2
+ import { executeCodewikiBuildOutcome } from "./build-operation.js";
3
+ import type { CodewikiBuildWorkerMessage, CodewikiBuildWorkerRequest } from "./build-worker-protocol.js";
36
4
 
37
5
  const port = parentPort;
38
6
  if (!port) throw new Error("codewiki build worker requires a worker_threads parent");
39
7
 
40
- execute(workerData as CodewikiBuildWorkerRequest).then(
8
+ executeCodewikiBuildOutcome(workerData as CodewikiBuildWorkerRequest).then(
41
9
  (result) => {
42
10
  port.postMessage({ ok: true, result } satisfies CodewikiBuildWorkerMessage);
43
11
  port.close();
@@ -4,9 +4,11 @@ import { resolve } from "node:path";
4
4
  import { pathToFileURL } from "node:url";
5
5
  import { Worker } from "node:worker_threads";
6
6
  import { withStateFileLock } from "../../../core/state-file-lock.js";
7
- import { codewikiPath, readCodewiki, writeCodewiki } from "./artifact.js";
7
+ import { codewikiNeedsBackfill, codewikiPath, readCodewiki, writeCodewiki } from "./artifact.js";
8
8
  import type {
9
+ CodewikiArtifactRef,
9
10
  CodewikiBuildWorkerMessage,
11
+ CodewikiBuildWorkerOutcome,
10
12
  CodewikiBuildWorkerRequest,
11
13
  CodewikiBuildWorkerResult,
12
14
  } from "./build-worker-protocol.js";
@@ -30,7 +32,30 @@ function buildWorkerUrl(): URL {
30
32
  );
31
33
  }
32
34
 
33
- async function executeInWorker(request: CodewikiBuildWorkerRequest): Promise<CodewikiBuildWorkerResult> {
35
+ function artifactRef(current: Codewiki): CodewikiArtifactRef {
36
+ return {
37
+ source: "artifact",
38
+ needsBackfill: codewikiNeedsBackfill(current),
39
+ loc: current.files.reduce((sum, file) => (file.lang === "config" ? sum : sum + file.loc), 0),
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Hand the worker a reference to the committed artifact instead of the parsed
45
+ * object. Cloning the object serializes it on this thread, deserializes it on
46
+ * the worker, and repeats both on the way back, so the cost grows with index
47
+ * size and lands on the thread that renders the TUI. The substitution is made
48
+ * only when the selector returned the very object this transaction read under
49
+ * the lease (`held`), which is the committed file by construction; any other
50
+ * object is shipped as it was given.
51
+ */
52
+ function byReference(request: CodewikiBuildWorkerRequest, held: Codewiki | null): CodewikiBuildWorkerRequest {
53
+ if (request.kind === "build" || request.current === null || "source" in request.current) return request;
54
+ if (held === null || request.current !== held) return request;
55
+ return { ...request, current: artifactRef(held) };
56
+ }
57
+
58
+ async function executeInWorker(request: CodewikiBuildWorkerRequest): Promise<CodewikiBuildWorkerOutcome> {
34
59
  // Do not inherit test-runner/application `--import` hooks. In particular,
35
60
  // `--import tsx` would be re-resolved from a hermetic fixture cwd before the
36
61
  // source bootstrap can install its absolute loader.
@@ -44,7 +69,7 @@ async function executeInWorker(request: CodewikiBuildWorkerRequest): Promise<Cod
44
69
  });
45
70
  let timer: NodeJS.Timeout | undefined;
46
71
  try {
47
- return await new Promise<CodewikiBuildWorkerResult>((resolve, reject) => {
72
+ return await new Promise<CodewikiBuildWorkerOutcome>((resolve, reject) => {
48
73
  let settled = false;
49
74
  const finish = (callback: () => void): void => {
50
75
  if (settled) return;
@@ -154,7 +179,10 @@ export function coordinateCodewikiWrite(
154
179
  const current = options.readCurrent?.(workspace) ?? readCodewiki(workspace);
155
180
  const request = await select(current, workspace);
156
181
  if (!request) return null;
157
- const worker = await executeInWorker({ ...request, cwd: workspace });
182
+ const outcome = await executeInWorker(byReference({ ...request, cwd: workspace }, current));
183
+ const codewiki = outcome.codewiki ?? current;
184
+ if (!codewiki) throw new Error("codewiki reconciliation returned no artifact");
185
+ const worker: CodewikiBuildWorkerResult = { codewiki, fingerprint: outcome.fingerprint, changed: outcome.changed };
158
186
  await options.beforeCommit?.(worker, workspace);
159
187
  const wrote = worker.changed || !existsSync(codewikiPath(workspace));
160
188
  if (wrote) writeCodewiki(workspace, worker.codewiki);
@@ -171,11 +199,13 @@ export function coordinateCodewikiExclusive<T>(cwd: string, task: (workspace: st
171
199
  }
172
200
 
173
201
  /** Build a preview candidate in the worker without acquiring a writer lease or touching disk. */
174
- export function buildCodewikiCandidate(
202
+ export async function buildCodewikiCandidate(
175
203
  cwd: string,
176
204
  language: Codewiki["language"],
177
205
  ): Promise<CodewikiBuildWorkerResult> {
178
- return executeInWorker({ kind: "build", cwd: resolve(cwd), language });
206
+ const outcome = await executeInWorker({ kind: "build", cwd: resolve(cwd), language });
207
+ if (!outcome.codewiki) throw new Error("codewiki build returned no artifact");
208
+ return { codewiki: outcome.codewiki, fingerprint: outcome.fingerprint, changed: outcome.changed };
179
209
  }
180
210
 
181
211
  /** Await every writer already admitted for one workspace, including idle refresh. */
@@ -850,11 +850,6 @@ function candidatePathsForImport(cwd: string, fromRel: string, specifier: string
850
850
  const stripped = base.replace(/\.js$/, "");
851
851
  for (const ext of [".ts", ".tsx", ".mts", ".cts"]) candidates.push(`${stripped}${ext}`);
852
852
  }
853
- if (/^[.]+[A-Za-z_]/.test(cleaned)) {
854
- const pythonModule = cleaned.replace(/^\.+/, "").replace(/\./g, "/");
855
- const pythonBase = resolve(fromDir, pythonModule);
856
- candidates.push(`${pythonBase}.py`, join(pythonBase, "__init__.py"));
857
- }
858
853
  return uniqueSorted(
859
854
  candidates.map((candidate) => normalizeRel(cwd, candidate)).filter((candidate) => !candidate.startsWith("..")),
860
855
  );
@@ -878,10 +873,36 @@ function createImportResolver(cwd: string): {
878
873
  const candidatesFor = (fromRel: string, specifier: string): string[] => {
879
874
  // The candidate set is a function of the directory, not the file: every
880
875
  // sibling importing the same specifier resolves through the same list.
881
- const key = `${dirname(fromRel)}\0${specifier}`;
876
+ const python = /\.pyw?$/.test(fromRel);
877
+ const key = `${python}\0${dirname(fromRel)}\0${specifier}`;
882
878
  let candidates = candidatesByOrigin.get(key);
883
879
  if (!candidates) {
884
- candidates = candidatePathsForImport(cwd, fromRel, specifier);
880
+ if (python) {
881
+ const fromDir = dirname(fromRel);
882
+ let packageRoot = fromDir;
883
+ while (packageRoot !== "." && isFile(join(packageRoot, "__init__.py"))) {
884
+ packageRoot = dirname(packageRoot);
885
+ }
886
+ const dots = /^\.+/.exec(specifier)?.[0].length ?? 0;
887
+ const modulePath = specifier.slice(dots).replace(/\./g, "/");
888
+ let bases: string[];
889
+ if (dots > 0) {
890
+ const parent = resolve(cwd, fromDir, ...Array<string>(dots - 1).fill(".."));
891
+ // A relative import must stay inside its package tree. Without
892
+ // __init__.py evidence, the workspace bounds namespace packages.
893
+ const root = resolve(cwd, packageRoot === fromDir ? "." : packageRoot);
894
+ const insidePackage = parent !== root || (root === resolve(cwd) && isFile("__init__.py"));
895
+ bases = insidePackage && !relative(root, parent).startsWith("..") ? [join(parent, modulePath)] : [];
896
+ } else {
897
+ bases = [resolve(cwd, modulePath)];
898
+ if (packageRoot !== fromDir && packageRoot !== ".") bases.push(resolve(cwd, packageRoot, modulePath));
899
+ }
900
+ candidates = [...new Set(bases.flatMap((base) => [join(base, "__init__.py"), `${base}.py`]))].map((candidate) =>
901
+ normalizeRel(cwd, candidate),
902
+ );
903
+ } else {
904
+ candidates = candidatePathsForImport(cwd, fromRel, specifier);
905
+ }
885
906
  candidatesByOrigin.set(key, candidates);
886
907
  }
887
908
  return candidates;
@@ -1020,7 +1041,8 @@ export async function buildCodewiki(input: BuildCodewikiInput, options: Codewiki
1020
1041
  /**
1021
1042
  * Apply an incremental update for a set of changed paths. The changed file
1022
1043
  * records and symbols are replaced in-place, and edges are rebuilt from stored
1023
- * imports across the merged file set.
1044
+ * imports across the merged file set. Unchanged content retains its records;
1045
+ * a batch with no index changes returns the original artifact without parsing.
1024
1046
  */
1025
1047
  export async function updateCodewikiPaths(
1026
1048
  cwd: string,
@@ -1045,30 +1067,42 @@ export async function updateCodewikiPaths(
1045
1067
  // Ignore and index metadata can add or remove paths that are not present in
1046
1068
  // the mutation batch itself. Re-enumerate once so incremental visibility
1047
1069
  // remains byte-equivalent to a full build.
1048
- return buildCodewiki({ cwd, language: codewiki.language }, options);
1070
+ return syncCodewiki(cwd, codewiki, options);
1049
1071
  }
1050
1072
  const slicer = options.slicer ?? createSlicer();
1051
- const existingPaths = new Set(codewiki.files.map((file) => file.path));
1073
+ const existingFiles = new Map(codewiki.files.map((file) => [file.path, file]));
1052
1074
  const visiblePaths = new Set(filterWorkspaceFileCandidates(cwd, normalizedPaths, EXCLUDED_DIRS));
1053
1075
  const readFile = options.readFile ?? defaultReadFile;
1054
- const changedPathSet = new Set(normalizedPaths);
1076
+ const currentTexts = new Map<string, string>();
1077
+ const changedPathSet = new Set<string>();
1055
1078
  const rebuildPaths: string[] = [];
1056
- let hasIndexChange = false;
1057
1079
  for (const relPath of normalizedPaths) {
1058
- const wasIndexed = existingPaths.has(relPath);
1080
+ const existing = existingFiles.get(relPath);
1059
1081
  const isCurrentIndexableFile = isIndexablePath(relPath) && visiblePaths.has(relPath);
1060
- if (!wasIndexed && !isCurrentIndexableFile) continue;
1061
- hasIndexChange = true;
1062
- if (isCurrentIndexableFile) rebuildPaths.push(relPath);
1082
+ if (!existing && !isCurrentIndexableFile) continue;
1083
+ if (isCurrentIndexableFile) {
1084
+ const text = readFile(join(cwd, relPath));
1085
+ if (text !== null) {
1086
+ if (existing?.hash === contentHash(text)) continue;
1087
+ currentTexts.set(relPath, text);
1088
+ rebuildPaths.push(relPath);
1089
+ }
1090
+ }
1091
+ changedPathSet.add(relPath);
1063
1092
  }
1064
- if (!hasIndexChange) return codewiki;
1093
+ if (changedPathSet.size === 0) return codewiki;
1065
1094
  const rebuiltFiles: BuiltFile[] = [];
1066
1095
  if (rebuildPaths.length > 0) {
1067
1096
  const treeSitterExtractor = await loadTreeSitterExtractor();
1068
1097
  await treeSitterExtractor.ensureGrammarsForPaths(rebuildPaths);
1069
1098
  for (const relPath of rebuildPaths) {
1070
1099
  await slicer.tick();
1071
- const built = buildFile(cwd, relPath, treeSitterExtractor, readFile);
1100
+ const built = buildFile(
1101
+ cwd,
1102
+ relPath,
1103
+ treeSitterExtractor,
1104
+ (path) => currentTexts.get(normalizeRel(cwd, path)) ?? null,
1105
+ );
1072
1106
  if (built) rebuiltFiles.push(built);
1073
1107
  }
1074
1108
  }
@@ -1123,7 +1157,13 @@ export async function syncCodewiki(
1123
1157
  for (const relPath of indexedFiles.keys()) {
1124
1158
  if (!currentFiles.has(relPath)) changedPaths.add(relPath);
1125
1159
  }
1126
- if (changedPaths.size === 0) return codewiki;
1160
+ if (changedPaths.size === 0) {
1161
+ // A fingerprint-domain upgrade also reconciles resolver changes even
1162
+ // when source hashes still match the old artifact.
1163
+ if (!codewiki.files.some((file) => file.lang === "python")) return codewiki;
1164
+ const edges = await buildEdges(cwd, codewiki.files, slicer);
1165
+ return JSON.stringify(edges) === JSON.stringify(codewiki.edges) ? codewiki : { ...codewiki, edges };
1166
+ }
1127
1167
  const syncOptions: CodewikiBuildOptions = {
1128
1168
  ...options,
1129
1169
  slicer,
@@ -12,9 +12,13 @@ export interface ProjectPromptContext {
12
12
  /**
13
13
  * Absolute paths of the effective project handbooks, ancestor to nearest.
14
14
  * An override resets the inherited chain, so this names exactly the files
15
- * whose content is in `text`; empty when no selected handbook parsed.
15
+ * whose content is in `text`; empty when no selected handbook loaded.
16
16
  */
17
17
  handbookFiles: string[];
18
+ /** Captured authored bytes from the same load as text, ancestor to nearest. */
19
+ handbookSources: ReadonlyArray<{ path: string; source: string }>;
20
+ /** Trusted renderer products, kept separate from authored Markdown. */
21
+ supportFragments: readonly string[];
18
22
  }
19
23
 
20
24
  /**
@@ -52,7 +56,7 @@ export interface ContextContract extends DomainContract {
52
56
  renderPromptContext(cwd: string): ProjectPromptContext;
53
57
  /**
54
58
  * Effective project handbook fields (project name, conventions, invariants)
55
- * or null when no selected handbook parses. Never returns raw handbook
59
+ * or null when no selected handbook has a structured projection. Never returns raw handbook
56
60
  * text; used by dispatch to give workers bounded project context.
57
61
  */
58
62
  projectStructuredContext(cwd?: string): ProjectStructuredContext | null;
@@ -135,9 +135,13 @@ export interface ContextBundleOptions {
135
135
 
136
136
  function collectStartupHints(cwd: string, options: ContextBundleOptions = {}): string[] {
137
137
  const hints: string[] = [];
138
+ // Runs at session start with the TUI mounting. Detection walks the tree and
139
+ // reads every header, so an indexed project answers from the type its state
140
+ // already records; only a never-indexed directory pays for detection.
141
+ const state = readClioState(cwd);
138
142
  let projectType: ReturnType<typeof detectProjectType>;
139
143
  try {
140
- projectType = detectProjectType(cwd);
144
+ projectType = state?.projectType ?? detectProjectType(cwd);
141
145
  } catch {
142
146
  projectType = "unknown";
143
147
  }
@@ -159,7 +163,6 @@ function collectStartupHints(cwd: string, options: ContextBundleOptions = {}): s
159
163
  if (!contract.ok) {
160
164
  hints.push(`clio-coder: validation contract ignored, rigor stays normal: ${describeValidationContract(contract)}`);
161
165
  }
162
- const state = readClioState(cwd);
163
166
  if (!state) return hints;
164
167
  if (state.contextSources !== undefined && adoptionSourcesChanged(state.contextSources, { cwd })) {
165
168
  hints.push("clio-coder: Imported agent context changed. Run /context init --adopt to refresh.");
@@ -202,7 +205,16 @@ export function createContextBundle(
202
205
  // mounted; an edge rebuild here is the same cost as one at start.
203
206
  await coordinateCodewikiWrite(
204
207
  workspace,
205
- (current) => (current ? { kind: "incremental", cwd: workspace, current, paths: rel } : null),
208
+ (current) =>
209
+ current
210
+ ? {
211
+ kind: "incremental",
212
+ cwd: workspace,
213
+ current,
214
+ paths: rel,
215
+ previous: readClioState(workspace)?.fingerprint ?? null,
216
+ }
217
+ : null,
206
218
  {
207
219
  requireExisting: true,
208
220
  afterCommit: ({ codewiki, fingerprint, changed }, committedWorkspace) => {
@@ -251,6 +263,43 @@ export function createContextBundle(
251
263
  },
252
264
  };
253
265
 
266
+ function promptSourceState(cwd: string): string | null {
267
+ try {
268
+ return JSON.stringify(renderPromptContext(cwd));
269
+ } catch {
270
+ // Enumeration can fail on unreadable or oversized trees. Bookkeeping
271
+ // must not prevent clear/recovery or replace the operation's own error.
272
+ return null;
273
+ }
274
+ }
275
+
276
+ /**
277
+ * Explicit operations are snapshot boundaries. A rejected operation can still
278
+ * have published an index or handbook before failing; compare the actual
279
+ * project context so that failure refreshes when visible sources changed
280
+ * or could not be inspected.
281
+ * These disk reads happen at the command boundary, never on ordinary turns.
282
+ */
283
+ async function withPromptSourceBoundary<T>(
284
+ cwd: string,
285
+ operation: () => Promise<T>,
286
+ committed: (result: T) => boolean,
287
+ ): Promise<T> {
288
+ const workspace = resolve(cwd);
289
+ const before = promptSourceState(workspace);
290
+ let refreshSources = false;
291
+ try {
292
+ const result = await operation();
293
+ refreshSources = committed(result);
294
+ return result;
295
+ } finally {
296
+ if (refreshSources || before === null || promptSourceState(workspace) !== before) {
297
+ contextState.invalidate(workspace);
298
+ _context.bus.emit(BusChannels.ContextSourcesChanged, { cwd: workspace });
299
+ }
300
+ }
301
+ }
302
+
254
303
  const contract: ContextContract = {
255
304
  async runBootstrap(input) {
256
305
  const emitProgress = (event: Omit<ContextActivityPayload, "kind" | "at">): void => {
@@ -258,7 +307,11 @@ export function createContextBundle(
258
307
  input?.onProgress?.(event);
259
308
  };
260
309
  try {
261
- const result = await runBootstrap(input ? { ...input, onProgress: emitProgress } : { onProgress: emitProgress });
310
+ const result = await withPromptSourceBoundary(
311
+ input?.cwd ?? process.cwd(),
312
+ () => runBootstrap({ ...input, onProgress: emitProgress }),
313
+ (result) => result.summary.action !== "previewed",
314
+ );
262
315
  const cwd = input?.cwd ?? process.cwd();
263
316
  contextState.invalidate(cwd);
264
317
  if (cwd === lastCwd) startupHints = collectStartupHints(cwd, options);
@@ -279,7 +332,11 @@ export function createContextBundle(
279
332
  };
280
333
  emitProgress({ phase: "done", status: "started", message: "clearing context" });
281
334
  try {
282
- const result = await runContextClear(input);
335
+ const result = await withPromptSourceBoundary(
336
+ input?.cwd ?? process.cwd(),
337
+ () => runContextClear(input),
338
+ (result) => result.action === "cleared",
339
+ );
283
340
  const cwd = input?.cwd ?? process.cwd();
284
341
  contextState.invalidate(cwd);
285
342
  if (cwd === lastCwd) startupHints = collectStartupHints(cwd, options);
@@ -301,11 +358,16 @@ export function createContextBundle(
301
358
  input?.onProgress?.(event);
302
359
  };
303
360
  try {
304
- const result = await runContextRefresh({
305
- ...input,
306
- ...(input?.wiki ? { decisions: input.decisions ?? (await currentDecisions(_context)) } : {}),
307
- onProgress: emitProgress,
308
- });
361
+ const result = await withPromptSourceBoundary(
362
+ input?.cwd ?? process.cwd(),
363
+ async () =>
364
+ runContextRefresh({
365
+ ...input,
366
+ ...(input?.wiki ? { decisions: input.decisions ?? (await currentDecisions(_context)) } : {}),
367
+ onProgress: emitProgress,
368
+ }),
369
+ () => true,
370
+ );
309
371
  const cwd = input?.cwd ?? process.cwd();
310
372
  contextState.invalidate(cwd);
311
373
  if (cwd === lastCwd) startupHints = collectStartupHints(cwd, options);
@@ -1,6 +1,6 @@
1
1
  import { execFile, execFileSync } from "node:child_process";
2
2
  import { createHash } from "node:crypto";
3
- import { readFileSync, statSync } from "node:fs";
3
+ import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  import { enumerateWorkspaceFiles, enumerateWorkspaceFilesAsync } from "../../core/workspace-files.js";
@@ -80,18 +80,13 @@ async function currentGitHeadAsync(cwd: string): Promise<string | null> {
80
80
  }
81
81
  }
82
82
 
83
- function countLines(filePath: string): number {
84
- try {
85
- const text = readFileSync(filePath, "utf8");
86
- if (text.length === 0) return 0;
87
- let lines = 1;
88
- for (const ch of text) {
89
- if (ch === "\n") lines += 1;
90
- }
91
- return lines;
92
- } catch {
93
- return 0;
83
+ function countLines(text: string): number {
84
+ if (text.length === 0) return 0;
85
+ let lines = 1;
86
+ for (const ch of text) {
87
+ if (ch === "\n") lines += 1;
94
88
  }
89
+ return lines;
95
90
  }
96
91
 
97
92
  function locFromCodewiki(codewiki: Codewiki | null): number | null {
@@ -99,6 +94,11 @@ function locFromCodewiki(codewiki: Codewiki | null): number | null {
99
94
  return codewiki.files.reduce((sum, file) => (file.lang === "config" ? sum : sum + file.loc), 0);
100
95
  }
101
96
 
97
+ function createTreeHash(): ReturnType<typeof createHash> {
98
+ // Migrate both unsalted and v2 metadata identities, including empty trees.
99
+ return createHash("sha256").update("clio-codewiki-tree:v3\n");
100
+ }
101
+
102
102
  /**
103
103
  * Hash one file's identity into the tree hash and accumulate its line count.
104
104
  * Shared verbatim by the sync and sliced walks so the two produce identical
@@ -110,23 +110,32 @@ function accumulateFile(
110
110
  hash: ReturnType<typeof createHash>,
111
111
  artifactLoc: number | null,
112
112
  ): number {
113
- const absPath = join(cwd, relPath);
114
- let stat: ReturnType<typeof statSync>;
115
- try {
116
- stat = statSync(absPath);
117
- } catch {
118
- return 0;
119
- }
120
- hash.update(`${relPath}:${stat.size}:${Math.floor(stat.mtimeMs)}\n`);
121
- if (artifactLoc === null && LOC_EXTENSIONS.has(extensionOf(relPath))) return countLines(absPath);
113
+ // Read failures must invalidate the operation, never certify a partial tree.
114
+ const contents = readFileSync(join(cwd, relPath));
115
+ const digest = createHash("sha256").update(contents).digest("hex");
116
+ hash.update(`${JSON.stringify(relPath)}:${digest}\n`);
117
+ if (artifactLoc === null && LOC_EXTENSIONS.has(extensionOf(relPath))) return countLines(contents.toString("utf8"));
122
118
  return 0;
123
119
  }
124
120
 
125
- export function computeFingerprint(cwd: string, codewiki: Codewiki | null = readCodewiki(cwd)): Fingerprint {
121
+ export interface ComputeFingerprintOptions {
122
+ /**
123
+ * Line total recorded by an artifact the caller chose not to parse. The
124
+ * tree hash never depends on it; it only keeps `loc` byte-identical to the
125
+ * fingerprint the artifact's own build stamped.
126
+ */
127
+ artifactLoc?: number;
128
+ }
129
+
130
+ export function computeFingerprint(
131
+ cwd: string,
132
+ codewiki: Codewiki | null = readCodewiki(cwd),
133
+ options: ComputeFingerprintOptions = {},
134
+ ): Fingerprint {
126
135
  const files = enumerateWorkspaceFiles(cwd, EXCLUDED_DIRS).filter(isIndexablePath);
127
136
 
128
- const hash = createHash("sha256");
129
- const artifactLoc = locFromCodewiki(codewiki);
137
+ const hash = createTreeHash();
138
+ const artifactLoc = options.artifactLoc ?? locFromCodewiki(codewiki);
130
139
  let loc = 0;
131
140
  for (const relPath of files) loc += accumulateFile(cwd, relPath, hash, artifactLoc);
132
141
 
@@ -142,13 +151,9 @@ export interface ComputeFingerprintAsyncOptions {
142
151
  }
143
152
 
144
153
  /**
145
- * Same fingerprint, sliced. One `statSync` per visible file plus a `git
146
- * rev-parse` is tens of milliseconds on a large repository, which is a dropped
147
- * frame if it lands in one turn. Callers on a status-surface poll or on the
148
- * session-start path should use this; one-shot CLI paths need not bother.
149
- *
150
- * The enumeration itself runs through `enumerateWorkspaceFilesAsync` on the
151
- * same slicer, so the former 34 ms synchronous floor is gone too.
154
+ * Same content fingerprint, with cooperative yields between file reads and
155
+ * during enumeration. Individual reads remain synchronous; callers on status
156
+ * surfaces and session-start paths avoid a single uninterrupted whole-tree scan.
152
157
  */
153
158
  export async function computeFingerprintAsync(
154
159
  cwd: string,
@@ -160,7 +165,7 @@ export async function computeFingerprintAsync(
160
165
  await slicer.tick();
161
166
  const files = (await enumerateWorkspaceFilesAsync(cwd, EXCLUDED_DIRS, undefined, slicer)).filter(isIndexablePath);
162
167
 
163
- const hash = createHash("sha256");
168
+ const hash = createTreeHash();
164
169
  const artifactLoc = locFromCodewiki(artifact);
165
170
  let loc = 0;
166
171
  for (const relPath of files) {
@@ -178,13 +183,13 @@ export async function computeFingerprintAsync(
178
183
  export function computeFingerprintCached(
179
184
  cwd: string,
180
185
  codewiki: Codewiki | null = readCodewiki(cwd),
181
- options: FingerprintCacheOptions = {},
186
+ options: FingerprintCacheOptions & ComputeFingerprintOptions = {},
182
187
  ): Fingerprint {
183
188
  const now = Date.now();
184
189
  const cached = cachedFingerprints.get(cwd);
185
190
  if (cached && cached.expiresAtMs > now) return cached.fingerprint;
186
191
 
187
- const fingerprint = computeFingerprint(cwd, codewiki);
192
+ const fingerprint = computeFingerprint(cwd, codewiki, options);
188
193
  const ttlMs = options.ttlMs ?? DEFAULT_FINGERPRINT_CACHE_TTL_MS;
189
194
  cachedFingerprints.set(cwd, {
190
195
  fingerprint,
@@ -23,7 +23,13 @@ export {
23
23
  runBootstrap,
24
24
  } from "./bootstrap.js";
25
25
  export { type RunContextClearInput, type RunContextClearResult, runContextClear } from "./clear.js";
26
- export { loadProjectClioMd, parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
26
+ export {
27
+ loadProjectClioMd,
28
+ parseClioMd,
29
+ renderProjectContextFragment,
30
+ serializeClioMd,
31
+ tryReadClioMd,
32
+ } from "./clio-md.js";
27
33
  export {
28
34
  codewikiEntries,
29
35
  codewikiNeedsBackfill,