@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
package/src/cli/context-map.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
-
import {
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
import { CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
|
|
5
|
-
import {
|
|
6
|
+
import { type CodewikiCoordinatedResult, coordinateCodewikiWrite } from "../domains/context/codewiki/coordinator.js";
|
|
7
|
+
import type { Codewiki } from "../domains/context/codewiki/schema.js";
|
|
6
8
|
import { buildArchitectureSeed, serializeArchitectureSeed } from "../domains/context/wiki/map-seed.js";
|
|
7
9
|
|
|
8
10
|
const HELP = `Usage:
|
|
@@ -11,7 +13,8 @@ const HELP = `Usage:
|
|
|
11
13
|
Write an archify architecture seed for the current repository from the codewiki
|
|
12
14
|
index, without model calls. The seed is the starting spec for the archify skill:
|
|
13
15
|
components are the largest directory areas, connections are collapsed import
|
|
14
|
-
edges
|
|
16
|
+
edges. The index is reconciled with current files before mapping; sources are
|
|
17
|
+
pinned only when clean Git evidence matches those files.
|
|
15
18
|
|
|
16
19
|
Options:
|
|
17
20
|
--out <path> where to write the seed (default: ${CLIO_ARTIFACT_DIR}/maps/<repo>.architecture.json)
|
|
@@ -28,21 +31,53 @@ function gitValue(cwd: string, args: string[]): string | null {
|
|
|
28
31
|
const out = execFileSync("git", args, { cwd, timeout: 5000, stdio: ["ignore", "pipe", "ignore"] })
|
|
29
32
|
.toString("utf8")
|
|
30
33
|
.trim();
|
|
31
|
-
return out
|
|
34
|
+
return out;
|
|
32
35
|
} catch {
|
|
33
36
|
return null;
|
|
34
37
|
}
|
|
35
38
|
}
|
|
36
39
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
type SourceState = "clean" | "dirty" | "unknown";
|
|
41
|
+
|
|
42
|
+
/** A successful empty status means clean; unavailable Git evidence never does. */
|
|
43
|
+
function repositoryFacts(
|
|
44
|
+
cwd: string,
|
|
45
|
+
codewiki: Codewiki,
|
|
46
|
+
indexedHead: string | null,
|
|
47
|
+
): { sourceState: SourceState; repository?: { url: string; revision: string } } {
|
|
40
48
|
const revision = gitValue(cwd, ["rev-parse", "--verify", "HEAD"]);
|
|
41
|
-
|
|
49
|
+
const status = gitValue(cwd, ["status", "--porcelain", "--untracked-files=normal"]);
|
|
50
|
+
if (!revision || status === null) return { sourceState: "unknown" };
|
|
51
|
+
if (status !== "" || revision !== indexedHead) return { sourceState: "dirty" };
|
|
52
|
+
// Source paths in the seed are workspace-relative. A nested workspace has
|
|
53
|
+
// no proven repository-relative path mapping, so cannot supply citations.
|
|
54
|
+
if (gitValue(cwd, ["rev-parse", "--show-prefix"]) !== "") return { sourceState: "unknown" };
|
|
55
|
+
const tree = gitValue(cwd, ["ls-tree", "-r", "-z", revision]);
|
|
56
|
+
if (tree === null) return { sourceState: "unknown" };
|
|
57
|
+
const blobs = new Map<string, string>();
|
|
58
|
+
for (const entry of tree.split("\0")) {
|
|
59
|
+
const match = /^100[0-7]{3} blob ([a-f0-9]{40})\t([\s\S]+)$/.exec(entry);
|
|
60
|
+
if (match) blobs.set(match[2] as string, match[1] as string);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
for (const file of codewiki.files) {
|
|
64
|
+
const contents = readFileSync(path.join(cwd, file.path));
|
|
65
|
+
// Verify both parser input identity and immutable Git blob identity.
|
|
66
|
+
// This also catches ignored/untracked inputs and assume-unchanged files
|
|
67
|
+
// that a successful `git status` alone cannot certify.
|
|
68
|
+
const indexedHash = createHash("sha256").update(contents.toString("utf8")).digest("hex").slice(0, 16);
|
|
69
|
+
const blob = createHash("sha1").update(`blob ${contents.length}\0`).update(contents).digest("hex");
|
|
70
|
+
if (indexedHash !== file.hash || blobs.get(file.path) !== blob) return { sourceState: "dirty" };
|
|
71
|
+
}
|
|
72
|
+
} catch {
|
|
73
|
+
return { sourceState: "unknown" };
|
|
74
|
+
}
|
|
75
|
+
const remote = gitValue(cwd, ["remote", "get-url", "origin"]);
|
|
76
|
+
if (!remote) return { sourceState: "clean" };
|
|
42
77
|
let url = remote.endsWith(".git") ? remote.slice(0, -4) : remote;
|
|
43
78
|
const ssh = /^git@([^:]+):(.+)$/.exec(url);
|
|
44
79
|
if (ssh) url = `https://${ssh[1]}/${ssh[2]}`;
|
|
45
|
-
return { url, revision };
|
|
80
|
+
return { sourceState: "clean", repository: { url, revision } };
|
|
46
81
|
}
|
|
47
82
|
|
|
48
83
|
export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
@@ -72,16 +107,40 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
72
107
|
return 2;
|
|
73
108
|
}
|
|
74
109
|
const cwd = process.cwd();
|
|
75
|
-
|
|
76
|
-
|
|
110
|
+
let reconciled: CodewikiCoordinatedResult | null;
|
|
111
|
+
try {
|
|
112
|
+
reconciled = await coordinateCodewikiWrite(
|
|
113
|
+
cwd,
|
|
114
|
+
(current, workspace) =>
|
|
115
|
+
current
|
|
116
|
+
? {
|
|
117
|
+
kind: "ensure",
|
|
118
|
+
cwd: workspace,
|
|
119
|
+
current,
|
|
120
|
+
language: current.language,
|
|
121
|
+
// Map evidence must reconcile actual inputs, even if a state file
|
|
122
|
+
// happens to carry a matching fingerprint from another operation.
|
|
123
|
+
previous: null,
|
|
124
|
+
}
|
|
125
|
+
: null,
|
|
126
|
+
{ requireExisting: true },
|
|
127
|
+
);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
process.stderr.write(
|
|
130
|
+
`clio-coder context map: index refresh failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
131
|
+
);
|
|
132
|
+
return 1;
|
|
133
|
+
}
|
|
134
|
+
if (!reconciled) {
|
|
77
135
|
process.stderr.write(
|
|
78
136
|
"clio-coder context map: no codewiki index in .clio-coder/codewiki.json; run `clio-coder context index` first\n",
|
|
79
137
|
);
|
|
80
138
|
return 1;
|
|
81
139
|
}
|
|
82
|
-
const
|
|
140
|
+
const facts = repositoryFacts(cwd, reconciled.codewiki, reconciled.worker.fingerprint.gitHead);
|
|
141
|
+
const seed = buildArchitectureSeed(reconciled.codewiki, {
|
|
83
142
|
title: path.basename(cwd),
|
|
84
|
-
repository:
|
|
143
|
+
repository: facts.repository,
|
|
85
144
|
});
|
|
86
145
|
const target = out ? path.resolve(cwd, out) : defaultMapSeedPath(cwd);
|
|
87
146
|
mkdirSync(path.dirname(target), { recursive: true });
|
|
@@ -91,6 +150,8 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
91
150
|
components: seed.components.length,
|
|
92
151
|
connections: seed.connections.length,
|
|
93
152
|
repository: seed.meta.repository ?? null,
|
|
153
|
+
index: "reconciled",
|
|
154
|
+
sourceState: facts.sourceState,
|
|
94
155
|
};
|
|
95
156
|
if (json) {
|
|
96
157
|
process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
@@ -102,7 +163,7 @@ export async function runContextMapCommand(args: string[]): Promise<number> {
|
|
|
102
163
|
` ${payload.components} components, ${payload.connections} connections${
|
|
103
164
|
payload.repository
|
|
104
165
|
? `, sources pinned at ${payload.repository.revision.slice(0, 12)}`
|
|
105
|
-
:
|
|
166
|
+
: `; no source citations (source state: ${payload.sourceState}; requires verified clean files and a GitHub origin at a full revision)`
|
|
106
167
|
}`,
|
|
107
168
|
payload.repository
|
|
108
169
|
? " next: validate and deliver it with the archify skill, passing --repo-root ."
|
package/src/cli/context.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { join, resolve } from "node:path";
|
|
2
2
|
import type { BootstrapProgressEvent } from "../domains/context/index.js";
|
|
3
3
|
import type { BootstrapGenerationState } from "../domains/context/state.js";
|
|
4
|
+
import type { RunWikiGenerateResult } from "../domains/context/wiki/generate.js";
|
|
5
|
+
import type { WikiMeta } from "../domains/context/wiki/meta.js";
|
|
6
|
+
import { MAX_PAGE_ATTEMPTS } from "../domains/context/wiki/plan-store.js";
|
|
4
7
|
|
|
5
8
|
const HELP = `Usage:
|
|
6
9
|
clio-coder context
|
|
7
10
|
clio-coder context init [--yes] [--preview|--heuristic] [--adopt] [--propose|--apply|--rewrite]
|
|
8
11
|
clio-coder context refresh [--wiki]
|
|
9
|
-
clio-coder context wiki [--update] [--status] [--depth auto|simple|medium|detailed]
|
|
12
|
+
clio-coder context wiki [--update|--retry-pending] [--status] [--depth auto|simple|medium|detailed]
|
|
10
13
|
[--target <id>] [--model <id>] [--thinking off|low|medium|high]
|
|
11
14
|
clio-coder context reset [--all] [--yes]
|
|
12
15
|
clio-coder context index [--json]
|
|
@@ -32,6 +35,36 @@ function printWikiProgress(event: BootstrapProgressEvent): void {
|
|
|
32
35
|
process.stderr.write(`clio-coder context wiki: ${event.message}${detail}\n`);
|
|
33
36
|
}
|
|
34
37
|
|
|
38
|
+
function wikiRecoveryLines(meta: WikiMeta | null): string[] {
|
|
39
|
+
const pending = meta?.plan?.pages.filter((page) => page.status !== "written") ?? [];
|
|
40
|
+
if (pending.length === 0) return [];
|
|
41
|
+
const exhausted = pending.filter((page) => page.attempts >= MAX_PAGE_ATTEMPTS).length;
|
|
42
|
+
const failures = pending.filter((page) => page.lastFailure);
|
|
43
|
+
return [
|
|
44
|
+
`pending: ${pending.length} page(s)${exhausted > 0 ? `; ${exhausted} exhausted ordinary writer attempts` : ""}`,
|
|
45
|
+
...failures.slice(0, 8).map((page) => `${page.path}: ${page.lastFailure?.phase}: ${page.lastFailure?.detail}`),
|
|
46
|
+
...(failures.length > 8 ? [`${failures.length - 8} more page failures retained in wiki metadata`] : []),
|
|
47
|
+
"Run `clio-coder context wiki --retry-pending` to retry pending pages once, including exhausted pages, without replanning.",
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function printWikiOutcome(prefix: string, result: RunWikiGenerateResult, meta: WikiMeta | null): void {
|
|
52
|
+
const pending = result.pending ?? meta?.plan?.pages.filter((page) => page.status !== "written").length ?? 0;
|
|
53
|
+
const complete = meta?.plan
|
|
54
|
+
? meta.plan.pages.filter((page) => page.status === "written").length
|
|
55
|
+
: (meta?.generation?.pagesWritten ?? Math.max(0, result.pages - pending));
|
|
56
|
+
const published = `${result.pages} published page${result.pages === 1 ? "" : "s"}`;
|
|
57
|
+
const progress = `${complete} complete, ${pending} pending`;
|
|
58
|
+
const outcome = pending > 0 ? "incomplete" : result.status === "noop" ? "unchanged" : "generated";
|
|
59
|
+
process.stdout.write(`${prefix}: ${outcome} (${published}; ${progress})\n`);
|
|
60
|
+
if (pending > 0) {
|
|
61
|
+
const recovery = wikiRecoveryLines(meta);
|
|
62
|
+
process.stdout.write(
|
|
63
|
+
`${recovery.length > 0 ? recovery.join("\n") : "Run `clio-coder context wiki --update` to continue pending pages."}\n`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
35
68
|
function compactMetric(value: number, suffix: string): string {
|
|
36
69
|
if (value < 1000) return `${value}${suffix}`;
|
|
37
70
|
return `${(value / 1000).toFixed(1)}k${suffix}`;
|
|
@@ -82,10 +115,7 @@ async function printContextStatus(): Promise<number> {
|
|
|
82
115
|
: "ok";
|
|
83
116
|
|
|
84
117
|
const prompt = context.renderPromptContext(cwd);
|
|
85
|
-
const preloadClass = preload.
|
|
86
|
-
hasClioMd: prompt.clioMd !== null,
|
|
87
|
-
text: prompt.text,
|
|
88
|
-
});
|
|
118
|
+
const preloadClass = preload.selectProjectPreload(prompt, null).classification;
|
|
89
119
|
|
|
90
120
|
const codewiki = context.readCodewiki(cwd);
|
|
91
121
|
const codewikiCount = codewiki ? context.codewikiEntries(codewiki).length : 0;
|
|
@@ -134,7 +164,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
|
|
|
134
164
|
return 2;
|
|
135
165
|
}
|
|
136
166
|
try {
|
|
137
|
-
const { runContextRefresh } = await import("../domains/context/index.js");
|
|
167
|
+
const { runContextRefresh, readWikiMeta } = await import("../domains/context/index.js");
|
|
138
168
|
const wikiEntry = updateWiki ? await import("./wiki-generate.js") : null;
|
|
139
169
|
const result = await runContextRefresh({
|
|
140
170
|
cwd: process.cwd(),
|
|
@@ -155,11 +185,7 @@ async function runRefreshCommand(args: string[]): Promise<number> {
|
|
|
155
185
|
);
|
|
156
186
|
return 1;
|
|
157
187
|
}
|
|
158
|
-
process.
|
|
159
|
-
result.wiki.status === "noop"
|
|
160
|
-
? `clio-coder context refresh: wiki unchanged (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`
|
|
161
|
-
: `clio-coder context refresh: wiki updated (${result.wiki.pages} page${result.wiki.pages === 1 ? "" : "s"})\n`,
|
|
162
|
-
);
|
|
188
|
+
printWikiOutcome("clio-coder context refresh: wiki", result.wiki, readWikiMeta(process.cwd()));
|
|
163
189
|
}
|
|
164
190
|
return 0;
|
|
165
191
|
} catch (err) {
|
|
@@ -189,10 +215,11 @@ async function runWikiStatusCommand(): Promise<number> {
|
|
|
189
215
|
`depth: ${depth} (requested ${requestedDepth}; ${sourceFiles} source files; ` +
|
|
190
216
|
`${pagesWritten}/${pagesPlanned} planned pages written)`,
|
|
191
217
|
);
|
|
192
|
-
if (pagesWritten < pagesPlanned) {
|
|
218
|
+
if (pagesWritten < pagesPlanned && !meta.plan) {
|
|
193
219
|
lines.push(`pending: ${pagesPlanned - pagesWritten} page(s); run \`clio-coder context wiki --update\` to finish`);
|
|
194
220
|
}
|
|
195
221
|
}
|
|
222
|
+
lines.push(...wikiRecoveryLines(meta));
|
|
196
223
|
if (currentHead !== meta.gitHead) {
|
|
197
224
|
lines.push(`staleness: gitHead differs from current HEAD (${currentHead ?? "none"})`);
|
|
198
225
|
}
|
|
@@ -215,6 +242,7 @@ function isThinkingLevel(value: unknown): value is WikiCliThinking {
|
|
|
215
242
|
|
|
216
243
|
async function runWikiCommand(args: string[]): Promise<number> {
|
|
217
244
|
let forceUpdate = false;
|
|
245
|
+
let retryPending = false;
|
|
218
246
|
let status = false;
|
|
219
247
|
let depth: WikiCliDepth = "auto";
|
|
220
248
|
let target: string | undefined;
|
|
@@ -230,6 +258,10 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
230
258
|
forceUpdate = true;
|
|
231
259
|
continue;
|
|
232
260
|
}
|
|
261
|
+
if (arg === "--retry-pending") {
|
|
262
|
+
retryPending = true;
|
|
263
|
+
continue;
|
|
264
|
+
}
|
|
233
265
|
if (arg === "--status") {
|
|
234
266
|
status = true;
|
|
235
267
|
continue;
|
|
@@ -277,6 +309,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
277
309
|
const result = await context.runWikiGenerate({
|
|
278
310
|
cwd: process.cwd(),
|
|
279
311
|
...(forceUpdate ? { mode: "update" as const } : {}),
|
|
312
|
+
...(retryPending ? { retryPending: true } : {}),
|
|
280
313
|
depth,
|
|
281
314
|
model: await resolveDocumenterModelId(route),
|
|
282
315
|
generate: modelWikiGenerate({ route }),
|
|
@@ -286,11 +319,7 @@ async function runWikiCommand(args: string[]): Promise<number> {
|
|
|
286
319
|
process.stderr.write(`clio-coder context wiki failed: ${(result.problems ?? ["unknown failure"]).join("; ")}\n`);
|
|
287
320
|
return 1;
|
|
288
321
|
}
|
|
289
|
-
process.
|
|
290
|
-
result.status === "noop"
|
|
291
|
-
? `clio-coder context wiki: unchanged (${result.pages} page${result.pages === 1 ? "" : "s"})\n`
|
|
292
|
-
: `clio-coder context wiki: generated ${result.pages} page${result.pages === 1 ? "" : "s"}\n`,
|
|
293
|
-
);
|
|
322
|
+
printWikiOutcome("clio-coder context wiki", result, context.readWikiMeta(process.cwd()));
|
|
294
323
|
return 0;
|
|
295
324
|
} catch (err) {
|
|
296
325
|
process.stderr.write(`clio-coder context wiki failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
package/src/cli/eval.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
1
2
|
import { resolve } from "node:path";
|
|
2
3
|
import { InvalidIdError } from "../core/safe-id.js";
|
|
4
|
+
import { shellQuote } from "../core/shell-quote.js";
|
|
3
5
|
import { clioDataDir } from "../core/xdg.js";
|
|
4
|
-
import { loadEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
|
|
6
|
+
import { loadEvalArtifactV4, parseEvalArtifactV4, writeEvalArtifactV4 } from "../domains/eval/artifacts/store.js";
|
|
5
7
|
import { compareEvalArtifactsV4 } from "../domains/eval/compare/compare.js";
|
|
6
8
|
import { evaluateGate, renderGateFailure, renderInformationalBudget } from "../domains/eval/compare/gates.js";
|
|
7
9
|
import { loadThresholds } from "../domains/eval/compare/thresholds.js";
|
|
@@ -50,6 +52,7 @@ interface ParsedEvalArgs {
|
|
|
50
52
|
out?: string;
|
|
51
53
|
clioEntry?: string;
|
|
52
54
|
evalId?: string;
|
|
55
|
+
artifact?: string;
|
|
53
56
|
format: EvalReportFormat;
|
|
54
57
|
compareIds: string[];
|
|
55
58
|
metric?: string;
|
|
@@ -133,6 +136,11 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
|
|
|
133
136
|
throw new Error(`unknown eval run argument: ${arg}`);
|
|
134
137
|
}
|
|
135
138
|
if (parsed.command === "report") {
|
|
139
|
+
if (arg === "--artifact") {
|
|
140
|
+
parsed.artifact = requiredValue(args, index, "--artifact");
|
|
141
|
+
index += 1;
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
136
144
|
if (arg === "--format") {
|
|
137
145
|
parsed.format = reportFormat(requiredValue(args, index, "--format"));
|
|
138
146
|
index += 1;
|
|
@@ -189,7 +197,9 @@ function parseEvalArgs(args: ReadonlyArray<string>): ParsedEvalArgs {
|
|
|
189
197
|
if (parsed.command === "run" && (parsed.suite === undefined) === (parsed.taskFile === undefined)) {
|
|
190
198
|
throw new Error("run requires exactly one of --suite or --task-file");
|
|
191
199
|
}
|
|
192
|
-
if (parsed.command === "report" && parsed.evalId === undefined)
|
|
200
|
+
if (parsed.command === "report" && (parsed.evalId === undefined) === (parsed.artifact === undefined)) {
|
|
201
|
+
throw new Error("report requires exactly one of an eval id or --artifact <path>");
|
|
202
|
+
}
|
|
193
203
|
if (parsed.command === "compare" && parsed.compareIds.length !== 2) {
|
|
194
204
|
throw new Error("compare requires <baselineEvalId> <candidateEvalId>");
|
|
195
205
|
}
|
|
@@ -259,6 +269,7 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
|
|
|
259
269
|
);
|
|
260
270
|
const artifactPath = await writeEvalArtifactV4(clioDataDir(), artifact, parsed.out);
|
|
261
271
|
process.stdout.write(`${renderEvalTextReportV4(artifact)}artifact: ${artifactPath}\n`);
|
|
272
|
+
process.stdout.write(`report: clio-coder eval report --artifact ${shellQuote(resolve(artifactPath))} --format md\n`);
|
|
262
273
|
// A suite that declares thresholds is gated by them here, on the artifact
|
|
263
274
|
// it just produced. Declaring a gate that only a later `eval gate`
|
|
264
275
|
// invocation enforces means the run that broke it still exited zero.
|
|
@@ -280,7 +291,10 @@ async function runEvalRun(parsed: ParsedEvalArgs): Promise<number> {
|
|
|
280
291
|
async function runEvalReportCommand(parsed: ParsedEvalArgs): Promise<number> {
|
|
281
292
|
try {
|
|
282
293
|
const dataDir = clioDataDir();
|
|
283
|
-
const artifact =
|
|
294
|
+
const artifact =
|
|
295
|
+
parsed.artifact === undefined
|
|
296
|
+
? await loadEvalArtifactV4(dataDir, parsed.evalId ?? "")
|
|
297
|
+
: parseEvalArtifactV4(JSON.parse(await readFile(parsed.artifact, "utf8")) as unknown, parsed.artifact);
|
|
284
298
|
process.stdout.write(renderArtifactReport(artifact, parsed.format, dataDir));
|
|
285
299
|
return 0;
|
|
286
300
|
} catch (error) {
|
package/src/cli/modes/print.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { getTerminationCoordinator } from "../../core/termination.js";
|
|
13
13
|
import { ToolNames } from "../../core/tool-names.js";
|
|
14
14
|
import { createRunReceiptQuality } from "../../domains/dispatch/receipt-findings.js";
|
|
15
|
-
import { openLedger } from "../../domains/dispatch/state.js";
|
|
15
|
+
import { newRunId, openLedger } from "../../domains/dispatch/state.js";
|
|
16
16
|
import type { RunKind, RunOutcome, RunReceiptDraft, RunStatus, ToolCallStat } from "../../domains/dispatch/types.js";
|
|
17
17
|
import type { AgentMessage, ImageContent } from "../../engine/types.js";
|
|
18
18
|
import type { ChatLoop, ChatLoopEvent } from "../../interactive/chat-loop.js";
|
|
@@ -58,6 +58,8 @@ export interface HeadlessMainAgentOptions {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
interface HeadlessMainAgentResult {
|
|
61
|
+
/** Latest assistant stop, superseded by subsequent continuation messages. */
|
|
62
|
+
outputExhausted: boolean;
|
|
61
63
|
text: string;
|
|
62
64
|
error: string | null;
|
|
63
65
|
/**
|
|
@@ -154,6 +156,7 @@ function resultFromEvent(event: ChatLoopEvent, current: HeadlessMainAgentResult)
|
|
|
154
156
|
if (event.type !== "message_end") return current;
|
|
155
157
|
const message = event.message;
|
|
156
158
|
if (message?.role !== "assistant") return current;
|
|
159
|
+
current = { ...current, outputExhausted: message.stopReason === "length", sawTerminatingToolResult: false };
|
|
157
160
|
const error = assistantError(message);
|
|
158
161
|
if (error) return { ...current, text: "", error };
|
|
159
162
|
const text = assistantText(message).trimEnd();
|
|
@@ -180,8 +183,15 @@ function recordToolEnd(stats: HeadlessMainAgentReceiptStats, event: ChatLoopEven
|
|
|
180
183
|
stat.count += 1;
|
|
181
184
|
const durationMs = durationMsFromEvent(event);
|
|
182
185
|
if (durationMs !== undefined) stat.totalDurationMs += durationMs;
|
|
183
|
-
|
|
184
|
-
|
|
186
|
+
// Registry settlement is authoritative; legacy producers only expose isError.
|
|
187
|
+
const outcome = (event as { outcome?: unknown }).outcome;
|
|
188
|
+
if (outcome === "blocked") stat.blocked += 1;
|
|
189
|
+
else if (outcome === "error") stat.errors += 1;
|
|
190
|
+
else if (outcome === "ok") stat.ok += 1;
|
|
191
|
+
else if (outcome === undefined) {
|
|
192
|
+
if (event.isError) stat.errors += 1;
|
|
193
|
+
else stat.ok += 1;
|
|
194
|
+
}
|
|
185
195
|
stats.toolStats.set(tool, stat);
|
|
186
196
|
if (tool === ToolNames.Context) {
|
|
187
197
|
const rawTurnId = (event as { turnId?: unknown }).turnId;
|
|
@@ -267,6 +277,7 @@ interface HeadlessTerminalOutcome {
|
|
|
267
277
|
}
|
|
268
278
|
|
|
269
279
|
async function recordHeadlessMainAgentReceipt(input: {
|
|
280
|
+
runId: string;
|
|
270
281
|
chat: ChatLoop;
|
|
271
282
|
task: string;
|
|
272
283
|
startedAt: string;
|
|
@@ -289,6 +300,7 @@ async function recordHeadlessMainAgentReceipt(input: {
|
|
|
289
300
|
const outcomeDetail = input.terminal.failureMessage;
|
|
290
301
|
const ledger = openLedger();
|
|
291
302
|
const envelope = ledger.create({
|
|
303
|
+
id: input.runId,
|
|
292
304
|
agentId: "main-agent",
|
|
293
305
|
executionRole: "builder",
|
|
294
306
|
requestOrigin: "user",
|
|
@@ -394,10 +406,14 @@ function defaultShutdownHooks(): HeadlessShutdownHooks {
|
|
|
394
406
|
}
|
|
395
407
|
|
|
396
408
|
export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMainAgentOptions): Promise<number> {
|
|
409
|
+
// Children need the authoritative parent before submit can invoke dispatch.
|
|
410
|
+
// The terminal writer reuses this identity whichever settlement path wins.
|
|
411
|
+
const runId = newRunId();
|
|
397
412
|
const mode = options.mode ?? "text";
|
|
398
413
|
const jsonEvents = options.jsonEvents ?? "full";
|
|
399
414
|
const startedAt = new Date().toISOString();
|
|
400
415
|
let result: HeadlessMainAgentResult = {
|
|
416
|
+
outputExhausted: false,
|
|
401
417
|
text: "",
|
|
402
418
|
error: null,
|
|
403
419
|
sawTerminatingToolResult: false,
|
|
@@ -422,6 +438,7 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
|
|
|
422
438
|
if (sealed !== null) return sealed;
|
|
423
439
|
const endedAt = new Date().toISOString();
|
|
424
440
|
sealed = recordHeadlessMainAgentReceipt({
|
|
441
|
+
runId,
|
|
425
442
|
chat,
|
|
426
443
|
task: options.prompt,
|
|
427
444
|
startedAt,
|
|
@@ -526,6 +543,7 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
|
|
|
526
543
|
try {
|
|
527
544
|
if (mode === "json" && jsonEvents === "terminal") writeTerminalTurnStart();
|
|
528
545
|
const submitOptions = {
|
|
546
|
+
hostRun: { runId, lineage: { parentRunId: null, rootRunId: runId, depth: 0, attempt: 0 } },
|
|
529
547
|
...(options.images && options.images.length > 0 ? { images: options.images } : {}),
|
|
530
548
|
...(options.workingContextPaths && options.workingContextPaths.length > 0
|
|
531
549
|
? { workingContextPaths: options.workingContextPaths }
|
|
@@ -573,6 +591,15 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
|
|
|
573
591
|
} else if (result.error) {
|
|
574
592
|
terminal = { exitCode: 1, outcome: "failed", status: "failed", failureMessage: result.error };
|
|
575
593
|
stderrMessage = prefixHeadlessFailure(chat, result.error);
|
|
594
|
+
} else if (result.outputExhausted && !result.sawTerminatingToolResult) {
|
|
595
|
+
// The provider returned normally, but generation exhausted its budget.
|
|
596
|
+
// Earlier chatter and partial prose cannot turn that terminal cause into
|
|
597
|
+
// success. A later assistant message or terminating tool supersedes it.
|
|
598
|
+
const failureMessage =
|
|
599
|
+
"clio-coder run: output token limit reached (stopReason=length); generation incomplete. Consider resuming with a narrower task, lower reasoning effort, or a larger output budget.";
|
|
600
|
+
terminal = { exitCode: 1, outcome: "failed", status: "failed", failureMessage };
|
|
601
|
+
stderrMessage = failureMessage;
|
|
602
|
+
if (mode === "text" && result.text.length > 0) stdoutMessage = result.text;
|
|
576
603
|
} else if (result.text.length === 0 && !result.sawTerminatingToolResult) {
|
|
577
604
|
const failureMessage =
|
|
578
605
|
result.lastNotice !== null
|
|
@@ -611,7 +638,8 @@ export async function runHeadlessMainAgent(chat: ChatLoop, options: HeadlessMain
|
|
|
611
638
|
|
|
612
639
|
if (stderrMessage !== null) {
|
|
613
640
|
process.stderr.write(`${stderrMessage}\n`);
|
|
614
|
-
}
|
|
641
|
+
}
|
|
642
|
+
if (stdoutMessage !== null) {
|
|
615
643
|
writeRawStdout(`${stdoutMessage}\n`);
|
|
616
644
|
}
|
|
617
645
|
await flushRawStdout();
|
package/src/cli/reset.ts
CHANGED
|
@@ -372,6 +372,8 @@ export async function runResetCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
372
372
|
presenter.finish();
|
|
373
373
|
return 1;
|
|
374
374
|
}
|
|
375
|
+
if (args.config || args.all) presenter.commandAdvice("Set up a model again:", "clio-coder configure");
|
|
376
|
+
else if (args.auth) presenter.commandAdvice("Reconnect your providers:", "clio-coder configure --section targets");
|
|
375
377
|
|
|
376
378
|
presenter.done("Done");
|
|
377
379
|
return 0;
|
package/src/cli/run.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type ClioSettings, readSettings } from "../core/config.js";
|
|
|
2
2
|
import { loadDomains } from "../core/domain-loader.js";
|
|
3
3
|
import { readFileArgsAsync } from "../core/file-references.js";
|
|
4
4
|
import { withRunOverrides } from "../core/run-overrides.js";
|
|
5
|
+
import { readStrictLayeredSettings } from "../core/settings-layers.js";
|
|
5
6
|
import { clioDataDir } from "../core/xdg.js";
|
|
6
7
|
import type { AgentsContract } from "../domains/agents/contract.js";
|
|
7
8
|
import { AgentsDomainModule } from "../domains/agents/index.js";
|
|
@@ -101,15 +102,15 @@ function hasDispatchOnlyOptions(parsed: RunCliArgs): boolean {
|
|
|
101
102
|
|
|
102
103
|
/**
|
|
103
104
|
* True when an explicit --target override names a target that is not in
|
|
104
|
-
* settings.targets.
|
|
105
|
-
* resolver
|
|
105
|
+
* effective settings.targets. Include project overlays just as the runtime
|
|
106
|
+
* resolver does (providers.getTarget), so this mirrors its `target-not-found`
|
|
106
107
|
* verdict without booting the providers domain. Unreadable/invalid settings
|
|
107
108
|
* fall through (returns false) so the normal boot path surfaces that error
|
|
108
109
|
* instead of a misleading "target not found".
|
|
109
110
|
*/
|
|
110
|
-
function explicitTargetMissing(targetId: string): boolean {
|
|
111
|
+
export function explicitTargetMissing(targetId: string): boolean {
|
|
111
112
|
try {
|
|
112
|
-
return !
|
|
113
|
+
return !readStrictLayeredSettings(process.cwd()).settings.targets.some((target) => target.id === targetId);
|
|
113
114
|
} catch {
|
|
114
115
|
return false;
|
|
115
116
|
}
|
|
@@ -163,9 +164,9 @@ function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
|
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
/**
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
167
|
+
* Refuse commands the headless prompt path cannot execute. Skill invocations
|
|
168
|
+
* and prompt templates have production expansion paths; interactive commands
|
|
169
|
+
* do not, so accepting them would send their literal text to the model.
|
|
169
170
|
*
|
|
170
171
|
* `parseSlashCommand` is the canonical shape test and the canonical registry
|
|
171
172
|
* walk, so a token that is one word of letters, digits, hyphens, or colons and
|
|
@@ -190,11 +191,14 @@ function explicitSkillPathErrors(skillPaths: ReadonlyArray<string>): string[] {
|
|
|
190
191
|
* closure sits on. Boundaries rule6 in `tests/boundaries/check-boundaries.ts`
|
|
191
192
|
* holds both halves of that.
|
|
192
193
|
*/
|
|
193
|
-
async function
|
|
194
|
+
async function headlessSlashCommandRefusal(task: string): Promise<string | null> {
|
|
194
195
|
if (!task.trim().startsWith("/")) return null;
|
|
195
196
|
const { parseSlashCommand } = await import("../interactive/slash-commands.js");
|
|
196
197
|
const command = parseSlashCommand(task);
|
|
197
|
-
if (command.kind
|
|
198
|
+
if (command.kind === "skill-invocation" || command.kind === "unknown" || command.kind === "empty") return null;
|
|
199
|
+
if (command.kind !== "unknown-command") {
|
|
200
|
+
return "interactive commands are not supported by clio-coder run; use interactive chat or the corresponding CLI command";
|
|
201
|
+
}
|
|
198
202
|
const { loadPromptTemplates } = await import("../domains/resources/index.js");
|
|
199
203
|
const templates = loadPromptTemplates({ cwd: process.cwd() });
|
|
200
204
|
if (templates.items.some((template) => template.name === command.token)) return null;
|
|
@@ -260,11 +264,9 @@ export async function runClioRun(
|
|
|
260
264
|
if (!assembled) return 2;
|
|
261
265
|
|
|
262
266
|
if (parsed.agentId === undefined) {
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
|
|
266
|
-
// and what docs/guide/extensions-and-sharing.md documents for both surfaces.
|
|
267
|
-
const slashRefusal = await unknownSlashCommandRefusal(assembled.prompt);
|
|
267
|
+
// Reject unknown and unsupported interactive commands before boot;
|
|
268
|
+
// neither has a headless handler that could honor the request.
|
|
269
|
+
const slashRefusal = await headlessSlashCommandRefusal(assembled.prompt);
|
|
268
270
|
if (slashRefusal !== null) {
|
|
269
271
|
process.stderr.write(`clio-coder run: ${slashRefusal}\n`);
|
|
270
272
|
return 2;
|
package/src/cli/select.ts
CHANGED
|
@@ -48,6 +48,8 @@ export interface SelectOptions<T> {
|
|
|
48
48
|
backLabel?: string;
|
|
49
49
|
/** Rows to show at once. Defaults to what the terminal has room for. */
|
|
50
50
|
maxVisible?: number;
|
|
51
|
+
/** Filter a long list by typing; q/j/k are text in this mode. */
|
|
52
|
+
searchable?: boolean;
|
|
51
53
|
/**
|
|
52
54
|
* Erase the menu once it is answered, leaving the caller's transcript to say
|
|
53
55
|
* what was chosen. A wizard that redraws its own answer rows needs this; a
|
|
@@ -243,7 +245,7 @@ function viewportFor(output: NodeJS.WriteStream, overhead: number, total: number
|
|
|
243
245
|
export async function promptSelect<T>(options: SelectOptions<T>): Promise<SelectResult<T>> {
|
|
244
246
|
const input = options.input ?? process.stdin;
|
|
245
247
|
const output = options.output ?? process.stdout;
|
|
246
|
-
|
|
248
|
+
let choices = options.choices;
|
|
247
249
|
if (choices.length === 0) return { kind: "back" };
|
|
248
250
|
|
|
249
251
|
const rail = options.railPrefix ?? "";
|
|
@@ -255,15 +257,25 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
|
|
|
255
257
|
|
|
256
258
|
let index = Math.min(Math.max(options.initialIndex ?? 0, 0), choices.length - 1);
|
|
257
259
|
let windowStart = 0;
|
|
260
|
+
let query = "";
|
|
261
|
+
const filter = () => {
|
|
262
|
+
choices = options.choices.filter((choice) => choice.label.toLowerCase().includes(query.toLowerCase()));
|
|
263
|
+
index = 0;
|
|
264
|
+
windowStart = 0;
|
|
265
|
+
render();
|
|
266
|
+
};
|
|
258
267
|
|
|
259
268
|
const render = (): void => {
|
|
260
|
-
const viewport = viewportFor(output, head.length + 5, choices.length, options.maxVisible);
|
|
269
|
+
const viewport = viewportFor(output, head.length + (options.searchable ? 6 : 5), choices.length, options.maxVisible);
|
|
261
270
|
if (index < windowStart) windowStart = index;
|
|
262
271
|
else if (index >= windowStart + viewport) windowStart = index - viewport + 1;
|
|
263
272
|
windowStart = Math.max(0, Math.min(windowStart, choices.length - viewport));
|
|
264
273
|
const lines: string[] = [];
|
|
265
274
|
for (const line of head) lines.push(`${rail}${line}`.trimEnd());
|
|
266
275
|
if (head.length > 0) lines.push(rail.trimEnd());
|
|
276
|
+
if (options.searchable)
|
|
277
|
+
lines.push(`${rail}${truncate(`Filter: ${query || "(type to search)"}`, terminalColumns(output) - railWidth)}`);
|
|
278
|
+
if (choices.length === 0) lines.push(`${rail}No matching models`);
|
|
267
279
|
lines.push(
|
|
268
280
|
...choiceRows(
|
|
269
281
|
{
|
|
@@ -284,7 +296,8 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
|
|
|
284
296
|
// "quit" reads as two different exits.
|
|
285
297
|
const legend = ["↑/↓ move", "enter select"];
|
|
286
298
|
if (options.backLabel !== undefined && options.backLabel !== "quit") legend.push(`esc ${options.backLabel}`);
|
|
287
|
-
legend.push(
|
|
299
|
+
if (options.searchable) legend.push("type to filter", "ctrl-u clear", "ctrl-c quit");
|
|
300
|
+
else legend.push(options.backLabel === "quit" ? "esc or q quit" : "q quit");
|
|
288
301
|
lines.push(`${rail}${chalk.dim(legend.join(" · "))}`);
|
|
289
302
|
frame.draw(lines);
|
|
290
303
|
};
|
|
@@ -294,11 +307,29 @@ export async function promptSelect<T>(options: SelectOptions<T>): Promise<Select
|
|
|
294
307
|
output,
|
|
295
308
|
true,
|
|
296
309
|
render,
|
|
297
|
-
(
|
|
310
|
+
(str, key, finish) => {
|
|
298
311
|
if (key.ctrl && (key.name === "c" || key.name === "d")) {
|
|
299
312
|
finish({ kind: "quit" });
|
|
300
313
|
return;
|
|
301
314
|
}
|
|
315
|
+
if (options.searchable) {
|
|
316
|
+
if (key.ctrl && key.name === "u") {
|
|
317
|
+
query = "";
|
|
318
|
+
filter();
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (key.name === "backspace") {
|
|
322
|
+
query = query.slice(0, -1);
|
|
323
|
+
filter();
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if (!key.ctrl && !key.meta && str?.length === 1 && str >= " " && str !== "\x7f") {
|
|
327
|
+
query += str;
|
|
328
|
+
filter();
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
if (choices.length === 0 && !["escape", "left"].includes(key.name ?? "")) return;
|
|
332
|
+
}
|
|
302
333
|
switch (key.name) {
|
|
303
334
|
case "up":
|
|
304
335
|
case "k":
|