@iowarp/clio-coder 0.4.4 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -2
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-TQAHXW6Y.js → chunk-22PQ4TX4.js} +4 -4
- 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-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
- 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-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
- package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
- package/dist/{chunk-25QBEXRS.js → chunk-7TKWWPD7.js} +5 -4
- 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-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- 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-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- 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-YNFKXPEC.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- 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-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
- 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-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
- package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-72YIHOZQ.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
- package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
- 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-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- 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-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
- 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-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.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-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/{chunk-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
- package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
- package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
- package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- 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-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
- package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
- 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-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
- 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-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
- 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-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-5636DCO5.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-OEJSLEPW.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
- 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-5I2IBFYL.js +26 -0
- package/dist/{code-nav-IJR2DBPR.js → code-nav-YXIAEZVS.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-Y2JDJ3JJ.js} +210 -124
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
- package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-BOYF5EJM.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -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-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
- package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
- package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -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-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
- package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
- package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
- 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-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
- package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
- package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -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-N5REUETU.js} +145 -94
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.js → terminal-lease-57UEOJKS.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-4HD5HAIV.js} +40 -39
- package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
- package/dist/verify-3AS3ULCY.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-7BV7XWIY.js +614 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -88
- 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 +44 -59
- 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/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +49 -36
- package/docs/guide/configuration-and-targets.md +7 -2
- package/docs/guide/configuration-reference.md +13 -3
- package/docs/guide/environment-variables.md +6 -2
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- 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 +10 -10
- 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 +6 -6
- 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/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/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/run.ts +16 -14
- 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 +9 -6
- 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 +33 -14
- package/src/core/defaults.ts +5 -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/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/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- 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/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +17 -2
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/interactive-application.ts +8 -2
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +15 -7
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-commands.ts +9 -7
- 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/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/read.ts +112 -15
- package/src/tools/registry.ts +54 -17
- 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 +6 -1
- 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/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/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/skills-eval.ts
CHANGED
|
@@ -272,10 +272,10 @@ export async function runSkillsEvalCommand(nameOrPath: string, options: SkillsEv
|
|
|
272
272
|
return anyUnmeasured || evidenceErrors.length > 0 ? 3 : 0;
|
|
273
273
|
}
|
|
274
274
|
|
|
275
|
-
export type NetworkPolicyLabel = "
|
|
275
|
+
export type NetworkPolicyLabel = "retrieve-disabled" | "allowed";
|
|
276
276
|
|
|
277
277
|
function networkPolicyLabel(allowNetwork: boolean): NetworkPolicyLabel {
|
|
278
|
-
return allowNetwork ? "allowed" : "
|
|
278
|
+
return allowNetwork ? "allowed" : "retrieve-disabled";
|
|
279
279
|
}
|
|
280
280
|
|
|
281
281
|
/**
|
|
@@ -287,7 +287,7 @@ function networkPolicyLabel(allowNetwork: boolean): NetworkPolicyLabel {
|
|
|
287
287
|
function describeArmPolicy(allowNetwork: boolean): string {
|
|
288
288
|
const network = allowNetwork
|
|
289
289
|
? "network allowed (--allow-network), so arm runs keep the web tools"
|
|
290
|
-
: "
|
|
290
|
+
: "retrieval tools disabled in every arm run; bash networking requires OS isolation (pass --allow-network to keep web tools)";
|
|
291
291
|
return `policy: autonomy ${ARM_AUTONOMY} for the baseline and treatment arms in per-run disposable workspaces; ${network}`;
|
|
292
292
|
}
|
|
293
293
|
|
|
@@ -295,7 +295,7 @@ function describeArmPolicy(allowNetwork: boolean): string {
|
|
|
295
295
|
function describeArmPolicyOutcome(allowNetwork: boolean): string {
|
|
296
296
|
const network = allowNetwork
|
|
297
297
|
? "network: allowed (--allow-network); arm runs kept the web tools"
|
|
298
|
-
: "
|
|
298
|
+
: "retrieval: disabled; bash networking was not constrained";
|
|
299
299
|
return `policy: the baseline and treatment arms ran at autonomy ${ARM_AUTONOMY}; ${network}`;
|
|
300
300
|
}
|
|
301
301
|
|
|
@@ -353,17 +353,19 @@ function unmeasuredBullets(scenario: SkillEvalScenario, reason: string): ScoredB
|
|
|
353
353
|
|
|
354
354
|
/**
|
|
355
355
|
* The environment each arm's child `clio-coder run` inherits. Absent
|
|
356
|
-
* `--allow-network` the
|
|
356
|
+
* `--allow-network` the retrieval registration switch is set, which strips the RETRIEVE
|
|
357
357
|
* plane from every registry the child and its descendants build. With the flag
|
|
358
358
|
* the variable is removed rather than left alone, so an ambient setting in the
|
|
359
359
|
* operator's shell cannot make `--allow-network` a claim the run does not keep.
|
|
360
360
|
*
|
|
361
361
|
* @internal Exported for contract tests.
|
|
362
362
|
*/
|
|
363
|
-
function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
|
|
363
|
+
export function evalChildEnv(allowNetwork: boolean, env: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
|
|
364
364
|
const childEnv: NodeJS.ProcessEnv = { ...env };
|
|
365
|
-
if (allowNetwork)
|
|
366
|
-
|
|
365
|
+
if (allowNetwork) {
|
|
366
|
+
Reflect.deleteProperty(childEnv, NO_NETWORK_TOOLS_ENV);
|
|
367
|
+
Reflect.deleteProperty(childEnv, "CLIO_CODER_NO_NETWORK_TOOLS");
|
|
368
|
+
} else childEnv[NO_NETWORK_TOOLS_ENV] = "1";
|
|
367
369
|
return childEnv;
|
|
368
370
|
}
|
|
369
371
|
|
package/src/cli/steer-channel.ts
CHANGED
|
@@ -1,18 +1,44 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
|
+
import { Socket } from "node:net";
|
|
2
3
|
import * as readline from "node:readline";
|
|
3
4
|
|
|
4
5
|
export function setupSteerChannel(filePath: string, onLine: (line: string) => void): () => void {
|
|
5
6
|
let closed = false;
|
|
6
7
|
let watcher: fs.FSWatcher | null = null;
|
|
7
|
-
let stream:
|
|
8
|
+
let stream: Socket | null = null;
|
|
8
9
|
let rl: readline.Interface | null = null;
|
|
10
|
+
const cleanup = () => {
|
|
11
|
+
if (closed) return;
|
|
12
|
+
closed = true;
|
|
13
|
+
watcher?.close();
|
|
14
|
+
rl?.close();
|
|
15
|
+
stream?.destroy();
|
|
16
|
+
};
|
|
17
|
+
const reportError = (err: unknown) => {
|
|
18
|
+
if (closed) return;
|
|
19
|
+
process.stderr.write(
|
|
20
|
+
`clio-coder run: failed to setup steer channel: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
21
|
+
);
|
|
22
|
+
cleanup();
|
|
23
|
+
};
|
|
9
24
|
|
|
10
25
|
try {
|
|
11
26
|
const stats = fs.statSync(filePath);
|
|
12
27
|
if (stats.isFIFO()) {
|
|
13
|
-
//
|
|
14
|
-
|
|
28
|
+
// A blocking fs read cannot be cancelled while a FIFO writer stays
|
|
29
|
+
// open. Socket uses readiness-driven pipe reads that destroy() closes.
|
|
30
|
+
// Keep read-only access and the existing first-writer-EOF behavior.
|
|
31
|
+
const fd = fs.openSync(filePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
|
|
32
|
+
try {
|
|
33
|
+
stream = new Socket({ fd, readable: true, writable: false });
|
|
34
|
+
} catch (err) {
|
|
35
|
+
// Ownership transfers to Socket only after successful construction.
|
|
36
|
+
fs.closeSync(fd);
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
stream.on("error", reportError);
|
|
15
40
|
rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
|
|
41
|
+
rl.on("error", reportError);
|
|
16
42
|
rl.on("line", (line) => {
|
|
17
43
|
if (closed) return;
|
|
18
44
|
const trimmed = line.trim();
|
|
@@ -66,21 +92,8 @@ export function setupSteerChannel(filePath: string, onLine: (line: string) => vo
|
|
|
66
92
|
});
|
|
67
93
|
}
|
|
68
94
|
} catch (err) {
|
|
69
|
-
|
|
70
|
-
`clio-coder run: failed to setup steer channel: ${err instanceof Error ? err.message : String(err)}\n`,
|
|
71
|
-
);
|
|
95
|
+
reportError(err);
|
|
72
96
|
}
|
|
73
97
|
|
|
74
|
-
return
|
|
75
|
-
closed = true;
|
|
76
|
-
if (watcher) {
|
|
77
|
-
watcher.close();
|
|
78
|
-
}
|
|
79
|
-
if (rl) {
|
|
80
|
-
rl.close();
|
|
81
|
-
}
|
|
82
|
-
if (stream) {
|
|
83
|
-
stream.destroy();
|
|
84
|
-
}
|
|
85
|
-
};
|
|
98
|
+
return cleanup;
|
|
86
99
|
}
|
package/src/cli/targets.ts
CHANGED
|
@@ -5,6 +5,8 @@ import {
|
|
|
5
5
|
readSettings,
|
|
6
6
|
removeFleetProfileFromSettings,
|
|
7
7
|
setFleetProfileInSettings,
|
|
8
|
+
type TargetSelectionRole,
|
|
9
|
+
type UseTargetOptions,
|
|
8
10
|
updateSettings,
|
|
9
11
|
useTargetInSettings,
|
|
10
12
|
} from "../core/config.js";
|
|
@@ -24,6 +26,7 @@ import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.
|
|
|
24
26
|
import type { CapabilityFlags } from "../domains/providers/types/capability-flags.js";
|
|
25
27
|
import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
|
|
26
28
|
import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
|
|
29
|
+
import { resolveSupportedWireModels } from "./configure-target.js";
|
|
27
30
|
import { printError, printOk } from "./shared.js";
|
|
28
31
|
import { column, terminalColumns, truncate, wrapPlain } from "./text-layout.js";
|
|
29
32
|
|
|
@@ -259,7 +262,7 @@ function parseUseArgs(args: ReadonlyArray<string>): UseArgs | null {
|
|
|
259
262
|
return parsed;
|
|
260
263
|
}
|
|
261
264
|
|
|
262
|
-
function runUse(args: ReadonlyArray<string>): number {
|
|
265
|
+
async function runUse(args: ReadonlyArray<string>): Promise<number> {
|
|
263
266
|
if (wantsHelp(args)) return printUsage(USE_USAGE);
|
|
264
267
|
let parsed: UseArgs | null;
|
|
265
268
|
try {
|
|
@@ -281,42 +284,91 @@ function runUse(args: ReadonlyArray<string>): number {
|
|
|
281
284
|
}
|
|
282
285
|
const registry = getRuntimeRegistry();
|
|
283
286
|
if (registry.list().length === 0) registerBuiltinRuntimes(registry);
|
|
284
|
-
const
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
)
|
|
287
|
+
const options: UseTargetOptions = {
|
|
288
|
+
...(parsed.model !== undefined ? { model: parsed.model } : {}),
|
|
289
|
+
...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
|
|
290
|
+
...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
|
|
291
|
+
...(parsed.workerTarget !== undefined ? { workerTargetId: parsed.workerTarget } : {}),
|
|
292
|
+
...(parsed.backgroundModel !== undefined ? { backgroundModel: parsed.backgroundModel } : {}),
|
|
293
|
+
};
|
|
294
|
+
const candidate = structuredClone(settings);
|
|
295
|
+
const selection = useTargetInSettings(candidate, target.id, options);
|
|
296
|
+
if (!selection) {
|
|
297
|
+
printError(`no target with id ${parsed.workerTarget}`);
|
|
289
298
|
return 1;
|
|
290
299
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
300
|
+
const labels: Record<TargetSelectionRole, string> = {
|
|
301
|
+
chat: "chat",
|
|
302
|
+
fleet: "fleet dispatch",
|
|
303
|
+
memory: "background memory",
|
|
304
|
+
};
|
|
305
|
+
const routes = { chat: candidate.chat, fleet: candidate.fleet.default, memory: candidate.context.memory };
|
|
306
|
+
const inventories = new Map<string, Awaited<ReturnType<typeof resolveSupportedWireModels>>>();
|
|
307
|
+
const checkedTargets = new Map<string, string>();
|
|
308
|
+
for (const role of selection.roles) {
|
|
309
|
+
const route = routes[role];
|
|
310
|
+
const selectedTarget = candidate.targets.find((entry) => entry.id === route.target);
|
|
311
|
+
if (!selectedTarget) throw new Error("selected target disappeared");
|
|
312
|
+
const runtime = registry.get(selectedTarget.runtime);
|
|
313
|
+
if (!runtime || !(role === "fleet" ? isDispatchEligibleRuntime(runtime) : isOrchestratorEligibleRuntime(runtime))) {
|
|
314
|
+
printError(
|
|
315
|
+
`cannot use target '${selectedTarget.id}' for ${labels[role]}: runtime '${selectedTarget.runtime}' is not eligible`,
|
|
316
|
+
);
|
|
317
|
+
return 1;
|
|
318
|
+
}
|
|
319
|
+
checkedTargets.set(selectedTarget.id, JSON.stringify(selectedTarget));
|
|
320
|
+
if (route.model === null) continue;
|
|
321
|
+
let inventory = inventories.get(selectedTarget.id);
|
|
322
|
+
if (!inventory) {
|
|
323
|
+
inventory = await resolveSupportedWireModels(runtime, selectedTarget, selectedTarget);
|
|
324
|
+
inventories.set(selectedTarget.id, inventory);
|
|
325
|
+
}
|
|
326
|
+
if (inventory.models.length > 0 && !inventory.models.includes(route.model)) {
|
|
327
|
+
printError(
|
|
328
|
+
`target '${selectedTarget.id}' does not list model '${route.model}' for ${labels[role]} (${inventory.source} inventory). Use an exact listed model id: ${inventory.models.slice(0, 10).join(", ")}`,
|
|
329
|
+
);
|
|
330
|
+
return 1;
|
|
331
|
+
}
|
|
332
|
+
if (inventory.models.length === 0) {
|
|
333
|
+
// Keep offline selection possible, but never imply that an unknown id was verified.
|
|
334
|
+
process.stderr.write(
|
|
335
|
+
`warning: could not verify model '${route.model}' for ${labels[role]}: target '${selectedTarget.id}' returned no model list; saving the id as written\n`,
|
|
336
|
+
);
|
|
337
|
+
} else if (inventory.source === "cache" || inventory.source === "legacy") {
|
|
338
|
+
process.stderr.write(
|
|
339
|
+
`warning: using ${inventory.source} model inventory for target '${selectedTarget.id}'; live availability was not verified\n`,
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Re-read under the settings lock. A changed endpoint/default invalidates the
|
|
344
|
+
// checked inventory; unrelated concurrent role edits are preserved by the scoped mutation.
|
|
345
|
+
let changedRoles: TargetSelectionRole[] = [];
|
|
346
|
+
try {
|
|
347
|
+
updateSettings((fresh) => {
|
|
348
|
+
for (const [id, descriptor] of checkedTargets) {
|
|
349
|
+
if (JSON.stringify(fresh.targets.find((entry) => entry.id === id)) !== descriptor) {
|
|
350
|
+
throw new Error(`target '${id}' changed while checking models; retry targets use`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const applied = useTargetInSettings(fresh, target.id, options);
|
|
354
|
+
if (!applied) throw new Error("target changed while checking models; retry targets use");
|
|
355
|
+
changedRoles = applied.changedRoles;
|
|
356
|
+
});
|
|
357
|
+
} catch (error) {
|
|
358
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
295
359
|
return 1;
|
|
296
360
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
const
|
|
300
|
-
|
|
301
|
-
|
|
361
|
+
const changedByTarget = new Map<string, string[]>();
|
|
362
|
+
for (const role of changedRoles) {
|
|
363
|
+
const id = routes[role].target as string;
|
|
364
|
+
const names = changedByTarget.get(id) ?? [];
|
|
365
|
+
names.push(labels[role]);
|
|
366
|
+
changedByTarget.set(id, names);
|
|
302
367
|
}
|
|
303
|
-
const backgroundModel = parsed.backgroundModel;
|
|
304
|
-
// Locked read-modify-write so a concurrent session's field-level
|
|
305
|
-
// write-through (Shift+Tab, Alt+L, …) cannot be lost between our read
|
|
306
|
-
// above and this save.
|
|
307
|
-
updateSettings((fresh) => {
|
|
308
|
-
useTargetInSettings(fresh, target.id, {
|
|
309
|
-
...(parsed.model !== undefined ? { model: parsed.model } : {}),
|
|
310
|
-
...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
|
|
311
|
-
...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
|
|
312
|
-
workerTargetId: workerTarget.id,
|
|
313
|
-
...(backgroundModel !== undefined ? { backgroundModel } : {}),
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
const dispatchWhere = workerTarget === target ? "" : ` and ${workerTarget.id} for fleet dispatch`;
|
|
317
|
-
const chatWhere = workerTarget === target ? "for chat and fleet dispatch" : "for chat";
|
|
318
368
|
printOk(
|
|
319
|
-
|
|
369
|
+
changedRoles.length === 0
|
|
370
|
+
? "no role settings changed"
|
|
371
|
+
: `using ${[...changedByTarget].map(([id, names]) => `target ${id} for ${names.join(" and ")}`).join("; ")}`,
|
|
320
372
|
);
|
|
321
373
|
return 0;
|
|
322
374
|
}
|
package/src/cli/tasks.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalizeIntentExpectedOutputs, normalizeIntentVerification } from "../domains/dispatch/intent.js";
|
|
2
2
|
import type { UserTaskAcceptance } from "../domains/user-tasks/acceptance.js";
|
|
3
|
+
import { formatUserTaskHandoff } from "../domains/user-tasks/handoff.js";
|
|
3
4
|
import { createUserTasksStore } from "../domains/user-tasks/store.js";
|
|
4
5
|
import { packageDeclaredCheck } from "../tools/verify/catalog.js";
|
|
5
6
|
import { discoverDeclaredChecksAtRoot, discoverDeclaredProjectEntriesAtRoot } from "../tools/verify/scripts.js";
|
|
@@ -74,7 +75,15 @@ export function runTasksCommand(args: string[]): number {
|
|
|
74
75
|
} else if (action === "list" && rest.length === 0) {
|
|
75
76
|
console.log(JSON.stringify(store.snapshot(), null, 2));
|
|
76
77
|
} else if ((action === "hand" || action === "done" || action === "drop") && rest.length === 1) {
|
|
77
|
-
|
|
78
|
+
const task = store[action](rest[0] ?? "");
|
|
79
|
+
console.log(JSON.stringify(task, null, 2));
|
|
80
|
+
if (action === "hand") {
|
|
81
|
+
console.error(
|
|
82
|
+
"CLI hand records the inbox state only; it does not start a session or submit the interactive /tasks hand turn. " +
|
|
83
|
+
"Pass this pickup prompt to clio-coder run in the same project:\n" +
|
|
84
|
+
formatUserTaskHandoff(task),
|
|
85
|
+
);
|
|
86
|
+
}
|
|
78
87
|
} else throw new Error(HELP);
|
|
79
88
|
return 0;
|
|
80
89
|
} catch (error) {
|
package/src/cli/upgrade.ts
CHANGED
|
@@ -21,11 +21,12 @@ Flags:
|
|
|
21
21
|
--dry-run print planned actions without changing anything
|
|
22
22
|
--channel=<chan> npm dist-tag to install (latest|beta|dev). npm installs only.
|
|
23
23
|
--skip-migrations skip migrations after the install step
|
|
24
|
+
--post-install apply local checks after a package-manager update; skip reinstall
|
|
24
25
|
--json emit machine-readable JSON output
|
|
25
26
|
--help, -h show this message
|
|
26
27
|
`;
|
|
27
28
|
|
|
28
|
-
const SOURCE_UPGRADE_STEPS = ["git pull", "
|
|
29
|
+
const SOURCE_UPGRADE_STEPS = ["git pull", "pnpm run install:local", "hash -r"] as const;
|
|
29
30
|
/** One wording for the source-update advice. Three paths print it; they used to disagree. */
|
|
30
31
|
const SOURCE_UPGRADE_LEAD = "To update the checkout itself, run:";
|
|
31
32
|
|
|
@@ -85,7 +86,7 @@ function parseUpgradeArgs(argv: ReadonlyArray<string>): UpgradeOptions {
|
|
|
85
86
|
* the installed version is the newest one.
|
|
86
87
|
*/
|
|
87
88
|
type RegistryLookup =
|
|
88
|
-
| { asked: false; reason: "source checkout" | "network checks are disabled" }
|
|
89
|
+
| { asked: false; reason: "source checkout" | "network checks are disabled" | "post-install checks" }
|
|
89
90
|
| { asked: true; version: string | null };
|
|
90
91
|
|
|
91
92
|
function testSeam(name: string): string | undefined {
|
|
@@ -186,11 +187,13 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
|
|
|
186
187
|
const before = getVersionInfo().clio;
|
|
187
188
|
const stateDir = clioStateDir();
|
|
188
189
|
const method = detectInstallMethod();
|
|
189
|
-
const methodLabel = method === "source" ? "source checkout" : "npm global";
|
|
190
|
+
const methodLabel = method === "source" ? "source checkout" : opts.postInstall ? "package install" : "npm global";
|
|
190
191
|
presenter.setMethod(methodLabel);
|
|
191
192
|
|
|
192
193
|
const noNetwork = Boolean(testSeam("CLIO_CODER_TEST_UPGRADE_NO_NETWORK"));
|
|
193
|
-
const lookup =
|
|
194
|
+
const lookup: RegistryLookup = opts.postInstall
|
|
195
|
+
? { asked: false, reason: "post-install checks" }
|
|
196
|
+
: await lookUpAvailableVersion(opts.channel, method, noNetwork);
|
|
194
197
|
const availableVersion = lookup.asked ? lookup.version : null;
|
|
195
198
|
|
|
196
199
|
presenter.step(`Installation method: ${methodLabel}`);
|
|
@@ -201,7 +204,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
|
|
|
201
204
|
if (availableVersion !== null) presenter.step(`Available version: ${availableVersion}`);
|
|
202
205
|
else if (!lookup.asked) presenter.step(`Available version: not checked (${lookup.reason})`);
|
|
203
206
|
else presenter.step("Available version: unknown (the registry could not be reached)");
|
|
204
|
-
if (method === "npm") presenter.step(`Channel: ${opts.channel}`);
|
|
207
|
+
if (method === "npm" && !opts.postInstall) presenter.step(`Channel: ${opts.channel}`);
|
|
205
208
|
presenter.step(`State dir: ${shortenPath(stateDir)}`);
|
|
206
209
|
|
|
207
210
|
const migrations = listMigrations();
|
|
@@ -236,7 +239,7 @@ export async function runUpgradeCommand(argv: ReadonlyArray<string>): Promise<nu
|
|
|
236
239
|
|
|
237
240
|
if (opts.dryRun) {
|
|
238
241
|
if (method === "source") presenter.commandAdvice(SOURCE_UPGRADE_LEAD, SOURCE_UPGRADE_STEPS.join("\n"));
|
|
239
|
-
else presenter.note(`Would run: npm install -g @iowarp/clio-coder@${opts.channel}`);
|
|
242
|
+
else if (!opts.postInstall) presenter.note(`Would run: npm install -g @iowarp/clio-coder@${opts.channel}`);
|
|
240
243
|
if (opts.skipMigrations) presenter.note("Would skip migrations (--skip-migrations).");
|
|
241
244
|
else if (pendingMigrationIds.length === 0) presenter.note("No pending migrations.");
|
|
242
245
|
else {
|
package/src/cli/usage.ts
CHANGED
|
@@ -354,6 +354,9 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
354
354
|
diagnostics.malformedAuditRows = auditRows.errors.length;
|
|
355
355
|
const auditInWindow = auditRows.rows.filter((row) => row.ts !== null && inWindow(row.ts, windowStart, now));
|
|
356
356
|
const auditToolCalls = auditInWindow.filter((row) => row.auditKind === "tool_call");
|
|
357
|
+
const permissions = summarizePermissionDecisions(
|
|
358
|
+
auditInWindow.filter((row) => row.auditKind === "permission").map((row) => row.row),
|
|
359
|
+
);
|
|
357
360
|
const auditBlocked = auditToolCalls.filter((row) => {
|
|
358
361
|
const decision = typeof row.row.decision === "string" ? row.row.decision : "";
|
|
359
362
|
return decision === "blocked" || decision === "denied";
|
|
@@ -564,6 +567,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
564
567
|
emit({ kind: "fact", fact: "unverified-successes", value: accountability.unverifiedSuccesses });
|
|
565
568
|
emit({ kind: "fact", fact: "ungrounded-claims", value: accountability.ungroundedClaims });
|
|
566
569
|
emit({ kind: "fact", fact: "audit-tool-calls", value: auditToolCalls.length, blocked: auditBlocked.length });
|
|
570
|
+
emit({ kind: "fact", fact: "permission-approval", ...permissions });
|
|
567
571
|
if (usageMeasurable) {
|
|
568
572
|
// The origin split is emitted only when something out of turn was
|
|
569
573
|
// recorded, so a report over an archive with no `/btw`, `/handoff`, or
|
|
@@ -656,6 +660,9 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
656
660
|
} else {
|
|
657
661
|
out(` receipt store missing at ${presence.receiptsPath}`);
|
|
658
662
|
}
|
|
663
|
+
out(
|
|
664
|
+
` permission decisions: ${permissions.requested} requested, ${permissions.granted} granted, ${permissions.denied} denied, ${permissions.expired} expired; approval rate ${permissions.approvalRate === null ? "n/a" : `${(permissions.approvalRate * 100).toFixed(1)}%`}`,
|
|
665
|
+
);
|
|
659
666
|
out(` audited tool calls in window: ${auditToolCalls.length} (${auditBlocked.length} blocked/denied)`);
|
|
660
667
|
if (usageMeasurable) {
|
|
661
668
|
out(
|
|
@@ -1128,3 +1135,20 @@ function numberOr0(value: unknown): number {
|
|
|
1128
1135
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
1129
1136
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1130
1137
|
}
|
|
1138
|
+
|
|
1139
|
+
/** Event-window approval rate. Resolutions can belong to requests outside the window. */
|
|
1140
|
+
export function summarizePermissionDecisions(rows: ReadonlyArray<Record<string, unknown>>): {
|
|
1141
|
+
requested: number;
|
|
1142
|
+
granted: number;
|
|
1143
|
+
denied: number;
|
|
1144
|
+
expired: number;
|
|
1145
|
+
approvalRate: number | null;
|
|
1146
|
+
} {
|
|
1147
|
+
const counts = { requested: 0, granted: 0, denied: 0, expired: 0 };
|
|
1148
|
+
for (const row of rows) {
|
|
1149
|
+
const status = row.status;
|
|
1150
|
+
if (status === "requested" || status === "granted" || status === "denied" || status === "expired")
|
|
1151
|
+
counts[status] += 1;
|
|
1152
|
+
}
|
|
1153
|
+
return { ...counts, approvalRate: counts.requested === 0 ? null : counts.granted / counts.requested };
|
|
1154
|
+
}
|