@iowarp/clio-coder 0.4.3 → 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 +153 -0
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
- package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-7DRAWPTZ.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-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
- package/dist/{chunk-NMJXSHBJ.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-5DDOTTG4.js +402 -0
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
- package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/chunk-633EXGZA.js +44 -0
- package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
- package/dist/{chunk-DWUOQKRU.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-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
- 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-B6UM3OZC.js +15 -0
- package/dist/{chunk-MCEPRMZW.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-42FMPA75.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-WCXUNS7U.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-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
- 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-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
- package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
- 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-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/chunk-GXCCHKN6.js +59 -0
- package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
- package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-WBKFA554.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-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
- package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
- 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-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
- package/dist/chunk-L4N3DWNW.js +539 -0
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/chunk-LVFANMOH.js +466 -0
- 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-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/chunk-MDU3C27C.js +674 -0
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-JEQ3XTHC.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-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/chunk-O2RQ7LCK.js +283 -0
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
- 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-64I3JVYM.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-R6MAYTMS.js +108 -0
- package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
- package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
- package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
- package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
- 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-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/chunk-T52TPHYC.js +318 -0
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
- package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/chunk-VLPTKCKT.js +396 -0
- 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-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
- package/dist/{chunk-YQWYVTMC.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-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-2VIKGWFZ.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-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
- 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 +45 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-MDZNQS33.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-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
- package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
- package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-E3VC7RX5.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-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
- package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
- package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
- package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
- package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
- package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
- package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
- package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
- package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
- package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
- package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
- package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
- package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
- package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
- package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.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-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
- package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
- package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
- package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -85
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +10 -8
- package/docs/architecture/acp.md +27 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/artifact-versions.md +1 -1
- 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/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +11 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +22 -12
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +1 -1
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +66 -38
- package/docs/guide/configuration-and-targets.md +10 -3
- package/docs/guide/configuration-reference.md +23 -8
- package/docs/guide/environment-variables.md +8 -4
- 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 +87 -5
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +15 -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/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- 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/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +33 -33
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +17 -17
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- 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.ts +2 -1
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/eval.ts +17 -3
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -16
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +84 -32
- package/src/cli/tasks.ts +93 -0
- package/src/cli/upgrade.ts +19 -11
- package/src/cli/usage.ts +30 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +240 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/commit-attribution.ts +41 -1
- 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/git-commit-attribution.ts +46 -3
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/run-overrides.ts +0 -5
- package/src/core/settings-layers.ts +21 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/termination.ts +26 -9
- package/src/core/tool-names.ts +5 -2
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +5 -3
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +8 -5
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- 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 +97 -11
- 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 +12 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +207 -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 +85 -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 +10 -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/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +41 -9
- 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 +4 -0
- package/src/domains/dispatch/extension.ts +240 -132
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +21 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +13 -37
- 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/state.ts +15 -2
- package/src/domains/dispatch/types.ts +21 -5
- 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 +17 -10
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- 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 +106 -17
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- 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/marketplace-offer.ts +20 -1
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/runtime.ts +7 -3
- 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/detect.ts +3 -6
- 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/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +54 -9
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +423 -53
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- 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 +12 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +36 -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/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +16 -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 +13 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +211 -34
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/archive-readers.ts +10 -1
- 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 +137 -28
- package/src/domains/session/entries.ts +213 -11
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +32 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +60 -10
- package/src/engine/acp/server.ts +22 -4
- package/src/engine/acp/transport.ts +55 -9
- package/src/engine/acp/types.ts +9 -0
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/ollama-native.ts +15 -0
- 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/claude/subprocess-runtime.ts +107 -60
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +26 -7
- 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 +64 -17
- 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 +58 -714
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +11 -4
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +63 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/oracle.ts +5 -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/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +3 -3
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.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-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +31 -43
- package/src/interactive/slash-spec.ts +28 -0
- 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 +2 -0
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +14 -10
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +40 -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 +41 -1
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +33 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +12 -9
- package/src/tools/dispatch-runner.ts +63 -33
- 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/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/limitation.ts +76 -0
- 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/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +127 -7
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +40 -5
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +303 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- 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-IA7V7FUC.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-BEPZRGGU.js +0 -1560
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-KK4JZPBQ.js +0 -3982
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-NDINPTJ4.js +0 -641
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/chunk-Y3CBHOR6.js +0 -228
- package/dist/clio-CMMK4KRR.js +0 -25
- package/dist/configure-LE3IK2TJ.js +0 -56
- package/dist/context-clear-BW4O37TG.js +0 -176
- package/dist/fleet-view-SWBR3VGQ.js +0 -97
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-S7MBJDQK.js +0 -83
- package/dist/tools-TFGJICCU.js +0 -29
- package/dist/verify-RWE4PPEK.js +0 -27
- package/dist/wiki-generate-C7IQOXSP.js +0 -469
package/src/cli/wiki-generate.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
3
|
import { performance } from "node:perf_hooks";
|
|
4
4
|
import { type LoadResult, loadDomains } from "../core/domain-loader.js";
|
|
5
|
+
import { asDirectoryPathBoundary } from "../core/path-boundary.js";
|
|
6
|
+
import { runWithBudget, writeShutdownNotice } from "../core/termination.js";
|
|
5
7
|
import { ToolNames } from "../core/tool-names.js";
|
|
6
8
|
import { AgentsDomainModule } from "../domains/agents/index.js";
|
|
7
9
|
import type { ConfigContract } from "../domains/config/contract.js";
|
|
8
10
|
import { ConfigDomainModule } from "../domains/config/index.js";
|
|
9
11
|
import { ContextDomainModule } from "../domains/context/runtime.js";
|
|
12
|
+
import { inspectWikiPageEvidence } from "../domains/context/wiki/evidence.js";
|
|
10
13
|
import type { WikiGenerate, WikiGenerateInput } from "../domains/context/wiki/generate.js";
|
|
11
14
|
import type { WikiPlan, WikiPlanPage } from "../domains/context/wiki/plan.js";
|
|
12
15
|
import {
|
|
@@ -18,6 +21,7 @@ import {
|
|
|
18
21
|
import { buildWikiPagePrompt, buildWikiPlanPrompt } from "../domains/context/wiki/prompts.js";
|
|
19
22
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
20
23
|
import { DispatchDomainModule } from "../domains/dispatch/index.js";
|
|
24
|
+
import { declaredScopeIntent } from "../domains/dispatch/intent.js";
|
|
21
25
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
22
26
|
import type { JobSpec, JobThinkingLevel } from "../domains/dispatch/validation.js";
|
|
23
27
|
import { MiddlewareDomainModule } from "../domains/middleware/index.js";
|
|
@@ -28,7 +32,6 @@ import { ResourcesDomainModule } from "../domains/resources/index.js";
|
|
|
28
32
|
import { SafetyDomainModule } from "../domains/safety/index.js";
|
|
29
33
|
import { SchedulingDomainModule } from "../domains/scheduling/index.js";
|
|
30
34
|
import { SessionDomainModule } from "../domains/session/index.js";
|
|
31
|
-
import { armInternalDispatchDeadline } from "./internal-dispatch.js";
|
|
32
35
|
|
|
33
36
|
/**
|
|
34
37
|
* Model id recorded on wiki metadata when the documenter target cannot be
|
|
@@ -41,25 +44,10 @@ const UNRESOLVED_DOCUMENTER_MODEL = "unresolved-documenter-target";
|
|
|
41
44
|
/** The agent recipe that plans and writes pages. */
|
|
42
45
|
const WIKI_AGENT_ID = "wiki-writer";
|
|
43
46
|
|
|
44
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
* page from consuming the time every other page needed, and losing it costs
|
|
49
|
-
* exactly that page because the plan records it as still owed.
|
|
50
|
-
*/
|
|
51
|
-
const PAGE_DEADLINE_MS = 6 * 60 * 1000;
|
|
52
|
-
|
|
53
|
-
/** Wall-clock ceiling for the single planning dispatch. */
|
|
54
|
-
const PLAN_DEADLINE_MS = 8 * 60 * 1000;
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Wall-clock budget for a whole generation, checked between page dispatches and
|
|
58
|
-
* never during one. Exceeding it ends the run cleanly with every finished page
|
|
59
|
-
* promoted and the rest recorded as owed, so a repository too large for one
|
|
60
|
-
* sitting is finished by the next run instead of failing forever.
|
|
61
|
-
*/
|
|
62
|
-
const RUN_BUDGET_MS = 60 * 60 * 1000;
|
|
47
|
+
/** Planning estimates inform progress, never admission or execution limits. */
|
|
48
|
+
const PAGE_ESTIMATE_MS = 6 * 60 * 1000;
|
|
49
|
+
const PLAN_ESTIMATE_MS = 8 * 60 * 1000;
|
|
50
|
+
const RUN_ESTIMATE_MS = 60 * 60 * 1000;
|
|
63
51
|
|
|
64
52
|
export interface WikiModelRoute {
|
|
65
53
|
target?: string;
|
|
@@ -70,8 +58,10 @@ export interface WikiModelRoute {
|
|
|
70
58
|
export interface ModelWikiGenerateOptions {
|
|
71
59
|
dispatch?: DispatchContract;
|
|
72
60
|
route?: WikiModelRoute;
|
|
73
|
-
/**
|
|
61
|
+
/** Explicit whole-run duration; omission leaves ordinary estimates advisory. */
|
|
74
62
|
runBudgetMs?: number;
|
|
63
|
+
/** Explicit absolute deadline, shared unchanged by planning and every page. */
|
|
64
|
+
deadlineAt?: number;
|
|
75
65
|
}
|
|
76
66
|
|
|
77
67
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
@@ -122,13 +112,7 @@ interface DispatchSummary {
|
|
|
122
112
|
mix: string;
|
|
123
113
|
}
|
|
124
114
|
|
|
125
|
-
/**
|
|
126
|
-
* Longest an in-flight phase may go without saying anything. The planner is
|
|
127
|
-
* allowed eight minutes and a page six, and the operator who reported this saw
|
|
128
|
-
* two lines in five minutes, concluded the command had deadlocked, and killed
|
|
129
|
-
* it. Narrating every tool call would scroll the terminal for nothing, so the
|
|
130
|
-
* heartbeat is throttled to this and carries only elapsed time and tool count.
|
|
131
|
-
*/
|
|
115
|
+
/** Throttle activity summaries so long-running healthy work remains visible. */
|
|
132
116
|
const HEARTBEAT_MS = 30_000;
|
|
133
117
|
|
|
134
118
|
/**
|
|
@@ -180,9 +164,30 @@ function summaryDetail(summary: DispatchSummary, startedAtClock: number): string
|
|
|
180
164
|
);
|
|
181
165
|
}
|
|
182
166
|
|
|
183
|
-
|
|
184
|
-
ok:
|
|
185
|
-
detail: string;
|
|
167
|
+
type WikiDispatchOutcome =
|
|
168
|
+
| { ok: false; phase: "admission"; detail: string }
|
|
169
|
+
| { ok: boolean; phase: "writer"; detail: string; runId: string };
|
|
170
|
+
|
|
171
|
+
interface WikiDeadline {
|
|
172
|
+
at: number;
|
|
173
|
+
remainingMs(): number;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function explicitWikiDeadline(options: ModelWikiGenerateOptions): WikiDeadline | undefined {
|
|
177
|
+
if (options.runBudgetMs !== undefined && (!Number.isFinite(options.runBudgetMs) || options.runBudgetMs < 0))
|
|
178
|
+
throw new Error("wiki runBudgetMs must be a finite non-negative duration");
|
|
179
|
+
if (options.deadlineAt !== undefined && !Number.isFinite(options.deadlineAt))
|
|
180
|
+
throw new Error("wiki deadlineAt must be a finite timestamp");
|
|
181
|
+
if (options.deadlineAt === undefined && options.runBudgetMs === undefined) return undefined;
|
|
182
|
+
const wallNow = Date.now();
|
|
183
|
+
const at = Math.min(
|
|
184
|
+
options.deadlineAt ?? Number.POSITIVE_INFINITY,
|
|
185
|
+
wallNow + (options.runBudgetMs ?? Number.POSITIVE_INFINITY),
|
|
186
|
+
);
|
|
187
|
+
if (!Number.isFinite(new Date(at).getTime())) throw new Error("wiki deadline exceeds the supported timestamp range");
|
|
188
|
+
const clockNow = performance.now();
|
|
189
|
+
// Keep the admission timestamp fixed while elapsed enforcement is monotonic.
|
|
190
|
+
return { at, remainingMs: () => at - wallNow - (performance.now() - clockNow) };
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
/**
|
|
@@ -195,22 +200,33 @@ async function runWikiDispatch(input: {
|
|
|
195
200
|
cwd: string;
|
|
196
201
|
outputDir: string;
|
|
197
202
|
task: string;
|
|
203
|
+
/** Caller-owned page path, relative to cwd; the planner remains unbound. */
|
|
204
|
+
artifactPath?: string;
|
|
198
205
|
route: WikiModelRoute;
|
|
199
|
-
|
|
200
|
-
label: string;
|
|
206
|
+
deadline: WikiDeadline | undefined;
|
|
201
207
|
/** Liveness signal while the dispatch runs, already throttled by the caller. */
|
|
202
208
|
onHeartbeat?: (info: { elapsedMs: number; tools: number }) => void;
|
|
203
209
|
}): Promise<WikiDispatchOutcome> {
|
|
204
|
-
// `startedAt` is a wall anchor because the admission deadline below is one
|
|
205
|
-
// too; every elapsed figure spans the monotonic twin instead.
|
|
206
|
-
const startedAt = Date.now();
|
|
207
210
|
const startedAtClock = performance.now();
|
|
208
211
|
let handle: Awaited<ReturnType<DispatchContract["dispatch"]>>;
|
|
209
212
|
try {
|
|
213
|
+
if (input.deadline && input.deadline.remainingMs() <= 0)
|
|
214
|
+
throw new Error("explicit wiki deadline reached before admission");
|
|
215
|
+
const stagingRoot = relative(input.cwd, input.outputDir);
|
|
216
|
+
if (!stagingRoot) throw new Error("wiki staging directory must be below the repository root");
|
|
217
|
+
// The repository is readable; only this staging tree is writable. Declare
|
|
218
|
+
// those paths directly so absolute filenames in prompt prose cannot become
|
|
219
|
+
// legacy scope tokens (including a sentence-ending period).
|
|
220
|
+
const scope = declaredScopeIntent({ readRoots: ["."], writeRoots: [asDirectoryPathBoundary(stagingRoot)] });
|
|
221
|
+
if (!scope.ok) throw new Error(`${scope.reason}: ${scope.message}`);
|
|
210
222
|
handle = await input.dispatch.dispatch({
|
|
223
|
+
intent: scope.intent,
|
|
211
224
|
agentId: WIKI_AGENT_ID,
|
|
212
225
|
executionRole: "builder",
|
|
213
226
|
task: input.task,
|
|
227
|
+
...(input.artifactPath !== undefined
|
|
228
|
+
? { resultContractOverride: { kind: "artifact-report" as const, path: input.artifactPath } }
|
|
229
|
+
: {}),
|
|
214
230
|
cwd: input.cwd,
|
|
215
231
|
requestOrigin: "internal",
|
|
216
232
|
noSkills: true,
|
|
@@ -222,21 +238,29 @@ async function runWikiDispatch(input: {
|
|
|
222
238
|
denyTools: [ToolNames.Git],
|
|
223
239
|
// Containment: the worker safety seam blocks any write-class tool call
|
|
224
240
|
// whose target escapes the staging dir.
|
|
225
|
-
writeRoots: [input.outputDir],
|
|
226
|
-
//
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
// dropped before it ever started. Observed live: a 33-page plan lost
|
|
230
|
-
// `core.md` to `dispatch: admission timed_out` at 10/33 while every
|
|
231
|
-
// page ahead of it was taking 110 to 125 seconds. A page the caller is
|
|
232
|
-
// willing to wait six minutes for is a page it should be willing to
|
|
233
|
-
// queue for six minutes.
|
|
234
|
-
assignmentDeadlineAt: startedAt + input.deadlineMs,
|
|
241
|
+
writeRoots: [asDirectoryPathBoundary(input.outputDir)],
|
|
242
|
+
// Only an explicit caller deadline constrains admission; recipe estimates
|
|
243
|
+
// must not become assignment deadlines or restart for each page.
|
|
244
|
+
...(input.deadline ? { assignmentDeadlineAt: input.deadline.at } : {}),
|
|
235
245
|
});
|
|
236
246
|
} catch (err) {
|
|
237
|
-
return { ok: false, detail: err instanceof Error ? err.message : String(err) };
|
|
247
|
+
return { ok: false, phase: "admission", detail: err instanceof Error ? err.message : String(err) };
|
|
238
248
|
}
|
|
239
|
-
|
|
249
|
+
let timedOut = false;
|
|
250
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
251
|
+
const armDeadline = (): void => {
|
|
252
|
+
if (!input.deadline) return;
|
|
253
|
+
const remaining = input.deadline.remainingMs();
|
|
254
|
+
if (remaining <= 0) {
|
|
255
|
+
timedOut = true;
|
|
256
|
+
input.dispatch.abort(handle.runId, { cause: "timeout", detail: "explicit wiki deadline reached" });
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Long explicit deadlines must not overflow Node's timer range into 1ms.
|
|
260
|
+
timer = setTimeout(armDeadline, Math.min(remaining, 2_147_483_647));
|
|
261
|
+
timer.unref();
|
|
262
|
+
};
|
|
263
|
+
armDeadline();
|
|
240
264
|
let lastHeartbeatAt = startedAtClock;
|
|
241
265
|
try {
|
|
242
266
|
const summary = await drainDispatchEvents(handle.events, (tools) => {
|
|
@@ -246,25 +270,42 @@ async function runWikiDispatch(input: {
|
|
|
246
270
|
input.onHeartbeat({ elapsedMs: Math.round(nowMs - startedAtClock), tools });
|
|
247
271
|
});
|
|
248
272
|
const receipt = await handle.finalPromise;
|
|
249
|
-
if (
|
|
273
|
+
if (timedOut)
|
|
274
|
+
return {
|
|
275
|
+
ok: false,
|
|
276
|
+
phase: "writer",
|
|
277
|
+
runId: handle.runId,
|
|
278
|
+
detail: `timed out; ${summaryDetail(summary, startedAtClock)}`,
|
|
279
|
+
};
|
|
250
280
|
if (receipt.exitCode !== 0) {
|
|
251
281
|
input.dispatch.abort(handle.runId);
|
|
252
|
-
return {
|
|
282
|
+
return {
|
|
283
|
+
ok: false,
|
|
284
|
+
phase: "writer",
|
|
285
|
+
runId: handle.runId,
|
|
286
|
+
detail: `${receiptFailure(receipt)}; ${summaryDetail(summary, startedAtClock)}`,
|
|
287
|
+
};
|
|
253
288
|
}
|
|
254
|
-
return { ok: true, detail: summaryDetail(summary, startedAtClock) };
|
|
289
|
+
return { ok: true, phase: "writer", runId: handle.runId, detail: summaryDetail(summary, startedAtClock) };
|
|
255
290
|
} catch (err) {
|
|
256
|
-
if (!
|
|
291
|
+
if (!timedOut) input.dispatch.abort(handle.runId);
|
|
257
292
|
await handle.finalPromise.catch(() => undefined);
|
|
258
|
-
const reason =
|
|
259
|
-
return {
|
|
293
|
+
const reason = timedOut ? "timed out" : err instanceof Error ? err.message : String(err);
|
|
294
|
+
return {
|
|
295
|
+
ok: false,
|
|
296
|
+
phase: "writer",
|
|
297
|
+
runId: handle.runId,
|
|
298
|
+
detail: `${reason}; ${formatElapsed(performance.now() - startedAtClock)}`,
|
|
299
|
+
};
|
|
260
300
|
} finally {
|
|
261
|
-
|
|
301
|
+
clearTimeout(timer);
|
|
262
302
|
}
|
|
263
303
|
}
|
|
264
304
|
|
|
265
305
|
function receiptFailure(receipt: RunReceipt): string {
|
|
266
306
|
const code = receipt.outcomeCode ? ` (${receipt.outcomeCode})` : "";
|
|
267
|
-
|
|
307
|
+
const detail = receipt.outcomeDetail?.replace(/\s+/gu, " ").slice(0, 350);
|
|
308
|
+
return `exit ${receipt.exitCode}${code}${detail ? `: ${detail}` : ""}`;
|
|
268
309
|
}
|
|
269
310
|
|
|
270
311
|
/**
|
|
@@ -276,6 +317,7 @@ async function runPlanPhase(
|
|
|
276
317
|
dispatch: DispatchContract,
|
|
277
318
|
input: WikiGenerateInput,
|
|
278
319
|
route: WikiModelRoute,
|
|
320
|
+
deadline: WikiDeadline | undefined,
|
|
279
321
|
): Promise<WikiPlan> {
|
|
280
322
|
input.progress?.({ phase: "generate", status: "running", message: "planning wiki pages" });
|
|
281
323
|
const outcome = await runWikiDispatch({
|
|
@@ -293,14 +335,13 @@ async function runPlanPhase(
|
|
|
293
335
|
gitHead: input.gitHead ?? null,
|
|
294
336
|
}),
|
|
295
337
|
route,
|
|
296
|
-
|
|
297
|
-
label: "wiki planner",
|
|
338
|
+
deadline,
|
|
298
339
|
onHeartbeat: ({ elapsedMs, tools }) =>
|
|
299
340
|
input.progress?.({
|
|
300
341
|
phase: "generate",
|
|
301
342
|
status: "running",
|
|
302
343
|
message: `still planning (${formatElapsed(elapsedMs)}, ${tools} tool calls)`,
|
|
303
|
-
detail: `planner
|
|
344
|
+
detail: `planner estimate ${Math.round(PLAN_ESTIMATE_MS / 60000)}m; healthy work may continue longer`,
|
|
304
345
|
}),
|
|
305
346
|
});
|
|
306
347
|
const revised = readAuthoredWikiPlan(input.outputDir, input.plan);
|
|
@@ -324,49 +365,72 @@ async function runPagePhase(
|
|
|
324
365
|
page: WikiPlanPage,
|
|
325
366
|
route: WikiModelRoute,
|
|
326
367
|
position: { index: number; total: number },
|
|
368
|
+
deadline: WikiDeadline | undefined,
|
|
327
369
|
): Promise<WikiPlan> {
|
|
328
370
|
const seeded = existsSync(join(input.outputDir, page.path));
|
|
329
371
|
const outcome = await runWikiDispatch({
|
|
330
372
|
dispatch,
|
|
331
373
|
cwd: input.cwd,
|
|
332
374
|
outputDir: input.outputDir,
|
|
375
|
+
artifactPath: relative(input.cwd, join(input.outputDir, page.path)),
|
|
333
376
|
task: buildWikiPagePrompt({
|
|
377
|
+
depth: input.generation.depth,
|
|
334
378
|
cwd: input.cwd,
|
|
335
379
|
mode: input.mode,
|
|
336
380
|
codewiki: input.codewiki,
|
|
337
381
|
page,
|
|
338
382
|
siblings: plan.pages,
|
|
383
|
+
...(input.decisions ? { decisions: input.decisions } : {}),
|
|
339
384
|
outputDir: input.outputDir,
|
|
340
385
|
seeded,
|
|
341
386
|
}),
|
|
342
387
|
route,
|
|
343
|
-
|
|
344
|
-
label: `wiki page ${page.path}`,
|
|
388
|
+
deadline,
|
|
345
389
|
onHeartbeat: ({ elapsedMs, tools }) =>
|
|
346
390
|
input.progress?.({
|
|
347
391
|
phase: "generate",
|
|
348
392
|
status: "running",
|
|
349
393
|
message: `still writing ${page.path} (${position.index}/${position.total}, ${formatElapsed(elapsedMs)}, ${tools} tool calls)`,
|
|
350
|
-
detail: `page
|
|
394
|
+
detail: `page estimate ${Math.round(PAGE_ESTIMATE_MS / 60000)}m; healthy work may continue longer`,
|
|
351
395
|
}),
|
|
352
396
|
});
|
|
353
|
-
//
|
|
354
|
-
//
|
|
355
|
-
const
|
|
397
|
+
// Keep failed refresh prose available, but require both a successful writer
|
|
398
|
+
// and mechanically valid evidence before crediting a page as completed.
|
|
399
|
+
const evidence = outcome.ok
|
|
400
|
+
? inspectWikiPageEvidence({
|
|
401
|
+
pagePath: page.path,
|
|
402
|
+
outputDir: input.outputDir,
|
|
403
|
+
sourceRoot: input.cwd,
|
|
404
|
+
})
|
|
405
|
+
: undefined;
|
|
406
|
+
const written = outcome.ok && evidence?.ok === true;
|
|
407
|
+
const detail = evidence && !evidence.ok ? `evidence check failed: ${evidence.reasons.join("; ")}` : outcome.detail;
|
|
356
408
|
const next: WikiPlan = {
|
|
357
409
|
...plan,
|
|
358
|
-
pages: plan.pages.map((entry) =>
|
|
359
|
-
entry.path
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
410
|
+
pages: plan.pages.map((entry) => {
|
|
411
|
+
if (entry.path !== page.path) return entry;
|
|
412
|
+
const nextPage: WikiPlanPage = {
|
|
413
|
+
...entry,
|
|
414
|
+
status: written ? "written" : "pending",
|
|
415
|
+
...(written ? { dependencies: evidence?.dependencies ?? [] } : {}),
|
|
416
|
+
attempts: entry.attempts + (outcome.phase === "writer" ? 1 : 0),
|
|
417
|
+
};
|
|
418
|
+
if (written) delete nextPage.lastFailure;
|
|
419
|
+
else
|
|
420
|
+
nextPage.lastFailure = {
|
|
421
|
+
phase: outcome.ok ? "validation" : outcome.phase,
|
|
422
|
+
detail: detail.replace(/\s+/gu, " ").slice(0, 500),
|
|
423
|
+
...(outcome.phase === "writer" ? { runId: outcome.runId } : {}),
|
|
424
|
+
};
|
|
425
|
+
return nextPage;
|
|
426
|
+
}),
|
|
363
427
|
};
|
|
364
428
|
writeWikiPlanFile(input.outputDir, next);
|
|
365
429
|
input.progress?.({
|
|
366
430
|
phase: "generate",
|
|
367
431
|
status: "running",
|
|
368
432
|
message: `${written ? "wrote" : "could not write"} ${page.path} (${position.index}/${position.total})`,
|
|
369
|
-
detail
|
|
433
|
+
detail,
|
|
370
434
|
});
|
|
371
435
|
return next;
|
|
372
436
|
}
|
|
@@ -375,8 +439,10 @@ async function generateWikiWithDocumenter(
|
|
|
375
439
|
dispatch: DispatchContract,
|
|
376
440
|
input: WikiGenerateInput,
|
|
377
441
|
route: WikiModelRoute = {},
|
|
378
|
-
|
|
442
|
+
deadline?: WikiDeadline,
|
|
443
|
+
signal?: AbortSignal,
|
|
379
444
|
): Promise<void> {
|
|
445
|
+
signal?.throwIfAborted();
|
|
380
446
|
const startedAtClock = performance.now();
|
|
381
447
|
const routeDetail = [route.target, route.model, route.thinkingLevel ? `thinking=${route.thinkingLevel}` : undefined]
|
|
382
448
|
.filter((value): value is string => value !== undefined)
|
|
@@ -392,43 +458,61 @@ async function generateWikiWithDocumenter(
|
|
|
392
458
|
// re-planning would churn the paths those pages already link to. Every other
|
|
393
459
|
// run plans, including an update, which is the only thing allowed to change
|
|
394
460
|
// a wiki's shape as the repository grows.
|
|
395
|
-
let plan = input.resumed ? input.plan : await runPlanPhase(dispatch, input, route);
|
|
461
|
+
let plan = input.resumed ? input.plan : await runPlanPhase(dispatch, input, route, deadline);
|
|
462
|
+
signal?.throwIfAborted();
|
|
396
463
|
if (!input.resumed) writeWikiPlanFile(input.outputDir, plan);
|
|
397
464
|
|
|
398
|
-
const queue = pendingPages(plan);
|
|
465
|
+
const queue = pendingPages(plan, input.retryPending);
|
|
399
466
|
if (queue.length === 0) {
|
|
400
|
-
|
|
467
|
+
const pending = plan.pages.filter((page) => page.status !== "written").length;
|
|
468
|
+
input.progress?.({
|
|
469
|
+
phase: "generate",
|
|
470
|
+
status: "running",
|
|
471
|
+
message:
|
|
472
|
+
pending > 0
|
|
473
|
+
? `${pending} pending page${pending === 1 ? " has" : "s have"} exhausted writer attempts`
|
|
474
|
+
: "every planned page is already current",
|
|
475
|
+
});
|
|
401
476
|
return;
|
|
402
477
|
}
|
|
403
478
|
// Say the shape of the wait before starting it. A 20-page wiki is 20 model
|
|
404
479
|
// runs and can legitimately take most of an hour, which is longer than any
|
|
405
480
|
// default command timeout an operator is likely to have wrapped around it.
|
|
406
481
|
{
|
|
407
|
-
const
|
|
482
|
+
const estimateMs = Math.min(RUN_ESTIMATE_MS, queue.length * PAGE_ESTIMATE_MS);
|
|
408
483
|
input.progress?.({
|
|
409
484
|
phase: "generate",
|
|
410
485
|
status: "running",
|
|
411
486
|
message: `${queue.length} page${queue.length === 1 ? "" : "s"} to write, one model run each`,
|
|
412
|
-
detail: `
|
|
487
|
+
detail: `estimate ${Math.round(estimateMs / 60000)}m; activity summaries every ${Math.round(HEARTBEAT_MS / 1000)}s; finished pages are kept if the run stops early${deadline ? `; explicit deadline ${new Date(deadline.at).toISOString()}` : "; healthy work may continue beyond estimates"}`,
|
|
413
488
|
});
|
|
414
489
|
}
|
|
415
490
|
for (const [index, page] of queue.entries()) {
|
|
416
|
-
|
|
491
|
+
signal?.throwIfAborted();
|
|
492
|
+
if (deadline && deadline.remainingMs() <= 0) {
|
|
417
493
|
const left = queue.length - index;
|
|
418
494
|
input.progress?.({
|
|
419
495
|
phase: "generate",
|
|
420
496
|
status: "running",
|
|
421
|
-
message: `
|
|
497
|
+
message: `explicit deadline reached with ${left} page${left === 1 ? "" : "s"} unwritten`,
|
|
422
498
|
detail: `${formatElapsed(performance.now() - startedAtClock)}; staged pages are kept and promoted`,
|
|
423
499
|
});
|
|
424
500
|
return;
|
|
425
501
|
}
|
|
426
502
|
const current = plan.pages.find((entry) => entry.path === page.path) ?? page;
|
|
427
|
-
if (current.status === "written" || current.attempts >= MAX_PAGE_ATTEMPTS) continue;
|
|
428
|
-
plan = await runPagePhase(
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
503
|
+
if (current.status === "written" || (!input.retryPending && current.attempts >= MAX_PAGE_ATTEMPTS)) continue;
|
|
504
|
+
plan = await runPagePhase(
|
|
505
|
+
dispatch,
|
|
506
|
+
input,
|
|
507
|
+
plan,
|
|
508
|
+
current,
|
|
509
|
+
route,
|
|
510
|
+
{
|
|
511
|
+
index: index + 1,
|
|
512
|
+
total: queue.length,
|
|
513
|
+
},
|
|
514
|
+
deadline,
|
|
515
|
+
);
|
|
432
516
|
}
|
|
433
517
|
}
|
|
434
518
|
|
|
@@ -492,19 +576,79 @@ export async function resolveDocumenterModelId(route: WikiModelRoute = {}): Prom
|
|
|
492
576
|
}
|
|
493
577
|
}
|
|
494
578
|
|
|
579
|
+
/**
|
|
580
|
+
* A standalone wiki command owns a dispatch runtime outside the main entry
|
|
581
|
+
* orchestrator. Hold its signal ownership until workers settle, including
|
|
582
|
+
* their 500ms forced-kill window, then stop domains before exiting. This is
|
|
583
|
+
* scoped to the runtime we loaded; injected dispatches keep their caller's
|
|
584
|
+
* lifecycle. The signal budget fits inside the enclosing editor shell grace.
|
|
585
|
+
*/
|
|
586
|
+
export async function withWikiDispatchLifecycle(
|
|
587
|
+
runtime: { dispatch: Pick<DispatchContract, "drain">; stop(): Promise<void> },
|
|
588
|
+
generate: (signal: AbortSignal) => Promise<void>,
|
|
589
|
+
): Promise<void> {
|
|
590
|
+
const abort = new AbortController();
|
|
591
|
+
let closing: Promise<void> | null = null;
|
|
592
|
+
let interrupted: Promise<void> | null = null;
|
|
593
|
+
const close = (): Promise<void> => {
|
|
594
|
+
closing ??= (async () => {
|
|
595
|
+
let failure: { error: unknown } | null = null;
|
|
596
|
+
try {
|
|
597
|
+
await runtime.dispatch.drain();
|
|
598
|
+
} catch (error) {
|
|
599
|
+
failure = { error };
|
|
600
|
+
}
|
|
601
|
+
try {
|
|
602
|
+
await runtime.stop();
|
|
603
|
+
} catch (error) {
|
|
604
|
+
if (failure) writeShutdownNotice(`clio-coder context wiki: domain cleanup failed: ${String(error)}`);
|
|
605
|
+
else failure = { error };
|
|
606
|
+
}
|
|
607
|
+
if (failure) throw failure.error;
|
|
608
|
+
})();
|
|
609
|
+
return closing;
|
|
610
|
+
};
|
|
611
|
+
const exitCodes = { SIGINT: 130, SIGTERM: 143, SIGHUP: 129 } as const;
|
|
612
|
+
const onSignal = (signal: keyof typeof exitCodes): void => {
|
|
613
|
+
if (interrupted) return;
|
|
614
|
+
abort.abort(new Error(`wiki generation interrupted by ${signal}`));
|
|
615
|
+
interrupted = (async () => {
|
|
616
|
+
const completed = await runWithBudget(close, 2000, (error) => {
|
|
617
|
+
writeShutdownNotice(`clio-coder context wiki: shutdown failed: ${String(error)}`);
|
|
618
|
+
});
|
|
619
|
+
if (!completed) writeShutdownNotice("clio-coder context wiki: shutdown exceeded 2000ms budget");
|
|
620
|
+
process.exit(exitCodes[signal]);
|
|
621
|
+
})();
|
|
622
|
+
};
|
|
623
|
+
for (const signal of Object.keys(exitCodes) as Array<keyof typeof exitCodes>) process.on(signal, onSignal);
|
|
624
|
+
let failure: { error: unknown } | null = null;
|
|
625
|
+
try {
|
|
626
|
+
await generate(abort.signal);
|
|
627
|
+
} catch (error) {
|
|
628
|
+
failure = { error };
|
|
629
|
+
}
|
|
630
|
+
try {
|
|
631
|
+
if (interrupted) await interrupted;
|
|
632
|
+
else await close();
|
|
633
|
+
} catch (error) {
|
|
634
|
+
if (failure) writeShutdownNotice(`clio-coder context wiki: cleanup failed: ${String(error)}`);
|
|
635
|
+
else failure = { error };
|
|
636
|
+
} finally {
|
|
637
|
+
for (const signal of Object.keys(exitCodes) as Array<keyof typeof exitCodes>) process.off(signal, onSignal);
|
|
638
|
+
}
|
|
639
|
+
if (failure) throw failure.error;
|
|
640
|
+
}
|
|
641
|
+
|
|
495
642
|
export function modelWikiGenerate(options: ModelWikiGenerateOptions = {}): WikiGenerate {
|
|
496
643
|
return async (input) => {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
const lazy = await loadWikiDispatch();
|
|
504
|
-
loaded = lazy.loaded;
|
|
505
|
-
await generateWikiWithDocumenter(lazy.dispatch, input, options.route, options.runBudgetMs);
|
|
506
|
-
} finally {
|
|
507
|
-
if (loaded) await loaded.stop();
|
|
644
|
+
const deadline = explicitWikiDeadline(options);
|
|
645
|
+
if (options.dispatch) {
|
|
646
|
+
await generateWikiWithDocumenter(options.dispatch, input, options.route, deadline);
|
|
647
|
+
return;
|
|
508
648
|
}
|
|
649
|
+
const { dispatch, loaded } = await loadWikiDispatch();
|
|
650
|
+
await withWikiDispatchLifecycle({ dispatch, stop: () => loaded.stop() }, (signal) =>
|
|
651
|
+
generateWikiWithDocumenter(dispatch, input, options.route, deadline, signal),
|
|
652
|
+
);
|
|
509
653
|
};
|
|
510
654
|
}
|
package/src/core/bash-exec.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { StringDecoder } from "node:string_decoder";
|
|
3
|
+
import { isSecretArgKey } from "../domains/safety/redaction.js";
|
|
3
4
|
import { AI_AGENT_NAME } from "./agent-environment.js";
|
|
4
5
|
import {
|
|
5
6
|
gitCommitAttributionEnabled,
|
|
@@ -18,7 +19,7 @@ export { clampTimerDelayMs as clampTimeoutMs } from "./timers.js";
|
|
|
18
19
|
// (failing assertion, compiler error, exit summary) must survive.
|
|
19
20
|
export const BASH_HARD_CAP_BYTES = 16 * 1024 * 1024;
|
|
20
21
|
|
|
21
|
-
const CLIO_CONTROL_ENV_KEYS = ["CLIO_CODER_INTERACTIVE"] as const;
|
|
22
|
+
const CLIO_CONTROL_ENV_KEYS = ["CLIO_CODER_INTERACTIVE", "BASH_ENV", "ENV"] as const;
|
|
22
23
|
|
|
23
24
|
export interface BashCommandResult {
|
|
24
25
|
error: NodeJS.ErrnoException | null;
|
|
@@ -175,8 +176,10 @@ export function createBashOutputProgressController(
|
|
|
175
176
|
};
|
|
176
177
|
}
|
|
177
178
|
|
|
178
|
-
function buildToolEnv(): NodeJS.ProcessEnv {
|
|
179
|
-
const env = { ...
|
|
179
|
+
function buildToolEnv(source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
|
|
180
|
+
const env = { ...source };
|
|
181
|
+
for (const key of Object.keys(env))
|
|
182
|
+
if (isSecretArgKey(key) || key.startsWith("BASH_FUNC_")) Reflect.deleteProperty(env, key);
|
|
180
183
|
env.AI_AGENT = AI_AGENT_NAME;
|
|
181
184
|
for (const key of CLIO_CONTROL_ENV_KEYS) {
|
|
182
185
|
Reflect.deleteProperty(env, key);
|
|
@@ -192,7 +195,7 @@ function buildToolEnv(): NodeJS.ProcessEnv {
|
|
|
192
195
|
// call still gets a fresh shell — only the env composition is cached, so
|
|
193
196
|
// there is no state bleed and cancellation semantics are untouched. When the
|
|
194
197
|
// capture fails (profile error, timeout, no PATH), every call falls back to
|
|
195
|
-
// the
|
|
198
|
+
// the filtered non-login environment; failed capture must not source secrets again.
|
|
196
199
|
const LOGIN_ENV_CAPTURE_TIMEOUT_MS = 10_000;
|
|
197
200
|
|
|
198
201
|
let loginEnvCapture: Promise<NodeJS.ProcessEnv | null> | null = null;
|
|
@@ -243,15 +246,11 @@ interface BashSpawnPlan {
|
|
|
243
246
|
async function bashSpawnPlan(): Promise<BashSpawnPlan> {
|
|
244
247
|
loginEnvCapture ??= captureLoginEnv();
|
|
245
248
|
const captured = await loginEnvCapture;
|
|
246
|
-
if (captured === null) return { mode: "-
|
|
249
|
+
if (captured === null) return { mode: "-c", env: buildToolEnv() };
|
|
247
250
|
// Captured (login-transformed) values win; keys added to process.env after
|
|
248
251
|
// the capture still flow through; the CLIO control keys are re-stripped
|
|
249
252
|
// last so they never reach the child from either source.
|
|
250
|
-
const env
|
|
251
|
-
env.AI_AGENT = AI_AGENT_NAME;
|
|
252
|
-
for (const key of CLIO_CONTROL_ENV_KEYS) {
|
|
253
|
-
Reflect.deleteProperty(env, key);
|
|
254
|
-
}
|
|
253
|
+
const env = buildToolEnv({ ...process.env, ...captured });
|
|
255
254
|
return { mode: "-c", env };
|
|
256
255
|
}
|
|
257
256
|
|
|
@@ -275,6 +274,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
275
274
|
let timeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
276
275
|
let killGraceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
277
276
|
let killSent = false;
|
|
277
|
+
let pendingClose: (() => void) | null = null;
|
|
278
278
|
const output = createBashOutputProgressController(options.onUpdate);
|
|
279
279
|
|
|
280
280
|
const child = spawn("/bin/bash", [plan.mode, command], {
|
|
@@ -305,12 +305,42 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
305
305
|
child.kill(signalName);
|
|
306
306
|
};
|
|
307
307
|
|
|
308
|
+
const hasOwnedProcesses = (): boolean => {
|
|
309
|
+
const pid = child.pid;
|
|
310
|
+
if (pid === undefined) return false;
|
|
311
|
+
if (process.platform !== "win32") {
|
|
312
|
+
try {
|
|
313
|
+
process.kill(-pid, 0);
|
|
314
|
+
return true;
|
|
315
|
+
} catch (error) {
|
|
316
|
+
if ((error as NodeJS.ErrnoException).code === "EPERM") return true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return child.exitCode === null && child.signalCode === null;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
const resolveAfterCancellation = (result: BashCommandResult): void => {
|
|
323
|
+
// A TERM handler can exit while a same-group child ignores TERM and
|
|
324
|
+
// holds no pipes. Keep the original result, but do not let close discard
|
|
325
|
+
// the escalation that still owns that child's cancellation.
|
|
326
|
+
if (killGraceTimer !== null && hasOwnedProcesses()) {
|
|
327
|
+
pendingClose = () => resolve(result);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
clearKillGraceTimer();
|
|
331
|
+
resolve(result);
|
|
332
|
+
};
|
|
333
|
+
|
|
308
334
|
const killChild = (): void => {
|
|
309
335
|
if (killSent) return;
|
|
310
336
|
killSent = true;
|
|
311
337
|
sendSignal("SIGTERM");
|
|
312
338
|
killGraceTimer = setTimeout(() => {
|
|
313
|
-
|
|
339
|
+
killGraceTimer = null;
|
|
340
|
+
if (hasOwnedProcesses()) sendSignal("SIGKILL");
|
|
341
|
+
const finish = pendingClose;
|
|
342
|
+
pendingClose = null;
|
|
343
|
+
finish?.();
|
|
314
344
|
}, 5000);
|
|
315
345
|
};
|
|
316
346
|
|
|
@@ -342,10 +372,9 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
342
372
|
if (settled) return;
|
|
343
373
|
settled = true;
|
|
344
374
|
if (timeoutId) clearTimeout(timeoutId);
|
|
345
|
-
clearKillGraceTimer();
|
|
346
375
|
const finalOutput = output.settle();
|
|
347
376
|
options.signal?.removeEventListener("abort", onAbort);
|
|
348
|
-
|
|
377
|
+
resolveAfterCancellation({
|
|
349
378
|
error: error as NodeJS.ErrnoException,
|
|
350
379
|
...finalOutput,
|
|
351
380
|
exitCode: null,
|
|
@@ -358,7 +387,6 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
358
387
|
if (settled) return;
|
|
359
388
|
settled = true;
|
|
360
389
|
if (timeoutId) clearTimeout(timeoutId);
|
|
361
|
-
clearKillGraceTimer();
|
|
362
390
|
const finalOutput = output.settle();
|
|
363
391
|
options.signal?.removeEventListener("abort", onAbort);
|
|
364
392
|
const error =
|
|
@@ -370,7 +398,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
370
398
|
code: code ?? undefined,
|
|
371
399
|
signal: signalName ?? undefined,
|
|
372
400
|
} as NodeJS.ErrnoException);
|
|
373
|
-
|
|
401
|
+
resolveAfterCancellation({
|
|
374
402
|
error,
|
|
375
403
|
...finalOutput,
|
|
376
404
|
exitCode: code,
|