@iowarp/clio-coder 0.4.7 → 0.4.9
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +69 -47
- package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
- package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/background-BUMOBAQN.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/chunk-2VBWFXYE.js +198 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
- package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
- package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
- package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
- package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
- package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
- package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
- package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
- package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
- package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/chunk-7N3OLLSL.js +637 -0
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
- package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
- package/dist/chunk-EHZRAB4U.js +63 -0
- package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
- package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
- package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
- package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
- package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
- package/dist/chunk-G5R53COU.js +68 -0
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
- package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
- package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
- package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
- package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
- package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
- package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
- package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
- package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/chunk-MJ4QEJVT.js +185 -0
- package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
- package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
- package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
- package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
- package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
- package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
- package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
- package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
- package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
- package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
- package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/chunk-SLLG2G44.js +85 -0
- package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
- package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
- package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
- package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
- package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
- package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/chunk-XNZWWDC3.js +686 -0
- package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
- package/dist/chunk-XTQ7MEJG.js +457 -0
- package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
- package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
- package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
- package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +50 -38
- package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
- package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
- package/dist/config-P3ZQVF63.js +275 -0
- package/dist/config-graph-GKAOBAS5.js +160 -0
- package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
- package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
- package/dist/docs-ZK777W2G.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
- package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-L73EBHSU.js +104 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
- package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
- package/dist/evidence-Y55WKYHH.js +246 -0
- package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
- package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
- package/dist/fleet-M4H2QBWT.js +268 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
- package/dist/fleet-decisions-EHEY7KPU.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
- package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
- package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
- package/dist/library-3J5IO2OJ.js +75 -0
- package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
- package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
- package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
- package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
- package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
- package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
- package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
- package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
- package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
- package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/settings-3VMBMWID.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
- package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
- package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
- package/dist/system-3TDQRMZZ.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
- package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
- package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
- package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
- package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
- package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
- package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
- package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
- package/dist/web/client/assets/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
- package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
- package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
- package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
- package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +6 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EMGUGGEI.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
- package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
- package/dist/worker/entry.js +113 -99
- package/docs/README.md +28 -27
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +12 -4
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +1 -3
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +37 -30
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +19 -9
- package/docs/architecture/session-lifecycle.md +10 -7
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +38 -18
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +41 -25
- package/docs/guide/configuration-and-targets.md +204 -9
- package/docs/guide/configuration-reference.md +125 -17
- package/docs/guide/environment-variables.md +2 -8
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +3 -5
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +3 -6
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +1 -3
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +166 -67
- package/docs/guide/troubleshooting.md +1 -4
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +16 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +6 -9
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +23 -6
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/docs.ts +65 -328
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +17 -2
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/usage.ts +3 -0
- package/src/cli/verifiers.ts +1 -1
- package/src/cli/web.ts +79 -0
- package/src/core/bash-exec.ts +27 -4
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +73 -1
- package/src/core/defaults.ts +10 -1
- package/src/core/domain-loader.ts +37 -28
- package/src/core/event-bus.ts +1 -1
- package/src/core/run-records.ts +438 -0
- package/src/core/safe-exec.ts +506 -56
- package/src/core/skill-activation.ts +5 -3
- package/src/core/termination.ts +16 -12
- package/src/core/tool-names.ts +33 -12
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/context/clio-md.ts +1 -1
- package/src/domains/context/worker/pressure.ts +6 -2
- package/src/domains/context/working-set/path-index.ts +7 -2
- package/src/domains/dispatch/code-step.ts +7 -2
- package/src/domains/dispatch/contract.ts +7 -0
- package/src/domains/dispatch/execution-role.ts +3 -3
- package/src/domains/dispatch/execution-scheduler.ts +204 -79
- package/src/domains/dispatch/extension.ts +206 -26
- package/src/domains/dispatch/fleet-preflight.ts +18 -3
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/gate-decisions.ts +3 -3
- package/src/domains/dispatch/heartbeat.ts +1 -1
- package/src/domains/dispatch/host-verification.ts +16 -14
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-findings.ts +3 -4
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +4 -5
- package/src/domains/dispatch/types.ts +3 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/build.ts +35 -7
- package/src/domains/extensions/operator-runtime.ts +3 -1
- package/src/domains/gateway/mcp/client.ts +923 -0
- package/src/domains/gateway/mcp/config.ts +456 -0
- package/src/domains/gateway/mcp/index.ts +88 -0
- package/src/domains/gateway/mcp/protocol.ts +273 -0
- package/src/domains/gateway/mcp/trust.ts +263 -0
- package/src/domains/lifecycle/doctor.ts +17 -3
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/mux/contract.ts +5 -9
- package/src/domains/mux/detect.ts +1 -1
- package/src/domains/mux/extension.ts +1 -1
- package/src/domains/mux/protocol.ts +5 -7
- package/src/domains/mux/socket-client.ts +3 -3
- package/src/domains/observability/accountability.ts +2 -2
- package/src/domains/observability/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/contract.ts +7 -3
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/compiler.ts +41 -23
- package/src/domains/prompts/extension.ts +4 -17
- package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
- package/src/domains/prompts/fragments/operating/skills.md +12 -10
- package/src/domains/providers/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +6 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
- package/src/domains/providers/types/target-descriptor.ts +17 -0
- package/src/domains/safety/action-classifier.ts +17 -1
- package/src/domains/safety/call-target.ts +14 -0
- package/src/domains/safety/contract.ts +1 -1
- package/src/domains/safety/finish-contract.ts +9 -3
- package/src/domains/safety/loop-detector.ts +1 -1
- package/src/domains/safety/policy-engine.ts +7 -0
- package/src/domains/safety/protected-artifacts.ts +3 -4
- package/src/domains/safety/rejection-feedback.ts +1 -1
- package/src/domains/safety/scope.ts +2 -3
- package/src/domains/safety/validation-contract.ts +3 -2
- package/src/domains/scheduling/budget.ts +5 -3
- package/src/domains/scheduling/contract.ts +2 -1
- package/src/domains/scheduling/extension.ts +3 -3
- package/src/domains/session/compaction/branch-summary.ts +1 -1
- package/src/domains/session/compaction/compact.ts +29 -3
- package/src/domains/session/compaction/cut-point.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +5 -10
- package/src/domains/session/contract.ts +1 -1
- package/src/domains/session/cwd-fallback.ts +2 -2
- package/src/domains/session/entries.ts +1 -0
- package/src/domains/session/handoff.ts +5 -1
- package/src/domains/session/history.ts +6 -0
- package/src/domains/session/manager.ts +14 -7
- package/src/domains/session/retry.ts +2 -1
- package/src/domains/session/session-artifacts.ts +12 -7
- package/src/domains/session/task-board.ts +2 -3
- package/src/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +17 -4
- package/src/engine/loop-guard.ts +7 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/engine/provider-error-body.ts +65 -0
- package/src/engine/session.ts +118 -29
- package/src/engine/worker-runtime.ts +3 -0
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +38 -18
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +10 -12
- package/src/interactive/chat-panel.ts +23 -9
- package/src/interactive/chat-renderer.ts +33 -11
- package/src/interactive/clio-editor.ts +13 -5
- package/src/interactive/dispatch-board.ts +70 -30
- package/src/interactive/editor-submit.ts +30 -25
- package/src/interactive/footer/widgets.ts +12 -9
- package/src/interactive/interactive-presentation.ts +2 -3
- package/src/interactive/mux-bridge.ts +3 -7
- package/src/interactive/overlay-general-openers.ts +14 -7
- package/src/interactive/overlays/cwd-fallback.ts +1 -1
- package/src/interactive/overlays/library-model.ts +114 -35
- package/src/interactive/overlays/library.ts +52 -5
- package/src/interactive/overlays/list-overlay.ts +4 -1
- package/src/interactive/overlays/session-selector.ts +28 -23
- package/src/interactive/overlays/settings.ts +20 -1
- package/src/interactive/overlays/tree-selector.ts +47 -10
- package/src/interactive/panes-runtime.ts +1 -1
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/renderers/compaction-summary.ts +1 -1
- package/src/interactive/renderers/provider-error.ts +118 -0
- package/src/interactive/renderers/retry-status.ts +59 -23
- package/src/interactive/renderers/tool-execution.ts +67 -7
- package/src/interactive/renderers/worker-answer.ts +198 -0
- package/src/interactive/renderers/worker-entry.ts +57 -163
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/slash-commands.ts +26 -1
- package/src/interactive/slash-spec.ts +2 -2
- package/src/interactive/theme/labels.ts +66 -30
- package/src/interactive/turn-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +9 -1
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +36 -5
- package/src/interactive/view/artifacts.ts +3 -2
- package/src/interactive/view/view-overlay.ts +96 -20
- package/src/tools/agent-tools.ts +21 -7
- package/src/tools/artifact.ts +16 -8
- package/src/tools/bash.ts +90 -11
- package/src/tools/bootstrap.ts +42 -4
- package/src/tools/builtin-tool-catalog.ts +80 -11
- package/src/tools/context/index.ts +27 -31
- package/src/tools/context/library.ts +3 -1
- package/src/tools/context/surface.ts +12 -26
- package/src/tools/core-bootstrap.ts +72 -1
- package/src/tools/data/csv.ts +1189 -0
- package/src/tools/data/index.ts +308 -0
- package/src/tools/data/json.ts +1799 -0
- package/src/tools/data/jsonl.ts +561 -0
- package/src/tools/data/shared.ts +452 -0
- package/src/tools/edit-diff.ts +0 -7
- package/src/tools/edit.ts +115 -18
- package/src/tools/file-mutation-queue.ts +114 -4
- package/src/tools/find.ts +108 -29
- package/src/tools/gateway/caps.ts +11 -0
- package/src/tools/gateway/clio-context-surface.ts +41 -0
- package/src/tools/gateway/clio-context-tools.ts +77 -0
- package/src/tools/gateway/data-surface.ts +138 -0
- package/src/tools/gateway/data-tool.ts +201 -0
- package/src/tools/gateway/index.ts +342 -0
- package/src/tools/gateway/mcp-capabilities.ts +469 -0
- package/src/tools/grep.ts +88 -33
- package/src/tools/harness-extensions.ts +3 -0
- package/src/tools/ignore-policy.ts +7 -5
- package/src/tools/ls.ts +111 -20
- package/src/tools/policy.ts +35 -13
- package/src/tools/presentation.ts +6 -0
- package/src/tools/read.ts +634 -156
- package/src/tools/registry.ts +106 -8
- package/src/tools/run-script.ts +997 -0
- package/src/tools/spawn-hygiene.ts +157 -5
- package/src/tools/surface.ts +163 -0
- package/src/tools/verify/authoring.ts +8 -3
- package/src/tools/verify/catalog.ts +14 -1
- package/src/tools/verify/numeric.ts +367 -59
- package/src/tools/verify/perf.ts +171 -9
- package/src/tools/verify/scripts.ts +178 -26
- package/src/tools/web-fetch-surface.ts +22 -0
- package/src/tools/web-fetch.ts +26 -1
- package/src/tools/write.ts +45 -19
- package/src/worker/spec-contract.ts +27 -0
- package/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-HRAKUPIH.js +0 -57
- package/dist/docs-BL7ROUFN.js +0 -292
package/src/core/safe-exec.ts
CHANGED
|
@@ -42,23 +42,340 @@ export interface SafeCommandResult {
|
|
|
42
42
|
file: string;
|
|
43
43
|
args: string[];
|
|
44
44
|
cwd: string;
|
|
45
|
+
/**
|
|
46
|
+
* Captured stdout. Without an output sink this is every byte up to the
|
|
47
|
+
* cap; with one it is the bounded head-and-tail rendering, and
|
|
48
|
+
* `stdoutRetained` says whether anything was omitted between them.
|
|
49
|
+
*/
|
|
45
50
|
stdout: string;
|
|
46
51
|
stderr: string;
|
|
52
|
+
/** Effective exit code; incomplete group cleanup or pipe draining converts leader exit 0 to 1. */
|
|
47
53
|
exitCode: number | null;
|
|
54
|
+
/** Actual leader outcome, or null if it had not exited at settlement. */
|
|
55
|
+
leaderExit?: { code: number | null; signal: NodeJS.Signals | null } | null;
|
|
48
56
|
signal: NodeJS.Signals | null;
|
|
49
57
|
aborted: boolean;
|
|
50
58
|
timedOut: boolean;
|
|
51
59
|
outputCapped: boolean;
|
|
52
60
|
durationMs: number;
|
|
61
|
+
/** Wall-clock instant the child was spawned. Optional only so hand-built test doubles stay valid. */
|
|
62
|
+
startedAt?: number;
|
|
63
|
+
/** Exact bytes the child wrote to stdout, whether or not they were all retained. */
|
|
64
|
+
stdoutBytes?: number;
|
|
65
|
+
stderrBytes?: number;
|
|
66
|
+
/** True when `stdout` holds every byte the child wrote to it. */
|
|
67
|
+
stdoutRetained?: boolean;
|
|
68
|
+
stderrRetained?: boolean;
|
|
69
|
+
/** The output sink threw; forwarding stopped there and the child was terminated. */
|
|
70
|
+
sinkError?: string;
|
|
71
|
+
/** Members of the child's process group outlived the leader and the runner had to signal them. */
|
|
72
|
+
descendantsCleaned?: boolean;
|
|
73
|
+
/** Group members were still present when the post-SIGKILL bound passed; the runner stopped waiting for them. */
|
|
74
|
+
cleanupIncomplete?: boolean;
|
|
75
|
+
/** Owned output pipes did not drain before the post-exit deadline or cancellation. */
|
|
76
|
+
pipeDrainIncomplete?: boolean;
|
|
77
|
+
/** Diagnostic for incomplete cleanup; the effective exit code also reports failure to existing callers. */
|
|
78
|
+
failure?: string | null;
|
|
53
79
|
}
|
|
54
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Where a command's complete output goes when it must not live in memory. The
|
|
83
|
+
* runner forwards every chunk synchronously in arrival order and keeps only a
|
|
84
|
+
* bounded head and tail of each stream for the result. With a sink present
|
|
85
|
+
* the output cap does not apply: the sink is the unbounded destination and
|
|
86
|
+
* the retained windows are the memory bound.
|
|
87
|
+
*/
|
|
88
|
+
export interface SafeCommandOutputSink {
|
|
89
|
+
onStdout?(chunk: Buffer): void;
|
|
90
|
+
onStderr?(chunk: Buffer): void;
|
|
91
|
+
/** Leading bytes of each stream kept on the result (default 4096). */
|
|
92
|
+
retainHeadBytes?: number;
|
|
93
|
+
/** Trailing bytes of each stream kept on the result (default 16384). */
|
|
94
|
+
retainTailBytes?: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export const SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES = 4096;
|
|
98
|
+
export const SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES = 16 * 1024;
|
|
99
|
+
/** Time the process group gets after SIGTERM before SIGKILL follows. */
|
|
100
|
+
export const SAFE_EXEC_DEFAULT_KILL_GRACE_MS = 3000;
|
|
101
|
+
/** After SIGKILL, how long the runner waits for the group to disappear before it gives up and says so. */
|
|
102
|
+
export const SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS = 1000;
|
|
103
|
+
/** Maximum time to drain inherited output pipes after leader exit. */
|
|
104
|
+
export const SAFE_EXEC_PIPE_DRAIN_BOUND_MS = 1000;
|
|
105
|
+
const GROUP_POLL_INTERVAL_MS = 25;
|
|
106
|
+
|
|
55
107
|
export interface RunCommandVectorOptions {
|
|
56
108
|
cwd?: string;
|
|
57
109
|
workspaceRoot?: string;
|
|
58
110
|
timeoutMs?: number;
|
|
111
|
+
/** Combined stdout+stderr ceiling when no sink is given; crossing it kills the child. Ignored with a sink. */
|
|
59
112
|
maxOutputBytes?: number;
|
|
60
113
|
signal?: AbortSignal;
|
|
61
114
|
env?: Record<string, string>;
|
|
115
|
+
output?: SafeCommandOutputSink;
|
|
116
|
+
/**
|
|
117
|
+
* Milliseconds between SIGTERM and SIGKILL when the runner stops the
|
|
118
|
+
* process group (default 3000). Zero sends both at once.
|
|
119
|
+
*/
|
|
120
|
+
killGraceMs?: number;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Drop a trailing incomplete UTF-8 sequence so the bytes decode without a replacement character. */
|
|
124
|
+
function trimIncompleteUtf8Suffix(bytes: Buffer): Buffer {
|
|
125
|
+
const length = bytes.byteLength;
|
|
126
|
+
for (let back = 1; back <= 3 && back <= length; back += 1) {
|
|
127
|
+
const byte = bytes[length - back] as number;
|
|
128
|
+
if ((byte & 0xc0) === 0x80) continue;
|
|
129
|
+
const expected = byte >= 0xf0 ? 4 : byte >= 0xe0 ? 3 : byte >= 0xc0 ? 2 : 1;
|
|
130
|
+
return expected > back ? bytes.subarray(0, length - back) : bytes;
|
|
131
|
+
}
|
|
132
|
+
return bytes;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Drop leading continuation bytes so a window that starts mid-character decodes cleanly. */
|
|
136
|
+
function trimLeadingUtf8Continuation(bytes: Buffer): Buffer {
|
|
137
|
+
let start = 0;
|
|
138
|
+
while (start < bytes.byteLength && start < 4 && ((bytes[start] as number) & 0xc0) === 0x80) start += 1;
|
|
139
|
+
return start === 0 ? bytes : bytes.subarray(start);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface RetainedStreamRendering {
|
|
143
|
+
text: string;
|
|
144
|
+
/** True when the text carries every byte the stream produced. */
|
|
145
|
+
retained: boolean;
|
|
146
|
+
totalBytes: number;
|
|
147
|
+
omittedBytes: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Bounded head-and-tail window over a byte stream. Memory stays at
|
|
152
|
+
* head + tail + one chunk whatever the stream's length, and the rendering
|
|
153
|
+
* names exactly how many bytes fell between the two windows.
|
|
154
|
+
*/
|
|
155
|
+
export interface RetainedStreamWindow {
|
|
156
|
+
append(chunk: Buffer): void;
|
|
157
|
+
readonly totalBytes: number;
|
|
158
|
+
render(): RetainedStreamRendering;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function createRetainedStreamWindow(headCapBytes: number, tailCapBytes: number): RetainedStreamWindow {
|
|
162
|
+
const headCap = Math.max(0, Math.floor(headCapBytes));
|
|
163
|
+
const tailCap = Math.max(0, Math.floor(tailCapBytes));
|
|
164
|
+
const head: Buffer[] = [];
|
|
165
|
+
let headBytes = 0;
|
|
166
|
+
const tail: Buffer[] = [];
|
|
167
|
+
let tailBytes = 0;
|
|
168
|
+
let total = 0;
|
|
169
|
+
return {
|
|
170
|
+
get totalBytes() {
|
|
171
|
+
return total;
|
|
172
|
+
},
|
|
173
|
+
append(chunk) {
|
|
174
|
+
total += chunk.byteLength;
|
|
175
|
+
let rest = chunk;
|
|
176
|
+
if (headBytes < headCap) {
|
|
177
|
+
const take = Math.min(rest.byteLength, headCap - headBytes);
|
|
178
|
+
head.push(rest.subarray(0, take));
|
|
179
|
+
headBytes += take;
|
|
180
|
+
if (take === rest.byteLength) return;
|
|
181
|
+
rest = rest.subarray(take);
|
|
182
|
+
}
|
|
183
|
+
if (tailCap === 0) return;
|
|
184
|
+
tail.push(rest);
|
|
185
|
+
tailBytes += rest.byteLength;
|
|
186
|
+
while (tailBytes > tailCap && tail.length > 0) {
|
|
187
|
+
const first = tail[0] as Buffer;
|
|
188
|
+
const excess = tailBytes - tailCap;
|
|
189
|
+
if (first.byteLength <= excess) {
|
|
190
|
+
tail.shift();
|
|
191
|
+
tailBytes -= first.byteLength;
|
|
192
|
+
} else {
|
|
193
|
+
tail[0] = first.subarray(excess);
|
|
194
|
+
tailBytes -= excess;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
render() {
|
|
199
|
+
if (total - headBytes - tailBytes <= 0) {
|
|
200
|
+
const text = Buffer.concat([...head, ...tail]).toString("utf8");
|
|
201
|
+
return { text, retained: true, totalBytes: total, omittedBytes: 0 };
|
|
202
|
+
}
|
|
203
|
+
// Bytes trimmed at a character boundary are absent from the text too,
|
|
204
|
+
// so the marker counts them with the span between the windows.
|
|
205
|
+
const headShown = trimIncompleteUtf8Suffix(Buffer.concat(head));
|
|
206
|
+
const tailShown = trimLeadingUtf8Continuation(Buffer.concat(tail));
|
|
207
|
+
const omitted = total - headShown.byteLength - tailShown.byteLength;
|
|
208
|
+
const headText = headShown.toString("utf8");
|
|
209
|
+
const tailText = tailShown.toString("utf8");
|
|
210
|
+
const marker = `[... ${omitted} bytes omitted ...]`;
|
|
211
|
+
const text = headText.length > 0 ? `${headText}\n${marker}\n${tailText}` : `${marker}\n${tailText}`;
|
|
212
|
+
return { text, retained: false, totalBytes: total, omittedBytes: omitted };
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface ProcessGroupCleanupStatus {
|
|
218
|
+
/** The group still had members after the leader was reaped, and the runner signalled them. */
|
|
219
|
+
descendantsCleaned: boolean;
|
|
220
|
+
/** The teardown bound passed after SIGKILL with members still present; the runner stopped waiting. */
|
|
221
|
+
incomplete: boolean;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface ProcessGroupCleanupScheduler {
|
|
225
|
+
setTimeout(callback: () => void, delayMs: number): unknown;
|
|
226
|
+
clearTimeout(handle: unknown): void;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface ProcessGroupCleanupHooks {
|
|
230
|
+
/** Existence probe (`kill(-pgid, 0)`): true while any member remains, false only on ESRCH. */
|
|
231
|
+
probe(): boolean;
|
|
232
|
+
/**
|
|
233
|
+
* Deliver one signal to the group. Called only right after a probe that
|
|
234
|
+
* reported members. Returns false when the group was already gone (ESRCH),
|
|
235
|
+
* which closes the window exactly as a probe reporting ESRCH would.
|
|
236
|
+
*/
|
|
237
|
+
signal(signalName: NodeJS.Signals): boolean;
|
|
238
|
+
/** Called exactly once, when the window closes; nothing is probed or signalled afterwards. */
|
|
239
|
+
onDone(status: ProcessGroupCleanupStatus): void;
|
|
240
|
+
/** Milliseconds between SIGTERM and SIGKILL; zero sends both in one step. */
|
|
241
|
+
graceMs: number;
|
|
242
|
+
/** Milliseconds to wait for members after SIGKILL before giving up (default 1000). */
|
|
243
|
+
teardownBoundMs?: number | undefined;
|
|
244
|
+
pollIntervalMs?: number | undefined;
|
|
245
|
+
scheduler?: ProcessGroupCleanupScheduler | undefined;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export interface ProcessGroupCleanup {
|
|
249
|
+
readonly done: boolean;
|
|
250
|
+
readonly status: ProcessGroupCleanupStatus | null;
|
|
251
|
+
/** A kill was requested (timeout, cancellation, cap, sink failure): open the window with SIGTERM now. */
|
|
252
|
+
kill(): void;
|
|
253
|
+
/** The leader was reaped: if members remain they are cleaned up on the same schedule until none are left. */
|
|
254
|
+
leaderExited(): void;
|
|
255
|
+
/** Stop without signalling and without `onDone`; for a child that never started. */
|
|
256
|
+
dispose(): void;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const SYSTEM_CLEANUP_SCHEDULER: ProcessGroupCleanupScheduler = {
|
|
260
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
261
|
+
clearTimeout: (handle) => clearTimeout(handle as ReturnType<typeof setTimeout>),
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Bounded cleanup of one process group. The window opens at kill time or at
|
|
266
|
+
* leader exit, whichever comes first, and runs SIGTERM, grace, SIGKILL, then
|
|
267
|
+
* a bounded wait for the group to disappear. Every signal follows an
|
|
268
|
+
* existence probe in the same synchronous step, the first observation that
|
|
269
|
+
* the group is gone (ESRCH from a probe or from a signal) closes the window
|
|
270
|
+
* for good, and no path that runs after the window closed probes or signals
|
|
271
|
+
* again.
|
|
272
|
+
*
|
|
273
|
+
* Residual hazard, accepted: Linux keeps a PGID reserved while any member of
|
|
274
|
+
* the group lives, so a signal can only reach an unrelated group if every
|
|
275
|
+
* member dies between the probe and the signal that immediately follows it.
|
|
276
|
+
* `bash-exec.ts` and the ACP transport share this window; the gateway MCP
|
|
277
|
+
* client follows the same rules.
|
|
278
|
+
*/
|
|
279
|
+
export function createProcessGroupCleanup(hooks: ProcessGroupCleanupHooks): ProcessGroupCleanup {
|
|
280
|
+
const scheduler = hooks.scheduler ?? SYSTEM_CLEANUP_SCHEDULER;
|
|
281
|
+
const graceMs = Math.max(0, hooks.graceMs);
|
|
282
|
+
const teardownBoundMs = Math.max(0, hooks.teardownBoundMs ?? SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS);
|
|
283
|
+
const pollIntervalMs = Math.max(1, hooks.pollIntervalMs ?? GROUP_POLL_INTERVAL_MS);
|
|
284
|
+
let phase: "idle" | "terminating" | "killing" | "done" = "idle";
|
|
285
|
+
let leaderGone = false;
|
|
286
|
+
let descendantsCleaned = false;
|
|
287
|
+
let status: ProcessGroupCleanupStatus | null = null;
|
|
288
|
+
let graceTimer: unknown = null;
|
|
289
|
+
let boundTimer: unknown = null;
|
|
290
|
+
let pollTimer: unknown = null;
|
|
291
|
+
|
|
292
|
+
const isDone = (): boolean => phase === "done";
|
|
293
|
+
|
|
294
|
+
const clearTimers = (): void => {
|
|
295
|
+
for (const handle of [graceTimer, boundTimer, pollTimer]) if (handle !== null) scheduler.clearTimeout(handle);
|
|
296
|
+
graceTimer = null;
|
|
297
|
+
boundTimer = null;
|
|
298
|
+
pollTimer = null;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
const complete = (incomplete: boolean): void => {
|
|
302
|
+
if (phase === "done") return;
|
|
303
|
+
phase = "done";
|
|
304
|
+
clearTimers();
|
|
305
|
+
status = { descendantsCleaned, incomplete };
|
|
306
|
+
hooks.onDone(status);
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
/** One probe. A group that is gone closes the window here; nothing is sent after this returns false. */
|
|
310
|
+
const membersRemain = (): boolean => {
|
|
311
|
+
if (hooks.probe()) return true;
|
|
312
|
+
complete(false);
|
|
313
|
+
return false;
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
/** One signal. ESRCH at delivery is the same observation as ESRCH from a probe and closes the window too. */
|
|
317
|
+
const deliver = (signalName: NodeJS.Signals): boolean => {
|
|
318
|
+
if (hooks.signal(signalName)) return true;
|
|
319
|
+
complete(false);
|
|
320
|
+
return false;
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
const escalate = (): void => {
|
|
324
|
+
graceTimer = null;
|
|
325
|
+
if (phase === "done" || !membersRemain()) return;
|
|
326
|
+
phase = "killing";
|
|
327
|
+
if (!deliver("SIGKILL")) return;
|
|
328
|
+
boundTimer = scheduler.setTimeout(() => {
|
|
329
|
+
boundTimer = null;
|
|
330
|
+
if (phase === "done") return;
|
|
331
|
+
if (membersRemain()) complete(true);
|
|
332
|
+
}, teardownBoundMs);
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
/** Open with SIGTERM. `probed` says the caller already saw members in this same synchronous step. */
|
|
336
|
+
const openWindow = (probed: boolean): void => {
|
|
337
|
+
if (phase !== "idle") return;
|
|
338
|
+
if (!probed && !membersRemain()) return;
|
|
339
|
+
phase = "terminating";
|
|
340
|
+
if (!deliver("SIGTERM")) return;
|
|
341
|
+
if (graceMs > 0) graceTimer = scheduler.setTimeout(escalate, graceMs);
|
|
342
|
+
else escalate();
|
|
343
|
+
};
|
|
344
|
+
|
|
345
|
+
const poll = (): void => {
|
|
346
|
+
pollTimer = scheduler.setTimeout(() => {
|
|
347
|
+
pollTimer = null;
|
|
348
|
+
if (phase === "done") return;
|
|
349
|
+
if (membersRemain()) poll();
|
|
350
|
+
}, pollIntervalMs);
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
get done() {
|
|
355
|
+
return phase === "done";
|
|
356
|
+
},
|
|
357
|
+
get status() {
|
|
358
|
+
return status;
|
|
359
|
+
},
|
|
360
|
+
kill() {
|
|
361
|
+
if (phase === "done") return;
|
|
362
|
+
openWindow(false);
|
|
363
|
+
},
|
|
364
|
+
leaderExited() {
|
|
365
|
+
if (phase === "done" || leaderGone) return;
|
|
366
|
+
leaderGone = true;
|
|
367
|
+
if (!membersRemain()) return;
|
|
368
|
+
// Only descendants can be left now: the leader was reaped before this call.
|
|
369
|
+
descendantsCleaned = true;
|
|
370
|
+
openWindow(true);
|
|
371
|
+
if (!isDone()) poll();
|
|
372
|
+
},
|
|
373
|
+
dispose() {
|
|
374
|
+
if (phase === "done") return;
|
|
375
|
+
phase = "done";
|
|
376
|
+
clearTimers();
|
|
377
|
+
},
|
|
378
|
+
};
|
|
62
379
|
}
|
|
63
380
|
|
|
64
381
|
export function buildSafeToolEnv(
|
|
@@ -92,10 +409,30 @@ export function runCommandVector(
|
|
|
92
409
|
options: RunCommandVectorOptions = {},
|
|
93
410
|
): Promise<SafeCommandResult> {
|
|
94
411
|
return new Promise((resolve) => {
|
|
95
|
-
const
|
|
412
|
+
const startedAtClock = performance.now();
|
|
413
|
+
const startedAt = Date.now();
|
|
96
414
|
const cwd = resolveSafeCwd(options.cwd, options.workspaceRoot);
|
|
97
415
|
const timeoutMs = clampTimerDelayMs(options.timeoutMs ?? SAFE_EXEC_DEFAULT_TIMEOUT_MS);
|
|
416
|
+
const killGraceMs = clampTimerDelayMs(options.killGraceMs ?? SAFE_EXEC_DEFAULT_KILL_GRACE_MS);
|
|
98
417
|
const maxOutputBytes = options.maxOutputBytes ?? SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES;
|
|
418
|
+
const sink = options.output;
|
|
419
|
+
const stdoutWindow =
|
|
420
|
+
sink === undefined
|
|
421
|
+
? null
|
|
422
|
+
: createRetainedStreamWindow(
|
|
423
|
+
sink.retainHeadBytes ?? SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES,
|
|
424
|
+
sink.retainTailBytes ?? SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES,
|
|
425
|
+
);
|
|
426
|
+
const stderrWindow =
|
|
427
|
+
sink === undefined
|
|
428
|
+
? null
|
|
429
|
+
: createRetainedStreamWindow(
|
|
430
|
+
sink.retainHeadBytes ?? SAFE_EXEC_DEFAULT_RETAIN_HEAD_BYTES,
|
|
431
|
+
sink.retainTailBytes ?? SAFE_EXEC_DEFAULT_RETAIN_TAIL_BYTES,
|
|
432
|
+
);
|
|
433
|
+
let stdoutBytes = 0;
|
|
434
|
+
let stderrBytes = 0;
|
|
435
|
+
let sinkError: string | null = null;
|
|
99
436
|
const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(options.env), {
|
|
100
437
|
cwd,
|
|
101
438
|
enabled: gitCommitAttributionEnabled(process.env),
|
|
@@ -108,9 +445,38 @@ export function runCommandVector(
|
|
|
108
445
|
let stdout = "";
|
|
109
446
|
let stderr = "";
|
|
110
447
|
let settled = false;
|
|
111
|
-
|
|
448
|
+
const captured = (): Pick<
|
|
449
|
+
SafeCommandResult,
|
|
450
|
+
"stdout" | "stderr" | "stdoutBytes" | "stderrBytes" | "stdoutRetained" | "stderrRetained" | "sinkError"
|
|
451
|
+
> => {
|
|
452
|
+
if (stdoutWindow === null || stderrWindow === null) {
|
|
453
|
+
return {
|
|
454
|
+
stdout,
|
|
455
|
+
stderr,
|
|
456
|
+
stdoutBytes,
|
|
457
|
+
stderrBytes,
|
|
458
|
+
stdoutRetained: !outputCapped,
|
|
459
|
+
stderrRetained: !outputCapped,
|
|
460
|
+
...(sinkError === null ? {} : { sinkError }),
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
const out = stdoutWindow.render();
|
|
464
|
+
const err = stderrWindow.render();
|
|
465
|
+
return {
|
|
466
|
+
stdout: out.text,
|
|
467
|
+
stderr: err.text,
|
|
468
|
+
stdoutBytes,
|
|
469
|
+
stderrBytes,
|
|
470
|
+
stdoutRetained: out.retained,
|
|
471
|
+
stderrRetained: err.retained,
|
|
472
|
+
...(sinkError === null ? {} : { sinkError }),
|
|
473
|
+
};
|
|
474
|
+
};
|
|
112
475
|
let timeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
113
|
-
let
|
|
476
|
+
let leaderExit: { code: number | null; signal: NodeJS.Signals | null } | null = null;
|
|
477
|
+
let closed = false;
|
|
478
|
+
let pipeDrainIncomplete = false;
|
|
479
|
+
let drainTimer: ReturnType<typeof setTimeout> | null = null;
|
|
114
480
|
|
|
115
481
|
const child = spawn(file, [...args], {
|
|
116
482
|
cwd,
|
|
@@ -119,36 +485,123 @@ export function runCommandVector(
|
|
|
119
485
|
stdio: ["ignore", "pipe", "pipe"],
|
|
120
486
|
});
|
|
121
487
|
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
488
|
+
const onAbort = (): void => {
|
|
489
|
+
aborted = true;
|
|
490
|
+
killChild();
|
|
491
|
+
if (leaderExit !== null) stopDraining();
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
// Where process groups exist the child leads its own, and the probe and
|
|
495
|
+
// the signals address the whole group. Elsewhere only the direct child
|
|
496
|
+
// is reachable, and "members remain" means the leader is still running.
|
|
497
|
+
const groupProbe = (): boolean => {
|
|
498
|
+
const pid = child.pid;
|
|
499
|
+
if (!pid) return false;
|
|
500
|
+
if (process.platform === "win32") return child.exitCode === null && child.signalCode === null;
|
|
501
|
+
try {
|
|
502
|
+
process.kill(-pid, 0);
|
|
503
|
+
return true;
|
|
504
|
+
} catch (error) {
|
|
505
|
+
// ESRCH means no member is left. EPERM means one exists that this
|
|
506
|
+
// process may not signal; it still counts as present.
|
|
507
|
+
return (error as NodeJS.ErrnoException).code !== "ESRCH";
|
|
508
|
+
}
|
|
125
509
|
};
|
|
126
510
|
|
|
127
|
-
const
|
|
511
|
+
const groupSignal = (signalName: NodeJS.Signals): boolean => {
|
|
128
512
|
const pid = child.pid;
|
|
129
513
|
if (pid && process.platform !== "win32") {
|
|
130
514
|
try {
|
|
131
515
|
process.kill(-pid, signalName);
|
|
132
|
-
return;
|
|
133
|
-
} catch {
|
|
134
|
-
//
|
|
516
|
+
return true;
|
|
517
|
+
} catch (error) {
|
|
518
|
+
// ESRCH: the group vanished between the probe and this signal, so
|
|
519
|
+
// the window closes here. Anything else (EPERM) leaves members the
|
|
520
|
+
// runner cannot reach; retain the bounded cleanup window so its
|
|
521
|
+
// final probe reports what remains. Direct-child absence does not
|
|
522
|
+
// establish group absence.
|
|
523
|
+
if ((error as NodeJS.ErrnoException).code === "ESRCH") return false;
|
|
524
|
+
return true;
|
|
135
525
|
}
|
|
136
526
|
}
|
|
137
|
-
child
|
|
527
|
+
// Without a group only the direct child is addressable; once it has
|
|
528
|
+
// exited there is nothing left to clean.
|
|
529
|
+
return child.kill(signalName);
|
|
138
530
|
};
|
|
139
531
|
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
532
|
+
const cleanup = createProcessGroupCleanup({
|
|
533
|
+
graceMs: killGraceMs,
|
|
534
|
+
probe: groupProbe,
|
|
535
|
+
signal: groupSignal,
|
|
536
|
+
onDone: () => tryFinish(),
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
const killChild = (): void => cleanup.kill();
|
|
540
|
+
|
|
541
|
+
const finish = (exitCode: number | null, signalName: NodeJS.Signals | null, spawnError?: Error): void => {
|
|
542
|
+
if (settled) return;
|
|
543
|
+
settled = true;
|
|
544
|
+
if (drainTimer) clearTimeout(drainTimer);
|
|
545
|
+
drainTimer = null;
|
|
546
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
547
|
+
timeoutId = null;
|
|
548
|
+
cleanup.dispose();
|
|
549
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
550
|
+
// Descendants may retain the write ends indefinitely. Release our read
|
|
551
|
+
// ends and process handle even when settlement bypasses close.
|
|
552
|
+
child.stdout?.destroy();
|
|
553
|
+
child.stderr?.destroy();
|
|
554
|
+
child.unref();
|
|
555
|
+
const output = captured();
|
|
556
|
+
resolve({
|
|
557
|
+
file,
|
|
558
|
+
args: [...args],
|
|
559
|
+
cwd,
|
|
560
|
+
...output,
|
|
561
|
+
...(pipeDrainIncomplete ? { stdoutRetained: false, stderrRetained: false } : {}),
|
|
562
|
+
stderr: output.stderr.length === 0 && spawnError !== undefined ? spawnError.message : output.stderr,
|
|
563
|
+
exitCode: (cleanup.status?.incomplete === true || pipeDrainIncomplete) && exitCode === 0 ? 1 : exitCode,
|
|
564
|
+
leaderExit,
|
|
565
|
+
signal: signalName,
|
|
566
|
+
aborted,
|
|
567
|
+
timedOut,
|
|
568
|
+
outputCapped,
|
|
569
|
+
durationMs: Math.round(performance.now() - startedAtClock),
|
|
570
|
+
startedAt,
|
|
571
|
+
descendantsCleaned: cleanup.status?.descendantsCleaned ?? false,
|
|
572
|
+
cleanupIncomplete: cleanup.status?.incomplete ?? false,
|
|
573
|
+
pipeDrainIncomplete,
|
|
574
|
+
failure:
|
|
575
|
+
cleanup.status?.incomplete === true
|
|
576
|
+
? `process group cleanup incomplete: members were still present ${SAFE_EXEC_GROUP_TEARDOWN_BOUND_MS}ms after SIGKILL`
|
|
577
|
+
: pipeDrainIncomplete
|
|
578
|
+
? "output pipe draining incomplete after leader exit; logs may be incomplete and escaped processes are not contained"
|
|
579
|
+
: null,
|
|
580
|
+
});
|
|
145
581
|
};
|
|
146
582
|
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
583
|
+
const stopDraining = (): void => {
|
|
584
|
+
if (settled) return;
|
|
585
|
+
if (!child.stdout?.readableEnded || !child.stderr?.readableEnded) {
|
|
586
|
+
pipeDrainIncomplete = true;
|
|
587
|
+
child.stdout?.destroy();
|
|
588
|
+
child.stderr?.destroy();
|
|
589
|
+
}
|
|
590
|
+
tryFinish();
|
|
150
591
|
};
|
|
151
592
|
|
|
593
|
+
/**
|
|
594
|
+
* Settlement normally waits for both closed streams and group cleanup.
|
|
595
|
+
* An incomplete group teardown or pipe-drain deadline permits bounded
|
|
596
|
+
* settlement with the bytes received so far and an unsuccessful result.
|
|
597
|
+
* Neither path reopens group access after ESRCH.
|
|
598
|
+
*/
|
|
599
|
+
function tryFinish(): void {
|
|
600
|
+
if (settled || !cleanup.done) return;
|
|
601
|
+
if (!closed && cleanup.status?.incomplete !== true && !pipeDrainIncomplete) return;
|
|
602
|
+
finish(leaderExit?.code ?? null, leaderExit?.signal ?? null);
|
|
603
|
+
}
|
|
604
|
+
|
|
152
605
|
if (timeoutMs > 0) {
|
|
153
606
|
timeoutId = setTimeout(() => {
|
|
154
607
|
timedOut = true;
|
|
@@ -159,6 +612,26 @@ export function runCommandVector(
|
|
|
159
612
|
else options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
160
613
|
|
|
161
614
|
const appendChunk = (target: "stdout" | "stderr", chunk: Buffer): void => {
|
|
615
|
+
if (settled) return;
|
|
616
|
+
// Every byte the child wrote counts, whatever happens to it next: the
|
|
617
|
+
// counters say what was received, the retained flags say what was kept.
|
|
618
|
+
if (target === "stdout") stdoutBytes += chunk.byteLength;
|
|
619
|
+
else stderrBytes += chunk.byteLength;
|
|
620
|
+
if (sink !== undefined && stdoutWindow !== null && stderrWindow !== null) {
|
|
621
|
+
// The bounded window keeps observing so the result's tail and the
|
|
622
|
+
// retained flag stay honest; a failed sink receives nothing more.
|
|
623
|
+
(target === "stdout" ? stdoutWindow : stderrWindow).append(chunk);
|
|
624
|
+
if (sinkError !== null) return;
|
|
625
|
+
try {
|
|
626
|
+
if (target === "stdout") sink.onStdout?.(chunk);
|
|
627
|
+
else sink.onStderr?.(chunk);
|
|
628
|
+
} catch (error) {
|
|
629
|
+
sinkError = error instanceof Error ? error.message : String(error);
|
|
630
|
+
killChild();
|
|
631
|
+
}
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
if (outputCapped) return;
|
|
162
635
|
outputBytes += chunk.byteLength;
|
|
163
636
|
if (outputBytes > maxOutputBytes) {
|
|
164
637
|
outputCapped = true;
|
|
@@ -171,45 +644,22 @@ export function runCommandVector(
|
|
|
171
644
|
|
|
172
645
|
child.stdout?.on("data", (chunk: Buffer) => appendChunk("stdout", chunk));
|
|
173
646
|
child.stderr?.on("data", (chunk: Buffer) => appendChunk("stderr", chunk));
|
|
174
|
-
child.on("error", (error) =>
|
|
175
|
-
|
|
176
|
-
settled
|
|
647
|
+
child.on("error", (error) => finish(null, null, error));
|
|
648
|
+
child.on("exit", (code, signalName) => {
|
|
649
|
+
if (settled || leaderExit !== null) return;
|
|
650
|
+
leaderExit = { code, signal: signalName };
|
|
651
|
+
// Execution timeout ends here, but cancellation remains active through
|
|
652
|
+
// settlement. Escaped descendants can retain pipes after group ESRCH.
|
|
177
653
|
if (timeoutId) clearTimeout(timeoutId);
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
args: [...args],
|
|
183
|
-
cwd,
|
|
184
|
-
stdout,
|
|
185
|
-
stderr: stderr.length > 0 ? stderr : error.message,
|
|
186
|
-
exitCode: null,
|
|
187
|
-
signal: null,
|
|
188
|
-
aborted,
|
|
189
|
-
timedOut,
|
|
190
|
-
outputCapped,
|
|
191
|
-
durationMs: Math.round(performance.now() - startedAt),
|
|
192
|
-
});
|
|
654
|
+
timeoutId = null;
|
|
655
|
+
drainTimer = setTimeout(stopDraining, SAFE_EXEC_PIPE_DRAIN_BOUND_MS);
|
|
656
|
+
cleanup.leaderExited();
|
|
657
|
+
if (aborted) stopDraining();
|
|
193
658
|
});
|
|
194
|
-
child.on("close", (
|
|
195
|
-
if (settled) return;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
clearKillGraceTimer();
|
|
199
|
-
options.signal?.removeEventListener("abort", onAbort);
|
|
200
|
-
resolve({
|
|
201
|
-
file,
|
|
202
|
-
args: [...args],
|
|
203
|
-
cwd,
|
|
204
|
-
stdout,
|
|
205
|
-
stderr,
|
|
206
|
-
exitCode: code,
|
|
207
|
-
signal: signalName,
|
|
208
|
-
aborted,
|
|
209
|
-
timedOut,
|
|
210
|
-
outputCapped,
|
|
211
|
-
durationMs: Math.round(performance.now() - startedAt),
|
|
212
|
-
});
|
|
659
|
+
child.on("close", () => {
|
|
660
|
+
if (settled || closed) return;
|
|
661
|
+
closed = true;
|
|
662
|
+
tryFinish();
|
|
213
663
|
});
|
|
214
664
|
});
|
|
215
665
|
}
|
|
@@ -146,11 +146,13 @@ export function withModelSkillActivation(
|
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
148
|
* Tools admitted regardless of any active skill narrowing: context so the
|
|
149
|
-
* remaining requested skills of the same turn can still load,
|
|
149
|
+
* remaining requested skills of the same turn can still load, ask_user as
|
|
150
150
|
* the escape hatch the block message points at when a workflow genuinely
|
|
151
|
-
* needs a tool its skill did not declare
|
|
151
|
+
* needs a tool its skill did not declare, and gateway because find and
|
|
152
|
+
* describe are harmless and a gateway call is checked again, under the
|
|
153
|
+
* capability's own name, by the nested admission it makes.
|
|
152
154
|
*/
|
|
153
|
-
const SKILL_SURFACE_EXEMPT_TOOLS: ReadonlySet<string> = new Set(["context", "ask_user"]);
|
|
155
|
+
const SKILL_SURFACE_EXEMPT_TOOLS: ReadonlySet<string> = new Set(["context", "ask_user", "gateway"]);
|
|
154
156
|
|
|
155
157
|
export interface SkillToolSurfaceViolation {
|
|
156
158
|
/** Every loaded skill that contributed a declaration to the merged surface. */
|