@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/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,13 +365,16 @@ 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,
|
|
@@ -341,33 +385,52 @@ async function runPagePhase(
|
|
|
341
385
|
seeded,
|
|
342
386
|
}),
|
|
343
387
|
route,
|
|
344
|
-
|
|
345
|
-
label: `wiki page ${page.path}`,
|
|
388
|
+
deadline,
|
|
346
389
|
onHeartbeat: ({ elapsedMs, tools }) =>
|
|
347
390
|
input.progress?.({
|
|
348
391
|
phase: "generate",
|
|
349
392
|
status: "running",
|
|
350
393
|
message: `still writing ${page.path} (${position.index}/${position.total}, ${formatElapsed(elapsedMs)}, ${tools} tool calls)`,
|
|
351
|
-
detail: `page
|
|
394
|
+
detail: `page estimate ${Math.round(PAGE_ESTIMATE_MS / 60000)}m; healthy work may continue longer`,
|
|
352
395
|
}),
|
|
353
396
|
});
|
|
354
|
-
//
|
|
355
|
-
//
|
|
356
|
-
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;
|
|
357
408
|
const next: WikiPlan = {
|
|
358
409
|
...plan,
|
|
359
|
-
pages: plan.pages.map((entry) =>
|
|
360
|
-
entry.path
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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
|
+
}),
|
|
364
427
|
};
|
|
365
428
|
writeWikiPlanFile(input.outputDir, next);
|
|
366
429
|
input.progress?.({
|
|
367
430
|
phase: "generate",
|
|
368
431
|
status: "running",
|
|
369
432
|
message: `${written ? "wrote" : "could not write"} ${page.path} (${position.index}/${position.total})`,
|
|
370
|
-
detail
|
|
433
|
+
detail,
|
|
371
434
|
});
|
|
372
435
|
return next;
|
|
373
436
|
}
|
|
@@ -376,8 +439,10 @@ async function generateWikiWithDocumenter(
|
|
|
376
439
|
dispatch: DispatchContract,
|
|
377
440
|
input: WikiGenerateInput,
|
|
378
441
|
route: WikiModelRoute = {},
|
|
379
|
-
|
|
442
|
+
deadline?: WikiDeadline,
|
|
443
|
+
signal?: AbortSignal,
|
|
380
444
|
): Promise<void> {
|
|
445
|
+
signal?.throwIfAborted();
|
|
381
446
|
const startedAtClock = performance.now();
|
|
382
447
|
const routeDetail = [route.target, route.model, route.thinkingLevel ? `thinking=${route.thinkingLevel}` : undefined]
|
|
383
448
|
.filter((value): value is string => value !== undefined)
|
|
@@ -393,43 +458,61 @@ async function generateWikiWithDocumenter(
|
|
|
393
458
|
// re-planning would churn the paths those pages already link to. Every other
|
|
394
459
|
// run plans, including an update, which is the only thing allowed to change
|
|
395
460
|
// a wiki's shape as the repository grows.
|
|
396
|
-
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();
|
|
397
463
|
if (!input.resumed) writeWikiPlanFile(input.outputDir, plan);
|
|
398
464
|
|
|
399
|
-
const queue = pendingPages(plan);
|
|
465
|
+
const queue = pendingPages(plan, input.retryPending);
|
|
400
466
|
if (queue.length === 0) {
|
|
401
|
-
|
|
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
|
+
});
|
|
402
476
|
return;
|
|
403
477
|
}
|
|
404
478
|
// Say the shape of the wait before starting it. A 20-page wiki is 20 model
|
|
405
479
|
// runs and can legitimately take most of an hour, which is longer than any
|
|
406
480
|
// default command timeout an operator is likely to have wrapped around it.
|
|
407
481
|
{
|
|
408
|
-
const
|
|
482
|
+
const estimateMs = Math.min(RUN_ESTIMATE_MS, queue.length * PAGE_ESTIMATE_MS);
|
|
409
483
|
input.progress?.({
|
|
410
484
|
phase: "generate",
|
|
411
485
|
status: "running",
|
|
412
486
|
message: `${queue.length} page${queue.length === 1 ? "" : "s"} to write, one model run each`,
|
|
413
|
-
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"}`,
|
|
414
488
|
});
|
|
415
489
|
}
|
|
416
490
|
for (const [index, page] of queue.entries()) {
|
|
417
|
-
|
|
491
|
+
signal?.throwIfAborted();
|
|
492
|
+
if (deadline && deadline.remainingMs() <= 0) {
|
|
418
493
|
const left = queue.length - index;
|
|
419
494
|
input.progress?.({
|
|
420
495
|
phase: "generate",
|
|
421
496
|
status: "running",
|
|
422
|
-
message: `
|
|
497
|
+
message: `explicit deadline reached with ${left} page${left === 1 ? "" : "s"} unwritten`,
|
|
423
498
|
detail: `${formatElapsed(performance.now() - startedAtClock)}; staged pages are kept and promoted`,
|
|
424
499
|
});
|
|
425
500
|
return;
|
|
426
501
|
}
|
|
427
502
|
const current = plan.pages.find((entry) => entry.path === page.path) ?? page;
|
|
428
|
-
if (current.status === "written" || current.attempts >= MAX_PAGE_ATTEMPTS) continue;
|
|
429
|
-
plan = await runPagePhase(
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
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
|
+
);
|
|
433
516
|
}
|
|
434
517
|
}
|
|
435
518
|
|
|
@@ -493,19 +576,79 @@ export async function resolveDocumenterModelId(route: WikiModelRoute = {}): Prom
|
|
|
493
576
|
}
|
|
494
577
|
}
|
|
495
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
|
+
|
|
496
642
|
export function modelWikiGenerate(options: ModelWikiGenerateOptions = {}): WikiGenerate {
|
|
497
643
|
return async (input) => {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
return;
|
|
503
|
-
}
|
|
504
|
-
const lazy = await loadWikiDispatch();
|
|
505
|
-
loaded = lazy.loaded;
|
|
506
|
-
await generateWikiWithDocumenter(lazy.dispatch, input, options.route, options.runBudgetMs);
|
|
507
|
-
} finally {
|
|
508
|
-
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;
|
|
509
648
|
}
|
|
649
|
+
const { dispatch, loaded } = await loadWikiDispatch();
|
|
650
|
+
await withWikiDispatchLifecycle({ dispatch, stop: () => loaded.stop() }, (signal) =>
|
|
651
|
+
generateWikiWithDocumenter(dispatch, input, options.route, deadline, signal),
|
|
652
|
+
);
|
|
510
653
|
};
|
|
511
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,
|