@ken-jo/agent-connector 0.4.95 → 0.4.97
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/LICENSE +202 -202
- package/NOTICE +6 -6
- package/README.md +605 -599
- package/dist/{action-Q7GGO4PA.js → action-IPFDPOZU.js} +16 -16
- package/dist/action-IPFDPOZU.js.map +1 -0
- package/dist/{amazon-q-ETMAGY3D.js → amazon-q-IT44LEWV.js} +6 -6
- package/dist/amazon-q-IT44LEWV.js.map +1 -0
- package/dist/{amp-BQZOL5GR.js → amp-CEWOSWQO.js} +4 -4
- package/dist/amp-CEWOSWQO.js.map +1 -0
- package/dist/{amp-67BZONGF.js → amp-P35FRU2Z.js} +7 -7
- package/dist/amp-P35FRU2Z.js.map +1 -0
- package/dist/{antigravity-EA4L225L.js → antigravity-LHFEFNMC.js} +5 -5
- package/dist/antigravity-LHFEFNMC.js.map +1 -0
- package/dist/antigravity-TWIWXTQH.js +18 -0
- package/dist/{antigravity-cli-B2HXZFYQ.js → antigravity-cli-MOKFSWOU.js} +5 -5
- package/dist/antigravity-cli-MOKFSWOU.js.map +1 -0
- package/dist/{antigravity-cli-OM6SC3PE.js → antigravity-cli-MPE27LPI.js} +9 -9
- package/dist/antigravity-cli-MPE27LPI.js.map +1 -0
- package/dist/audit-3E5JAOP2.js +311 -0
- package/dist/audit-3E5JAOP2.js.map +1 -0
- package/dist/{chunk-PW42ZXCB.js → chunk-3EP5V2F4.js} +3 -3
- package/dist/chunk-3EP5V2F4.js.map +1 -0
- package/dist/{chunk-MGTDQLJJ.js → chunk-3FINQ2ZF.js} +4 -4
- package/dist/chunk-3FINQ2ZF.js.map +1 -0
- package/dist/{chunk-KHO5WNTP.js → chunk-4GH2KA7V.js} +1 -1
- package/dist/chunk-4GH2KA7V.js.map +1 -0
- package/dist/{chunk-2Y2MZRLP.js → chunk-7C2IPIIB.js} +3 -3
- package/dist/chunk-7C2IPIIB.js.map +1 -0
- package/dist/{chunk-NLE2J5P4.js → chunk-7HHW23AC.js} +29 -29
- package/dist/chunk-7HHW23AC.js.map +1 -0
- package/dist/{chunk-XD7MY6HB.js → chunk-7PSNXUFK.js} +1 -1
- package/dist/chunk-7PSNXUFK.js.map +1 -0
- package/dist/{chunk-5IOTP7LQ.js → chunk-7ZFK2WEO.js} +7 -5
- package/dist/chunk-7ZFK2WEO.js.map +1 -0
- package/dist/{chunk-XC5SJ35F.js → chunk-C63AAXK7.js} +5 -5
- package/dist/chunk-C63AAXK7.js.map +1 -0
- package/dist/{chunk-UM5S7DKK.js → chunk-C747DYNT.js} +1 -1
- package/dist/chunk-C747DYNT.js.map +1 -0
- package/dist/{chunk-YPAXJ7EW.js → chunk-FHYR5Q5T.js} +13 -13
- package/dist/chunk-FHYR5Q5T.js.map +1 -0
- package/dist/{chunk-I5UXHIDT.js → chunk-GCPEPUD7.js} +8 -8
- package/dist/chunk-GCPEPUD7.js.map +1 -0
- package/dist/{chunk-ISEJWBFF.js → chunk-GZZCHJDP.js} +2 -2
- package/dist/chunk-GZZCHJDP.js.map +1 -0
- package/dist/{chunk-UMQ6NBQR.js → chunk-ILWHLGIC.js} +2 -2
- package/dist/chunk-ILWHLGIC.js.map +1 -0
- package/dist/{chunk-IVAWP6HH.js → chunk-IOJDZJ72.js} +2 -2
- package/dist/chunk-IOJDZJ72.js.map +1 -0
- package/dist/{chunk-NBYKLUF6.js → chunk-KFPSJRHR.js} +2 -2
- package/dist/chunk-KFPSJRHR.js.map +1 -0
- package/dist/{chunk-O7SDRBVB.js → chunk-KM2YXO6V.js} +1 -1
- package/dist/chunk-KM2YXO6V.js.map +1 -0
- package/dist/{chunk-7F5KHLEP.js → chunk-L2C5UMKW.js} +4 -4
- package/dist/chunk-L2C5UMKW.js.map +1 -0
- package/dist/{chunk-OP4KBXUO.js → chunk-LFWYYWLV.js} +1 -1
- package/dist/chunk-LFWYYWLV.js.map +1 -0
- package/dist/{chunk-APZDTY76.js → chunk-LQ55E7QI.js} +7 -7
- package/dist/chunk-LQ55E7QI.js.map +1 -0
- package/dist/{chunk-PAPMUAR5.js → chunk-MLU7NDAZ.js} +12 -12
- package/dist/chunk-MLU7NDAZ.js.map +1 -0
- package/dist/{chunk-H33M77DD.js → chunk-N4ENLZEU.js} +22 -19
- package/dist/chunk-N4ENLZEU.js.map +1 -0
- package/dist/{chunk-D4ELPBB5.js → chunk-NDMNMAKP.js} +43 -43
- package/dist/chunk-NDMNMAKP.js.map +1 -0
- package/dist/{chunk-H53QZQJI.js → chunk-PSGTHJQU.js} +1 -1
- package/dist/chunk-PSGTHJQU.js.map +1 -0
- package/dist/{chunk-FBJQGRET.js → chunk-Q4ISQHUQ.js} +1 -1
- package/dist/chunk-Q4ISQHUQ.js.map +1 -0
- package/dist/{chunk-6TF7MHG5.js → chunk-Q7PR2WGT.js} +2 -2
- package/dist/chunk-Q7PR2WGT.js.map +1 -0
- package/dist/{chunk-GZGLCCEE.js → chunk-QYOUQCC6.js} +1 -1
- package/dist/chunk-QYOUQCC6.js.map +1 -0
- package/dist/{chunk-Z2MRSS2I.js → chunk-SLJI5BOM.js} +2 -2
- package/dist/chunk-SLJI5BOM.js.map +1 -0
- package/dist/{chunk-JKKU2WKG.js → chunk-TGZFDXNH.js} +4 -4
- package/dist/chunk-TGZFDXNH.js.map +1 -0
- package/dist/{chunk-FJCUKXGX.js → chunk-THI4PI4H.js} +2 -2
- package/dist/chunk-THI4PI4H.js.map +1 -0
- package/dist/{chunk-MQPNU2CY.js → chunk-UZZTWWGG.js} +1 -1
- package/dist/chunk-UZZTWWGG.js.map +1 -0
- package/dist/{chunk-3NH2ARIS.js → chunk-WPTNMYYM.js} +2 -2
- package/dist/chunk-WPTNMYYM.js.map +1 -0
- package/dist/{chunk-OPXAP3AC.js → chunk-XN7S44U4.js} +1 -1
- package/dist/chunk-XN7S44U4.js.map +1 -0
- package/dist/{chunk-6WZODR3Z.js → chunk-XVEJAFKW.js} +5 -5
- package/dist/chunk-XVEJAFKW.js.map +1 -0
- package/dist/{chunk-BEFVJ2OE.js → chunk-XXLCMSD3.js} +1 -1
- package/dist/chunk-XXLCMSD3.js.map +1 -0
- package/dist/{chunk-YT43MUSJ.js → chunk-XZWMJLIT.js} +1 -1
- package/dist/chunk-XZWMJLIT.js.map +1 -0
- package/dist/{chunk-4NHXLXSD.js → chunk-Y3K6KJMS.js} +2 -2
- package/dist/chunk-Y3K6KJMS.js.map +1 -0
- package/dist/{chunk-RK6VBLXP.js → chunk-ZSOS2KOR.js} +1 -1
- package/dist/chunk-ZSOS2KOR.js.map +1 -0
- package/dist/{claude-code-NMRKTAP7.js → claude-code-FS42PXZO.js} +4 -4
- package/dist/claude-code-FS42PXZO.js.map +1 -0
- package/dist/{claude-code-GRWO6XBZ.js → claude-code-QBWDT5RT.js} +11 -11
- package/dist/claude-code-QBWDT5RT.js.map +1 -0
- package/dist/cli/sdk.js +9 -8
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{cline-25KW25IN.js → cline-JKEAYWVR.js} +6 -6
- package/dist/cline-JKEAYWVR.js.map +1 -0
- package/dist/{codebuddy-ZNYQACMF.js → codebuddy-EB6EYPC3.js} +7 -7
- package/dist/codebuddy-EB6EYPC3.js.map +1 -0
- package/dist/{codebuff-VR6JUDIY.js → codebuff-5RSXFU6G.js} +6 -6
- package/dist/codebuff-5RSXFU6G.js.map +1 -0
- package/dist/{codebuff-ETYT5UBL.js → codebuff-6KWBW6CT.js} +4 -4
- package/dist/codebuff-6KWBW6CT.js.map +1 -0
- package/dist/{codex-CPNKTXG3.js → codex-ART46CDD.js} +9 -9
- package/dist/codex-ART46CDD.js.map +1 -0
- package/dist/{codex-YAORPCOD.js → codex-DKBAAUCO.js} +4 -4
- package/dist/codex-DKBAAUCO.js.map +1 -0
- package/dist/{continue-WU2IB5KS.js → continue-JHZCMSPH.js} +8 -8
- package/dist/continue-JHZCMSPH.js.map +1 -0
- package/dist/{copilot-cli-MZTAWMPW.js → copilot-cli-CLBJACQ5.js} +4 -4
- package/dist/copilot-cli-CLBJACQ5.js.map +1 -0
- package/dist/{copilot-cli-PAP377OM.js → copilot-cli-QVAU5CFM.js} +7 -7
- package/dist/copilot-cli-QVAU5CFM.js.map +1 -0
- package/dist/{crush-3AVQA4YU.js → crush-7TORBYUL.js} +7 -7
- package/dist/crush-7TORBYUL.js.map +1 -0
- package/dist/{crush-QBXLNN7T.js → crush-A5C5USRL.js} +4 -4
- package/dist/crush-A5C5USRL.js.map +1 -0
- package/dist/{cursor-DIW43TRZ.js → cursor-D5SWDVSW.js} +3 -3
- package/dist/cursor-D5SWDVSW.js.map +1 -0
- package/dist/cursor-W7I4QUFO.js +22 -0
- package/dist/{detect-6V4LC3MA.js → detect-JHSA3G3U.js} +4 -4
- package/dist/detect-JHSA3G3U.js.map +1 -0
- package/dist/{devin-QMEM3OFA.js → devin-SSR7S4WX.js} +7 -7
- package/dist/devin-SSR7S4WX.js.map +1 -0
- package/dist/{doctor-2YDUVSAU.js → doctor-CQJ7TZPA.js} +26 -26
- package/dist/doctor-CQJ7TZPA.js.map +1 -0
- package/dist/{droid-MOKV53J4.js → droid-45PJ7JGF.js} +7 -7
- package/dist/droid-45PJ7JGF.js.map +1 -0
- package/dist/{droid-U3ZBLQFO.js → droid-PFQ2PZSF.js} +4 -4
- package/dist/droid-PFQ2PZSF.js.map +1 -0
- package/dist/{gemini-cli-47ZHCOZR.js → gemini-cli-24PFDK7D.js} +8 -8
- package/dist/gemini-cli-24PFDK7D.js.map +1 -0
- package/dist/{gemini-cli-NMVVBO3K.js → gemini-cli-Y6RJMU24.js} +4 -4
- package/dist/gemini-cli-Y6RJMU24.js.map +1 -0
- package/dist/{goose-64V46Y2W.js → goose-K2HKUTBK.js} +4 -4
- package/dist/goose-K2HKUTBK.js.map +1 -0
- package/dist/{goose-4EI5MYTI.js → goose-U5D3LCPC.js} +9 -9
- package/dist/goose-U5D3LCPC.js.map +1 -0
- package/dist/{grok-cli-QYQPDSVB.js → grok-cli-L2MHAPBY.js} +7 -7
- package/dist/grok-cli-L2MHAPBY.js.map +1 -0
- package/dist/{hermes-F75OSK3Y.js → hermes-2S5JUTTJ.js} +7 -7
- package/dist/hermes-2S5JUTTJ.js.map +1 -0
- package/dist/{hermes-F3EGTK6N.js → hermes-MF3NX4ZY.js} +4 -4
- package/dist/hermes-MF3NX4ZY.js.map +1 -0
- package/dist/{hook-OEVRDMXD.js → hook-VHICXHXL.js} +16 -16
- package/dist/hook-VHICXHXL.js.map +1 -0
- package/dist/index.js +5 -5
- package/dist/{install-5NMCUDG5.js → install-WLENR4KF.js} +192 -28
- package/dist/install-WLENR4KF.js.map +1 -0
- package/dist/{jetbrains-copilot-ZGIWI6YV.js → jetbrains-copilot-Z4FC3RM3.js} +6 -6
- package/dist/jetbrains-copilot-Z4FC3RM3.js.map +1 -0
- package/dist/{junie-DIFN2P22.js → junie-ULGJJIHB.js} +6 -6
- package/dist/junie-ULGJJIHB.js.map +1 -0
- package/dist/{kilo-SW7BH6EG.js → kilo-SMHPOHJ5.js} +4 -4
- package/dist/kilo-SMHPOHJ5.js.map +1 -0
- package/dist/{kilo-EMZJBEBB.js → kilo-WWIJOVWD.js} +8 -8
- package/dist/kilo-WWIJOVWD.js.map +1 -0
- package/dist/{kilo-cli-S3GXBPAE.js → kilo-cli-QKE2EQLS.js} +8 -8
- package/dist/kilo-cli-QKE2EQLS.js.map +1 -0
- package/dist/{kilo-cli-ZF272ZHN.js → kilo-cli-T2SRRRJS.js} +5 -5
- package/dist/kilo-cli-T2SRRRJS.js.map +1 -0
- package/dist/{kimi-IQJOIY6B.js → kimi-JMUFTVSF.js} +7 -7
- package/dist/kimi-JMUFTVSF.js.map +1 -0
- package/dist/{kimi-5FHEXGZD.js → kimi-MSIDEMCI.js} +4 -4
- package/dist/kimi-MSIDEMCI.js.map +1 -0
- package/dist/{kiro-WGOI5CGT.js → kiro-NYRRBIKW.js} +4 -4
- package/dist/kiro-NYRRBIKW.js.map +1 -0
- package/dist/{kiro-BYX4HEAJ.js → kiro-UWUCRKR3.js} +7 -7
- package/dist/kiro-UWUCRKR3.js.map +1 -0
- package/dist/{leaderboard-XEKS7B3H.js → leaderboard-NJWKGMXP.js} +7 -7
- package/dist/leaderboard-NJWKGMXP.js.map +1 -0
- package/dist/{mimo-code-7R53QDHB.js → mimo-code-BPNYYIVM.js} +7 -7
- package/dist/mimo-code-BPNYYIVM.js.map +1 -0
- package/dist/{mistral-vibe-LHJ55FSB.js → mistral-vibe-LT3DAJ3L.js} +6 -6
- package/dist/mistral-vibe-LT3DAJ3L.js.map +1 -0
- package/dist/{mux-XM6AP35L.js → mux-7PIJ7HUQ.js} +4 -4
- package/dist/mux-7PIJ7HUQ.js.map +1 -0
- package/dist/{mux-NYCNGL43.js → mux-AHNUAY5Z.js} +6 -6
- package/dist/mux-AHNUAY5Z.js.map +1 -0
- package/dist/{nemoclaw-WSIPSE7U.js → nemoclaw-RE5RZASZ.js} +7 -7
- package/dist/nemoclaw-RE5RZASZ.js.map +1 -0
- package/dist/{omp-562NK5BJ.js → omp-D2EXEPH7.js} +7 -7
- package/dist/omp-D2EXEPH7.js.map +1 -0
- package/dist/{open-interpreter-I2CNOEXY.js → open-interpreter-SSGBEUKX.js} +6 -6
- package/dist/open-interpreter-SSGBEUKX.js.map +1 -0
- package/dist/openclaw-IJ33K45M.js +17 -0
- package/dist/{openclaw-5EQFGOWL.js → openclaw-KAFTNLR2.js} +4 -4
- package/dist/openclaw-KAFTNLR2.js.map +1 -0
- package/dist/{opencode-YS4WX2E2.js → opencode-YKUKZY3J.js} +7 -7
- package/dist/opencode-YKUKZY3J.js.map +1 -0
- package/dist/{opencode-QGP4ALQY.js → opencode-Z65JYILL.js} +4 -4
- package/dist/opencode-Z65JYILL.js.map +1 -0
- package/dist/{openhands-QMYIKNOS.js → openhands-SEZMCUC3.js} +7 -7
- package/dist/openhands-SEZMCUC3.js.map +1 -0
- package/dist/{package-G25GVTH2.js → package-JECVQEFT.js} +15 -15
- package/dist/package-JECVQEFT.js.map +1 -0
- package/dist/{pi-GGDQREVG.js → pi-DLKCPOJE.js} +4 -4
- package/dist/pi-DLKCPOJE.js.map +1 -0
- package/dist/{pi-644FIN3A.js → pi-YPYV2ULH.js} +6 -6
- package/dist/pi-YPYV2ULH.js.map +1 -0
- package/dist/{qwen-code-GQILBJ5B.js → qwen-code-26CSFDX6.js} +4 -4
- package/dist/qwen-code-26CSFDX6.js.map +1 -0
- package/dist/{qwen-code-STDMX7EM.js → qwen-code-ZHCLCYMC.js} +9 -9
- package/dist/qwen-code-ZHCLCYMC.js.map +1 -0
- package/dist/{roo-code-DLPIHHQ6.js → roo-code-7F4HYB34.js} +6 -6
- package/dist/roo-code-7F4HYB34.js.map +1 -0
- package/dist/{roo-code-SUWI4BBN.js → roo-code-HSAE2CJU.js} +4 -4
- package/dist/roo-code-HSAE2CJU.js.map +1 -0
- package/dist/runtime/index.js +14 -14
- package/dist/sdk/index.js +6 -6
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/test.js +11 -11
- package/dist/{serve-XTMIUHKK.js → serve-LYSBH43G.js} +16 -16
- package/dist/serve-LYSBH43G.js.map +1 -0
- package/dist/{status-VJAGO4Z7.js → status-PHKKGEW5.js} +11 -11
- package/dist/status-PHKKGEW5.js.map +1 -0
- package/dist/{statusline-EY2E2UGF.js → statusline-ZDD4OZ4F.js} +15 -15
- package/dist/statusline-ZDD4OZ4F.js.map +1 -0
- package/dist/{synthetic-6FRA7P5Q.js → synthetic-LUT6V6SD.js} +4 -4
- package/dist/synthetic-LUT6V6SD.js.map +1 -0
- package/dist/{telemetry-OLZQBADT.js → telemetry-HDGMI2BK.js} +10 -10
- package/dist/telemetry-HDGMI2BK.js.map +1 -0
- package/dist/{trae-CPPYASR2.js → trae-SIQI3C66.js} +4 -4
- package/dist/trae-SIQI3C66.js.map +1 -0
- package/dist/{trae-UOYD6JZZ.js → trae-Y67HSDOW.js} +6 -6
- package/dist/trae-Y67HSDOW.js.map +1 -0
- package/dist/{uninstall-AZEUPAND.js → uninstall-RWO2GM2I.js} +21 -21
- package/dist/uninstall-RWO2GM2I.js.map +1 -0
- package/dist/{upgrade-CAUUHSSC.js → upgrade-YJCXNUEE.js} +21 -21
- package/dist/upgrade-YJCXNUEE.js.map +1 -0
- package/dist/{usage-3KHZ4RYZ.js → usage-IWO4RQN6.js} +4 -4
- package/dist/usage-IWO4RQN6.js.map +1 -0
- package/dist/{usage-event-TZWOZPRJ.js → usage-event-AFFKCLHE.js} +15 -15
- package/dist/usage-event-AFFKCLHE.js.map +1 -0
- package/dist/{vscode-copilot-NIMH2DGU.js → vscode-copilot-5CI5B3X6.js} +7 -7
- package/dist/vscode-copilot-5CI5B3X6.js.map +1 -0
- package/dist/{warp-NRBBJQR2.js → warp-5YBSP7FP.js} +4 -4
- package/dist/warp-5YBSP7FP.js.map +1 -0
- package/dist/{warp-QYJGKURM.js → warp-INAKVGBV.js} +6 -6
- package/dist/warp-INAKVGBV.js.map +1 -0
- package/dist/{windsurf-75LLZ37C.js → windsurf-4HM57QAY.js} +6 -6
- package/dist/windsurf-4HM57QAY.js.map +1 -0
- package/dist/{zed-XJFOOKCO.js → zed-XXCNYOIN.js} +4 -4
- package/dist/zed-XXCNYOIN.js.map +1 -0
- package/dist/{zed-HKAZXEJW.js → zed-YN5X37PQ.js} +7 -7
- package/dist/zed-YN5X37PQ.js.map +1 -0
- package/package.json +92 -88
- package/dist/action-Q7GGO4PA.js.map +0 -1
- package/dist/amazon-q-ETMAGY3D.js.map +0 -1
- package/dist/amp-67BZONGF.js.map +0 -1
- package/dist/amp-BQZOL5GR.js.map +0 -1
- package/dist/antigravity-EA4L225L.js.map +0 -1
- package/dist/antigravity-VXLDLTO7.js +0 -18
- package/dist/antigravity-cli-B2HXZFYQ.js.map +0 -1
- package/dist/antigravity-cli-OM6SC3PE.js.map +0 -1
- package/dist/chunk-2Y2MZRLP.js.map +0 -1
- package/dist/chunk-3NH2ARIS.js.map +0 -1
- package/dist/chunk-4NHXLXSD.js.map +0 -1
- package/dist/chunk-5IOTP7LQ.js.map +0 -1
- package/dist/chunk-6TF7MHG5.js.map +0 -1
- package/dist/chunk-6WZODR3Z.js.map +0 -1
- package/dist/chunk-7F5KHLEP.js.map +0 -1
- package/dist/chunk-APZDTY76.js.map +0 -1
- package/dist/chunk-BEFVJ2OE.js.map +0 -1
- package/dist/chunk-D4ELPBB5.js.map +0 -1
- package/dist/chunk-FBJQGRET.js.map +0 -1
- package/dist/chunk-FJCUKXGX.js.map +0 -1
- package/dist/chunk-GZGLCCEE.js.map +0 -1
- package/dist/chunk-H33M77DD.js.map +0 -1
- package/dist/chunk-H53QZQJI.js.map +0 -1
- package/dist/chunk-I5UXHIDT.js.map +0 -1
- package/dist/chunk-ISEJWBFF.js.map +0 -1
- package/dist/chunk-IVAWP6HH.js.map +0 -1
- package/dist/chunk-JKKU2WKG.js.map +0 -1
- package/dist/chunk-KHO5WNTP.js.map +0 -1
- package/dist/chunk-MGTDQLJJ.js.map +0 -1
- package/dist/chunk-MQPNU2CY.js.map +0 -1
- package/dist/chunk-NBYKLUF6.js.map +0 -1
- package/dist/chunk-NLE2J5P4.js.map +0 -1
- package/dist/chunk-O7SDRBVB.js.map +0 -1
- package/dist/chunk-OP4KBXUO.js.map +0 -1
- package/dist/chunk-OPXAP3AC.js.map +0 -1
- package/dist/chunk-PAPMUAR5.js.map +0 -1
- package/dist/chunk-PW42ZXCB.js.map +0 -1
- package/dist/chunk-RK6VBLXP.js.map +0 -1
- package/dist/chunk-UM5S7DKK.js.map +0 -1
- package/dist/chunk-UMQ6NBQR.js.map +0 -1
- package/dist/chunk-XC5SJ35F.js.map +0 -1
- package/dist/chunk-XD7MY6HB.js.map +0 -1
- package/dist/chunk-YPAXJ7EW.js.map +0 -1
- package/dist/chunk-YT43MUSJ.js.map +0 -1
- package/dist/chunk-Z2MRSS2I.js.map +0 -1
- package/dist/claude-code-GRWO6XBZ.js.map +0 -1
- package/dist/claude-code-NMRKTAP7.js.map +0 -1
- package/dist/cline-25KW25IN.js.map +0 -1
- package/dist/codebuddy-ZNYQACMF.js.map +0 -1
- package/dist/codebuff-ETYT5UBL.js.map +0 -1
- package/dist/codebuff-VR6JUDIY.js.map +0 -1
- package/dist/codex-CPNKTXG3.js.map +0 -1
- package/dist/codex-YAORPCOD.js.map +0 -1
- package/dist/continue-WU2IB5KS.js.map +0 -1
- package/dist/copilot-cli-MZTAWMPW.js.map +0 -1
- package/dist/copilot-cli-PAP377OM.js.map +0 -1
- package/dist/crush-3AVQA4YU.js.map +0 -1
- package/dist/crush-QBXLNN7T.js.map +0 -1
- package/dist/cursor-DIW43TRZ.js.map +0 -1
- package/dist/cursor-GSLUET3V.js +0 -22
- package/dist/detect-6V4LC3MA.js.map +0 -1
- package/dist/devin-QMEM3OFA.js.map +0 -1
- package/dist/doctor-2YDUVSAU.js.map +0 -1
- package/dist/droid-MOKV53J4.js.map +0 -1
- package/dist/droid-U3ZBLQFO.js.map +0 -1
- package/dist/gemini-cli-47ZHCOZR.js.map +0 -1
- package/dist/gemini-cli-NMVVBO3K.js.map +0 -1
- package/dist/goose-4EI5MYTI.js.map +0 -1
- package/dist/goose-64V46Y2W.js.map +0 -1
- package/dist/grok-cli-QYQPDSVB.js.map +0 -1
- package/dist/hermes-F3EGTK6N.js.map +0 -1
- package/dist/hermes-F75OSK3Y.js.map +0 -1
- package/dist/hook-OEVRDMXD.js.map +0 -1
- package/dist/install-5NMCUDG5.js.map +0 -1
- package/dist/jetbrains-copilot-ZGIWI6YV.js.map +0 -1
- package/dist/junie-DIFN2P22.js.map +0 -1
- package/dist/kilo-EMZJBEBB.js.map +0 -1
- package/dist/kilo-SW7BH6EG.js.map +0 -1
- package/dist/kilo-cli-S3GXBPAE.js.map +0 -1
- package/dist/kilo-cli-ZF272ZHN.js.map +0 -1
- package/dist/kimi-5FHEXGZD.js.map +0 -1
- package/dist/kimi-IQJOIY6B.js.map +0 -1
- package/dist/kiro-BYX4HEAJ.js.map +0 -1
- package/dist/kiro-WGOI5CGT.js.map +0 -1
- package/dist/leaderboard-XEKS7B3H.js.map +0 -1
- package/dist/mimo-code-7R53QDHB.js.map +0 -1
- package/dist/mistral-vibe-LHJ55FSB.js.map +0 -1
- package/dist/mux-NYCNGL43.js.map +0 -1
- package/dist/mux-XM6AP35L.js.map +0 -1
- package/dist/nemoclaw-WSIPSE7U.js.map +0 -1
- package/dist/omp-562NK5BJ.js.map +0 -1
- package/dist/open-interpreter-I2CNOEXY.js.map +0 -1
- package/dist/openclaw-5EQFGOWL.js.map +0 -1
- package/dist/openclaw-7EYBQS4R.js +0 -17
- package/dist/opencode-QGP4ALQY.js.map +0 -1
- package/dist/opencode-YS4WX2E2.js.map +0 -1
- package/dist/openhands-QMYIKNOS.js.map +0 -1
- package/dist/package-G25GVTH2.js.map +0 -1
- package/dist/pi-644FIN3A.js.map +0 -1
- package/dist/pi-GGDQREVG.js.map +0 -1
- package/dist/qwen-code-GQILBJ5B.js.map +0 -1
- package/dist/qwen-code-STDMX7EM.js.map +0 -1
- package/dist/roo-code-DLPIHHQ6.js.map +0 -1
- package/dist/roo-code-SUWI4BBN.js.map +0 -1
- package/dist/serve-XTMIUHKK.js.map +0 -1
- package/dist/status-VJAGO4Z7.js.map +0 -1
- package/dist/statusline-EY2E2UGF.js.map +0 -1
- package/dist/synthetic-6FRA7P5Q.js.map +0 -1
- package/dist/telemetry-OLZQBADT.js.map +0 -1
- package/dist/trae-CPPYASR2.js.map +0 -1
- package/dist/trae-UOYD6JZZ.js.map +0 -1
- package/dist/uninstall-AZEUPAND.js.map +0 -1
- package/dist/upgrade-CAUUHSSC.js.map +0 -1
- package/dist/usage-3KHZ4RYZ.js.map +0 -1
- package/dist/usage-event-TZWOZPRJ.js.map +0 -1
- package/dist/vscode-copilot-NIMH2DGU.js.map +0 -1
- package/dist/warp-NRBBJQR2.js.map +0 -1
- package/dist/warp-QYJGKURM.js.map +0 -1
- package/dist/windsurf-75LLZ37C.js.map +0 -1
- package/dist/zed-HKAZXEJW.js.map +0 -1
- package/dist/zed-XJFOOKCO.js.map +0 -1
- /package/dist/{antigravity-VXLDLTO7.js.map → antigravity-TWIWXTQH.js.map} +0 -0
- /package/dist/{cursor-GSLUET3V.js.map → cursor-W7I4QUFO.js.map} +0 -0
- /package/dist/{openclaw-7EYBQS4R.js.map → openclaw-IJ33K45M.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/leaderboard.ts"],"sourcesContent":["/**\r\n * cli/commands/leaderboard — the unified top-level `agent-connector leaderboard`.\r\n *\r\n * Prints THREE leaderboards, each clearly origin-labeled and NEVER summed:\r\n * 🔌 MCP / Plugin leaderboard ← origin `mcp-self`: the serve-proxy\r\n * telemetry store (which MCP server WE wrap costs the most — per-MCP `call`\r\n * + `tool_defs` rows; the `model_turn` rows are EXCLUDED here).\r\n * 🖥️ Host / User leaderboard ← origin `host-scan-logs`: the host usage\r\n * readers scanning agent CLI logs (which CLI / host spent the most).\r\n * 🛰️ Host-native turns (live, exact) ← origin `host-native-live`: the opt-in\r\n * AfterModel / PostInvocation usage hook (scope `model_turn`, confidence\r\n * host-native) — whole-conversation usage the host reported in real time.\r\n *\r\n * All three measure DIFFERENT things (per-MCP server bytes vs whole-conversation\r\n * usage from logs vs whole-conversation usage from a live hook). They are reported\r\n * side by side but their totals are NEVER added together.\r\n *\r\n * Flags:\r\n * --since 7d|24h|… lower-bound window applied to both sources.\r\n * --scope <value> MCP-section scope slice (user|project|npx|binary|http|…);\r\n * ignored by the host section (host logs carry no scope).\r\n * --connector <id> restrict the 🔌 MCP/plugin + 🛰️ host-native-turns\r\n * sections to ONE connector id. The 🖥️ host-scan section\r\n * is connector-agnostic (host CLI logs carry no connector\r\n * attribution) and is intentionally NOT filtered.\r\n * --json emit { mcp:[...], host:[...] } instead of the tables.\r\n */\r\n\r\nimport { parseArgs } from \"node:util\";\r\n\r\nimport {\r\n formatHostNativeTurns,\r\n formatMcpLeaderboard,\r\n hostNativeTurns,\r\n isScopeFilter,\r\n mcpLeaderboard,\r\n SCOPE_FILTER_VALUES,\r\n type ScopeFilter,\r\n} from \"../../telemetry/leaderboard.js\";\r\nimport { formatHostLeaderboard, hostLeaderboard } from \"../../usage/leaderboard.js\";\r\nimport { fail, print } from \"../app.js\";\r\n\r\n/**\r\n * Parse a relative duration (`Ns`/`Nm`/`Nh`/`Nd`) to a lower-bound epoch ms.\r\n * Returns undefined for empty input and null for a malformed one. (Kept local so\r\n * the leaderboard command stays decoupled from the report commands.)\r\n */\r\nexport function parseSince(since: string | undefined): number | null | undefined {\r\n if (since == null || since.trim() === \"\") return undefined;\r\n const m = since.trim().match(/^(\\d+)\\s*([smhd])$/i);\r\n if (!m || !m[1] || !m[2]) return null;\r\n const n = Number(m[1]);\r\n const unitMs: Record<string, number> = {\r\n s: 1000,\r\n m: 60_000,\r\n h: 3_600_000,\r\n d: 86_400_000,\r\n };\r\n const factor = unitMs[m[2].toLowerCase()];\r\n if (factor == null) return null;\r\n return Date.now() - n * factor;\r\n}\r\n\r\nexport async function run(argv: string[]): Promise<number> {\r\n const first = argv[0];\r\n if (first === \"--help\" || first === \"-h\") {\r\n print(\"usage: agent-connector leaderboard [flags]\");\r\n print(\" --since 7d|24h|… window applied to BOTH sources\");\r\n print(` --scope <value> MCP-section slice (${SCOPE_FILTER_VALUES.join(\"|\")})`);\r\n print(\" --connector <id> restrict the 🔌 MCP + 🛰️ host-native sections to one connector\");\r\n print(\" --json emit { mcp:[...], host:[...] } (never summed)\");\r\n return 0;\r\n }\r\n\r\n const { values } = parseArgs({\r\n args: argv,\r\n options: {\r\n since: { type: \"string\" },\r\n scope: { type: \"string\" },\r\n connector: { type: \"string\" },\r\n json: { type: \"boolean\", default: false },\r\n },\r\n allowPositionals: false,\r\n });\r\n\r\n const sinceMs = parseSince(values.since);\r\n if (sinceMs === null) {\r\n return fail(`invalid --since \"${values.since}\" (use forms like 30s, 15m, 24h, 7d)`);\r\n }\r\n\r\n let scope: ScopeFilter | undefined;\r\n if (values.scope !== undefined && values.scope.trim() !== \"\") {\r\n const s = values.scope.trim();\r\n if (!isScopeFilter(s)) {\r\n return fail(`invalid --scope \"${s}\" (use ${SCOPE_FILTER_VALUES.join(\"|\")})`);\r\n }\r\n scope = s;\r\n }\r\n\r\n // The optional --connector <id> FILTER restricts the two connector-attributed\r\n // sections (🔌 MCP/plugin + 🛰️ host-native turns) to one connector. The\r\n // 🖥️ host-scan section below is intentionally NOT filtered: host CLI logs carry\r\n // no connector attribution, so it stays connector-agnostic (whole-conversation).\r\n const connectorId =\r\n values.connector !== undefined && values.connector.trim() !== \"\"\r\n ? values.connector.trim()\r\n : undefined;\r\n\r\n // 🔌 MCP / Plugin leaderboard — serve-proxy telemetry (origin: mcp-self).\r\n const mcpOpts: { sinceMs?: number; scope?: ScopeFilter; connectorId?: string } = {};\r\n if (sinceMs !== undefined) mcpOpts.sinceMs = sinceMs;\r\n if (scope !== undefined) mcpOpts.scope = scope;\r\n if (connectorId !== undefined) mcpOpts.connectorId = connectorId;\r\n const mcp = mcpLeaderboard(mcpOpts);\r\n\r\n // 🖥️ Host / User leaderboard — host usage readers (origin: host-scan-logs).\r\n // Connector-agnostic by construction: NOT filtered by --connector.\r\n const hostOpts: { sinceMs?: number } = {};\r\n if (sinceMs !== undefined) hostOpts.sinceMs = sinceMs;\r\n const host = await hostLeaderboard(hostOpts);\r\n\r\n // 🛰️ Host-native turns — opt-in AfterModel usage hook (origin: host-native-live).\r\n // Scope `model_turn` rows ONLY; the MCP section above already excludes them.\r\n const turnsOpts: { sinceMs?: number; scope?: ScopeFilter; connectorId?: string } = {};\r\n if (sinceMs !== undefined) turnsOpts.sinceMs = sinceMs;\r\n if (scope !== undefined) turnsOpts.scope = scope;\r\n if (connectorId !== undefined) turnsOpts.connectorId = connectorId;\r\n const turns = hostNativeTurns(turnsOpts);\r\n\r\n if (values.json) {\r\n // Three separate arrays — by construction the consumer cannot sum origins.\r\n print(\r\n JSON.stringify(\r\n {\r\n mcp, // origin: mcp-self\r\n host: host.rows, // origin: host-scan-logs\r\n hostSkipped: host.skipped,\r\n hostNativeTurns: turns, // origin: host-native-live (scope model_turn)\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n return 0;\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push(\r\n \"🔌 MCP / Plugin leaderboard (origin: mcp-self — per-MCP server bytes we wrap; \" +\r\n \"excludes host-native model_turn rows)\",\r\n );\r\n if (scope !== undefined) lines.push(` scope: ${scope}`);\r\n if (connectorId !== undefined) lines.push(` connector: ${connectorId}`);\r\n lines.push(\"\");\r\n lines.push(formatMcpLeaderboard(mcp));\r\n lines.push(\"\");\r\n lines.push(\r\n \"🖥️ Host / User leaderboard (origin: host-scan-logs — whole-conversation usage from CLI logs)\",\r\n );\r\n if (connectorId !== undefined) {\r\n lines.push(\" (connector-agnostic — host CLI logs carry no connector attribution; --connector not applied here)\");\r\n }\r\n lines.push(\"\");\r\n lines.push(formatHostLeaderboard(host));\r\n lines.push(\"\");\r\n lines.push(\r\n \"🛰️ Host-native turns (live, exact) (origin: host-native-live — opt-in AfterModel usage hook)\",\r\n );\r\n lines.push(\"\");\r\n lines.push(formatHostNativeTurns(turns));\r\n lines.push(\"\");\r\n lines.push(\r\n \"note: the THREE leaderboards measure DIFFERENT things (per-MCP server bytes vs \" +\r\n \"whole-conversation usage from logs vs live host-native turns) and are never \" +\r\n \"summed together (their totals are NEVER added across origins).\",\r\n );\r\n print(lines.join(\"\\n\"));\r\n return 0;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAS,iBAAiB;AAmBnB,SAAS,WAAW,OAAsD;AAC/E,MAAI,SAAS,QAAQ,MAAM,KAAK,MAAM,GAAI,QAAO;AACjD,QAAM,IAAI,MAAM,KAAK,EAAE,MAAM,qBAAqB;AAClD,MAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAG,QAAO;AACjC,QAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,QAAM,SAAiC;AAAA,IACrC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACA,QAAM,SAAS,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC;AACxC,MAAI,UAAU,KAAM,QAAO;AAC3B,SAAO,KAAK,IAAI,IAAI,IAAI;AAC1B;AAEA,eAAsB,IAAI,MAAiC;AACzD,QAAM,QAAQ,KAAK,CAAC;AACpB,MAAI,UAAU,YAAY,UAAU,MAAM;AACxC,UAAM,4CAA4C;AAClD,UAAM,0DAAqD;AAC3D,UAAM,2CAA2C,oBAAoB,KAAK,GAAG,CAAC,GAAG;AACjF,UAAM,yGAAsF;AAC5F,UAAM,oEAAoE;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,MAAM,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,IAC1C;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AAED,QAAM,UAAU,WAAW,OAAO,KAAK;AACvC,MAAI,YAAY,MAAM;AACpB,WAAO,KAAK,oBAAoB,OAAO,KAAK,sCAAsC;AAAA,EACpF;AAEA,MAAI;AACJ,MAAI,OAAO,UAAU,UAAa,OAAO,MAAM,KAAK,MAAM,IAAI;AAC5D,UAAM,IAAI,OAAO,MAAM,KAAK;AAC5B,QAAI,CAAC,cAAc,CAAC,GAAG;AACrB,aAAO,KAAK,oBAAoB,CAAC,UAAU,oBAAoB,KAAK,GAAG,CAAC,GAAG;AAAA,IAC7E;AACA,YAAQ;AAAA,EACV;AAMA,QAAM,cACJ,OAAO,cAAc,UAAa,OAAO,UAAU,KAAK,MAAM,KAC1D,OAAO,UAAU,KAAK,IACtB;AAGN,QAAM,UAA2E,CAAC;AAClF,MAAI,YAAY,OAAW,SAAQ,UAAU;AAC7C,MAAI,UAAU,OAAW,SAAQ,QAAQ;AACzC,MAAI,gBAAgB,OAAW,SAAQ,cAAc;AACrD,QAAM,MAAM,eAAe,OAAO;AAIlC,QAAM,WAAiC,CAAC;AACxC,MAAI,YAAY,OAAW,UAAS,UAAU;AAC9C,QAAM,OAAO,MAAM,gBAAgB,QAAQ;AAI3C,QAAM,YAA6E,CAAC;AACpF,MAAI,YAAY,OAAW,WAAU,UAAU;AAC/C,MAAI,UAAU,OAAW,WAAU,QAAQ;AAC3C,MAAI,gBAAgB,OAAW,WAAU,cAAc;AACvD,QAAM,QAAQ,gBAAgB,SAAS;AAEvC,MAAI,OAAO,MAAM;AAEf;AAAA,MACE,KAAK;AAAA,QACH;AAAA,UACE;AAAA;AAAA,UACA,MAAM,KAAK;AAAA;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,iBAAiB;AAAA;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ;AAAA,EAEF;AACA,MAAI,UAAU,OAAW,OAAM,KAAK,aAAa,KAAK,EAAE;AACxD,MAAI,gBAAgB,OAAW,OAAM,KAAK,iBAAiB,WAAW,EAAE;AACxE,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,qBAAqB,GAAG,CAAC;AACpC,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ;AAAA,EACF;AACA,MAAI,gBAAgB,QAAW;AAC7B,UAAM,KAAK,2GAAsG;AAAA,EACnH;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sBAAsB,IAAI,CAAC;AACtC,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,sBAAsB,KAAK,CAAC;AACvC,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ;AAAA,EAGF;AACA,QAAM,MAAM,KAAK,IAAI,CAAC;AACtB,SAAO;AACT;","names":[]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
renderBridgePrelude
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Q4ISQHUQ.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveEnvRefsDeep
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XXLCMSD3.js";
|
|
8
8
|
import {
|
|
9
9
|
BaseAdapter,
|
|
10
10
|
renderOpenCodeSubagentMd,
|
|
11
11
|
renderSkillMd
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-3FINQ2ZF.js";
|
|
13
13
|
import {
|
|
14
14
|
buildWrappedStdio
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-Y3K6KJMS.js";
|
|
16
|
+
import "./chunk-ILWHLGIC.js";
|
|
17
|
+
import "./chunk-QYOUQCC6.js";
|
|
18
18
|
|
|
19
19
|
// src/adapters/mimo-code/index.ts
|
|
20
20
|
import { existsSync } from "fs";
|
|
@@ -716,4 +716,4 @@ export {
|
|
|
716
716
|
adapter,
|
|
717
717
|
mimo_code_default as default
|
|
718
718
|
};
|
|
719
|
-
//# sourceMappingURL=mimo-code-
|
|
719
|
+
//# sourceMappingURL=mimo-code-BPNYYIVM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mimo-code/index.ts"],"sourcesContent":["/**\r\n * adapters/mimo-code — Xiaomi MiMoCode platform adapter for agent-connector.\r\n *\r\n * MiMoCode (github.com/XiaomiMiMo/MiMo-Code, MIT) is Xiaomi's open-source\r\n * terminal AI coding agent — a FORK OF OpenCode (anomalyco/opencode) that adds\r\n * cross-session memory, checkpoints, subagents, etc. Official npm `@mimo-ai/cli`\r\n * (bin: `mimo`). NOTE: `@xiaomi-mimo/cli` is an UNOFFICIAL squatter (GPL) — not\r\n * referenced here; the bin is `mimo`, NOT `mimo-code`.\r\n *\r\n * DESIGN — STANDALONE (mirrors OpenCode's render logic with mimocode paths),\r\n * NOT `extends OpenCodeAdapter`. The OpenCode adapter binds the host string in\r\n * several places that a subclass cannot cleanly override:\r\n * - a module-level `const HOST = \"opencode\"` used for the per-platform server/\r\n * hooks override lookup (`ctx.connector.platforms[HOST]`) and stamped as\r\n * `hostPlatform` on every parsed event — extending would read\r\n * `platforms[\"opencode\"]` overrides and mis-stamp events as opencode;\r\n * - the PRIVATE `buildPluginSource` hardcodes `[\"hook\", \"opencode\", event, …]`\r\n * in the GENERATED bridge, so an inherited plugin would dispatch the runtime\r\n * hook to the opencode adapter (`hook opencode`) instead of mimo-code;\r\n * - the config/plugin/content directory builders hardcode \"opencode\" /\r\n * \".opencode\" / \"opencode.json\".\r\n * Overriding all of that means re-implementing the private render core anyway,\r\n * so this adapter mirrors OpenCode's logic with a `HOST = \"mimo-code\"` constant\r\n * and the mimocode paths — a clean standalone that routes detection, the runtime\r\n * bridge, and per-platform overrides to its own id.\r\n *\r\n * MiMoCode IS OpenCode's config dialect, so the render shapes are IDENTICAL:\r\n * - config file `mimocode.json`\r\n * user scope → ~/.config/mimocode/mimocode.json\r\n * project scope → <projectDir>/mimocode.json\r\n * (the dir is `.mimocode` / `~/.config/mimocode` — NO hyphen; the committed\r\n * example is `.mimocode/mimocode.jsonc`).\r\n * - MCP root key \"mcp\" (the OpenCode shape, NOT \"mcpServers\"); each server\r\n * keyed by name; stdio → { type:\"local\", command:[exe,…args], environment },\r\n * remote → { type:\"remote\", url }.\r\n * - ts-plugin hooks: a self-contained ESM bridge module auto-loaded from the\r\n * user scope → ~/.config/mimocode/plugin/<id>.js\r\n * project scope → <projectDir>/.mimocode/plugin/<id>.js\r\n * plugin dir (writing the file IS the registration; no config array edit).\r\n * - content surfaces under <mcDir>/{commands,skills,agent} (singular `agent/`,\r\n * matching OpenCode).\r\n *\r\n * Event mapping (OpenCode's, unchanged):\r\n * PreToolUse → \"tool.execute.before\" (mutate output.args; throw to deny)\r\n * PostToolUse → \"tool.execute.after\" (mutate output.output)\r\n * SessionStart → \"experimental.chat.system.transform\" (inject into output.system)\r\n *\r\n * SOURCES: github.com/XiaomiMiMo/MiMo-Code (README, .mimocode/mimocode.jsonc,\r\n * packages/opencode/src/config/{config.ts,mcp.ts,plugin.ts}). npm @mimo-ai/cli.\r\n * mimo.xiaomi.com/en/mimocode.\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\n\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport type {\r\n Adapter,\r\n GeneratedPluginFile,\r\n HookReply,\r\n InstallContext,\r\n MemoryTarget,\r\n NormalizedEvent,\r\n} from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n CommandDef,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookEventName,\r\n HookParadigm,\r\n HookResponse,\r\n PlatformCapabilities,\r\n PlatformId,\r\n PostToolUseEvent,\r\n PreToolUseEvent,\r\n ServerDef,\r\n SessionStartEvent,\r\n StopEvent,\r\n Transport,\r\n UserPromptSubmitEvent,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport { renderBridgePrelude } from \"../../core/ts-plugin-bridge.js\";\r\nimport {\r\n buildWrappedStdio,\r\n} from \"../../core/spawn.js\";\r\nimport { renderOpenCodeSubagentMd, renderSkillMd } from \"../claude-code/render.js\";\r\n\r\nconst HOST: PlatformId = \"mimo-code\";\r\nconst MCP_ROOT_KEY = \"mcp\";\r\n\r\n/** The config dir name (NO hyphen): `.mimocode` / `~/.config/mimocode`. */\r\nconst CONFIG_DIR_NAME = \"mimocode\";\r\n/** The config file name: `mimocode.json`. */\r\nconst CONFIG_FILE_NAME = \"mimocode.json\";\r\n\r\n/**\r\n * Canonical → MiMoCode (OpenCode-shaped) event name map. A connector hook event\r\n * is only emitted by the generated plugin when it appears here AND is declared\r\n * by the connector.\r\n */\r\nconst EVENT_TO_MIMOCODE: Partial<Record<HookEventName, string>> = {\r\n PreToolUse: \"tool.execute.before\",\r\n PostToolUse: \"tool.execute.after\",\r\n // No real SessionStart hook (inherited from OpenCode #14808 / #5409). The\r\n // verified surrogate is experimental.chat.system.transform.\r\n SessionStart: \"experimental.chat.system.transform\",\r\n // chat.message fires on the user's prompt submission; the handler mutates\r\n // output (pushes a text part) to inject context. No documented block/abort.\r\n UserPromptSubmit: \"chat.message\",\r\n // session.idle (\"session finished responding\") → canonical Stop. NOT a direct\r\n // hook key — dispatched through the generic `event` hook (event.type switch).\r\n // session.idle is the OpenCode-family session-completion event (mirrors kilo /\r\n // kilo-cli); if it never fires on a given MiMoCode build, Stop is a silent\r\n // no-op (an acceptable degrade — it never mis-fires), so coverage may be\r\n // optimistic.\r\n Stop: \"session.idle\",\r\n};\r\n\r\n/** Raw payload the generated plugin posts to the universal hook entrypoint. */\r\ninterface MiMoCodeBridgePayload {\r\n toolName?: string;\r\n toolInput?: Record<string, unknown>;\r\n toolOutput?: string;\r\n isError?: boolean;\r\n prompt?: string;\r\n sessionId?: string;\r\n projectDir?: string;\r\n}\r\n\r\n/** Native MCP server entry shapes MiMoCode accepts under the \"mcp\" key. */\r\ninterface MiMoCodeLocalServer {\r\n type: \"local\";\r\n command: string[];\r\n environment?: Record<string, string>;\r\n enabled?: boolean;\r\n}\r\ninterface MiMoCodeRemoteServer {\r\n type: \"remote\";\r\n url: string;\r\n enabled?: boolean;\r\n}\r\n\r\nexport class MiMoCodeAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"MiMoCode\";\r\n readonly paradigm: HookParadigm = \"ts-plugin\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block (CLAUDE.md fallback, like\r\n // OpenCode — MiMoCode keeps OpenCode's CLAUDE.md import + AGENTS.md reading).\r\n supportsMemory: true,\r\n preToolUse: true,\r\n postToolUse: true,\r\n preCompact: false,\r\n sessionStart: true,\r\n sessionEnd: false,\r\n userPromptSubmit: true,\r\n // session.idle (via the generic `event` hook) backs Stop (mirrors kilo /\r\n // kilo-cli — same OpenCode-family ts-plugin layer).\r\n stop: true,\r\n notification: false,\r\n // tool.execute.before mutates output.args → input rewrite supported.\r\n canModifyArgs: true,\r\n // tool.execute.after mutates output.output → output rewrite supported.\r\n canModifyOutput: true,\r\n // injected via experimental.chat.system.transform at session start.\r\n canInjectSessionContext: true,\r\n transports: [\"stdio\", \"sse\", \"http\"],\r\n // Content surfaces: MiMoCode authors all three natively under <mcDir>\r\n // (inherited from OpenCode's commands/skills/agent layout).\r\n supportsCommands: true,\r\n supportsSkills: true,\r\n supportsSubagents: true,\r\n };\r\n\r\n // ── Detection ──────────────────────────────────────────────────────────\r\n\r\n detectInstalled(projectDir: string): DetectedPlatform {\r\n const userConfigDir = join(homedir(), \".config\", CONFIG_DIR_NAME);\r\n const userConfig = join(userConfigDir, CONFIG_FILE_NAME);\r\n const projectConfig = join(projectDir, CONFIG_FILE_NAME);\r\n\r\n const userInstalled = existsSync(userConfigDir) || existsSync(userConfig);\r\n const projInstalled = existsSync(projectConfig);\r\n const installed = userInstalled || projInstalled;\r\n\r\n // Report the marker that actually matched so a project-only install isn't\r\n // misreported as a (non-existent) user install.\r\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\r\n const configPath = scope === \"project\" ? projectConfig : userConfig;\r\n\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope,\r\n reason: installed\r\n ? scope === \"project\"\r\n ? `found project MiMoCode config at ${projectConfig}`\r\n : `found MiMoCode config under ${userConfigDir}`\r\n : `no MiMoCode config at ${userConfigDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Memory surface: AGENTS.md / CLAUDE.md-fallback probe (project) ──────\r\n // Mirrors OpenCode: project AGENTS.md, falling back to CLAUDE.md ONLY when no\r\n // AGENTS.md exists (creating AGENTS.md beside a relied-on CLAUDE.md would\r\n // shadow the user's rules). User scope stays on the BaseAdapter default.\r\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\r\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"project\") {\r\n return super.memoryTargets(ctx);\r\n }\r\n const agentsMd = join(ctx.projectDir, \"AGENTS.md\");\r\n if (existsSync(agentsMd)) {\r\n return [{ path: agentsMd, reason: \"AGENTS.md (mimocode's primary project rules file)\" }];\r\n }\r\n const claudeMd = join(ctx.projectDir, \"CLAUDE.md\");\r\n if (existsSync(claudeMd)) {\r\n return [\r\n {\r\n path: claudeMd,\r\n reason:\r\n \"CLAUDE.md (mimocode's fallback rules file — creating AGENTS.md would shadow it)\",\r\n },\r\n ];\r\n }\r\n return [{ path: agentsMd, reason: \"AGENTS.md standard (created; no mimocode rules file yet)\" }];\r\n }\r\n\r\n // ── Native paths ───────────────────────────────────────────────────────\r\n\r\n getConfigDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? ctx.projectDir\r\n : join(homedir(), \".config\", CONFIG_DIR_NAME);\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), CONFIG_FILE_NAME);\r\n }\r\n\r\n /**\r\n * For ts-plugin hosts the \"hook config path\" is the generated plugin FILE.\r\n * MiMoCode (like OpenCode) auto-loads every file in the plugin dir; writing\r\n * this file IS the registration.\r\n */\r\n getHookConfigPath(ctx: InstallContext): string {\r\n return join(this.pluginDir(ctx), this.pluginFileName(ctx));\r\n }\r\n\r\n /** Plugin directory MiMoCode auto-loads modules from, per scope. */\r\n private pluginDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, `.${CONFIG_DIR_NAME}`, \"plugin\")\r\n : join(homedir(), \".config\", CONFIG_DIR_NAME, \"plugin\");\r\n }\r\n\r\n /** Plugin module file name (one per connector, kebab-case id). */\r\n private pluginFileName(ctx: InstallContext): string {\r\n return `${ctx.connector.id}.js`;\r\n }\r\n\r\n // ── MCP server install / uninstall ─────────────────────────────────────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const server = this.effectiveServer(ctx);\r\n const serverPath = this.getServerConfigPath(ctx);\r\n\r\n if (!server) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: serverPath,\r\n detail: ctx.connector.server\r\n ? \"server registration disabled for mimo-code\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n const entry = this.renderServerEntry(ctx, server);\r\n return [\r\n this.upsertServerInJson(\r\n serverPath,\r\n MCP_ROOT_KEY,\r\n ctx.connector.id,\r\n entry,\r\n ctx.dryRun,\r\n ),\r\n ];\r\n }\r\n\r\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const serverPath = this.getServerConfigPath(ctx);\r\n return [\r\n this.removeServerFromJson(\r\n serverPath,\r\n MCP_ROOT_KEY,\r\n ctx.connector.id,\r\n ctx.dryRun,\r\n ),\r\n ];\r\n }\r\n\r\n /** Resolve the per-platform server override into an effective ServerDef. */\r\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\r\n const override = ctx.connector.platforms[HOST]?.server;\r\n if (override === false) return undefined;\r\n const base = ctx.connector.server;\r\n if (!base) return undefined;\r\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\r\n }\r\n\r\n /**\r\n * Render a normalized ServerDef into MiMoCode's native \"mcp\" entry (OpenCode\r\n * dialect).\r\n *\r\n * stdio → { type: \"local\", command: [exe, ...args], environment }\r\n * remote → { type: \"remote\", url }\r\n *\r\n * MiMoCode flattens command+args into a single ARRAY. When telemetry wrapping\r\n * applies, the wrapper's command+args (which already include the real command\r\n * tail after `--`) become the head of that array. No native interpolation\r\n * token → resolve every ${env:VAR} reference to a literal at install time.\r\n */\r\n private renderServerEntry(\r\n ctx: InstallContext,\r\n server: ServerDef,\r\n ): MiMoCodeLocalServer | MiMoCodeRemoteServer {\r\n const transport: Transport = server.transport;\r\n\r\n if (transport === \"stdio\") {\r\n let command = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n const commandArray = resolveEnvRefsDeep([command, ...args]).filter(\r\n (s) => s !== \"\",\r\n );\r\n const entry: MiMoCodeLocalServer = {\r\n type: \"local\",\r\n command: commandArray,\r\n };\r\n const environment = this.renderEnv(server.env);\r\n if (environment) entry.environment = environment;\r\n if (server.enabled === false) entry.enabled = false;\r\n return entry;\r\n }\r\n\r\n // sse / http / ws (any remote transport) — MiMoCode registers a URL.\r\n const entry: MiMoCodeRemoteServer = {\r\n type: \"remote\",\r\n url: resolveEnvRefsDeep(server.url ?? \"\"),\r\n };\r\n if (server.enabled === false) entry.enabled = false;\r\n return entry;\r\n }\r\n\r\n /** Render env values, resolving every ${env:VAR} reference to a literal. */\r\n private renderEnv(\r\n env: Record<string, string> | undefined,\r\n ): Record<string, string> | undefined {\r\n if (!env || Object.keys(env).length === 0) return undefined;\r\n return resolveEnvRefsDeep({ ...env });\r\n }\r\n\r\n // ── Hook install / uninstall (ts-plugin) ───────────────────────────────\r\n\r\n installHooks(ctx: InstallContext): ChangeRecord[] {\r\n const pluginPath = this.getHookConfigPath(ctx);\r\n\r\n if (ctx.connector.platforms[HOST]?.hooks === false) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: pluginPath,\r\n detail: \"hooks disabled for mimo-code\",\r\n },\r\n ];\r\n }\r\n if (ctx.connector.hookEvents.length === 0) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path: pluginPath,\r\n detail: \"connector declares no hooks\",\r\n },\r\n ];\r\n }\r\n\r\n const files = this.synthesizePlugin(ctx);\r\n const changes: ChangeRecord[] = [];\r\n\r\n for (const file of files) {\r\n changes.push(\r\n this.writeManagedFile(\r\n file.path,\r\n file.contents,\r\n ctx.dryRun,\r\n `mimo-code plugin module (${this.hookDetail(ctx)})`,\r\n file.executable,\r\n ),\r\n );\r\n }\r\n\r\n return changes;\r\n }\r\n\r\n /**\r\n * Human-facing summary of which declared events the synthesized module\r\n * ACTUALLY wires. Only events present in EVENT_TO_MIMOCODE are mapped/wired;\r\n * any declared event with no mapping is reported separately as \"unsupported\r\n * here\" so the detail never overstates coverage.\r\n */\r\n private hookDetail(ctx: InstallContext): string {\r\n const declared = ctx.connector.hookEvents;\r\n const mapped = declared.filter((e) => EVENT_TO_MIMOCODE[e] !== undefined);\r\n const unsupported = declared.filter((e) => EVENT_TO_MIMOCODE[e] === undefined);\r\n const base = mapped.join(\",\");\r\n return unsupported.length > 0\r\n ? `${base}; unsupported here: ${unsupported.join(\",\")}`\r\n : base;\r\n }\r\n\r\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\r\n const pluginPath = this.getHookConfigPath(ctx);\r\n return [\r\n this.removeManagedFile(\r\n pluginPath,\r\n ctx.dryRun,\r\n \"mimo-code plugin module\",\r\n \"no mimo-code plugin module present\",\r\n ),\r\n ];\r\n }\r\n\r\n // ── Content surfaces: commands / skills / subagents ──────────────────────\r\n // CONTENT-ONLY: pure native-file writers under <mcDir>/{commands,skills,\r\n // agent}. No runtime dispatch, no home-bin pointer, no telemetry wrap. Each\r\n // method is idempotent (byte-identical → skip) and reversible. Mirrors\r\n // OpenCode's layout: commands/<name>.md, skills/<name>/SKILL.md, and the\r\n // SINGULAR agent/<name>.md dir for subagents. For project scope the content\r\n // root is <projectDir>/.mimocode (NOT the project root where mimocode.json\r\n // lives).\r\n\r\n private contentRootDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, `.${CONFIG_DIR_NAME}`)\r\n : this.getConfigDir(ctx);\r\n }\r\n private commandsDir(ctx: InstallContext): string {\r\n return join(this.contentRootDir(ctx), \"commands\");\r\n }\r\n private skillsDir(ctx: InstallContext): string {\r\n return join(this.contentRootDir(ctx), \"skills\");\r\n }\r\n private agentDir(ctx: InstallContext): string {\r\n return join(this.contentRootDir(ctx), \"agent\");\r\n }\r\n\r\n /** Native command file path: <mcDir>/commands/<name>.md. */\r\n private commandPath(ctx: InstallContext, name: string): string {\r\n return join(this.commandsDir(ctx), `${name}.md`);\r\n }\r\n /** Native skill dir: <mcDir>/skills/<name>. */\r\n private skillDir(ctx: InstallContext, name: string): string {\r\n return join(this.skillsDir(ctx), name);\r\n }\r\n /** Native subagent file path: <mcDir>/agent/<name>.md (SINGULAR dir). */\r\n private subagentPath(ctx: InstallContext, name: string): string {\r\n return join(this.agentDir(ctx), `${name}.md`);\r\n }\r\n\r\n // ── Commands ──────────────────────────────────────────────────────────────\r\n\r\n override installCommands(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.commands === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"commands disabled for mimo-code\" }];\r\n }\r\n if (connector.commands.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\r\n }\r\n return connector.commands.map((cmd) =>\r\n this.writeContentFile(\r\n this.commandPath(ctx, cmd.name),\r\n this.renderCommand(cmd),\r\n ctx.dryRun,\r\n ),\r\n );\r\n }\r\n\r\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.commands.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\r\n }\r\n return connector.commands.map((cmd) =>\r\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\r\n );\r\n }\r\n\r\n /** Render a command to md+frontmatter (description, model, subtask). */\r\n private renderCommand(cmd: CommandDef): string {\r\n const frontmatter: Record<string, unknown> = {};\r\n if (cmd.description !== undefined) frontmatter.description = cmd.description;\r\n if (cmd.model !== undefined) frontmatter.model = cmd.model;\r\n if (cmd.subtask !== undefined) frontmatter.subtask = cmd.subtask;\r\n if (cmd.extra) Object.assign(frontmatter, cmd.extra);\r\n return this.renderFrontmatterMd(frontmatter, cmd.prompt);\r\n }\r\n\r\n // ── Skills ────────────────────────────────────────────────────────────────\r\n\r\n override installSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.skills === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for mimo-code\" }];\r\n }\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n changes.push(\r\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\r\n );\r\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n const dir = this.skillDir(ctx, skill.name);\r\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\r\n for (const rel of Object.keys(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) continue;\r\n changes.push(this.removeContentFile(target, ctx.dryRun));\r\n }\r\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\r\n }\r\n return changes;\r\n }\r\n\r\n // ── Subagents ───────────────────────────────────────────────────────────────\r\n\r\n override installSubagents(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.subagents === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"subagents disabled for mimo-code\" }];\r\n }\r\n if (connector.subagents.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\r\n }\r\n return connector.subagents.map((agent) =>\r\n this.writeContentFile(\r\n this.subagentPath(ctx, agent.name),\r\n renderOpenCodeSubagentMd(agent),\r\n ctx.dryRun,\r\n ),\r\n );\r\n }\r\n\r\n override uninstallSubagents(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.subagents.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\r\n }\r\n return connector.subagents.map((agent) =>\r\n this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun),\r\n );\r\n }\r\n\r\n // ── ts-plugin synthesis ────────────────────────────────────────────────\r\n\r\n /**\r\n * Build ONE self-contained ESM bridge module for MiMoCode. The module imports\r\n * nothing from agent-connector; it embeds the home-bin path + connector id and\r\n * a `bridge()` helper that shells out to the universal hook entrypoint\r\n * (`<homeBin> hook mimo-code <event> --connector <id>`), feeding the payload on\r\n * stdin and JSON.parsing the normalized HookResponse from stdout (fail-open).\r\n */\r\n synthesizePlugin(ctx: InstallContext): GeneratedPluginFile[] {\r\n const path = this.getHookConfigPath(ctx);\r\n const contents = this.buildPluginSource(ctx);\r\n return [{ path, contents, executable: false }];\r\n }\r\n\r\n /** Compose the generated plugin source with plain string concatenation. */\r\n private buildPluginSource(ctx: InstallContext): string {\r\n const events = ctx.connector.hookEvents.filter(\r\n (e): e is HookEventName => EVENT_TO_MIMOCODE[e] !== undefined,\r\n );\r\n const has = (e: HookEventName) => events.includes(e);\r\n\r\n const header = `/**\r\n * AUTO-GENERATED by agent-connector — DO NOT EDIT.\r\n *\r\n * Self-contained MiMoCode plugin bridge for connector ${ctx.connector.id}.\r\n * It imports nothing from agent-connector: every hook invocation shells out to\r\n * the stable home binary's universal entrypoint and JSON-parses the normalized\r\n * response. Fail-open: any bridge error degrades to \"allow\".\r\n */\r\nimport { execFileSync, execSync } from \"node:child_process\";\r\n\r\n${renderBridgePrelude({\r\n homeBin: ctx.homeBinPath,\r\n connectorId: ctx.connector.id,\r\n hookSlug: \"mimo-code\",\r\n payloadNoun: \"MiMoCode\",\r\n eventDoc: \" (PreToolUse|PostToolUse|SessionStart)\",\r\n failOpenComment: \"Fail-open — never wedge a tool call on a bridge error.\",\r\n})}\r\n`;\r\n\r\n const handlers: string[] = [];\r\n\r\n if (has(\"PreToolUse\")) {\r\n handlers.push(` // PreToolUse → block (throw) / rewrite args (mutate output.args).\r\n \"tool.execute.before\": async (input, output) => {\r\n const payload = {\r\n toolName: input.tool ?? \"\",\r\n toolInput: (output && output.args) ?? {},\r\n sessionId: input.sessionID ?? \"\",\r\n projectDir: PROJECT_DIR,\r\n };\r\n const res = bridge(\"PreToolUse\", payload);\r\n if (!res) return;\r\n // MiMoCode has no \"ask\" gate — degrade \"ask\" to a block (safe direction).\r\n if (res.decision === \"deny\" || res.decision === \"ask\") {\r\n throw new Error(res.reason || \"Blocked by ${ctx.connector.id}\");\r\n }\r\n if (res.updatedInput && output && output.args) {\r\n Object.assign(output.args, res.updatedInput);\r\n }\r\n },`);\r\n }\r\n\r\n if (has(\"PostToolUse\")) {\r\n handlers.push(` // PostToolUse → observe / rewrite tool output (mutate output.output).\r\n \"tool.execute.after\": async (input, output) => {\r\n const payload = {\r\n toolName: input.tool ?? \"\",\r\n toolInput: input.args ?? {},\r\n toolOutput: output ? output.output : undefined,\r\n sessionId: input.sessionID ?? \"\",\r\n projectDir: PROJECT_DIR,\r\n };\r\n const res = bridge(\"PostToolUse\", payload);\r\n if (!res) return;\r\n if (typeof res.updatedOutput === \"string\" && output) {\r\n output.output = res.updatedOutput;\r\n }\r\n },`);\r\n }\r\n\r\n if (has(\"SessionStart\")) {\r\n handlers.push(` // SessionStart surrogate → inject context into the system prompt.\r\n // MiMoCode has no real SessionStart hook (inherited from OpenCode\r\n // #14808 / #5409); experimental.chat.system.transform is the injection point.\r\n \"experimental.chat.system.transform\": async (input, output) => {\r\n const payload = {\r\n sessionId: (input && input.sessionID) ?? \"\",\r\n projectDir: PROJECT_DIR,\r\n };\r\n const res = bridge(\"SessionStart\", payload);\r\n if (!res) return;\r\n if (res.additionalContext && output && Array.isArray(output.system)) {\r\n // Insert at index 1 (after the header) to preserve the prompt-cache\r\n // fold (header must remain system[0]).\r\n output.system.splice(1, 0, res.additionalContext);\r\n }\r\n },`);\r\n }\r\n\r\n if (has(\"UserPromptSubmit\")) {\r\n handlers.push(` // UserPromptSubmit → context injection on prompt submission.\r\n // chat.message fires on the USER's prompt; output.message is a UserMessage\r\n // and output.parts holds the prompt parts. Inject context by PUSHING a text\r\n // part onto output.parts. chat.message has NO documented block/abort\r\n // mechanism, so a \"deny\" decision degrades to a NO-OP (best-effort) — same\r\n // way the tool/system handlers degrade decisions this host cannot honor.\r\n \"chat.message\": async (input, output) => {\r\n const promptText =\r\n output && Array.isArray(output.parts)\r\n ? output.parts\r\n .filter((p) => p && p.type === \"text\" && typeof p.text === \"string\")\r\n .map((p) => p.text)\r\n .join(\"\\\\n\")\r\n : \"\";\r\n const res = bridge(\"UserPromptSubmit\", {\r\n prompt: promptText,\r\n sessionId: (input && input.sessionID) || \"\",\r\n projectDir: PROJECT_DIR,\r\n });\r\n if (!res) return;\r\n if (res.additionalContext && output && Array.isArray(output.parts)) {\r\n output.parts.push({ type: \"text\", text: res.additionalContext });\r\n }\r\n },`);\r\n }\r\n\r\n if (has(\"Stop\")) {\r\n handlers.push(` // Stop → session.idle (\"session finished responding\"). session.idle is NOT a\r\n // direct hook key — it is dispatched through the generic \\`event\\` hook\r\n // switching on event.type (the OpenCode plugin shape, per opencode.ai/docs/\r\n // plugins). A block decision throws to halt (MiMoCode has no Stop-gate return\r\n // value). If session.idle never fires on a given build, Stop is a silent\r\n // no-op (an acceptable degrade — it never mis-fires).\r\n event: async ({ event }) => {\r\n if (!event || event.type !== \"session.idle\") return;\r\n const res = bridge(\"Stop\", {\r\n sessionId: (event.properties && event.properties.sessionID) || \"\",\r\n projectDir: PROJECT_DIR,\r\n });\r\n if (res && res.decision === \"deny\") {\r\n throw new Error(res.reason || \"Stop blocked by ${ctx.connector.id}\");\r\n }\r\n },`);\r\n }\r\n\r\n const factory = `\r\nexport default async function (ctx) {\r\n // ctx.directory is the MiMoCode project root; fall back to cwd.\r\n const PROJECT_DIR =\r\n (ctx && (ctx.directory || (ctx.worktree && ctx.worktree.path))) ||\r\n process.cwd();\r\n\r\n return {\r\n${handlers.join(\"\\n\")}\r\n };\r\n}\r\n`;\r\n\r\n return header + factory;\r\n }\r\n\r\n // ── Runtime: parse OUR bridge payload → normalized event ───────────────\r\n\r\n /**\r\n * `raw` is the payload OUR generated plugin posts (NOT a host-native shape):\r\n * { toolName, toolInput, toolOutput?, isError?, sessionId, projectDir }\r\n * so this maps straight through.\r\n */\r\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\r\n const input = (raw ?? {}) as MiMoCodeBridgePayload;\r\n const base = {\r\n hostPlatform: HOST,\r\n connectorId: \"\",\r\n sessionId: typeof input.sessionId === \"string\" ? input.sessionId : \"\",\r\n raw,\r\n ...(typeof input.projectDir === \"string\"\r\n ? { projectDir: input.projectDir }\r\n : {}),\r\n } as const;\r\n\r\n switch (event) {\r\n case \"PreToolUse\": {\r\n const ev: PreToolUseEvent = {\r\n ...base,\r\n toolName: input.toolName ?? \"\",\r\n toolInput: input.toolInput ?? {},\r\n };\r\n return ev;\r\n }\r\n case \"PostToolUse\": {\r\n const ev: PostToolUseEvent = {\r\n ...base,\r\n toolName: input.toolName ?? \"\",\r\n toolInput: input.toolInput ?? {},\r\n ...(typeof input.toolOutput === \"string\"\r\n ? { toolOutput: input.toolOutput }\r\n : {}),\r\n ...(typeof input.isError === \"boolean\"\r\n ? { isError: input.isError }\r\n : {}),\r\n };\r\n return ev;\r\n }\r\n case \"SessionStart\": {\r\n const ev: SessionStartEvent = { ...base, source: \"startup\" };\r\n return ev;\r\n }\r\n case \"UserPromptSubmit\": {\r\n const ev: UserPromptSubmitEvent = {\r\n ...base,\r\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\r\n };\r\n return ev;\r\n }\r\n case \"Stop\": {\r\n const ev: StopEvent = { ...base };\r\n return ev;\r\n }\r\n default:\r\n // Other canonical events are not surfaced by MiMoCode; treat as a\r\n // session-start-shaped no-op so the dispatcher fails open gracefully.\r\n return { ...base, source: \"startup\" } satisfies SessionStartEvent;\r\n }\r\n }\r\n\r\n // ── Runtime: normalized response → reply the generated bridge parses ───\r\n\r\n /**\r\n * Our generated bridge consumes this stdout directly, so the reply body is the\r\n * NORMALIZED HookResponse itself — the bridge JSON.parses it and reads\r\n * decision / updatedInput / updatedOutput / additionalContext.\r\n */\r\n formatReply(_event: HookEventName, response: HookResponse): HookReply {\r\n return {\r\n exitCode: 0,\r\n stdout: JSON.stringify(response ?? { decision: \"allow\" }),\r\n };\r\n }\r\n\r\n // ── Diagnostics ────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const serverPath = this.getServerConfigPath(ctx);\r\n const pluginPath = this.getHookConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n const hasHooks = ctx.connector.hookEvents.length > 0;\r\n\r\n const checks: HealthCheck[] = [\r\n {\r\n name: `${this.name}: mimocode.json present`,\r\n check: () =>\r\n existsSync(serverPath)\r\n ? { status: \"OK\", detail: serverPath }\r\n : { status: \"FAIL\", detail: `not found: ${serverPath}` },\r\n },\r\n {\r\n name: `${this.name}: mcp.${connectorId} registered`,\r\n check: () => {\r\n if (!ctx.connector.server) {\r\n return { status: \"OK\", detail: \"no MCP server declared\" };\r\n }\r\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(\r\n serverPath,\r\n );\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n if (!cfg || !bucket) {\r\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${serverPath}` };\r\n }\r\n return connectorId in bucket\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\r\n : {\r\n status: \"FAIL\",\r\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${serverPath}`,\r\n };\r\n },\r\n },\r\n {\r\n name: `${this.name}: plugin module present`,\r\n check: () => {\r\n if (!hasHooks) return { status: \"OK\", detail: \"no hooks declared\" };\r\n return existsSync(pluginPath)\r\n ? { status: \"OK\", detail: pluginPath }\r\n : { status: \"FAIL\", detail: `not found: ${pluginPath}` };\r\n },\r\n },\r\n ];\r\n\r\n for (const cmd of ctx.connector.commands) {\r\n const p = this.commandPath(ctx, cmd.name);\r\n checks.push({\r\n name: `${this.name}: command ${cmd.name} present`,\r\n check: () =>\r\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\r\n });\r\n }\r\n for (const skill of ctx.connector.skills) {\r\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\r\n checks.push({\r\n name: `${this.name}: skill ${skill.name} present`,\r\n check: () =>\r\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\r\n });\r\n }\r\n for (const agent of ctx.connector.subagents) {\r\n const p = this.subagentPath(ctx, agent.name);\r\n checks.push({\r\n name: `${this.name}: subagent ${agent.name} present`,\r\n check: () =>\r\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\r\n });\r\n }\r\n return checks;\r\n }\r\n\r\n /** Read a file, returning undefined on any error (idempotency compare). */\r\n}\r\n\r\nexport const adapter = new MiMoCodeAdapter();\r\nexport default adapter;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoDA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAY;AAoCrB,IAAM,OAAmB;AACzB,IAAM,eAAe;AAGrB,IAAM,kBAAkB;AAExB,IAAM,mBAAmB;AAOzB,IAAM,oBAA4D;AAAA,EAChE,YAAY;AAAA,EACZ,aAAa;AAAA;AAAA;AAAA,EAGb,cAAc;AAAA;AAAA;AAAA,EAGd,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlB,MAAM;AACR;AA0BO,IAAM,kBAAN,cAA8B,YAA+B;AAAA,EACzD,KAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAyB;AAAA,EAEzB,eAAqC;AAAA;AAAA;AAAA,IAG5C,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA;AAAA;AAAA,IAGlB,MAAM;AAAA,IACN,cAAc;AAAA;AAAA,IAEd,eAAe;AAAA;AAAA,IAEf,iBAAiB;AAAA;AAAA,IAEjB,yBAAyB;AAAA,IACzB,YAAY,CAAC,SAAS,OAAO,MAAM;AAAA;AAAA;AAAA,IAGnC,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,EACrB;AAAA;AAAA,EAIA,gBAAgB,YAAsC;AACpD,UAAM,gBAAgB,KAAK,QAAQ,GAAG,WAAW,eAAe;AAChE,UAAM,aAAa,KAAK,eAAe,gBAAgB;AACvD,UAAM,gBAAgB,KAAK,YAAY,gBAAgB;AAEvD,UAAM,gBAAgB,WAAW,aAAa,KAAK,WAAW,UAAU;AACxE,UAAM,gBAAgB,WAAW,aAAa;AAC9C,UAAM,YAAY,iBAAiB;AAInC,UAAM,QAAQ,iBAAiB,CAAC,gBAAgB,YAAY;AAC5D,UAAM,aAAa,UAAU,YAAY,gBAAgB;AAEzD,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ,YACJ,UAAU,YACR,oCAAoC,aAAa,KACjD,+BAA+B,aAAa,KAC9C,yBAAyB,aAAa;AAAA,MAC1C,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMmB,cAAc,KAAqC;AACpE,QAAI,KAAK,eAAe,GAAG,GAAG,QAAQ,IAAI,UAAU,WAAW;AAC7D,aAAO,MAAM,cAAc,GAAG;AAAA,IAChC;AACA,UAAM,WAAW,KAAK,IAAI,YAAY,WAAW;AACjD,QAAI,WAAW,QAAQ,GAAG;AACxB,aAAO,CAAC,EAAE,MAAM,UAAU,QAAQ,oDAAoD,CAAC;AAAA,IACzF;AACA,UAAM,WAAW,KAAK,IAAI,YAAY,WAAW;AACjD,QAAI,WAAW,QAAQ,GAAG;AACxB,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,QACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC,EAAE,MAAM,UAAU,QAAQ,2DAA2D,CAAC;AAAA,EAChG;AAAA;AAAA,EAIA,aAAa,KAA6B;AACxC,WAAO,IAAI,UAAU,YACjB,IAAI,aACJ,KAAK,QAAQ,GAAG,WAAW,eAAe;AAAA,EAChD;AAAA,EAEA,oBAAoB,KAA6B;AAC/C,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,gBAAgB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,KAA6B;AAC7C,WAAO,KAAK,KAAK,UAAU,GAAG,GAAG,KAAK,eAAe,GAAG,CAAC;AAAA,EAC3D;AAAA;AAAA,EAGQ,UAAU,KAA6B;AAC7C,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,IAAI,eAAe,IAAI,QAAQ,IACpD,KAAK,QAAQ,GAAG,WAAW,iBAAiB,QAAQ;AAAA,EAC1D;AAAA;AAAA,EAGQ,eAAe,KAA6B;AAClD,WAAO,GAAG,IAAI,UAAU,EAAE;AAAA,EAC5B;AAAA;AAAA,EAIA,cAAc,KAAqC;AACjD,UAAM,SAAS,KAAK,gBAAgB,GAAG;AACvC,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAE/C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,IAAI,UAAU,SAClB,+CACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,kBAAkB,KAAK,MAAM;AAChD,WAAO;AAAA,MACL,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,IAAI,UAAU;AAAA,QACd;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,KAAqC;AACnD,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAC/C,WAAO;AAAA,MACL,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,IAAI,UAAU;AAAA,QACd,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,gBAAgB,KAA4C;AAClE,UAAM,WAAW,IAAI,UAAU,UAAU,IAAI,GAAG;AAChD,QAAI,aAAa,MAAO,QAAO;AAC/B,UAAM,OAAO,IAAI,UAAU;AAC3B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,YAAY,OAAO,aAAa,WAAW,EAAE,GAAG,MAAM,GAAG,SAAS,IAAI;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,kBACN,KACA,QAC4C;AAC5C,UAAM,YAAuB,OAAO;AAEpC,QAAI,cAAc,SAAS;AACzB,UAAI,UAAU,OAAO,WAAW;AAChC,UAAI,OAAO,CAAC,GAAI,OAAO,QAAQ,CAAC,CAAE;AAElC,OAAC,EAAE,SAAS,KAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI,SAAS,IAAI;AAE1E,YAAM,eAAe,mBAAmB,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE;AAAA,QAC1D,CAAC,MAAM,MAAM;AAAA,MACf;AACA,YAAMA,SAA6B;AAAA,QACjC,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AACA,YAAM,cAAc,KAAK,UAAU,OAAO,GAAG;AAC7C,UAAI,YAAa,CAAAA,OAAM,cAAc;AACrC,UAAI,OAAO,YAAY,MAAO,CAAAA,OAAM,UAAU;AAC9C,aAAOA;AAAA,IACT;AAGA,UAAM,QAA8B;AAAA,MAClC,MAAM;AAAA,MACN,KAAK,mBAAmB,OAAO,OAAO,EAAE;AAAA,IAC1C;AACA,QAAI,OAAO,YAAY,MAAO,OAAM,UAAU;AAC9C,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,UACN,KACoC;AACpC,QAAI,CAAC,OAAO,OAAO,KAAK,GAAG,EAAE,WAAW,EAAG,QAAO;AAClD,WAAO,mBAAmB,EAAE,GAAG,IAAI,CAAC;AAAA,EACtC;AAAA;AAAA,EAIA,aAAa,KAAqC;AAChD,UAAM,aAAa,KAAK,kBAAkB,GAAG;AAE7C,QAAI,IAAI,UAAU,UAAU,IAAI,GAAG,UAAU,OAAO;AAClD,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,UAAU,WAAW,WAAW,GAAG;AACzC,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,iBAAiB,GAAG;AACvC,UAAM,UAA0B,CAAC;AAEjC,eAAW,QAAQ,OAAO;AACxB,cAAQ;AAAA,QACN,KAAK;AAAA,UACH,KAAK;AAAA,UACL,KAAK;AAAA,UACL,IAAI;AAAA,UACJ,4BAA4B,KAAK,WAAW,GAAG,CAAC;AAAA,UAChD,KAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,WAAW,KAA6B;AAC9C,UAAM,WAAW,IAAI,UAAU;AAC/B,UAAM,SAAS,SAAS,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,MAAS;AACxE,UAAM,cAAc,SAAS,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,MAAS;AAC7E,UAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,WAAO,YAAY,SAAS,IACxB,GAAG,IAAI,uBAAuB,YAAY,KAAK,GAAG,CAAC,KACnD;AAAA,EACN;AAAA,EAEA,eAAe,KAAqC;AAClD,UAAM,aAAa,KAAK,kBAAkB,GAAG;AAC7C,WAAO;AAAA,MACL,KAAK;AAAA,QACH;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,eAAe,KAA6B;AAClD,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,IAAI,eAAe,EAAE,IAC1C,KAAK,aAAa,GAAG;AAAA,EAC3B;AAAA,EACQ,YAAY,KAA6B;AAC/C,WAAO,KAAK,KAAK,eAAe,GAAG,GAAG,UAAU;AAAA,EAClD;AAAA,EACQ,UAAU,KAA6B;AAC7C,WAAO,KAAK,KAAK,eAAe,GAAG,GAAG,QAAQ;AAAA,EAChD;AAAA,EACQ,SAAS,KAA6B;AAC5C,WAAO,KAAK,KAAK,eAAe,GAAG,GAAG,OAAO;AAAA,EAC/C;AAAA;AAAA,EAGQ,YAAY,KAAqB,MAAsB;AAC7D,WAAO,KAAK,KAAK,YAAY,GAAG,GAAG,GAAG,IAAI,KAAK;AAAA,EACjD;AAAA;AAAA,EAEQ,SAAS,KAAqB,MAAsB;AAC1D,WAAO,KAAK,KAAK,UAAU,GAAG,GAAG,IAAI;AAAA,EACvC;AAAA;AAAA,EAEQ,aAAa,KAAqB,MAAsB;AAC9D,WAAO,KAAK,KAAK,SAAS,GAAG,GAAG,GAAG,IAAI,KAAK;AAAA,EAC9C;AAAA;AAAA,EAIS,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,aAAa,OAAO;AACjD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK;AAAA,QACH,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA,QAC9B,KAAK,cAAc,GAAG;AAAA,QACtB,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,kBAAkB,KAAqC;AAC9D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK,kBAAkB,KAAK,YAAY,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGQ,cAAc,KAAyB;AAC7C,UAAM,cAAuC,CAAC;AAC9C,QAAI,IAAI,gBAAgB,OAAW,aAAY,cAAc,IAAI;AACjE,QAAI,IAAI,UAAU,OAAW,aAAY,QAAQ,IAAI;AACrD,QAAI,IAAI,YAAY,OAAW,aAAY,UAAU,IAAI;AACzD,QAAI,IAAI,MAAO,QAAO,OAAO,aAAa,IAAI,KAAK;AACnD,WAAO,KAAK,oBAAoB,aAAa,IAAI,MAAM;AAAA,EACzD;AAAA;AAAA,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,WAAW,OAAO;AAC/C,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,gCAAgC,CAAC;AAAA,IACxF;AACA,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ;AAAA,QACN,KAAK,iBAAiB,KAAK,KAAK,UAAU,GAAG,cAAc,KAAK,GAAG,IAAI,MAAM;AAAA,MAC/E;AACA,iBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC,GAAG;AACnE,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,MAAM;AACnB,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,mBAAmB,GAAG;AAAA,UAChC,CAAC;AACD;AAAA,QACF;AACA,gBAAQ,KAAK,KAAK,iBAAiB,QAAQ,UAAU,IAAI,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ,KAAK,KAAK,kBAAkB,KAAK,KAAK,UAAU,GAAG,IAAI,MAAM,CAAC;AACtE,iBAAW,OAAO,OAAO,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AACpD,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,KAAM;AACrB,gBAAQ,KAAK,KAAK,kBAAkB,QAAQ,IAAI,MAAM,CAAC;AAAA,MACzD;AACA,cAAQ,KAAK,KAAK,iBAAiB,KAAK,IAAI,MAAM,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIS,iBAAiB,KAAqC;AAC7D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,cAAc,OAAO;AAClD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,mCAAmC,CAAC;AAAA,IAC3F;AACA,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK;AAAA,QACH,KAAK,aAAa,KAAK,MAAM,IAAI;AAAA,QACjC,yBAAyB,KAAK;AAAA,QAC9B,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,mBAAmB,KAAqC;AAC/D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK,kBAAkB,KAAK,aAAa,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iBAAiB,KAA4C;AAC3D,UAAM,OAAO,KAAK,kBAAkB,GAAG;AACvC,UAAM,WAAW,KAAK,kBAAkB,GAAG;AAC3C,WAAO,CAAC,EAAE,MAAM,UAAU,YAAY,MAAM,CAAC;AAAA,EAC/C;AAAA;AAAA,EAGQ,kBAAkB,KAA6B;AACrD,UAAM,SAAS,IAAI,UAAU,WAAW;AAAA,MACtC,CAAC,MAA0B,kBAAkB,CAAC,MAAM;AAAA,IACtD;AACA,UAAM,MAAM,CAAC,MAAqB,OAAO,SAAS,CAAC;AAEnD,UAAM,SAAS;AAAA;AAAA;AAAA,yDAGsC,IAAI,UAAU,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvE,oBAAoB;AAAA,MACpB,SAAS,IAAI;AAAA,MACb,aAAa,IAAI,UAAU;AAAA,MAC3B,UAAU;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB,CAAC,CAAC;AAAA;AAGE,UAAM,WAAqB,CAAC;AAE5B,QAAI,IAAI,YAAY,GAAG;AACrB,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAYgC,IAAI,UAAU,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,OAK7D;AAAA,IACH;AAEA,QAAI,IAAI,aAAa,GAAG;AACtB,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAcb;AAAA,IACH;AAEA,QAAI,IAAI,cAAc,GAAG;AACvB,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAeb;AAAA,IACH;AAEA,QAAI,IAAI,kBAAkB,GAAG;AAC3B,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAuBb;AAAA,IACH;AAEA,QAAI,IAAI,MAAM,GAAG;AACf,eAAS,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yDAaqC,IAAI,UAAU,EAAE;AAAA;AAAA,OAElE;AAAA,IACH;AAEA,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAKjB,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,OAAsB,KAA+B;AAC9D,UAAM,QAAS,OAAO,CAAC;AACvB,UAAM,OAAO;AAAA,MACX,cAAc;AAAA,MACd,aAAa;AAAA,MACb,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,MACnE;AAAA,MACA,GAAI,OAAO,MAAM,eAAe,WAC5B,EAAE,YAAY,MAAM,WAAW,IAC/B,CAAC;AAAA,IACP;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,UAAU,MAAM,YAAY;AAAA,UAC5B,WAAW,MAAM,aAAa,CAAC;AAAA,QACjC;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,KAAuB;AAAA,UAC3B,GAAG;AAAA,UACH,UAAU,MAAM,YAAY;AAAA,UAC5B,WAAW,MAAM,aAAa,CAAC;AAAA,UAC/B,GAAI,OAAO,MAAM,eAAe,WAC5B,EAAE,YAAY,MAAM,WAAW,IAC/B,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,YAAY,YACzB,EAAE,SAAS,MAAM,QAAQ,IACzB,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,KAAwB,EAAE,GAAG,MAAM,QAAQ,UAAU;AAC3D,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,KAA4B;AAAA,UAChC,GAAG;AAAA,UACH,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,QAC5D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,KAAgB,EAAE,GAAG,KAAK;AAChC,eAAO;AAAA,MACT;AAAA,MACA;AAGE,eAAO,EAAE,GAAG,MAAM,QAAQ,UAAU;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,QAAuB,UAAmC;AACpE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,KAAK,UAAU,YAAY,EAAE,UAAU,QAAQ,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA,EAIS,gBAAgB,KAA6C;AACpE,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAC/C,UAAM,aAAa,KAAK,kBAAkB,GAAG;AAC7C,UAAM,cAAc,IAAI,UAAU;AAClC,UAAM,WAAW,IAAI,UAAU,WAAW,SAAS;AAEnD,UAAM,SAAwB;AAAA,MAC5B;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MACL,WAAW,UAAU,IACjB,EAAE,QAAQ,MAAM,QAAQ,WAAW,IACnC,EAAE,QAAQ,QAAQ,QAAQ,cAAc,UAAU,GAAG;AAAA,MAC7D;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI,SAAS,WAAW;AAAA,QACtC,OAAO,MAAM;AACX,cAAI,CAAC,IAAI,UAAU,QAAQ;AACzB,mBAAO,EAAE,QAAQ,MAAM,QAAQ,yBAAyB;AAAA,UAC1D;AACA,gBAAM,MAAM,KAAK;AAAA,YACf;AAAA,UACF;AACA,gBAAM,SAAS,MAAM,YAAY;AACjC,cAAI,CAAC,OAAO,CAAC,QAAQ;AACnB,mBAAO,EAAE,QAAQ,QAAQ,QAAQ,MAAM,YAAY,OAAO,UAAU,GAAG;AAAA,UACzE;AACA,iBAAO,eAAe,SAClB,EAAE,QAAQ,MAAM,QAAQ,GAAG,YAAY,IAAI,WAAW,WAAW,IACjE;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ,MAAM,YAAY,IAAI,WAAW,OAAO,UAAU;AAAA,UAC5D;AAAA,QACN;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MAAM;AACX,cAAI,CAAC,SAAU,QAAO,EAAE,QAAQ,MAAM,QAAQ,oBAAoB;AAClE,iBAAO,WAAW,UAAU,IACxB,EAAE,QAAQ,MAAM,QAAQ,WAAW,IACnC,EAAE,QAAQ,QAAQ,QAAQ,cAAc,UAAU,GAAG;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAEA,eAAW,OAAO,IAAI,UAAU,UAAU;AACxC,YAAM,IAAI,KAAK,YAAY,KAAK,IAAI,IAAI;AACxC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,aAAa,IAAI,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,QAAQ;AACxC,YAAM,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,UAAU;AACzD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,WAAW,MAAM,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,WAAW;AAC3C,YAAM,IAAI,KAAK,aAAa,KAAK,MAAM,IAAI;AAC3C,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,cAAc,MAAM,IAAI;AAAA,QAC1C,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAGF;AAEO,IAAM,UAAU,IAAI,gBAAgB;AAC3C,IAAO,oBAAQ;","names":["entry"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
resolveEnvRefsDeep
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-XXLCMSD3.js";
|
|
5
5
|
import {
|
|
6
6
|
BaseAdapter
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-3FINQ2ZF.js";
|
|
8
8
|
import {
|
|
9
9
|
buildWrappedStdio
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-Y3K6KJMS.js";
|
|
11
|
+
import "./chunk-ILWHLGIC.js";
|
|
12
12
|
import {
|
|
13
13
|
ensureDir
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-QYOUQCC6.js";
|
|
15
15
|
|
|
16
16
|
// src/adapters/mistral-vibe/index.ts
|
|
17
17
|
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -297,4 +297,4 @@ export {
|
|
|
297
297
|
adapter,
|
|
298
298
|
mistral_vibe_default as default
|
|
299
299
|
};
|
|
300
|
-
//# sourceMappingURL=mistral-vibe-
|
|
300
|
+
//# sourceMappingURL=mistral-vibe-LT3DAJ3L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mistral-vibe/index.ts"],"sourcesContent":["/**\r\n * adapters/mistral-vibe — Mistral Vibe (Mistral's coding-agent CLI) adapter.\r\n *\r\n * Mistral Vibe is an **mcp-only** host: it registers MCP servers but exposes no\r\n * user-installable lifecycle-hook surface AC can wire today. Its native config\r\n * is TOML, with a two-level lookup order (project precedes user):\r\n * 1. <projectDir>/.vibe/config.toml (PROJECT — takes precedence)\r\n * 2. ~/.vibe/config.toml (USER)\r\n *\r\n * MCP shape — byte-confirmed from the OFFICIAL repo README\r\n * (github.com/mistralai/mistral-vibe) + docs (docs.mistral.ai/vibe/code/cli/\r\n * configuration + /mcp-servers): the root key `mcp_servers` is a TOML\r\n * ARRAY-OF-TABLES (`[[mcp_servers]]`), NOT codex's table-keyed\r\n * `[mcp_servers.<name>]`. Each entry carries a REQUIRED short-alias `name` field\r\n * — AC writes the CONNECTOR ID there and keys ownership on it (the array-by-name\r\n * merge the `continue` adapter uses for YAML, applied over TOML):\r\n *\r\n * [[mcp_servers]]\r\n * name = \"fetch_server\"\r\n * transport = \"stdio\"\r\n * command = \"uvx\"\r\n * args = [\"mcp-server-fetch\"]\r\n * env = { \"DEBUG\" = \"1\", \"LOG_LEVEL\" = \"info\" }\r\n *\r\n * [[mcp_servers]]\r\n * name = \"my_http_server\"\r\n * transport = \"http\"\r\n * url = \"http://localhost:8000\"\r\n * headers = { \"Authorization\" = \"Bearer my_token\" }\r\n * api_key_env = \"MY_API_KEY_ENV_VAR\"\r\n *\r\n * Per-entry fields:\r\n * - name (required short alias — the connector id)\r\n * - transport (\"stdio\" | \"http\" | \"streamable-http\")\r\n * - stdio → command / args / env\r\n * - http/sse → url / headers / api_key_env / api_key_header / api_key_format\r\n * - optional startup_timeout_sec / tool_timeout_sec\r\n *\r\n * TOML has NO native interpolation token, so every `${env:VAR}` is resolved to a\r\n * literal at install time (the safe path matching codex/droid). The stdio entry\r\n * is routed through the telemetry serve-wrapper (`<homeBin> serve --connector\r\n * <id> -- <command> <args...>`); remote transports are registered but never\r\n * wrapped (they cannot be intercepted).\r\n *\r\n * HOOKS: HONEST CEILING — Mistral Vibe ships only an experimental, unstable hook\r\n * surface (no byte-confirmed format/event-name contract), so AC wires NO hooks\r\n * here. The capability flags stay unset and the host is reported mcp-only (the\r\n * generic installHooks reports \"hooks unavailable\"). When a first-party hook\r\n * contract is byte-confirmed this becomes a normal capability addition.\r\n */\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport TOML from \"@iarna/toml\";\r\n\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookParadigm,\r\n PlatformCapabilities,\r\n PlatformId,\r\n ServerDef,\r\n Transport,\r\n} from \"../../core/types.js\";\r\nimport { ensureDir } from \"../../core/paths.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport { buildWrappedStdio } from \"../../core/spawn.js\";\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport type { Adapter, InstallContext } from \"../spi.js\";\r\n\r\nconst HOST: PlatformId = \"mistral-vibe\";\r\n/** Root key under which Mistral Vibe stores MCP servers — a TOML ARRAY-OF-TABLES. */\r\nconst MCP_ROOT_KEY = \"mcp_servers\";\r\n\r\n/**\r\n * Native Mistral Vibe MCP server entry shapes. `name` is the required short\r\n * alias (we key ownership on it). A stdio entry carries an explicit\r\n * `transport: \"stdio\"` + command/args/env; a remote entry carries the chosen\r\n * transport + url/headers. NO api_key_* / *_timeout_sec unless declared.\r\n */\r\ninterface VibeStdioServer {\r\n name: string;\r\n transport: \"stdio\";\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n}\r\ninterface VibeRemoteServer {\r\n name: string;\r\n transport: \"http\" | \"streamable-http\";\r\n url: string;\r\n headers?: Record<string, string>;\r\n}\r\ntype VibeServer = VibeStdioServer | VibeRemoteServer;\r\n\r\nexport class MistralVibeAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Mistral Vibe\";\r\n readonly paradigm: HookParadigm = \"mcp-only\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // mcp-only: no hook layer wired (experimental host hooks are not\r\n // byte-confirmed — see header HONEST CEILING). No memory/content surfaces\r\n // wired either; only the MCP server is installed. Every hook capability is\r\n // false.\r\n preToolUse: false,\r\n postToolUse: false,\r\n preCompact: false,\r\n sessionStart: false,\r\n sessionEnd: false,\r\n userPromptSubmit: false,\r\n stop: false,\r\n notification: false,\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: false,\r\n // Mistral Vibe registers stdio + remote (http / streamable-http) MCP\r\n // servers. The framework's `http` transport maps to Vibe's \"http\"; `sse`\r\n // maps to Vibe's \"streamable-http\" (its closest remote form).\r\n transports: [\"stdio\", \"http\", \"sse\"],\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(projectDir: string): DetectedPlatform {\r\n const userDir = this.userConfigDir();\r\n const userCfg = join(userDir, \"config.toml\");\r\n const projDir = join(projectDir, \".vibe\");\r\n const projCfg = join(projDir, \"config.toml\");\r\n\r\n const userInstalled = existsSync(userDir) || existsSync(userCfg);\r\n const projInstalled = existsSync(projDir) || existsSync(projCfg);\r\n const installed = userInstalled || projInstalled;\r\n // Project config.toml takes precedence in Vibe's lookup order, so a\r\n // project-only install reports project scope.\r\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\r\n const configPath = scope === \"project\" ? projCfg : userCfg;\r\n\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope,\r\n reason: installed\r\n ? `found Mistral Vibe config (${scope}) at ${configPath}`\r\n : `no .vibe config at ${userDir} or ${projDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Native paths ─────────────────────────────────────────────────────────\r\n\r\n /** ~/.vibe (user) or <projectDir>/.vibe (project). */\r\n override getConfigDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".vibe\")\r\n : this.userConfigDir();\r\n }\r\n\r\n /** MCP config: config.toml under the per-scope .vibe dir. */\r\n override getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"config.toml\");\r\n }\r\n\r\n /**\r\n * Mistral Vibe has no AC-wired hook file (mcp-only — see header). The hook\r\n * \"config path\" is the same config.toml so the generic doctor/backup behave\r\n * sensibly (mirrors warp/zed).\r\n */\r\n override getHookConfigPath(ctx: InstallContext): string {\r\n return this.getServerConfigPath(ctx);\r\n }\r\n\r\n /** ~/.vibe — homedir() covers %USERPROFILE% on Windows. */\r\n private userConfigDir(): string {\r\n return join(homedir(), \".vibe\");\r\n }\r\n\r\n // ── TOML config IO ─────────────────────────────────────────────────────────\r\n\r\n private readToml(path: string): Record<string, unknown> {\r\n if (!existsSync(path)) return {};\r\n try {\r\n return TOML.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>;\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n private writeToml(path: string, data: Record<string, unknown>, dryRun: boolean): void {\r\n if (dryRun) return;\r\n ensureDir(dirname(path));\r\n // @iarna/toml's stringify type wants its JsonMap; our object is structurally compatible.\r\n writeFileSync(path, TOML.stringify(data as never), \"utf8\");\r\n }\r\n\r\n // ── MCP server install / uninstall (TOML — ARRAY-OF-TABLES, by `name`) ──────\r\n\r\n override installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const server = this.effectiveServer(ctx);\r\n\r\n if (!server) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: connector.server\r\n ? \"server registration disabled for mistral-vibe\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n // Merge into existing TOML, preserving every other config key + sibling\r\n // mcp_servers entry. mcp_servers is a TOML ARRAY-OF-TABLES; we key on `name`.\r\n const cfg = this.readToml(path);\r\n // NEVER clobber a malformed `mcp_servers`: if it exists and is not an array,\r\n // skip-and-warn (symmetric with uninstallServer) rather than silently\r\n // replacing the user's hand-written value.\r\n const existingRoot = cfg[MCP_ROOT_KEY];\r\n if (existingRoot !== undefined && !Array.isArray(existingRoot)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `${MCP_ROOT_KEY} is not a TOML array — left untouched (manual fix needed)`,\r\n },\r\n ];\r\n }\r\n\r\n const list = Array.isArray(existingRoot) ? (existingRoot as VibeServer[]) : [];\r\n const idx = list.findIndex((e) => this.entryName(e) === connector.id);\r\n\r\n let action: ChangeRecord[\"action\"];\r\n if (idx < 0) {\r\n list.push(entry);\r\n action = \"create\";\r\n } else if (JSON.stringify(list[idx]) === JSON.stringify(entry)) {\r\n action = \"skip\";\r\n } else {\r\n list[idx] = entry;\r\n action = \"update\";\r\n }\r\n\r\n if (action !== \"skip\") {\r\n cfg[MCP_ROOT_KEY] = list;\r\n this.writeToml(path, cfg, dryRun);\r\n }\r\n return [{ platform: this.id, action, path, detail: `${MCP_ROOT_KEY}[name=${connector.id}]` }];\r\n }\r\n\r\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const path = this.getServerConfigPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n const cfg = this.readToml(path);\r\n const rawList = cfg[MCP_ROOT_KEY];\r\n if (!Array.isArray(rawList)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `${MCP_ROOT_KEY}[name=${connector.id}] absent`,\r\n },\r\n ];\r\n }\r\n\r\n const list = rawList as VibeServer[];\r\n const kept = list.filter((e) => this.entryName(e) !== connector.id);\r\n if (kept.length === list.length) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `${MCP_ROOT_KEY}[name=${connector.id}] absent`,\r\n },\r\n ];\r\n }\r\n\r\n cfg[MCP_ROOT_KEY] = kept;\r\n this.writeToml(path, cfg, dryRun);\r\n return [\r\n { platform: this.id, action: \"remove\", path, detail: `${MCP_ROOT_KEY}[name=${connector.id}]` },\r\n ];\r\n }\r\n\r\n /**\r\n * Render a normalized ServerDef into Mistral Vibe's native mcp_servers entry.\r\n * TOML has no native ${env:VAR} token — resolve every reference to a literal at\r\n * install time (the safe path, matching codex/droid). Honors the telemetry\r\n * serve-wrapper for stdio.\r\n */\r\n private renderServerEntry(ctx: InstallContext, server: ServerDef): VibeServer {\r\n const transport: Transport = server.transport;\r\n\r\n if (transport === \"stdio\") {\r\n let command = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n command = resolveEnvRefsDeep(command);\r\n args = resolveEnvRefsDeep(args);\r\n\r\n const entry: VibeStdioServer = {\r\n name: ctx.connector.id,\r\n transport: \"stdio\",\r\n command,\r\n };\r\n if (args.length > 0) entry.args = args;\r\n const env = this.renderEnv(server.env);\r\n if (env) entry.env = env;\r\n return entry;\r\n }\r\n\r\n // Remote (sse / http / ws) — Vibe registers an explicit transport + url. The\r\n // framework's `http` transport maps to Vibe's \"http\"; `sse` maps to\r\n // \"streamable-http\" (ws has no Vibe analog → also \"streamable-http\", the\r\n // closest documented remote form).\r\n const vibeTransport: VibeRemoteServer[\"transport\"] =\r\n transport === \"http\" ? \"http\" : \"streamable-http\";\r\n const entry: VibeRemoteServer = {\r\n name: ctx.connector.id,\r\n transport: vibeTransport,\r\n url: resolveEnvRefsDeep(server.url ?? \"\"),\r\n };\r\n const headers = this.renderEnv(server.headers);\r\n if (headers) entry.headers = headers;\r\n return entry;\r\n }\r\n\r\n /**\r\n * Render env/header values. Resolve `${env:VAR}` references to literals at\r\n * install time (TOML cannot interpolate).\r\n */\r\n private renderEnv(\r\n env: Record<string, string> | undefined,\r\n ): Record<string, string> | undefined {\r\n if (!env || Object.keys(env).length === 0) return undefined;\r\n const out: Record<string, string> = {};\r\n for (const [k, v] of Object.entries(resolveEnvRefsDeep({ ...env }))) {\r\n out[k] = String(v);\r\n }\r\n return out;\r\n }\r\n\r\n // ── Hooks (unavailable — Mistral Vibe is mcp-only) ───────────────────────\r\n // HONEST CEILING: Vibe ships only an experimental hook surface with no\r\n // byte-confirmed format/event-name contract, so AC wires no hooks here.\r\n\r\n installHooks(_ctx: InstallContext): ChangeRecord[] {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"hooks unavailable (Mistral Vibe is mcp-only)\",\r\n },\r\n ];\r\n }\r\n\r\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"hooks unavailable (Mistral Vibe is mcp-only)\",\r\n },\r\n ];\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const path = this.getServerConfigPath(ctx);\r\n const id = ctx.connector.id;\r\n return [\r\n {\r\n name: `${this.name}: config.toml present`,\r\n check: () =>\r\n existsSync(path)\r\n ? { status: \"OK\", detail: path }\r\n : { status: \"FAIL\", detail: `not found: ${path}` },\r\n },\r\n {\r\n name: `${this.name}: ${MCP_ROOT_KEY}[name=${id}] registered`,\r\n check: () => {\r\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\r\n const cfg = this.readToml(path);\r\n const list = cfg[MCP_ROOT_KEY];\r\n const present =\r\n Array.isArray(list) &&\r\n (list as VibeServer[]).some((e) => this.entryName(e) === id);\r\n return present\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}[name=${id}]` }\r\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}[name=${id}] not found in ${path}` };\r\n },\r\n },\r\n ];\r\n }\r\n\r\n // ── Internal helpers ──────────────────────────────────────────────────────\r\n\r\n /** The `name` of an array entry, or undefined when it is not a named object. */\r\n private entryName(entry: unknown): string | undefined {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return undefined;\r\n const name = (entry as { name?: unknown }).name;\r\n return typeof name === \"string\" ? name : undefined;\r\n }\r\n\r\n /** Resolve the per-platform server override into an effective ServerDef. */\r\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\r\n const override = ctx.connector.platforms[this.id]?.server;\r\n if (override === false) return undefined;\r\n const base = ctx.connector.server;\r\n if (!base) return undefined;\r\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\r\n }\r\n}\r\n\r\nexport const adapter = new MistralVibeAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
fileMtimeMs,
|
|
4
4
|
readJsonFile
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-ZSOS2KOR.js";
|
|
6
6
|
import {
|
|
7
7
|
firstExistingRoot,
|
|
8
8
|
walkFiles
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-KM2YXO6V.js";
|
|
10
10
|
import {
|
|
11
11
|
emptyTokens
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7PSNXUFK.js";
|
|
13
13
|
|
|
14
14
|
// src/usage/readers/mux.ts
|
|
15
15
|
import { basename, dirname } from "path";
|
|
@@ -93,4 +93,4 @@ var mux_default = muxReader;
|
|
|
93
93
|
export {
|
|
94
94
|
mux_default as default
|
|
95
95
|
};
|
|
96
|
-
//# sourceMappingURL=mux-
|
|
96
|
+
//# sourceMappingURL=mux-7PIJ7HUQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/usage/readers/mux.ts"],"sourcesContent":["/**\r\n * usage/readers/mux — Mux (Coder) native session-usage reader.\r\n *\r\n * Faithful port of tokscale sessions/mux.rs. Reads the aggregate\r\n * ~/.mux/sessions/<workspaceId>/session-usage.json file (one per workspace).\r\n * This is NOT a JSONL log: each file is a single JSON object carrying a\r\n * `byModel` map keyed by `<provider>:<model>`, with one cumulative token bucket\r\n * group per model used in the session:\r\n * byModel.<key>.input.tokens → input\r\n * byModel.<key>.cached.tokens → cacheRead\r\n * byModel.<key>.cacheCreate.tokens → cacheWrite\r\n * byModel.<key>.output.tokens → output\r\n * byModel.<key>.reasoning.tokens → reasoning\r\n * Each bucket also carries an optional `.cost_usd`; the Rust sums those across\r\n * the five buckets into a source cost, but cost is out of scope for v1 readers\r\n * (matching the droid/amp JSON siblings) so we do not emit it. Negative token\r\n * counts are clamped to 0 and an entry whose five dimensions sum to 0 is dropped.\r\n *\r\n * One UsageRecord is produced per `byModel` entry (model used in the session).\r\n * The model key is split on the FIRST ':' only: the prefix is the provider id,\r\n * the remainder is the model id (so \"provider:sub:model\" → provider=\"provider\",\r\n * model=\"sub:model\"). A key with no ':' yields an empty provider and the full\r\n * key as the model id (matching the Rust empty-string provider).\r\n *\r\n * Session id is the parent directory name (the workspaceId), e.g.\r\n * \".../sessions/abc123/session-usage.json\" → \"abc123\". The session-usage.json\r\n * structure carries no cwd/dir, so there is no project attribution. Timestamp\r\n * prefers `lastRequest.timestamp` (i64 epoch milliseconds), falling back to the\r\n * file mtime. No dedup is needed — the file is an aggregate, not an incremental\r\n * log, and each model key appears once. Confidence is \"host-reported\".\r\n *\r\n * Fail-open: no root → []; unreadable/malformed file → skipped (never throws).\r\n */\r\n\r\nimport { basename, dirname } from \"node:path\";\r\n\r\nimport type { UsageReader, UsageRecord } from \"../types.js\";\r\nimport { emptyTokens } from \"../aggregate.js\";\r\nimport { fileMtimeMs, readJsonFile } from \"../jsonl.js\";\r\nimport { firstExistingRoot, walkFiles } from \"../paths.js\";\r\n\r\nconst PLATFORM_ID = \"mux\" as const;\r\n\r\n/** A single token bucket within a model entry (every field optional / unknown). */\r\ninterface MuxTokenBucket {\r\n tokens?: unknown;\r\n}\r\n\r\n/** One model entry under `byModel` (every bucket optional / unknown). */\r\ninterface MuxModelUsage {\r\n input?: MuxTokenBucket;\r\n cached?: MuxTokenBucket;\r\n cacheCreate?: MuxTokenBucket;\r\n output?: MuxTokenBucket;\r\n reasoning?: MuxTokenBucket;\r\n}\r\n\r\n/** The session-usage.json shape we read (everything optional / unknown). */\r\ninterface MuxSessionUsage {\r\n byModel?: unknown;\r\n lastRequest?: {\r\n timestamp?: unknown;\r\n };\r\n}\r\n\r\n/**\r\n * Coerce a bucket's token count to a non-negative integer, mirroring the Rust\r\n * closure `b.as_ref().and_then(|b| b.tokens).unwrap_or(0).max(0)`: absent or\r\n * non-numeric → 0, negatives clamped to 0.\r\n */\r\nfunction bucketTokens(bucket: MuxTokenBucket | undefined): number {\r\n const v = bucket?.tokens;\r\n const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\r\n if (!Number.isFinite(n)) return 0;\r\n return Math.max(0, Math.trunc(n));\r\n}\r\n\r\n/**\r\n * Parse a `lastRequest.timestamp` to epoch ms, or null when unusable. Mux logs\r\n * an i64 of epoch milliseconds, so a positive finite number is taken verbatim\r\n * (no seconds heuristic — the Rust treats it as raw millis).\r\n */\r\nfunction parseTimestampMs(v: unknown): number | null {\r\n if (typeof v === \"number\" && Number.isFinite(v) && v > 0) return Math.trunc(v);\r\n if (typeof v === \"string\") {\r\n const n = Number(v);\r\n if (Number.isFinite(n) && n > 0) return Math.trunc(n);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Split a model key on the FIRST ':' into provider + model (port of the Rust\r\n * splitn(2, ':')): \"anthropic:claude-opus-4-6\" → { provider: \"anthropic\",\r\n * model: \"claude-opus-4-6\" }; \"provider:sub:model\" → { provider: \"provider\",\r\n * model: \"sub:model\" }; a key with no ':' → empty provider, full key as model.\r\n */\r\nfunction splitModelKey(key: string): { provider: string; model: string } {\r\n const colon = key.indexOf(\":\");\r\n if (colon < 0) return { provider: \"\", model: key };\r\n return { provider: key.slice(0, colon), model: key.slice(colon + 1) };\r\n}\r\n\r\n/** Parse one mux session-usage.json file into usage records (port of parse_mux_file). */\r\nfunction parseMuxFile(path: string): UsageRecord[] {\r\n const raw = readJsonFile(path);\r\n if (typeof raw !== \"object\" || raw === null) return [];\r\n const usage = raw as MuxSessionUsage;\r\n\r\n const byModel = usage.byModel;\r\n if (typeof byModel !== \"object\" || byModel === null) return [];\r\n\r\n // Timestamp: lastRequest.timestamp (epoch ms) else the file mtime.\r\n const ts = parseTimestampMs(usage.lastRequest?.timestamp) ?? fileMtimeMs(path);\r\n\r\n // Session id = the parent directory name (the workspaceId).\r\n const sessionId = basename(dirname(path));\r\n\r\n const out: UsageRecord[] = [];\r\n for (const [modelKey, value] of Object.entries(byModel as Record<string, unknown>)) {\r\n if (typeof value !== \"object\" || value === null) continue;\r\n const modelUsage = value as MuxModelUsage;\r\n\r\n const input = bucketTokens(modelUsage.input);\r\n const cacheRead = bucketTokens(modelUsage.cached);\r\n const cacheWrite = bucketTokens(modelUsage.cacheCreate);\r\n const output = bucketTokens(modelUsage.output);\r\n const reasoning = bucketTokens(modelUsage.reasoning);\r\n\r\n // Skip entries with no tokens in any dimension.\r\n if (input + cacheRead + cacheWrite + output + reasoning === 0) continue;\r\n\r\n const { provider, model } = splitModelKey(modelKey);\r\n\r\n const tokens = emptyTokens();\r\n tokens.input = input;\r\n tokens.output = output;\r\n tokens.cacheRead = cacheRead;\r\n tokens.cacheWrite = cacheWrite;\r\n tokens.reasoning = reasoning;\r\n\r\n out.push({\r\n platformId: PLATFORM_ID,\r\n modelId: model,\r\n providerId: provider,\r\n sessionId,\r\n tokens,\r\n ts,\r\n messageCount: 1,\r\n confidence: \"host-reported\",\r\n });\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/** The Mux (Coder) usage reader singleton. */\r\nconst muxReader: UsageReader = {\r\n platformId: PLATFORM_ID,\r\n kind: \"local\",\r\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\r\n const root = firstExistingRoot(PLATFORM_ID);\r\n if (root === undefined) return []; // no ~/.mux/sessions → fail-open\r\n\r\n // ~/.mux/sessions/<workspaceId>/session-usage.json\r\n const files = walkFiles(root, (name) => name === \"session-usage.json\");\r\n\r\n const records: UsageRecord[] = [];\r\n for (const file of files) {\r\n const rows = parseMuxFile(file);\r\n for (const row of rows) {\r\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\r\n records.push(row);\r\n }\r\n }\r\n return records;\r\n },\r\n};\r\n\r\nexport default muxReader;\r\n"],"mappings":";;;;;;;;;;;;;;AAkCA,SAAS,UAAU,eAAe;AAOlC,IAAM,cAAc;AA6BpB,SAAS,aAAa,QAA4C;AAChE,QAAM,IAAI,QAAQ;AAClB,QAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,WAAW,OAAO,CAAC,IAAI;AAC1E,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC;AAClC;AAOA,SAAS,iBAAiB,GAA2B;AACnD,MAAI,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,QAAO,KAAK,MAAM,CAAC;AAC7E,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,IAAI,OAAO,CAAC;AAClB,QAAI,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,QAAO,KAAK,MAAM,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAQA,SAAS,cAAc,KAAkD;AACvE,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI,QAAQ,EAAG,QAAO,EAAE,UAAU,IAAI,OAAO,IAAI;AACjD,SAAO,EAAE,UAAU,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO,IAAI,MAAM,QAAQ,CAAC,EAAE;AACtE;AAGA,SAAS,aAAa,MAA6B;AACjD,QAAM,MAAM,aAAa,IAAI;AAC7B,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO,CAAC;AACrD,QAAM,QAAQ;AAEd,QAAM,UAAU,MAAM;AACtB,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO,CAAC;AAG7D,QAAM,KAAK,iBAAiB,MAAM,aAAa,SAAS,KAAK,YAAY,IAAI;AAG7E,QAAM,YAAY,SAAS,QAAQ,IAAI,CAAC;AAExC,QAAM,MAAqB,CAAC;AAC5B,aAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,OAAkC,GAAG;AAClF,QAAI,OAAO,UAAU,YAAY,UAAU,KAAM;AACjD,UAAM,aAAa;AAEnB,UAAM,QAAQ,aAAa,WAAW,KAAK;AAC3C,UAAM,YAAY,aAAa,WAAW,MAAM;AAChD,UAAM,aAAa,aAAa,WAAW,WAAW;AACtD,UAAM,SAAS,aAAa,WAAW,MAAM;AAC7C,UAAM,YAAY,aAAa,WAAW,SAAS;AAGnD,QAAI,QAAQ,YAAY,aAAa,SAAS,cAAc,EAAG;AAE/D,UAAM,EAAE,UAAU,MAAM,IAAI,cAAc,QAAQ;AAElD,UAAM,SAAS,YAAY;AAC3B,WAAO,QAAQ;AACf,WAAO,SAAS;AAChB,WAAO,YAAY;AACnB,WAAO,aAAa;AACpB,WAAO,YAAY;AAEnB,QAAI,KAAK;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAGA,IAAM,YAAyB;AAAA,EAC7B,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,MAAM,KAAK,EAAE,QAAQ,GAAiD;AACpE,UAAM,OAAO,kBAAkB,WAAW;AAC1C,QAAI,SAAS,OAAW,QAAO,CAAC;AAGhC,UAAM,QAAQ,UAAU,MAAM,CAAC,SAAS,SAAS,oBAAoB;AAErE,UAAM,UAAyB,CAAC;AAChC,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,aAAa,IAAI;AAC9B,iBAAW,OAAO,MAAM;AACtB,YAAI,YAAY,UAAa,IAAI,KAAK,QAAS;AAC/C,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,IAAO,cAAQ;","names":[]}
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveEnvRefs,
|
|
4
4
|
resolveEnvRefsDeep
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-XXLCMSD3.js";
|
|
6
6
|
import {
|
|
7
7
|
BaseAdapter,
|
|
8
8
|
renderSkillMd
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3FINQ2ZF.js";
|
|
10
10
|
import {
|
|
11
11
|
buildWrappedStdio
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-Y3K6KJMS.js";
|
|
13
|
+
import "./chunk-ILWHLGIC.js";
|
|
14
|
+
import "./chunk-QYOUQCC6.js";
|
|
15
15
|
|
|
16
16
|
// src/adapters/mux/index.ts
|
|
17
17
|
import { existsSync, statSync } from "fs";
|
|
@@ -319,4 +319,4 @@ export {
|
|
|
319
319
|
adapter,
|
|
320
320
|
mux_default as default
|
|
321
321
|
};
|
|
322
|
-
//# sourceMappingURL=mux-
|
|
322
|
+
//# sourceMappingURL=mux-AHNUAY5Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/mux/index.ts"],"sourcesContent":["/**\r\n * adapters/mux — Mux (Coder) platform adapter for agent-connector.\r\n *\r\n * Mux is an **mcp-only** host: it exposes no lifecycle hook system, and MCP is\r\n * its extensibility mechanism. This adapter therefore installs only the MCP\r\n * server and reports hooks as unavailable — the same shape as the Warp\r\n * reference adapter.\r\n *\r\n * MCP config:\r\n * - user scope → ~/.mux/mcp.jsonc\r\n * - project scope → <projectDir>/.mux/mcp.jsonc\r\n * Both are JSONC (comments allowed) but we write strict JSON. The root key is\r\n * \"servers\", and this file doubles as the (non-existent) hook config — there\r\n * is no separate hook file here.\r\n *\r\n * QUIRK: Mux models each server entry as a single shell-command STRING, not an\r\n * object. So `servers[id]` is `\"<exe> <arg1> <arg2> ...\"` — space-joined, with\r\n * any token containing whitespace double-quoted. We therefore build that string\r\n * ourselves and upsert it idempotently (the generic object upsert helper would\r\n * write the wrong shape). When telemetry-wrapping, the string is the home-bin\r\n * `serve` wrapper command followed by its args.\r\n *\r\n * Mux documents no native `${env:VAR}` interpolation token, so env-refs in the\r\n * command/args are resolved to literals at install time. The string form has no\r\n * place for an env map, so server.env is dropped with no native equivalent.\r\n */\r\n\r\nimport { existsSync, statSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { dirname, join } from \"node:path\";\r\n\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport type { Adapter, InstallContext } from \"../spi.js\";\r\nimport type {\r\n ChangeRecord,\r\n DetectedPlatform,\r\n HealthCheck,\r\n HookParadigm,\r\n PlatformCapabilities,\r\n PlatformId,\r\n ServerDef,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefs, resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport {\r\n buildWrappedStdio,\r\n} from \"../../core/spawn.js\";\r\nimport { renderSkillMd } from \"../claude-code/render.js\";\r\n\r\nconst HOST: PlatformId = \"mux\";\r\nconst MCP_ROOT_KEY = \"servers\";\r\n\r\n/**\r\n * Mux enforces this exact pattern (1–64 chars) on a SKILL directory name, and\r\n * the SKILL.md `name` field MUST equal the directory name\r\n * (mux.coder.com/agents/agent-skills). A skill name that does not match is\r\n * skip-warned rather than written to a dir Mux would reject.\r\n */\r\nconst MUX_SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\r\nconst MUX_SKILL_NAME_MAX = 64;\r\n\r\n/** Quote a token only when it contains whitespace (Mux command-string form). */\r\nfunction quoteToken(token: string): string {\r\n return /\\s/.test(token) ? `\"${token}\"` : token;\r\n}\r\n\r\n/** Join an executable + args into Mux's single shell-command string. */\r\nfunction buildCommandString(command: string, args: readonly string[]): string {\r\n return [command, ...args].map(quoteToken).join(\" \");\r\n}\r\n\r\nexport class MuxAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Mux\";\r\n readonly paradigm: HookParadigm = \"mcp-only\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block via the BaseAdapter default\r\n // (memoryTargets: project <projectDir>/AGENTS.md; user scope where documented).\r\n supportsMemory: true,\r\n // Mux has no lifecycle hook system — every hook capability is false.\r\n preToolUse: false,\r\n postToolUse: false,\r\n preCompact: false,\r\n sessionStart: false,\r\n sessionEnd: false,\r\n userPromptSubmit: false,\r\n stop: false,\r\n notification: false,\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: false,\r\n // Mux's command-string server entry is stdio-only.\r\n transports: [\"stdio\"],\r\n // Content surface: Mux auto-discovers dir-per-skill SKILL.md from its\r\n // workspace-local and global roots (mux.coder.com/agents/agent-skills,\r\n // fetched 2026-06-16):\r\n // project → <projectDir>/.mux/skills/<name>/SKILL.md (workspace-local)\r\n // user → ~/.mux/skills/<name>/SKILL.md (global, Mux-specific)\r\n // The skill directory name MUST match ^[a-z0-9]+(?:-[a-z0-9]+)*$ (1–64\r\n // chars) and the SKILL.md `name` field must equal it — a name that cannot\r\n // be represented is skip-warned (see installSkills).\r\n supportsSkills: true,\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(projectDir: string): DetectedPlatform {\r\n const userDir = join(homedir(), \".mux\");\r\n const userMcp = join(userDir, \"mcp.jsonc\");\r\n const projDir = join(projectDir, \".mux\");\r\n const projMcp = join(projDir, \"mcp.jsonc\");\r\n\r\n const userInstalled = existsSync(userDir) || existsSync(userMcp);\r\n const projInstalled = existsSync(projDir) || existsSync(projMcp);\r\n const installed = userInstalled || projInstalled;\r\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\r\n const configPath = scope === \"project\" ? projMcp : userMcp;\r\n\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n configPath,\r\n scope,\r\n reason: installed\r\n ? `found Mux config (${scope})`\r\n : `no Mux config at ${userDir} or ${projDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Native paths ─────────────────────────────────────────────────────────\r\n\r\n getConfigDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".mux\")\r\n : join(homedir(), \".mux\");\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"mcp.jsonc\");\r\n }\r\n\r\n /**\r\n * Mux has no hook file — hooks are not a thing here. The hook \"config path\"\r\n * is the same mcp.jsonc so the generic doctor/backup behave sensibly.\r\n */\r\n getHookConfigPath(ctx: InstallContext): string {\r\n return this.getServerConfigPath(ctx);\r\n }\r\n\r\n // ── MCP server install / uninstall ───────────────────────────────────────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n const override = connector.platforms[HOST]?.server;\r\n if (!connector.server || override === false) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: connector.server\r\n ? \"server registration disabled for mux\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n // Shallow-merge any per-platform server override into the base ServerDef.\r\n const server: ServerDef =\r\n override && typeof override === \"object\"\r\n ? { ...connector.server, ...override }\r\n : connector.server;\r\n\r\n const path = this.getServerConfigPath(ctx);\r\n\r\n if (server.transport !== \"stdio\" || !server.command) {\r\n // Mux's command-string entry is stdio-only; remote transports skip.\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n path,\r\n detail: `transport \"${server.transport}\" not registrable (mux expects a stdio command string)`,\r\n },\r\n ];\r\n }\r\n\r\n const entry = this.renderCommandString(ctx, server);\r\n // Mux's server VALUE is a command string, but the object-map upsert is\r\n // value-agnostic — route through the shared helper (byte-identical output).\r\n return [this.upsertServerInJson(path, MCP_ROOT_KEY, connector.id, entry, dryRun)];\r\n }\r\n\r\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const path = this.getServerConfigPath(ctx);\r\n return [\r\n this.removeServerFromJson(path, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\r\n ];\r\n }\r\n\r\n /**\r\n * Render a stdio ServerDef into Mux's single shell-command string. Honors the\r\n * telemetry serve-wrapper and resolves every `${env:VAR}` to a literal (Mux\r\n * documents no native interpolation token).\r\n */\r\n private renderCommandString(ctx: InstallContext, server: ServerDef): string {\r\n let command = server.command ?? \"\";\r\n let args = [...(server.args ?? [])];\r\n\r\n // Transparent telemetry wrapping: route the real command through\r\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\r\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\r\n\r\n // Resolve env-refs to literals (Mux has no native interpolation token).\r\n command = resolveEnvRefs(command);\r\n args = resolveEnvRefsDeep(args);\r\n\r\n return buildCommandString(command, args);\r\n }\r\n\r\n // ── Hooks (unavailable — Mux is mcp-only) ─────────────────────────────────\r\n\r\n installHooks(_ctx: InstallContext): ChangeRecord[] {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"hooks unavailable (Mux is mcp-only)\",\r\n },\r\n ];\r\n }\r\n\r\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail: \"hooks unavailable (Mux is mcp-only)\",\r\n },\r\n ];\r\n }\r\n\r\n // ── Content surface: skills (dir-per-skill SKILL.md) ─────────────────────\r\n // CONTENT-ONLY: pure native-file writers, mirroring goose/openclaw. No\r\n // runtime dispatch, no home-bin pointer, no telemetry wrap. Idempotent\r\n // (byte-identical → skip) via writeContentFile and reversible via\r\n // removeContentFile + removeDirIfEmpty. Honors platforms[\"mux\"].skills ===\r\n // false. No mcp.jsonc entry — Mux auto-discovers the skills dirs.\r\n //\r\n // Native locations (mux.coder.com/agents/agent-skills):\r\n // project → <projectDir>/.mux/skills/<name>/SKILL.md (workspace-local)\r\n // user → ~/.mux/skills/<name>/SKILL.md (global, Mux-specific)\r\n // The dir name MUST match MUX_SKILL_NAME_RE (1–64 chars) and the SKILL.md\r\n // `name` field must equal it — a name that can't be represented is skip-warned.\r\n\r\n /** The skills ROOT dir for ctx.scope (parent of every per-skill dir). */\r\n private skillsDir(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"skills\");\r\n }\r\n\r\n /** Per-skill directory: <skillsDir>/<name>. */\r\n private skillDir(ctx: InstallContext, name: string): string {\r\n return join(this.skillsDir(ctx), name);\r\n }\r\n\r\n override installSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.platforms[HOST]?.skills === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for mux\" }];\r\n }\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n // Mux REQUIRES the dir name (and SKILL.md `name`) to match its pattern;\r\n // a name we cannot represent is skip-warned rather than written to a dir\r\n // Mux would reject (the honesty bar — never write an unreadable path).\r\n if (!this.isValidSkillName(skill.name)) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail:\r\n `skill \"${skill.name}\" cannot be represented on mux ` +\r\n `(name must match ${MUX_SKILL_NAME_RE.source}, 1–${MUX_SKILL_NAME_MAX} chars); skipped`,\r\n });\r\n continue;\r\n }\r\n const dir = this.skillDir(ctx, skill.name);\r\n // Guard a skills path occupied by a regular FILE (mkdir would throw\r\n // ENOTDIR): skip-warn rather than crash (cline `.clinerules`-is-a-file\r\n // precedent).\r\n const blockingFile = this.firstFileOnSkillPath(ctx, dir);\r\n if (blockingFile !== null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: blockingFile,\r\n detail: `${blockingFile} is a file, not a directory; skill \"${skill.name}\" skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(\r\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\r\n );\r\n // Bundle any resource files beside SKILL.md (relative path → contents).\r\n // Defense-in-depth: skip+warn on any key that escapes the skill dir.\r\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\r\n });\r\n continue;\r\n }\r\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\r\n }\r\n }\r\n return changes;\r\n }\r\n\r\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n if (connector.skills.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\r\n }\r\n const changes: ChangeRecord[] = [];\r\n for (const skill of connector.skills) {\r\n // Skip names install never wrote (invalid → never on disk under our dir).\r\n if (!this.isValidSkillName(skill.name)) continue;\r\n const dir = this.skillDir(ctx, skill.name);\r\n // Remove only the files we wrote (SKILL.md + declared resources), then the\r\n // skill dir itself when we own its full contents.\r\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\r\n for (const rel of Object.keys(skill.resources ?? {})) {\r\n const target = this.resolveWithin(dir, rel);\r\n if (target === null) continue; // never delete outside the skill dir\r\n changes.push(this.removeContentFile(target, ctx.dryRun));\r\n }\r\n // Only remove the skill dir when WE own its full contents — never rm -rf a\r\n // dir that still holds user-added / sibling-tool / shared files.\r\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\r\n }\r\n if (changes.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"no installable skills to remove\" }];\r\n }\r\n return changes;\r\n }\r\n\r\n /** True when a skill name is representable as a Mux skill directory name. */\r\n private isValidSkillName(name: string): boolean {\r\n return name.length >= 1 && name.length <= MUX_SKILL_NAME_MAX && MUX_SKILL_NAME_RE.test(name);\r\n }\r\n\r\n /**\r\n * Walk from the skills root down to `leaf` and return the FIRST segment that\r\n * exists as a regular file (a mkdir there throws ENOTDIR), else null — so\r\n * installSkills can skip-warn instead of crashing.\r\n */\r\n private firstFileOnSkillPath(ctx: InstallContext, leaf: string): string | null {\r\n const root = this.skillsDir(ctx);\r\n const segments: string[] = [];\r\n let cur = leaf;\r\n while (cur.length >= root.length) {\r\n segments.unshift(cur);\r\n if (cur === root) break;\r\n const parent = dirname(cur);\r\n if (parent === cur) break;\r\n cur = parent;\r\n }\r\n for (const p of segments) {\r\n if (!existsSync(p)) return null;\r\n try {\r\n if (statSync(p).isFile()) return p;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n // ── Diagnostics ──────────────────────────────────────────────────────────\r\n\r\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\r\n const mcpPath = this.getServerConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n return [\r\n {\r\n name: `${this.name}: mcp.jsonc present`,\r\n check: () =>\r\n existsSync(mcpPath)\r\n ? { status: \"OK\", detail: mcpPath }\r\n : { status: \"FAIL\", detail: `not found: ${mcpPath}` },\r\n },\r\n {\r\n name: `${this.name}: server entry registered`,\r\n check: () => {\r\n // Only assert what the connector declares: a server-less connector\r\n // never writes an mcpServers entry, so its absence is healthy.\r\n if (!ctx.connector.server) {\r\n return { status: \"OK\", detail: \"no MCP server declared\" };\r\n }\r\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(\r\n mcpPath,\r\n );\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n if (!cfg || !bucket) {\r\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\r\n }\r\n return connectorId in bucket\r\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\r\n : {\r\n status: \"FAIL\",\r\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`,\r\n };\r\n },\r\n },\r\n ];\r\n }\r\n}\r\n\r\nexport const adapter = new MuxAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
OpenClawAdapter
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-TGZFDXNH.js";
|
|
5
|
+
import "./chunk-XXLCMSD3.js";
|
|
6
|
+
import "./chunk-3FINQ2ZF.js";
|
|
7
|
+
import "./chunk-Y3K6KJMS.js";
|
|
8
|
+
import "./chunk-ILWHLGIC.js";
|
|
9
|
+
import "./chunk-QYOUQCC6.js";
|
|
10
10
|
|
|
11
11
|
// src/adapters/nemoclaw/index.ts
|
|
12
12
|
import { existsSync } from "fs";
|
|
@@ -54,4 +54,4 @@ export {
|
|
|
54
54
|
adapter,
|
|
55
55
|
nemoclaw_default as default
|
|
56
56
|
};
|
|
57
|
-
//# sourceMappingURL=nemoclaw-
|
|
57
|
+
//# sourceMappingURL=nemoclaw-RE5RZASZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/nemoclaw/index.ts"],"sourcesContent":["/**\r\n * adapters/nemoclaw — NVIDIA NemoClaw platform adapter for agent-connector.\r\n *\r\n * NemoClaw (github.com/NVIDIA/NemoClaw, Apache-2.0, v0.1.0) is an\r\n * orchestrator/wrapper that deploys and lifecycle-manages an OpenClaw agent\r\n * (the default) inside an NVIDIA OpenShell sandbox. It is ALSO an OpenClaw\r\n * plugin. It is NOT a Claude/Codex/Gemini fork: the agent it wraps is OpenClaw,\r\n * and the config the wrapped agent actually loads is the SAME\r\n * `~/.openclaw/openclaw.json` the OpenClaw adapter already targets (top-level\r\n * `mcp.servers.<id>` for MCP sidecars; plugins.entries + plugins.load.paths for\r\n * the ts-plugin bridge — OpenClaw's verified DUAL REGISTRATION shape).\r\n *\r\n * DESIGN — a thin fork of {@link OpenClawAdapter} (precedent:\r\n * AntigravityCliAdapter extends AntigravityAdapter). It REUSES every render /\r\n * hook / parse / surface path from the parent unchanged — MCP still lands in\r\n * the wrapped `~/.openclaw/openclaw.json`, the paradigm stays ts-plugin, and the\r\n * content surfaces (skills) are inherited. The ONLY differences are identity and\r\n * detection:\r\n *\r\n * - id = \"nemoclaw\", name = \"NVIDIA NemoClaw\". Identity flows into the\r\n * ChangeRecord `platform` stamp and the host-detection result.\r\n * - detectInstalled probes the NemoClaw-specific marker `~/.nemoclaw/`\r\n * (config.json + rebuild-backups/ + blueprints/). A NemoClaw box has BOTH\r\n * markers on disk: it DRIVES the wrapped `~/.openclaw/openclaw.json`, so\r\n * `~/.openclaw/` is present too. Exclusivity is therefore guaranteed at the\r\n * SOURCE, not by registry order alone — {@link OpenClawAdapter.detectInstalled}\r\n * BOWS OUT (reports its user scope not-installed) whenever `~/.nemoclaw/`\r\n * exists, so the shared config is never double-targeted as two platforms\r\n * (an `uninstall openclaw` would otherwise strip nemoclaw's entries). nemoclaw\r\n * is ALSO registered BEFORE openclaw (PlatformId union AND ADAPTER_REGISTRY)\r\n * as the deterministic tie-break — a NemoClaw box classifies as nemoclaw; an\r\n * OpenClaw-only box (no `~/.nemoclaw/`) classifies as openclaw.\r\n *\r\n * HOOKS: NemoClaw ships NO Claude-style lifecycle hooks of its own\r\n * (managedChannels are messaging; plugin activation.onStartup and runtime-slash\r\n * aliases are not hook events). It nonetheless INHERITS OpenClaw's ts-plugin\r\n * hook machinery — when a connector declares hooks, the inherited installHooks\r\n * writes the same self-contained OpenClaw plugin bridge into the wrapped\r\n * `~/.openclaw/openclaw.json` (the agent NemoClaw runs), so the paradigm stays\r\n * ts-plugin honestly.\r\n *\r\n * SOURCES: github.com/NVIDIA/NemoClaw (README, nemoclaw/openclaw.plugin.json,\r\n * src/onboard/config.ts, test/openclaw-config-snapshot.test.ts,\r\n * src/lib/state/sandbox.ts), docs.nvidia.com/nemoclaw.\r\n */\r\n\r\nimport { existsSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { join } from \"node:path\";\r\n\r\nimport { OpenClawAdapter } from \"../openclaw/index.js\";\r\nimport type { Adapter } from \"../spi.js\";\r\nimport type { DetectedPlatform, PlatformId } from \"../../core/types.js\";\r\n\r\nconst HOST: PlatformId = \"nemoclaw\";\r\n\r\nexport class NemoClawAdapter extends OpenClawAdapter implements Adapter {\r\n override readonly id: PlatformId = HOST;\r\n override readonly name = \"NVIDIA NemoClaw\";\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Probe the NemoClaw-specific marker `~/.nemoclaw/` (its onboarding writes\r\n * config.json + rebuild-backups/ + blueprints/ there). This is DISTINCT from\r\n * OpenClaw's `~/.openclaw/` marker even though NemoClaw drives the wrapped\r\n * OpenClaw config: a box with `~/.nemoclaw/` is a NemoClaw install. Reported\r\n * before the OpenClaw adapter in the registry so the more-specific NemoClaw\r\n * marker wins host detection (a plain OpenClaw box — `~/.openclaw/` only,\r\n * no `~/.nemoclaw/` — falls through to the openclaw adapter).\r\n *\r\n * The config path returned is the WRAPPED OpenClaw config (where MCP/hooks are\r\n * actually written) so install/doctor point at the file the agent loads.\r\n */\r\n override detectInstalled(projectDir: string): DetectedPlatform {\r\n const nemoclawDir = join(homedir(), \".nemoclaw\");\r\n const installed = existsSync(nemoclawDir);\r\n\r\n // Inherit OpenClaw's path resolution for the wrapped config (the file the\r\n // agent NemoClaw runs actually loads) and the capabilities/paradigm.\r\n const base = super.detectInstalled(projectDir);\r\n\r\n return {\r\n id: this.id,\r\n name: this.name,\r\n installed,\r\n paradigm: this.paradigm,\r\n capabilities: this.capabilities,\r\n // Where MCP/hooks land for NemoClaw: the wrapped OpenClaw config.\r\n configPath: base.configPath,\r\n scope: base.scope,\r\n reason: installed\r\n ? `found NVIDIA NemoClaw config at ${nemoclawDir} (wraps OpenClaw at ${base.configPath})`\r\n : `no NVIDIA NemoClaw config at ${nemoclawDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n}\r\n\r\nexport const adapter = new NemoClawAdapter();\r\nexport default adapter;\r\n"],"mappings":";;;;;;;;;;;AA8CA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,YAAY;AAMrB,IAAM,OAAmB;AAElB,IAAM,kBAAN,cAA8B,gBAAmC;AAAA,EACpD,KAAiB;AAAA,EACjB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBhB,gBAAgB,YAAsC;AAC7D,UAAM,cAAc,KAAK,QAAQ,GAAG,WAAW;AAC/C,UAAM,YAAY,WAAW,WAAW;AAIxC,UAAM,OAAO,MAAM,gBAAgB,UAAU;AAE7C,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA;AAAA,MAEnB,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK;AAAA,MACZ,QAAQ,YACJ,mCAAmC,WAAW,uBAAuB,KAAK,UAAU,MACpF,gCAAgC,WAAW;AAAA,MAC/C,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AACF;AAEO,IAAM,UAAU,IAAI,gBAAgB;AAC3C,IAAO,mBAAQ;","names":[]}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
renderBridgePrelude
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Q4ISQHUQ.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveEnvRefsDeep
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-XXLCMSD3.js";
|
|
8
8
|
import {
|
|
9
9
|
BaseAdapter
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3FINQ2ZF.js";
|
|
11
11
|
import {
|
|
12
12
|
buildWrappedStdio
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-Y3K6KJMS.js";
|
|
14
|
+
import "./chunk-ILWHLGIC.js";
|
|
15
|
+
import "./chunk-QYOUQCC6.js";
|
|
16
16
|
|
|
17
17
|
// src/adapters/omp/index.ts
|
|
18
18
|
import { existsSync } from "fs";
|
|
@@ -652,4 +652,4 @@ export {
|
|
|
652
652
|
adapter,
|
|
653
653
|
omp_default as default
|
|
654
654
|
};
|
|
655
|
-
//# sourceMappingURL=omp-
|
|
655
|
+
//# sourceMappingURL=omp-D2EXEPH7.js.map
|