@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.
- package/CHANGELOG.md +116 -2
- package/CONTRIBUTING.md +39 -24
- package/NOTICE +16 -0
- package/README.md +343 -403
- package/dist/{acp-WNAYYF4F.js → acp-UVEVWSDL.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-VWY37DTK.js} +78 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-PCV2XQDV.js} +38 -38
- package/dist/builtins-PD652MTK.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NRO2BJRH.js → chunk-24T2YZ7A.js} +10686 -4464
- package/dist/{chunk-Y55JBDO5.js → chunk-2AKYFREM.js} +38 -23
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-UXCU4E3T.js → chunk-3BJGMT2D.js} +35 -14
- package/dist/{chunk-5ICU3EUH.js → chunk-3HQVBIKD.js} +5 -5
- package/dist/{chunk-GWZNEVM2.js → chunk-3JLFK5MW.js} +9 -9
- package/dist/{chunk-XXYSBZIQ.js → chunk-3O2ZAUGQ.js} +4 -4
- package/dist/{chunk-GX5WYQO4.js → chunk-3QKXHCGS.js} +8 -8
- package/dist/{chunk-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-OEJSLEPW.js → chunk-3WBALRQH.js} +337 -337
- package/dist/{chunk-ELWDPP3Y.js → chunk-4DU2TVI4.js} +8 -8
- package/dist/{chunk-JSD46VO2.js → chunk-4U4TKZFR.js} +43 -36
- package/dist/{chunk-FEAXX7B6.js → chunk-4VMV6OS6.js} +4 -4
- package/dist/{chunk-2ZSONWVL.js → chunk-536HXRFE.js} +13 -13
- package/dist/{chunk-W54I7H25.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-5QRX7SLS.js} +11 -11
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-DT3LWJOB.js → chunk-6HAO6X5B.js} +24 -6
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-K6T2ZAMZ.js → chunk-6OII3LOK.js} +6 -6
- package/dist/{chunk-36CT5VVL.js → chunk-6RYDAVQT.js} +138 -89
- package/dist/{chunk-I7XBWTYH.js → chunk-6VRRJT7L.js} +5 -5
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-NAI6ZFCY.js → chunk-7JSSKXG2.js} +122 -11
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-IXIY2H4R.js → chunk-ACCKVSHU.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-B3MOMLJ4.js} +12 -12
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/{chunk-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-23L32XTI.js → chunk-BLTEAUCB.js} +68 -39
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-XULDXHTN.js → chunk-BT7HGDOX.js} +105 -53
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-QZWQA4DE.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-6UINWWS6.js → chunk-DXLUVUD4.js} +16 -16
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-E7RF4KBO.js} +5 -5
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/chunk-EM2WNQS2.js +93 -0
- package/dist/{chunk-57XXR6DR.js → chunk-F5Z7EWMN.js} +967 -246
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-EXLD33WO.js → chunk-GLYBJ4RQ.js} +24 -9
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-FFUPXJC4.js → chunk-HPTJF6DG.js} +32 -56
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-CUSRQKPU.js → chunk-HZ2T2YED.js} +299 -89
- package/dist/{chunk-YD5GIKET.js → chunk-HZFBVU5X.js} +49 -580
- package/dist/{chunk-6QOTUPRG.js → chunk-I2K2NCZQ.js} +65 -17
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-I2DWJ4GM.js → chunk-IGLVVNEG.js} +54 -42
- package/dist/{chunk-6Q3CYFD3.js → chunk-IKRWLEDA.js} +186 -35
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-2DSOYNFC.js → chunk-JMPL7NUB.js} +7 -7
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-KAFMW7WM.js} +72 -81
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-JQLNNIKT.js → chunk-LIN2K3EL.js} +6 -6
- package/dist/{chunk-2STGEDFV.js → chunk-LK2FN5JY.js} +2 -2
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4WR7VSYB.js → chunk-N2OKBREN.js} +23 -9
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/{chunk-4M6Z5QVF.js → chunk-NNWJYUNO.js} +11 -11
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-75W7L2E2.js → chunk-P5JMBPDJ.js} +1052 -171
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-S6PYF2XF.js → chunk-P6M7RKMI.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-RXTN6AKH.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-DXKJURES.js → chunk-PZN2LQY6.js} +14 -11
- package/dist/{chunk-N56KALIC.js → chunk-Q7NNUHQV.js} +62 -35
- package/dist/{chunk-RQCKCSRL.js → chunk-QCOV5DFY.js} +22 -22
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-NEKRRTYW.js → chunk-QJMRYTCX.js} +8 -8
- package/dist/{chunk-YNFKXPEC.js → chunk-QNWRHOMF.js} +35 -66
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-QXFBABFJ.js} +10 -10
- package/dist/chunk-R2CT5YDO.js +66 -0
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-IGLP3ODT.js → chunk-RGZNQ5CT.js} +15 -15
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-UEPWCCTY.js → chunk-SXQKNKRA.js} +12 -12
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-5636DCO5.js → chunk-TJFDL26W.js} +59 -12
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-7UGL4MB5.js → chunk-VAHLPXPY.js} +10 -10
- package/dist/{chunk-25QBEXRS.js → chunk-VANN3GDP.js} +7 -26
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-QUFRYSWI.js → chunk-VHMX7SXF.js} +129 -48
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-USR47QNF.js → chunk-WKUYQBCG.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-WNGF5AJX.js} +36 -22
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/{chunk-6OSVSQL5.js → chunk-WV6TDAPN.js} +41 -23
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-2ASED4PZ.js → chunk-X3BI7HTV.js} +26 -26
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-RZDWV63N.js → chunk-XWMSPJYN.js} +6 -6
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-6PAZTBPA.js → chunk-YPRSNUTC.js} +15 -6
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-LTIKRKFL.js → chunk-ZS43Y2FT.js} +4 -4
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +44 -44
- package/dist/clio-QQCMTUZE.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-GUPM6766.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-IIM7YOD3.js} +211 -124
- package/dist/configure-4ZM5HWJX.js +73 -0
- package/dist/{context-BOYF5EJM.js → context-44BZLJ3J.js} +62 -31
- package/dist/{context-4MPR7WKB.js → context-AIDVQKMW.js} +126 -121
- package/dist/{context-2DKHWH2T.js → context-OL5P3HEP.js} +92 -62
- package/dist/context-clear-OQV76MYP.js +184 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-3I3FYX6Y.js → context-working-set-ZUW3EGLS.js} +32 -31
- package/dist/detail-UXPWRANG.js +115 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-P3ZW6G77.js} +192 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-JJVGPZWT.js} +59 -58
- package/dist/{eval-OQOQUDHK.js → eval-V2RTN3UH.js} +476 -170
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-35PYWGSO.js +225 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-CIGGKI6J.js} +111 -94
- package/dist/{evolve-GSS52E5J.js → evolve-33SM3NJP.js} +108 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-LFO7SIPC.js} +147 -146
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-RLK72GU3.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-JZIBCGMW.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-2L5YGGZJ.js} +108 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-LIAVKDUU.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-JIK3OQZR.js} +106 -89
- package/dist/fleet-view-IWHYGQKK.js +118 -0
- package/dist/{init-PXEXQSBF.js → init-NJEDOTQW.js} +124 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-RVCAYECG.js} +25 -25
- package/dist/inventory-74UL7UHU.js +118 -0
- package/dist/{library-B2W4N74O.js → library-CTKZA7K3.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-I76I5VUH.js} +108 -93
- package/dist/{models-GERTU3YI.js → models-D4YDIQZQ.js} +64 -62
- package/dist/{monitor-CPNIUULB.js → monitor-NKVD55HX.js} +137 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-I6OATVPK.js} +1715 -1687
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-EJAWJEIO.js +116 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-4XMQKDNZ.js} +22 -20
- package/dist/{resources-4PXNMD5G.js → resources-TVYVXK3Q.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-OWQNNSJU.js} +164 -157
- package/dist/{share-2NWMJJEE.js → share-NPZZMUXG.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-OXFEAWMT.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-J5TCKSJA.js} +128 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-7II4DM57.js} +41 -40
- package/dist/slash-commands-MDSDSWYF.js +92 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-KILZEOCE.js} +161 -94
- package/dist/tasks-R6P6OV22.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-LZCG2KN3.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-D2OZH6IQ.js} +42 -41
- package/dist/{usage-NHG6MCJM.js → usage-PIASNUS4.js} +137 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-LTHUY2PX.js} +28 -27
- package/dist/verify-HYF7KBVE.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-RK7JQ5NP.js +615 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +108 -95
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/context-engine.md +45 -60
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +45 -30
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +75 -61
- package/docs/guide/configuration-and-targets.md +126 -26
- package/docs/guide/configuration-reference.md +22 -7
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +13 -6
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +79 -20
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +9 -2
- package/docs/process/development-pipeline.md +11 -11
- package/docs/process/documentation-coverage.md +1 -1
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/release-cut-checklist.md +24 -12
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- package/src/cli/ask.ts +10 -10
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/configure-editor.ts +51 -0
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure-oauth.ts +1 -1
- package/src/cli/configure-onboarding.ts +232 -96
- package/src/cli/configure-prompts.ts +76 -0
- package/src/cli/configure-quick.ts +274 -0
- package/src/cli/configure-target.ts +14 -2
- package/src/cli/configure.ts +413 -174
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/oauth-manual-input.ts +1 -1
- package/src/cli/reset.ts +2 -0
- package/src/cli/run.ts +16 -14
- package/src/cli/select.ts +35 -4
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +11 -8
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/config.ts +39 -15
- package/src/core/defaults.ts +38 -15
- package/src/{interactive → core}/external-editor.ts +4 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/config/classify.ts +1 -1
- package/src/domains/config/keybindings.ts +3 -31
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +72 -10
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +42 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +6 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/contract.ts +10 -2
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/types.ts +4 -3
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +5 -1
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +4 -2
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/probe/fingerprint.ts +13 -6
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +53 -15
- package/src/interactive/application-controller.ts +1 -31
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-panel.ts +163 -637
- package/src/interactive/chat-renderer.ts +73 -30
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +18 -5
- package/src/interactive/editor-submit.ts +21 -31
- package/src/interactive/footer/dashboard.ts +8 -3
- package/src/interactive/footer/widgets.ts +50 -91
- package/src/interactive/interactive-application.ts +24 -44
- package/src/interactive/interactive-event-projection.ts +9 -45
- package/src/interactive/interactive-input-runtime.ts +3 -28
- package/src/interactive/interactive-presentation.ts +45 -16
- package/src/interactive/interactive-slash-runtime.ts +5 -40
- package/src/interactive/layout.ts +31 -5
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +5 -1
- package/src/interactive/overlay-lifecycle.ts +1 -0
- package/src/interactive/overlay-session-lifecycle.ts +7 -1
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/settings.ts +9 -8
- package/src/interactive/renderers/preview.ts +16 -0
- package/src/interactive/renderers/tool-execution.ts +84 -161
- package/src/interactive/renderers/worker-entry.ts +74 -43
- package/src/interactive/slash-autocomplete.ts +1 -6
- package/src/interactive/slash-commands.ts +16 -46
- package/src/interactive/status/controller.ts +0 -5
- package/src/interactive/status/state-machine.ts +44 -26
- package/src/interactive/status/types.ts +3 -0
- package/src/interactive/status/verbs.ts +13 -12
- package/src/interactive/transcript-detail.ts +50 -112
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/view/artifacts.ts +4 -0
- package/src/interactive/view/view-overlay.ts +44 -34
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/presentation.ts +1 -1
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +10 -5
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
|
@@ -1,43 +1,11 @@
|
|
|
1
1
|
import { parentPort, workerData } from "node:worker_threads";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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<
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
1070
|
+
return syncCodewiki(cwd, codewiki, options);
|
|
1049
1071
|
}
|
|
1050
1072
|
const slicer = options.slicer ?? createSlicer();
|
|
1051
|
-
const
|
|
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
|
|
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
|
|
1080
|
+
const existing = existingFiles.get(relPath);
|
|
1059
1081
|
const isCurrentIndexableFile = isIndexablePath(relPath) && visiblePaths.has(relPath);
|
|
1060
|
-
if (!
|
|
1061
|
-
|
|
1062
|
-
|
|
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 (
|
|
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(
|
|
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)
|
|
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
|
|
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
|
|
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) =>
|
|
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
|
|
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
|
|
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
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
|
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(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
|
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 =
|
|
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,
|
|
146
|
-
*
|
|
147
|
-
*
|
|
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 =
|
|
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 {
|
|
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,
|