@iowarp/clio-coder 0.4.8 → 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/CHANGELOG.md +82 -0
- package/README.md +7 -6
- package/dist/{acp-JWPQZM2D.js → acp-ZWZCPS2A.js} +13 -13
- package/dist/{agents-4GCDIRVX.js → agents-LYSOWZUE.js} +53 -52
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-SYAKTDQE.js → auth-WBQGKWQ5.js} +27 -27
- package/dist/{background-OW67WMYR.js → background-BUMOBAQN.js} +4 -4
- package/dist/{builtins-TKS63VNV.js → builtins-ODRJOEDI.js} +7 -7
- package/dist/{chunk-JLBVCROW.js → chunk-2DRRZ57Q.js} +33 -24
- package/dist/chunk-2JBZYUPY.js +105 -0
- package/dist/chunk-2KUBKL63.js +336 -0
- package/dist/{chunk-K45LHSCI.js → chunk-2VBWFXYE.js} +7 -3
- package/dist/{chunk-XTLJDC2X.js → chunk-2X2R3UTH.js} +23 -18
- package/dist/{chunk-5HULHKT2.js → chunk-37LW32LZ.js} +5 -5
- package/dist/{chunk-W7KNI3F5.js → chunk-3AND2EFU.js} +5 -5
- package/dist/{chunk-36XSBPXL.js → chunk-3RDHGNU7.js} +95 -27
- package/dist/{chunk-BIY22UUK.js → chunk-3SUDBGEI.js} +11 -10
- package/dist/{chunk-3IQOZRQ6.js → chunk-3TQN67I2.js} +7 -7
- package/dist/{chunk-KWJXCL2X.js → chunk-3U4BL2EV.js} +3 -3
- package/dist/{chunk-RBES4TCZ.js → chunk-3UQADNG2.js} +3 -3
- package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
- package/dist/{chunk-MWMW53WW.js → chunk-4ATBOFRP.js} +649 -193
- package/dist/{chunk-QGIC5SX5.js → chunk-4DNL43EZ.js} +3 -3
- package/dist/{chunk-GVU4CXPJ.js → chunk-4HFJKRGZ.js} +113 -54
- package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
- package/dist/{chunk-LZDLYSUN.js → chunk-5RTEFNBP.js} +3 -3
- package/dist/{chunk-HMGAKB7E.js → chunk-64XJW7NT.js} +15 -15
- package/dist/{chunk-EXKUF426.js → chunk-7FBCRWVT.js} +280 -280
- package/dist/{chunk-K3W6BF5C.js → chunk-7JSOSVLP.js} +2 -2
- package/dist/{chunk-WFTSK7N3.js → chunk-7N3OLLSL.js} +4 -4
- package/dist/{chunk-JRA6OBHY.js → chunk-A6DULIMH.js} +17 -5
- package/dist/{chunk-R5NRX5N4.js → chunk-AB3QXXBC.js} +2 -2
- package/dist/chunk-ACCECAH4.js +49 -0
- package/dist/{chunk-GJBJHJNY.js → chunk-AM6CEP2K.js} +5 -5
- package/dist/{chunk-MUXNDNMZ.js → chunk-AY4XE6GN.js} +19 -13
- package/dist/{chunk-MATCRH3M.js → chunk-BBA2TAWV.js} +9 -9
- package/dist/{chunk-PMUUAABD.js → chunk-BMNVVKEW.js} +9 -9
- package/dist/{chunk-TOPICHGR.js → chunk-CTGZCEI6.js} +2 -2
- package/dist/{chunk-L75H5B3B.js → chunk-DIAJYJYG.js} +2 -2
- package/dist/{chunk-JIMWEYWO.js → chunk-EHZRAB4U.js} +2 -2
- package/dist/{chunk-YXANQGCX.js → chunk-EM2DIQAJ.js} +6 -6
- package/dist/{chunk-JCVIL6TY.js → chunk-ETF4ROKH.js} +4 -4
- package/dist/{chunk-5W4FRA5Q.js → chunk-F2YM3JY4.js} +483 -253
- package/dist/{chunk-YGIV24MF.js → chunk-FEBQWHJT.js} +21 -16
- package/dist/{chunk-PGEFOTJB.js → chunk-FPS4R2RN.js} +5 -4
- package/dist/{chunk-XC5POIL4.js → chunk-G5R53COU.js} +1 -1
- package/dist/chunk-GHXGMFQ5.js +40 -0
- package/dist/{chunk-QLKCCC2J.js → chunk-GJDRMBDI.js} +14 -14
- package/dist/{chunk-2ZWLMA3T.js → chunk-GREYLTZ5.js} +7 -7
- package/dist/{chunk-YXFKLMX2.js → chunk-H2WSCZZT.js} +22 -6
- package/dist/{chunk-FNVPQQYT.js → chunk-H6IUCY6Q.js} +2 -2
- package/dist/{chunk-5C2OQHLR.js → chunk-H72DCH3E.js} +92 -203
- package/dist/{chunk-JYKUMHCQ.js → chunk-H7TXJR23.js} +21 -21
- package/dist/chunk-HBJQQTKM.js +40 -0
- package/dist/chunk-HCVKSGNZ.js +990 -0
- package/dist/{chunk-ARRUMZ7X.js → chunk-I47EJPYL.js} +3 -3
- package/dist/{chunk-YKIIWURD.js → chunk-IALGWTLO.js} +3 -3
- package/dist/{chunk-FB3KTE2J.js → chunk-IALZJE37.js} +4 -4
- package/dist/{chunk-RAUOKUZV.js → chunk-IC7JXLOM.js} +15 -10
- package/dist/{chunk-LLCGGVSW.js → chunk-IOSVTTCD.js} +7 -7
- package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
- package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
- package/dist/{chunk-UDAK6GR2.js → chunk-JIYWMQZ5.js} +2 -2
- package/dist/{chunk-O3HSB2YL.js → chunk-JKU34ACI.js} +2 -2
- package/dist/{chunk-6X7VOCDY.js → chunk-JTR3VSV3.js} +3 -3
- package/dist/{chunk-O2QJDRWP.js → chunk-JU6MAMRJ.js} +4 -4
- package/dist/chunk-JURMQWVJ.js +15 -0
- package/dist/{chunk-STC6CWUZ.js → chunk-K3XN4LZ4.js} +5 -5
- package/dist/{chunk-ATB3Q7YO.js → chunk-KIVFXGBM.js} +27 -2
- package/dist/{chunk-WJWNZXRM.js → chunk-KOAHT3N2.js} +2 -2
- package/dist/chunk-KP5BPXR3.js +73 -0
- package/dist/{chunk-K53E2PTW.js → chunk-KRJQG47M.js} +3 -3
- package/dist/{chunk-IILXVWJY.js → chunk-KW6OJ7IY.js} +19 -21
- package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
- package/dist/{chunk-2U2U5POA.js → chunk-L4RUTLRL.js} +5 -5
- package/dist/{chunk-QYSAZMSH.js → chunk-LGTVWPRN.js} +2 -2
- package/dist/{chunk-KGP3UQGJ.js → chunk-LSQW6KZO.js} +5 -5
- package/dist/{chunk-P4JS3MH5.js → chunk-LWJYOHT3.js} +8 -8
- package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
- package/dist/{chunk-5D2FNBMG.js → chunk-MJ4QEJVT.js} +2 -2
- package/dist/{chunk-RM3XJX7P.js → chunk-MO65K5CH.js} +5 -5
- package/dist/{chunk-H5DPSUBB.js → chunk-MTOZEQHL.js} +3 -3
- package/dist/{chunk-6R5MBXBJ.js → chunk-NBPA5QM6.js} +2 -2
- package/dist/{chunk-H77XBUBM.js → chunk-NMBEW4PP.js} +3 -3
- package/dist/{chunk-QWUSS2QP.js → chunk-NPLLK3HO.js} +67 -87
- package/dist/{chunk-K5UJD6MM.js → chunk-NSYGPIVW.js} +5 -5
- package/dist/{context-EZZPT2ZV.js → chunk-NXTV5OI5.js} +30 -84
- package/dist/{chunk-F7Y6QTPL.js → chunk-NYDG4QP4.js} +4 -4
- package/dist/{chunk-PFZJMXIY.js → chunk-OA2GDACN.js} +2 -2
- package/dist/{chunk-Q32C6AWI.js → chunk-PJI57EC6.js} +4 -4
- package/dist/{chunk-EFXMQYI6.js → chunk-PJJBUGMR.js} +52 -52
- package/dist/{chunk-ICYIUNO4.js → chunk-PNJE7JPS.js} +18 -3
- package/dist/chunk-PP23PZEV.js +1347 -0
- package/dist/chunk-PPIFDSBK.js +409 -0
- package/dist/{chunk-RFULVPBX.js → chunk-PTFISXQO.js} +6 -5
- package/dist/{chunk-JV25I7ID.js → chunk-QB33Z5S7.js} +5 -5
- package/dist/{chunk-D55WO5J7.js → chunk-QGNII5VC.js} +8 -8
- package/dist/{chunk-RKFNU5UA.js → chunk-QI72X67S.js} +104 -27
- package/dist/chunk-QKHZZFKH.js +98 -0
- package/dist/{chunk-5UG6EZI3.js → chunk-RDKX2PME.js} +4 -4
- package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
- package/dist/{chunk-BE4I3UJ2.js → chunk-RQROVOV3.js} +15 -13
- package/dist/{chunk-TEHVMHOK.js → chunk-S34A7BSP.js} +3 -3
- package/dist/{chunk-4P6M2TTE.js → chunk-SJETVJHX.js} +2 -2
- package/dist/{chunk-OPC4DQD6.js → chunk-SJMNU4ZS.js} +2 -2
- package/dist/{chunk-2JSCCEKO.js → chunk-SLLG2G44.js} +2 -2
- package/dist/{chunk-EPYATQMG.js → chunk-SQAZN2V3.js} +42 -16
- package/dist/{chunk-E2NSPYLC.js → chunk-SQBT46OF.js} +5 -5
- package/dist/{chunk-WTZVSMQZ.js → chunk-TCUOGIL2.js} +5 -5
- package/dist/{chunk-RRZFRIJP.js → chunk-TIWPKCVO.js} +5 -5
- package/dist/{chunk-QLAGXTTV.js → chunk-UIU7MGZ3.js} +5 -1
- package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
- package/dist/{chunk-PJ5H5B7A.js → chunk-VPWGADBG.js} +18 -18
- package/dist/{chunk-GEYX2NZ5.js → chunk-VWFCAK34.js} +6 -6
- package/dist/{chunk-44U2OUSM.js → chunk-W72LLZAV.js} +2 -2
- package/dist/{chunk-ORRNGQDV.js → chunk-WGRDABW7.js} +4 -4
- package/dist/{chunk-RNLAPBJL.js → chunk-XFLSL7BT.js} +2 -2
- package/dist/{chunk-2SXGG2IV.js → chunk-XJZEDCNT.js} +6 -6
- package/dist/{chunk-UB33F3YW.js → chunk-XLLEL3K7.js} +5 -5
- package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
- package/dist/{chunk-WS4FOGLY.js → chunk-XNZWWDC3.js} +2 -2
- package/dist/{chunk-P7GTE4FX.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-OEMFEL26.js → chunk-Y3M2T5RO.js} +3 -3
- package/dist/{chunk-HP7KJ5O2.js → chunk-YPQOPFP7.js} +6 -6
- package/dist/{chunk-MEHBW2SP.js → chunk-YQYINEJI.js} +6 -6
- package/dist/{chunk-RXI7K4J5.js → chunk-ZF6CV4WZ.js} +1338 -217
- package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
- package/dist/{chunk-526ABLHD.js → chunk-ZKQ63XZ5.js} +12 -35
- package/dist/{chunk-PAQVETLA.js → chunk-ZKVMDNAN.js} +5 -5
- package/dist/cli/index.js +47 -37
- package/dist/{clio-BPBAPZGA.js → clio-JUDCLNHC.js} +7 -7
- package/dist/clio-context-tools-FT672MNZ.js +136 -0
- package/dist/{code-nav-KBQ3RIFK.js → code-nav-7OVCTP2Z.js} +28 -26
- package/dist/{components-6DKAXWFN.js → components-OZXZMDWU.js} +5 -5
- package/dist/{config-FWL5JK2H.js → config-P3ZQVF63.js} +80 -75
- package/dist/{config-graph-ACDB26L2.js → config-graph-GKAOBAS5.js} +74 -70
- package/dist/{configure-ZIZ4YV62.js → configure-25LRYZJG.js} +45 -44
- package/dist/context-72VQV7JX.js +73 -0
- package/dist/{context-VIL5MFRH.js → context-COWRWXP3.js} +74 -70
- package/dist/{context-Z3GOBHDK.js → context-WB3D474G.js} +12 -12
- package/dist/{context-clear-ZPB3L7MN.js → context-clear-Y4LYMWC6.js} +70 -66
- package/dist/{context-working-set-2GLBVF7L.js → context-working-set-TMZYVC7A.js} +15 -14
- package/dist/data-tool-KMBWKKWR.js +2987 -0
- package/dist/{detail-VSBWYSGZ.js → detail-4GLROGY5.js} +71 -67
- package/dist/{dispatch-runner-EEEHGKX4.js → dispatch-runner-TR3LBP5P.js} +92 -88
- package/dist/{docs-VMMWFVHL.js → docs-ZK777W2G.js} +3 -3
- package/dist/{doctor-V5L4IQGP.js → doctor-WC4OV2OB.js} +61 -59
- package/dist/{eval-VJYJ2BV3.js → eval-FUNWJNUJ.js} +45 -45
- package/dist/{evals-J2H5V6DD.js → evals-L73EBHSU.js} +4 -4
- package/dist/{evidence-Y35YSXH6.js → evidence-AVJ2RTHX.js} +80 -76
- package/dist/{evidence-POWAEBEW.js → evidence-P4NZOAK7.js} +70 -66
- package/dist/{evidence-XCCCLS36.js → evidence-Y55WKYHH.js} +79 -75
- package/dist/{evolve-GPG72VB6.js → evolve-MAWKRYWF.js} +75 -71
- package/dist/{extensions-YIZ7W3DA.js → extensions-PYQH3H47.js} +8 -8
- package/dist/{fleet-2MDCQ2VK.js → fleet-M4H2QBWT.js} +84 -80
- package/dist/{fleet-W2AF3TOJ.js → fleet-ULBXXRDR.js} +123 -119
- package/dist/{fleet-commands-WS56G26H.js → fleet-commands-7NNC4JZU.js} +17 -16
- package/dist/{fleet-decisions-MYGZ3JW7.js → fleet-decisions-EHEY7KPU.js} +9 -9
- package/dist/{fleet-graph-ELTBXBAV.js → fleet-graph-LQ2AHZT3.js} +15 -15
- package/dist/{fleet-inspect-45IK73L4.js → fleet-inspect-5IGBIIYZ.js} +76 -72
- package/dist/{fleet-preflight-T5NCZKHE.js → fleet-preflight-UTTNOKMG.js} +7 -2
- package/dist/{fleet-validate-VG4JBLA4.js → fleet-validate-YGILJKA6.js} +20 -20
- package/dist/{fleet-verify-VTSABAYO.js → fleet-verify-AUWTCDKR.js} +70 -66
- package/dist/{fleet-view-XC7WMKSS.js → fleet-view-TGUFCY5A.js} +73 -69
- package/dist/{init-VTJNNTIP.js → init-GFN2Z7NF.js} +94 -90
- package/dist/{interop-IU6BNA7C.js → interop-EF5JUWWK.js} +21 -21
- package/dist/{inventory-QPQUTUUZ.js → inventory-I6VJDDYF.js} +73 -69
- package/dist/{library-Q3NWL5CM.js → library-3J5IO2OJ.js} +13 -13
- package/dist/{library-LF7DLU6S.js → library-IJTOFTDS.js} +16 -15
- package/dist/{library-HUTAS57T.js → library-Z3KZSHPE.js} +27 -27
- package/dist/{library-import-PPW4YUC5.js → library-import-IMKFLDHX.js} +21 -21
- package/dist/{library-inventory-DIRVFRZU.js → library-inventory-CQP5D6GU.js} +13 -13
- package/dist/{library-validation-XHUZ3INE.js → library-validation-33UTX7AI.js} +11 -11
- package/dist/mcp-5FWZKUS6.js +26 -0
- package/dist/{memory-Z2LSKNV6.js → memory-36CWN67Y.js} +75 -71
- package/dist/{models-3FTREYPY.js → models-KQ6PQJJQ.js} +49 -49
- package/dist/{monitor-HF2MQRB3.js → monitor-XX6ZD6KC.js} +83 -79
- package/dist/{orchestrator-UYPA6W4S.js → orchestrator-SK6HDAOP.js} +1337 -772
- package/dist/{panes-736XB73K.js → panes-L27QRXUH.js} +12 -12
- package/dist/{panes-C4P3PIWT.js → panes-LXZIWNOZ.js} +4 -4
- package/dist/{paths-JQ4QYIYB.js → paths-7DJDU4P4.js} +5 -5
- package/dist/{preload-XSLRYH3Y.js → preload-K2TDYI4Y.js} +70 -66
- package/dist/{reset-V7QSPZYE.js → reset-73VU3XNT.js} +10 -10
- package/dist/{resources-OJGDFHYT.js → resources-3BYJYVYL.js} +16 -16
- package/dist/{run-T354SMDW.js → run-AR7PY6GW.js} +132 -128
- package/dist/run-script-H2KUDIII.js +41 -0
- package/dist/{settings-MWZXO6RV.js → settings-3VMBMWID.js} +4 -4
- package/dist/{share-Y5ZKJPND.js → share-HVWH4FPF.js} +21 -21
- package/dist/{skills-4GLZC4LN.js → skills-5TYEY75Q.js} +22 -22
- package/dist/{skills-eval-L5T7GODM.js → skills-eval-CK3MD63Z.js} +96 -87
- package/dist/{skills-inventory-LASKXEZI.js → skills-inventory-KSFYG3I6.js} +16 -16
- package/dist/{slash-commands-OIMRU36D.js → slash-commands-DMVHML7P.js} +47 -44
- package/dist/{steer-KMAM2Y2C.js → steer-XCD6V3EW.js} +4 -4
- package/dist/{support-AWC3XKPX.js → support-JAZL6VBR.js} +7 -7
- package/dist/{system-CD75NYBU.js → system-3TDQRMZZ.js} +26 -26
- package/dist/{targets-VSZX2J2S.js → targets-EZKHAYRN.js} +66 -65
- package/dist/{tasks-AN567LYH.js → tasks-SNEFHWYW.js} +12 -12
- package/dist/{terminal-lease-6KTWNHVY.js → terminal-lease-BNLFA4OF.js} +8 -7
- package/dist/{tools-AGRK3V5J.js → tools-7IM6BDCE.js} +12 -12
- package/dist/{trace-P4MQZD33.js → trace-C3MBGD4S.js} +8 -8
- package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
- package/dist/{uninstall-BRUTEPIC.js → uninstall-WWLOSZ42.js} +10 -10
- package/dist/{upgrade-SBCGHQGJ.js → upgrade-ETK2JNSJ.js} +37 -47
- package/dist/{usage-BIDVTO6V.js → usage-S2HOB7BZ.js} +93 -89
- package/dist/{verifiers-LTGCAMXS.js → verifiers-QDTEVH7R.js} +24 -22
- package/dist/{verify-OZU4LLNP.js → verify-SUKUK6XM.js} +15 -14
- package/dist/web/client/assets/{abnfDiagram-VCTEODGH-C5wfoHm3.js → abnfDiagram-VCTEODGH-BznNOe_I.js} +1 -1
- package/dist/web/client/assets/{arc-oH91sfLl.js → arc-Pry-7G1_.js} +1 -1
- 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/{blockDiagram-I7D4REHJ-wi0_CYHL.js → blockDiagram-I7D4REHJ-prINbpbM.js} +1 -1
- package/dist/web/client/assets/{c4Diagram-7LVT6UL2-DV7NYc2W.js → c4Diagram-7LVT6UL2-DkVRKtyU.js} +1 -1
- package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
- package/dist/web/client/assets/{chunk-4HAMMTFA-Bhsegh3F.js → chunk-4HAMMTFA-CV0Z1ApC.js} +1 -1
- package/dist/web/client/assets/{chunk-75Z2AOVW-RQCckcQG.js → chunk-75Z2AOVW-D34Nohxq.js} +1 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
- package/dist/web/client/assets/{chunk-F27PBJKO-BcNqv2x1.js → chunk-F27PBJKO-CmRojxkG.js} +1 -1
- package/dist/web/client/assets/{chunk-GMAD6QVW-Bq8JWiZT.js → chunk-GMAD6QVW-ClYZmc73.js} +1 -1
- package/dist/web/client/assets/{chunk-GVQU2GXP-DbchrAeJ.js → chunk-GVQU2GXP-B2BiHFt-.js} +1 -1
- package/dist/web/client/assets/{chunk-IMKFNOWR-DrpvjocK.js → chunk-IMKFNOWR-BGApZ8nP.js} +1 -1
- package/dist/web/client/assets/{chunk-L3NEJ4N5-DHLmTnCe.js → chunk-L3NEJ4N5-DIzCgpkY.js} +1 -1
- package/dist/web/client/assets/{chunk-OSK3NFVY-CsRbtN9n.js → chunk-OSK3NFVY-BPT-yePv.js} +1 -1
- package/dist/web/client/assets/{chunk-P2QGCYS3-aqPbxoMh.js → chunk-P2QGCYS3-BC1WTc2t.js} +1 -1
- package/dist/web/client/assets/{chunk-POPQ4Y6H-Dl5vw0h0.js → chunk-POPQ4Y6H-BSjzBmZU.js} +1 -1
- package/dist/web/client/assets/{chunk-PWAF6VOD-D7OBRSdO.js → chunk-PWAF6VOD-BIjLs86Z.js} +1 -1
- package/dist/web/client/assets/{chunk-SHT3W25Y-CdKCIwuB.js → chunk-SHT3W25Y-CduDz2cm.js} +1 -1
- package/dist/web/client/assets/{chunk-SVP7TREG-B94Nu_1-.js → chunk-SVP7TREG-XUn4pPAP.js} +1 -1
- package/dist/web/client/assets/{chunk-TICWLB2K-jjRQI_hk.js → chunk-TICWLB2K-DcBy2DKy.js} +1 -1
- package/dist/web/client/assets/{chunk-XXDRQBXY-azkbKE37.js → chunk-XXDRQBXY-DqAYeljN.js} +1 -1
- 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/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
- package/dist/web/client/assets/{cynefin-OW5HDTMX--i9RDU5f.js → cynefin-OW5HDTMX-BecPbyM6.js} +1 -1
- package/dist/web/client/assets/{cynefinDiagram-5FMLGOSQ-cRcvyBdp.js → cynefinDiagram-5FMLGOSQ-BzMzFwyT.js} +1 -1
- package/dist/web/client/assets/{dagre-GXQ25YYZ-C9mZmAPe.js → dagre-GXQ25YYZ-CAWJmRMG.js} +1 -1
- package/dist/web/client/assets/{diagram-S7CK7UJ4-Oj_zlLDY.js → diagram-S7CK7UJ4--lp0ALmn.js} +1 -1
- package/dist/web/client/assets/{diagram-UQ7AKVKN-BWKbbfcR.js → diagram-UQ7AKVKN-gKUnsjcj.js} +1 -1
- package/dist/web/client/assets/{diagram-VSXAHHWV-C3N3f7DO.js → diagram-VSXAHHWV-BoN5D1Gh.js} +1 -1
- package/dist/web/client/assets/{diagram-VX7I27RA-CtDKDAWe.js → diagram-VX7I27RA-BMtuswQ6.js} +1 -1
- package/dist/web/client/assets/{diagram-Z3DM3KII-B8bkBRCz.js → diagram-Z3DM3KII-DtU8LXrA.js} +1 -1
- package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
- package/dist/web/client/assets/{ebnfDiagram-PWID7BFC-CskW-Whx.js → ebnfDiagram-PWID7BFC-DDcnv9BH.js} +1 -1
- package/dist/web/client/assets/{erDiagram-RLTQ6QDP-C-83cgCW.js → erDiagram-RLTQ6QDP-DvRb4iDL.js} +1 -1
- 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-B40cQtBE.js → gitGraph-4MIJSDKK-DjD_AAMj.js} +1 -1
- package/dist/web/client/assets/{gitGraphDiagram-WWUBYQGX-CH-7P7Di.js → gitGraphDiagram-WWUBYQGX-CDyN9n2u.js} +1 -1
- package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
- package/dist/web/client/assets/{info-A6RAGUB7-eCCE9D_Q.js → info-A6RAGUB7-C_XK8Hq0.js} +1 -1
- package/dist/web/client/assets/{infoDiagram-27XIBGKW-DRnvqMjM.js → infoDiagram-27XIBGKW-DIe4tJ1i.js} +1 -1
- package/dist/web/client/assets/{ishikawaDiagram-5VMMS53U-DBA_55wp.js → ishikawaDiagram-5VMMS53U-CVl5unKI.js} +1 -1
- package/dist/web/client/assets/{journeyDiagram-3NMN7TZE-C-ewpNl7.js → journeyDiagram-3NMN7TZE-CPEB1Vt8.js} +1 -1
- package/dist/web/client/assets/{kanban-definition-UXKFOSKX-B1taGsu0.js → kanban-definition-UXKFOSKX-j-9WXjYQ.js} +1 -1
- package/dist/web/client/assets/{line-lZ0kyxDI.js → line-BIDAcEtX.js} +1 -1
- package/dist/web/client/assets/{linear-DIc8FgZj.js → linear-SzVmGSw4.js} +1 -1
- package/dist/web/client/assets/{mermaid-parser.core-SXolxpXw.js → mermaid-parser.core-Ux4vssh0.js} +3 -3
- package/dist/web/client/assets/{mermaid.core-DXgQtkNg.js → mermaid.core-CDuwVKeh.js} +4 -4
- package/dist/web/client/assets/{mindmap-definition-YA3MSWOX-DXJas9K7.js → mindmap-definition-YA3MSWOX-5MlQEeQ6.js} +1 -1
- package/dist/web/client/assets/{packet-AYTQ26CC-OqVl_07o.js → packet-AYTQ26CC-DRO66c9Q.js} +1 -1
- package/dist/web/client/assets/{pegDiagram-XKGWAZYB-CPE_zdfN.js → pegDiagram-XKGWAZYB-BakZnSjM.js} +1 -1
- package/dist/web/client/assets/{pie-WAS4IAKB-DAxnMBLe.js → pie-WAS4IAKB-BEzcmhz8.js} +1 -1
- package/dist/web/client/assets/{pieDiagram-E7YTZNPT-Uwjpufxv.js → pieDiagram-E7YTZNPT-DpmqgoPt.js} +1 -1
- package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
- package/dist/web/client/assets/{quadrantDiagram-AXDQQJYC-Bjs4yjgs.js → quadrantDiagram-AXDQQJYC-DuMPwwV2.js} +1 -1
- package/dist/web/client/assets/{radar-RG4KPBEZ-CuCKjHM3.js → radar-RG4KPBEZ-Djm3oXl5.js} +1 -1
- package/dist/web/client/assets/{railroad-74A4TZTK-CnQK-Cc1.js → railroad-74A4TZTK-Cpvkwsao.js} +1 -1
- 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-BDDIPNLL.js → railroadDiagram-O6MQD6OU-CgMS4B6R.js} +1 -1
- package/dist/web/client/assets/{requirementDiagram-BXWQKSXE-B5Ydyxc1.js → requirementDiagram-BXWQKSXE-CX5eoNdN.js} +1 -1
- package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/web/client/assets/{sankeyDiagram-P5KCCOFB-Bw2Qym75.js → sankeyDiagram-P5KCCOFB-CODBX2N3.js} +1 -1
- package/dist/web/client/assets/{sequenceDiagram-WJ2MYXX4-BZf36nO0.js → sequenceDiagram-WJ2MYXX4-eUhhF8OR.js} +1 -1
- package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
- package/dist/web/client/assets/{stateDiagram-D77RDMKH-DnH6JRkp.js → stateDiagram-D77RDMKH-vR6l0NC2.js} +1 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
- package/dist/web/client/assets/{swimlanes-42K2YHIH-D9PZmtZg.js → swimlanes-42K2YHIH-v9Tw_zX7.js} +1 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
- package/dist/web/client/assets/{timeline-definition-24CTP7MA-CrkZZBo7.js → timeline-definition-24CTP7MA-DxianbhU.js} +1 -1
- package/dist/web/client/assets/{treeView-Q6P3EWNA-C9zDShoC.js → treeView-Q6P3EWNA-DLxnZb9R.js} +1 -1
- package/dist/web/client/assets/{treemap-WGGIJYW6-B-plj9yK.js → treemap-WGGIJYW6-I7UnZ6xJ.js} +1 -1
- package/dist/web/client/assets/{vennDiagram-4TSXK5OY-VeOdaphN.js → vennDiagram-4TSXK5OY-Ar7M8Mrj.js} +1 -1
- package/dist/web/client/assets/{wardley-WFR3VGLG-Wl1P_m6L.js → wardley-WFR3VGLG-B8ZSHeDu.js} +1 -1
- package/dist/web/client/assets/{wardleyDiagram-VM6X3IG4-B85-R9t2.js → wardleyDiagram-VM6X3IG4-Qks2FmIn.js} +1 -1
- package/dist/web/client/assets/{xychartDiagram-S5SC5T6Z-BrD8OW8m.js → xychartDiagram-S5SC5T6Z-BBBjRtiE.js} +1 -1
- package/dist/web/client/index.html +3 -1
- package/dist/web/reads-worker.js +17 -17
- package/dist/web/server.js +25 -25
- package/dist/{web-EU6ATJWA.js → web-EMGUGGEI.js} +3 -3
- package/dist/{web-fetch-U22Q7HV4.js → web-fetch-6BRRVQON.js} +22 -5
- package/dist/{wiki-generate-LZRLFG6I.js → wiki-generate-XHSJTDOP.js} +104 -100
- package/dist/{with-panes-X5CZOGML.js → with-panes-Z6BTEHMZ.js} +11 -11
- package/dist/worker/entry.js +101 -87
- package/docs/README.md +1 -1
- package/docs/architecture/artifact-placement.md +12 -1
- package/docs/architecture/library.md +1 -1
- package/docs/architecture/prompt-envelope-and-tools.md +37 -27
- package/docs/architecture/safety-model.md +19 -6
- package/docs/architecture/session-lifecycle.md +10 -4
- package/docs/architecture/tui-design.md +37 -14
- package/docs/guide/commands-and-modes.md +39 -19
- package/docs/guide/configuration-and-targets.md +7 -5
- package/docs/guide/configuration-reference.md +116 -13
- package/docs/guide/environment-variables.md +2 -5
- package/docs/guide/fleet-dispatch.md +3 -2
- package/docs/guide/glossary.md +1 -1
- package/docs/guide/installation-and-lifecycle.md +2 -2
- package/docs/guide/resource-library.md +1 -1
- package/docs/guide/tool-usage.md +166 -64
- package/docs/guide/troubleshooting.md +1 -1
- package/docs/process/documentation-guide.md +1 -0
- package/docs/process/fleet-demo-runbook.md +6 -6
- package/docs/process/scientific-validation.md +22 -2
- package/docs/process/tool-audit-v0.4.9.md +357 -0
- package/package.json +1 -1
- package/src/cli/argv.ts +31 -0
- package/src/cli/clio.ts +17 -13
- package/src/cli/config.ts +4 -0
- package/src/cli/doctor-panes.ts +1 -1
- package/src/cli/doctor.ts +3 -1
- package/src/cli/index.ts +14 -1
- package/src/cli/mcp.ts +106 -0
- package/src/cli/skills-eval.ts +8 -2
- package/src/cli/upgrade.ts +34 -38
- package/src/cli/verifiers.ts +1 -1
- package/src/core/bash-exec.ts +27 -4
- package/src/core/config.ts +2 -1
- package/src/core/defaults.ts +10 -1
- 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 +3 -3
- package/src/core/tool-names.ts +33 -12
- 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 +131 -14
- 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/receipt-findings.ts +3 -4
- package/src/domains/dispatch/reservation-store.ts +7 -9
- package/src/domains/dispatch/route-facts.ts +1 -1
- package/src/domains/dispatch/state.ts +3 -3
- package/src/domains/dispatch/types.ts +1 -1
- package/src/domains/evidence/build.ts +35 -7
- 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/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/contract.ts +7 -3
- package/src/domains/observability/evidence-index.ts +2 -2
- package/src/domains/observability/projection.ts +10 -0
- package/src/domains/prompts/compiler.ts +41 -23
- 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/index.ts +5 -1
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
- package/src/domains/providers/probe/http.ts +44 -59
- package/src/domains/providers/probe/reasoning.ts +2 -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/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 +25 -2
- 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/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/engine/apis/openai-completions.ts +8 -0
- package/src/engine/loop-guard.ts +7 -0
- 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 +18 -2
- package/src/interactive/chat-loop-policy.ts +1 -0
- package/src/interactive/chat-loop.ts +8 -4
- 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/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/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-persistence.ts +6 -1
- package/src/interactive/turn-recovery.ts +2 -1
- package/src/interactive/turn-runtime.ts +22 -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 +72 -7
- 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 +94 -6
- 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/dist/chunk-B6UM3OZC.js +0 -15
- package/dist/chunk-GJ24ODAX.js +0 -196
- package/dist/chunk-LZCCBLRC.js +0 -57
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +0 -1
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +0 -36
- package/dist/web/client/assets/channel-CiUWbHN9.js +0 -1
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +0 -125
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +0 -1
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +0 -1
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +0 -1
- package/dist/web/client/assets/dist-D0_q-A2b.js +0 -1
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +0 -1
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +0 -1
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +0 -292
- package/dist/web/client/assets/index-FSIC94pi.js +0 -83
- package/dist/web/client/assets/prism-core-BngLtbUd.js +0 -1
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +0 -1
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +0 -1
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +0 -1
- package/dist/web/client/assets/src-yeptRXpt.js +0 -1
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +0 -1
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +0 -8
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Declared local MCP servers. Two optional YAML files name them: the user's
|
|
3
|
+
* `<config>/mcp.yaml`, trusted by authorship, and the project's
|
|
4
|
+
* `.clio-coder/mcp.yaml`, which needs an explicit trust record (see trust.ts)
|
|
5
|
+
* before anything in it is launched. The loader is strict in the same way the
|
|
6
|
+
* verifier catalog is: unknown fields, shell strings, escaping paths, and
|
|
7
|
+
* oversized files are diagnostics that contribute no server, never a guess.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { closeSync, constants as fsConstants, fstatSync, openSync, readSync, realpathSync, statSync } from "node:fs";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { parseDocument } from "yaml";
|
|
14
|
+
import { resolveSafeCwd } from "../../../core/safe-exec.js";
|
|
15
|
+
import { clioConfigDir } from "../../../core/xdg.js";
|
|
16
|
+
|
|
17
|
+
export const MCP_CONFIG_VERSION = 1;
|
|
18
|
+
export const MCP_USER_CONFIG_FILENAME = "mcp.yaml";
|
|
19
|
+
export const MCP_PROJECT_CONFIG_RELATIVE_PATH = ".clio-coder/mcp.yaml";
|
|
20
|
+
|
|
21
|
+
/** Public schema limits; diagnostics cite these values. */
|
|
22
|
+
export const MCP_CONFIG_CAPS = Object.freeze({
|
|
23
|
+
fileBytes: 256 * 1024,
|
|
24
|
+
servers: 32,
|
|
25
|
+
idChars: 32,
|
|
26
|
+
commandBytes: 512,
|
|
27
|
+
args: 64,
|
|
28
|
+
argBytes: 4096,
|
|
29
|
+
envEntries: 64,
|
|
30
|
+
envValueBytes: 4096,
|
|
31
|
+
cwdBytes: 512,
|
|
32
|
+
timeoutMs: 900_000,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const ID_PATTERN = /^[a-z0-9][a-z0-9_-]*$/;
|
|
36
|
+
const ENV_KEY_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
|
|
37
|
+
const ROOT_FIELDS = new Set(["version", "servers"]);
|
|
38
|
+
const SERVER_FIELDS = new Set(["id", "command", "args", "cwd", "env", "timeoutMs"]);
|
|
39
|
+
const SHELL_EXECUTABLES = new Set([
|
|
40
|
+
"bash",
|
|
41
|
+
"cmd",
|
|
42
|
+
"command.com",
|
|
43
|
+
"dash",
|
|
44
|
+
"fish",
|
|
45
|
+
"ksh",
|
|
46
|
+
"powershell",
|
|
47
|
+
"pwsh",
|
|
48
|
+
"sh",
|
|
49
|
+
"tcsh",
|
|
50
|
+
"zsh",
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
export type McpServerScope = "user" | "project";
|
|
54
|
+
|
|
55
|
+
export interface McpServerDeclaration {
|
|
56
|
+
id: string;
|
|
57
|
+
scope: McpServerScope;
|
|
58
|
+
/** The config file that declares the server. */
|
|
59
|
+
path: string;
|
|
60
|
+
command: string;
|
|
61
|
+
args: string[];
|
|
62
|
+
/** Absolute working directory the server starts in. */
|
|
63
|
+
cwd: string;
|
|
64
|
+
/** Containment root for `cwd`; the client refuses a cwd outside it. */
|
|
65
|
+
cwdRoot: string;
|
|
66
|
+
env: Record<string, string>;
|
|
67
|
+
timeoutMs: number | null;
|
|
68
|
+
/** sha256 of the canonical declaration; a trust record binds to it. */
|
|
69
|
+
digest: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface McpConfigDiagnostic {
|
|
73
|
+
scope: McpServerScope;
|
|
74
|
+
path: string;
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface McpConfigLoadResult {
|
|
79
|
+
servers: McpServerDeclaration[];
|
|
80
|
+
diagnostics: McpConfigDiagnostic[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface McpConfigLoadOptions {
|
|
84
|
+
cwd: string;
|
|
85
|
+
/** Override for the user config directory; defaults to clioConfigDir(). */
|
|
86
|
+
configDir?: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface DeclaredServerFields {
|
|
90
|
+
id: string;
|
|
91
|
+
command: string;
|
|
92
|
+
args: string[];
|
|
93
|
+
cwd: string | null;
|
|
94
|
+
env: Record<string, string>;
|
|
95
|
+
timeoutMs: number | null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
99
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function utf8Bytes(value: string): number {
|
|
103
|
+
return Buffer.byteLength(value, "utf8");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function unknownFields(record: Record<string, unknown>, allowed: ReadonlySet<string>): string[] {
|
|
107
|
+
return Object.keys(record)
|
|
108
|
+
.filter((key) => !allowed.has(key))
|
|
109
|
+
.sort();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** The digest a trust record binds to: every field that changes what runs, in canonical order. */
|
|
113
|
+
export function mcpServerDigest(fields: {
|
|
114
|
+
id: string;
|
|
115
|
+
command: string;
|
|
116
|
+
args: ReadonlyArray<string>;
|
|
117
|
+
cwd: string | null;
|
|
118
|
+
env: Readonly<Record<string, string>>;
|
|
119
|
+
timeoutMs: number | null;
|
|
120
|
+
}): string {
|
|
121
|
+
const canonical = JSON.stringify({
|
|
122
|
+
id: fields.id,
|
|
123
|
+
command: fields.command,
|
|
124
|
+
args: [...fields.args],
|
|
125
|
+
cwd: fields.cwd,
|
|
126
|
+
env: Object.fromEntries(
|
|
127
|
+
Object.keys(fields.env)
|
|
128
|
+
.sort()
|
|
129
|
+
.map((key) => [key, fields.env[key]]),
|
|
130
|
+
),
|
|
131
|
+
timeoutMs: fields.timeoutMs,
|
|
132
|
+
});
|
|
133
|
+
return createHash("sha256").update(canonical).digest("hex");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function mcpConfigPaths(options: McpConfigLoadOptions): { user: string; project: string } {
|
|
137
|
+
return {
|
|
138
|
+
user: path.join(options.configDir ?? clioConfigDir(), MCP_USER_CONFIG_FILENAME),
|
|
139
|
+
project: path.join(path.resolve(options.cwd), MCP_PROJECT_CONFIG_RELATIVE_PATH),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function validateId(value: unknown, location: string): string | Error {
|
|
144
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
145
|
+
if (value.length > MCP_CONFIG_CAPS.idChars) {
|
|
146
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.idChars}-character cap`);
|
|
147
|
+
}
|
|
148
|
+
if (!ID_PATTERN.test(value)) return new Error(`${location} must match /^[a-z0-9][a-z0-9_-]*$/`);
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function validateCommand(value: unknown, location: string): string | Error {
|
|
153
|
+
if (typeof value !== "string" || value.length === 0) return new Error(`${location} must be a non-empty string`);
|
|
154
|
+
if (value.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
155
|
+
if (/\s/u.test(value)) return new Error(`${location} must be one executable token, not a shell command string`);
|
|
156
|
+
if (utf8Bytes(value) > MCP_CONFIG_CAPS.commandBytes) {
|
|
157
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.commandBytes}-byte cap`);
|
|
158
|
+
}
|
|
159
|
+
const hasSeparator = value.includes("/") || value.includes("\\");
|
|
160
|
+
if (hasSeparator && !(path.isAbsolute(value) || path.win32.isAbsolute(value))) {
|
|
161
|
+
return new Error(
|
|
162
|
+
`${location} must be an executable name resolved on PATH or an absolute path; relative path '${value}' is not allowed`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
const executable = path
|
|
166
|
+
.basename(value)
|
|
167
|
+
.toLowerCase()
|
|
168
|
+
.replace(/\.exe$/u, "");
|
|
169
|
+
if (SHELL_EXECUTABLES.has(executable)) {
|
|
170
|
+
return new Error(`${location} may not invoke shell executable '${value}'`);
|
|
171
|
+
}
|
|
172
|
+
return value;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function validateArgs(value: unknown, location: string): string[] | Error {
|
|
176
|
+
if (value === undefined) return [];
|
|
177
|
+
if (!Array.isArray(value)) return new Error(`${location} must be an array of strings`);
|
|
178
|
+
if (value.length > MCP_CONFIG_CAPS.args) return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.args}-entry cap`);
|
|
179
|
+
const args: string[] = [];
|
|
180
|
+
for (const [index, entry] of value.entries()) {
|
|
181
|
+
const entryLocation = `${location}[${index}]`;
|
|
182
|
+
if (typeof entry !== "string") return new Error(`${entryLocation} must be a string`);
|
|
183
|
+
if (entry.includes("\0")) return new Error(`${entryLocation} must not contain a NUL byte`);
|
|
184
|
+
if (utf8Bytes(entry) > MCP_CONFIG_CAPS.argBytes) {
|
|
185
|
+
return new Error(`${entryLocation} exceeds the ${MCP_CONFIG_CAPS.argBytes}-byte cap`);
|
|
186
|
+
}
|
|
187
|
+
args.push(entry);
|
|
188
|
+
}
|
|
189
|
+
return args;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function validateEnv(value: unknown, location: string): Record<string, string> | Error {
|
|
193
|
+
if (value === undefined) return {};
|
|
194
|
+
if (!isRecord(value)) return new Error(`${location} must be an object of string values`);
|
|
195
|
+
const keys = Object.keys(value);
|
|
196
|
+
if (keys.length > MCP_CONFIG_CAPS.envEntries) {
|
|
197
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.envEntries}-entry cap`);
|
|
198
|
+
}
|
|
199
|
+
const env: Record<string, string> = {};
|
|
200
|
+
for (const key of keys.sort()) {
|
|
201
|
+
if (!ENV_KEY_PATTERN.test(key)) return new Error(`${location}.${key} is not a valid environment variable name`);
|
|
202
|
+
const entry = value[key];
|
|
203
|
+
if (typeof entry !== "string") return new Error(`${location}.${key} must be a string`);
|
|
204
|
+
if (entry.includes("\0")) return new Error(`${location}.${key} must not contain a NUL byte`);
|
|
205
|
+
if (utf8Bytes(entry) > MCP_CONFIG_CAPS.envValueBytes) {
|
|
206
|
+
return new Error(`${location}.${key} exceeds the ${MCP_CONFIG_CAPS.envValueBytes}-byte cap`);
|
|
207
|
+
}
|
|
208
|
+
env[key] = entry;
|
|
209
|
+
}
|
|
210
|
+
return env;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
function validateTimeout(value: unknown, location: string): number | null | Error {
|
|
214
|
+
if (value === undefined) return null;
|
|
215
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value <= 0) {
|
|
216
|
+
return new Error(`${location} must be a positive integer number of milliseconds`);
|
|
217
|
+
}
|
|
218
|
+
if (value > MCP_CONFIG_CAPS.timeoutMs) return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.timeoutMs}ms cap`);
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
interface ResolvedCwd {
|
|
223
|
+
cwd: string;
|
|
224
|
+
cwdRoot: string;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function realDirectory(candidate: string, location: string): string | Error {
|
|
228
|
+
try {
|
|
229
|
+
if (!statSync(candidate).isDirectory()) return new Error(`${location} is not a directory: '${candidate}'`);
|
|
230
|
+
return realpathSync(candidate);
|
|
231
|
+
} catch (error) {
|
|
232
|
+
return new Error(
|
|
233
|
+
`${location} cannot be resolved as a directory: '${candidate}' (${error instanceof Error ? error.message : String(error)})`,
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* A project server's cwd is repository-relative and must stay inside the
|
|
240
|
+
* repository, symlinks included. A user server's cwd is absolute or relative
|
|
241
|
+
* to the config directory; an absolute directory is its own containment root.
|
|
242
|
+
*/
|
|
243
|
+
function resolveCwd(raw: string | null, scope: McpServerScope, root: string, location: string): ResolvedCwd | Error {
|
|
244
|
+
if (raw !== null) {
|
|
245
|
+
if (raw.length === 0) return new Error(`${location} must be a non-empty path when given`);
|
|
246
|
+
if (raw.includes("\0")) return new Error(`${location} must not contain a NUL byte`);
|
|
247
|
+
if (utf8Bytes(raw) > MCP_CONFIG_CAPS.cwdBytes) {
|
|
248
|
+
return new Error(`${location} exceeds the ${MCP_CONFIG_CAPS.cwdBytes}-byte cap`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const absolute = raw !== null && (path.isAbsolute(raw) || path.win32.isAbsolute(raw));
|
|
252
|
+
if (scope === "project" && absolute) {
|
|
253
|
+
return new Error(`${location} must be repository-relative; absolute cwd '${raw}' is not allowed`);
|
|
254
|
+
}
|
|
255
|
+
const realRoot = realDirectory(root, `${location} root`);
|
|
256
|
+
if (realRoot instanceof Error) return realRoot;
|
|
257
|
+
if (scope === "user" && absolute && raw !== null) {
|
|
258
|
+
const real = realDirectory(raw, location);
|
|
259
|
+
if (real instanceof Error) return real;
|
|
260
|
+
return { cwd: real, cwdRoot: real };
|
|
261
|
+
}
|
|
262
|
+
let resolved: string;
|
|
263
|
+
try {
|
|
264
|
+
resolved = resolveSafeCwd(raw ?? undefined, realRoot);
|
|
265
|
+
} catch {
|
|
266
|
+
return new Error(`${location} escapes its root: '${raw}'`);
|
|
267
|
+
}
|
|
268
|
+
const real = realDirectory(resolved, location);
|
|
269
|
+
if (real instanceof Error) return real;
|
|
270
|
+
try {
|
|
271
|
+
resolveSafeCwd(real, realRoot);
|
|
272
|
+
} catch {
|
|
273
|
+
return new Error(`${location} escapes its root through a symbolic link: '${raw}'`);
|
|
274
|
+
}
|
|
275
|
+
return { cwd: real, cwdRoot: realRoot };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function validateServer(
|
|
279
|
+
value: unknown,
|
|
280
|
+
location: string,
|
|
281
|
+
): { fields: DeclaredServerFields; declaredCwd: string | null } | Error {
|
|
282
|
+
if (!isRecord(value)) return new Error(`${location} must be an object`);
|
|
283
|
+
const unknown = unknownFields(value, SERVER_FIELDS);
|
|
284
|
+
if (unknown.length > 0) return new Error(`${location} has unknown field(s): ${unknown.join(", ")}`);
|
|
285
|
+
for (const field of ["id", "command"]) {
|
|
286
|
+
if (!Object.hasOwn(value, field)) return new Error(`${location}.${field} is required`);
|
|
287
|
+
}
|
|
288
|
+
const id = validateId(value.id, `${location}.id`);
|
|
289
|
+
if (id instanceof Error) return id;
|
|
290
|
+
const command = validateCommand(value.command, `${location}.command`);
|
|
291
|
+
if (command instanceof Error) return command;
|
|
292
|
+
const args = validateArgs(value.args, `${location}.args`);
|
|
293
|
+
if (args instanceof Error) return args;
|
|
294
|
+
const env = validateEnv(value.env, `${location}.env`);
|
|
295
|
+
if (env instanceof Error) return env;
|
|
296
|
+
const timeoutMs = validateTimeout(value.timeoutMs, `${location}.timeoutMs`);
|
|
297
|
+
if (timeoutMs instanceof Error) return timeoutMs;
|
|
298
|
+
let declaredCwd: string | null = null;
|
|
299
|
+
if (value.cwd !== undefined) {
|
|
300
|
+
if (typeof value.cwd !== "string") return new Error(`${location}.cwd must be a string`);
|
|
301
|
+
declaredCwd = value.cwd;
|
|
302
|
+
}
|
|
303
|
+
return { fields: { id, command, args, cwd: declaredCwd, env, timeoutMs }, declaredCwd };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
export interface McpConfigTextInput {
|
|
307
|
+
scope: McpServerScope;
|
|
308
|
+
/** The config file path, for diagnostics and declarations. */
|
|
309
|
+
path: string;
|
|
310
|
+
/** Root that relative cwd values resolve against: the project root or the config directory. */
|
|
311
|
+
root: string;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/** Parse one config file's text through the strict schema. Exported for tests and the CLI. */
|
|
315
|
+
export function parseMcpConfigText(text: string, input: McpConfigTextInput): McpConfigLoadResult {
|
|
316
|
+
const diagnostic = (message: string): McpConfigLoadResult => ({
|
|
317
|
+
servers: [],
|
|
318
|
+
diagnostics: [{ scope: input.scope, path: input.path, message }],
|
|
319
|
+
});
|
|
320
|
+
if (utf8Bytes(text) > MCP_CONFIG_CAPS.fileBytes) {
|
|
321
|
+
return diagnostic(`file exceeds the ${MCP_CONFIG_CAPS.fileBytes}-byte cap`);
|
|
322
|
+
}
|
|
323
|
+
const document = parseDocument(text, { prettyErrors: false, strict: true, uniqueKeys: true });
|
|
324
|
+
if (document.errors.length > 0) {
|
|
325
|
+
return diagnostic(`invalid YAML: ${document.errors.map((error) => error.message).join("; ")}`);
|
|
326
|
+
}
|
|
327
|
+
let parsed: unknown;
|
|
328
|
+
try {
|
|
329
|
+
parsed = document.toJS({ maxAliasCount: 0 }) as unknown;
|
|
330
|
+
} catch (error) {
|
|
331
|
+
return diagnostic(`invalid YAML: ${error instanceof Error ? error.message : String(error)}`);
|
|
332
|
+
}
|
|
333
|
+
if (!isRecord(parsed)) return diagnostic("root must be an object with version and servers fields");
|
|
334
|
+
const rootUnknown = unknownFields(parsed, ROOT_FIELDS);
|
|
335
|
+
if (rootUnknown.length > 0) return diagnostic(`root has unknown field(s): ${rootUnknown.join(", ")}`);
|
|
336
|
+
if (!Object.hasOwn(parsed, "version")) return diagnostic("root.version is required");
|
|
337
|
+
if (parsed.version !== MCP_CONFIG_VERSION) {
|
|
338
|
+
return diagnostic(
|
|
339
|
+
`unsupported version ${JSON.stringify(parsed.version)}; supported version is ${MCP_CONFIG_VERSION}`,
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
if (!Object.hasOwn(parsed, "servers")) return diagnostic("root.servers is required");
|
|
343
|
+
if (!Array.isArray(parsed.servers)) return diagnostic("root.servers must be an array");
|
|
344
|
+
if (parsed.servers.length > MCP_CONFIG_CAPS.servers) {
|
|
345
|
+
return diagnostic(`root.servers exceeds the ${MCP_CONFIG_CAPS.servers}-server cap`);
|
|
346
|
+
}
|
|
347
|
+
const servers: McpServerDeclaration[] = [];
|
|
348
|
+
const ids = new Map<string, number>();
|
|
349
|
+
for (const [index, value] of parsed.servers.entries()) {
|
|
350
|
+
const location = `servers[${index}]`;
|
|
351
|
+
const validated = validateServer(value, location);
|
|
352
|
+
if (validated instanceof Error) return diagnostic(validated.message);
|
|
353
|
+
const { fields, declaredCwd } = validated;
|
|
354
|
+
const duplicateIndex = ids.get(fields.id);
|
|
355
|
+
if (duplicateIndex !== undefined) {
|
|
356
|
+
return diagnostic(`${location}.id duplicates '${fields.id}' from servers[${duplicateIndex}].id`);
|
|
357
|
+
}
|
|
358
|
+
const resolved = resolveCwd(declaredCwd, input.scope, input.root, `${location}.cwd`);
|
|
359
|
+
if (resolved instanceof Error) return diagnostic(resolved.message);
|
|
360
|
+
ids.set(fields.id, index);
|
|
361
|
+
servers.push({
|
|
362
|
+
id: fields.id,
|
|
363
|
+
scope: input.scope,
|
|
364
|
+
path: input.path,
|
|
365
|
+
command: fields.command,
|
|
366
|
+
args: fields.args,
|
|
367
|
+
cwd: resolved.cwd,
|
|
368
|
+
cwdRoot: resolved.cwdRoot,
|
|
369
|
+
env: fields.env,
|
|
370
|
+
timeoutMs: fields.timeoutMs,
|
|
371
|
+
digest: mcpServerDigest(fields),
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return { servers, diagnostics: [] };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
type BoundedFileRead =
|
|
378
|
+
| { ok: true; text: string }
|
|
379
|
+
| { ok: false; reason: "missing" | "oversized" | "unreadable"; message: string };
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Read a regular file of at most `maxBytes` as UTF-8. The read stops one byte
|
|
383
|
+
* past the cap, so a file that is (or grows) larger than the cap never lands
|
|
384
|
+
* in memory whole; a FIFO or directory at the path is refused without
|
|
385
|
+
* blocking on it. Shared by the config and trust loaders.
|
|
386
|
+
*/
|
|
387
|
+
export function readBoundedFileText(filePath: string, maxBytes: number): BoundedFileRead {
|
|
388
|
+
const describe = (error: unknown): string => (error instanceof Error ? error.message : String(error));
|
|
389
|
+
let fd: number;
|
|
390
|
+
try {
|
|
391
|
+
fd = openSync(filePath, fsConstants.O_RDONLY | (fsConstants.O_NONBLOCK ?? 0));
|
|
392
|
+
} catch (error) {
|
|
393
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") {
|
|
394
|
+
return { ok: false, reason: "missing", message: "file does not exist" };
|
|
395
|
+
}
|
|
396
|
+
return { ok: false, reason: "unreadable", message: `cannot read (${describe(error)})` };
|
|
397
|
+
}
|
|
398
|
+
try {
|
|
399
|
+
const stats = fstatSync(fd);
|
|
400
|
+
if (!stats.isFile()) return { ok: false, reason: "unreadable", message: "path must be a regular file" };
|
|
401
|
+
let buffer = Buffer.allocUnsafe(Math.min(Math.max(stats.size, 0), maxBytes) + 1);
|
|
402
|
+
let total = 0;
|
|
403
|
+
for (;;) {
|
|
404
|
+
if (total === buffer.length) {
|
|
405
|
+
if (total > maxBytes) break;
|
|
406
|
+
// The file grew past its stat size; one growth to the cap settles whether it fits.
|
|
407
|
+
buffer = Buffer.concat([buffer], maxBytes + 1);
|
|
408
|
+
}
|
|
409
|
+
const read = readSync(fd, buffer, total, buffer.length - total, null);
|
|
410
|
+
if (read === 0) break;
|
|
411
|
+
total += read;
|
|
412
|
+
}
|
|
413
|
+
if (total > maxBytes) return { ok: false, reason: "oversized", message: `file exceeds the ${maxBytes}-byte cap` };
|
|
414
|
+
return { ok: true, text: buffer.toString("utf8", 0, total) };
|
|
415
|
+
} catch (error) {
|
|
416
|
+
return { ok: false, reason: "unreadable", message: `cannot read (${describe(error)})` };
|
|
417
|
+
} finally {
|
|
418
|
+
closeSync(fd);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function loadFile(filePath: string, scope: McpServerScope, root: string): McpConfigLoadResult {
|
|
423
|
+
const read = readBoundedFileText(filePath, MCP_CONFIG_CAPS.fileBytes);
|
|
424
|
+
if (!read.ok) {
|
|
425
|
+
if (read.reason === "missing") return { servers: [], diagnostics: [] };
|
|
426
|
+
return { servers: [], diagnostics: [{ scope, path: filePath, message: read.message }] };
|
|
427
|
+
}
|
|
428
|
+
return parseMcpConfigText(read.text, { scope, path: filePath, root });
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* Load both scopes. A user declaration wins an id collision; the project
|
|
433
|
+
* declaration is dropped with a diagnostic so nobody wonders why the project's
|
|
434
|
+
* command never runs. A malformed file contributes nothing (fail closed).
|
|
435
|
+
*/
|
|
436
|
+
export function loadMcpServerConfig(options: McpConfigLoadOptions): McpConfigLoadResult {
|
|
437
|
+
const paths = mcpConfigPaths(options);
|
|
438
|
+
const configDir = options.configDir ?? clioConfigDir();
|
|
439
|
+
const user = loadFile(paths.user, "user", configDir);
|
|
440
|
+
const project = loadFile(paths.project, "project", path.resolve(options.cwd));
|
|
441
|
+
const servers = [...user.servers];
|
|
442
|
+
const diagnostics = [...user.diagnostics, ...project.diagnostics];
|
|
443
|
+
const userIds = new Set(user.servers.map((server) => server.id));
|
|
444
|
+
for (const server of project.servers) {
|
|
445
|
+
if (userIds.has(server.id)) {
|
|
446
|
+
diagnostics.push({
|
|
447
|
+
scope: "project",
|
|
448
|
+
path: server.path,
|
|
449
|
+
message: `server '${server.id}' is shadowed by the user declaration in ${paths.user}`,
|
|
450
|
+
});
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
servers.push(server);
|
|
454
|
+
}
|
|
455
|
+
return { servers, diagnostics };
|
|
456
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public surface of the local stdio MCP module: protocol framing, the
|
|
3
|
+
* one-process client, strict configuration loading, and explicit trust.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
createMcpStdioClient,
|
|
8
|
+
DEFAULT_INITIALIZE_TIMEOUT_MS,
|
|
9
|
+
DEFAULT_KILL_GRACE_MS,
|
|
10
|
+
DEFAULT_MAX_OUTBOUND_BYTES,
|
|
11
|
+
DEFAULT_MCP_CLIENT_VERSION,
|
|
12
|
+
DEFAULT_REQUEST_TIMEOUT_MS,
|
|
13
|
+
DEFAULT_RESULT_TEXT_BYTES,
|
|
14
|
+
DEFAULT_STDERR_TAIL_BYTES,
|
|
15
|
+
DEFAULT_TEARDOWN_BOUND_MS,
|
|
16
|
+
MCP_CLIENT_NAME,
|
|
17
|
+
MCP_TOOL_LIST_CAP,
|
|
18
|
+
type McpCallToolOptions,
|
|
19
|
+
type McpClient,
|
|
20
|
+
type McpClientOptions,
|
|
21
|
+
type McpClientState,
|
|
22
|
+
type McpClientStatus,
|
|
23
|
+
type McpContentBlock,
|
|
24
|
+
type McpServerInfo,
|
|
25
|
+
type McpServerSpec,
|
|
26
|
+
type McpTeardownOutcome,
|
|
27
|
+
type McpToolCallResult,
|
|
28
|
+
type McpToolDescriptor,
|
|
29
|
+
type McpToolListing,
|
|
30
|
+
renderMcpContent,
|
|
31
|
+
} from "./client.js";
|
|
32
|
+
export {
|
|
33
|
+
loadMcpServerConfig,
|
|
34
|
+
MCP_CONFIG_CAPS,
|
|
35
|
+
MCP_CONFIG_VERSION,
|
|
36
|
+
MCP_PROJECT_CONFIG_RELATIVE_PATH,
|
|
37
|
+
MCP_USER_CONFIG_FILENAME,
|
|
38
|
+
type McpConfigDiagnostic,
|
|
39
|
+
type McpConfigLoadOptions,
|
|
40
|
+
type McpConfigLoadResult,
|
|
41
|
+
type McpConfigTextInput,
|
|
42
|
+
type McpServerDeclaration,
|
|
43
|
+
type McpServerScope,
|
|
44
|
+
mcpConfigPaths,
|
|
45
|
+
mcpServerDigest,
|
|
46
|
+
parseMcpConfigText,
|
|
47
|
+
} from "./config.js";
|
|
48
|
+
export {
|
|
49
|
+
classifyJsonRpcMessage,
|
|
50
|
+
createLineFramer,
|
|
51
|
+
DEFAULT_MAX_LINE_BYTES,
|
|
52
|
+
encodeJsonRpcMessage,
|
|
53
|
+
JSON_RPC_METHOD_NOT_FOUND,
|
|
54
|
+
type JsonRpcErrorObject,
|
|
55
|
+
type JsonRpcId,
|
|
56
|
+
type JsonRpcMessage,
|
|
57
|
+
type JsonRpcNotification,
|
|
58
|
+
type JsonRpcRequest,
|
|
59
|
+
type JsonRpcResponse,
|
|
60
|
+
type LineFramer,
|
|
61
|
+
MCP_PROTOCOL_VERSION,
|
|
62
|
+
McpError,
|
|
63
|
+
type McpErrorCode,
|
|
64
|
+
type ProtocolFrame,
|
|
65
|
+
parseJsonRpcLine,
|
|
66
|
+
} from "./protocol.js";
|
|
67
|
+
export {
|
|
68
|
+
MCP_TRUST_ACTION_CLASSES,
|
|
69
|
+
MCP_TRUST_CAPS,
|
|
70
|
+
MCP_TRUST_FILENAME,
|
|
71
|
+
MCP_TRUST_VERSION,
|
|
72
|
+
type McpTrustActionClass,
|
|
73
|
+
type McpTrustOptions,
|
|
74
|
+
type McpTrustReadResult,
|
|
75
|
+
type McpTrustRecord,
|
|
76
|
+
type McpTrustState,
|
|
77
|
+
type McpTrustStatus,
|
|
78
|
+
mcpTrustPath,
|
|
79
|
+
type ResolvedMcpServer,
|
|
80
|
+
type ResolvedMcpServers,
|
|
81
|
+
readMcpTrustState,
|
|
82
|
+
resolveMcpServers,
|
|
83
|
+
type TrustMcpServerOptions,
|
|
84
|
+
type TrustMcpServerResult,
|
|
85
|
+
trustMcpServer,
|
|
86
|
+
type UntrustMcpServerResult,
|
|
87
|
+
untrustMcpServer,
|
|
88
|
+
} from "./trust.js";
|