@ken-jo/agent-connector 0.4.97 → 0.4.99
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 +604 -596
- package/dist/{action-IPFDPOZU.js → action-5OEM3QC4.js} +17 -16
- package/dist/action-5OEM3QC4.js.map +1 -0
- package/dist/{amazon-q-IT44LEWV.js → amazon-q-7DPVJXJN.js} +6 -6
- package/dist/amazon-q-7DPVJXJN.js.map +1 -0
- package/dist/{amp-CEWOSWQO.js → amp-BQZOL5GR.js} +4 -4
- package/dist/amp-BQZOL5GR.js.map +1 -0
- package/dist/{amp-P35FRU2Z.js → amp-VYXZWHXW.js} +7 -7
- package/dist/amp-VYXZWHXW.js.map +1 -0
- package/dist/{antigravity-LHFEFNMC.js → antigravity-EA4L225L.js} +5 -5
- package/dist/antigravity-EA4L225L.js.map +1 -0
- package/dist/antigravity-VXHL6ZPM.js +18 -0
- package/dist/{antigravity-cli-MOKFSWOU.js → antigravity-cli-B2HXZFYQ.js} +5 -5
- package/dist/antigravity-cli-B2HXZFYQ.js.map +1 -0
- package/dist/{antigravity-cli-MPE27LPI.js → antigravity-cli-JHQ7JGNX.js} +10 -9
- package/dist/antigravity-cli-JHQ7JGNX.js.map +1 -0
- package/dist/{audit-3E5JAOP2.js → audit-BO7JQYIH.js} +8 -8
- package/dist/{chunk-7C2IPIIB.js → chunk-2Y2MZRLP.js} +3 -3
- package/dist/chunk-2Y2MZRLP.js.map +1 -0
- package/dist/{chunk-GZZCHJDP.js → chunk-4KIXXJ7B.js} +2 -2
- package/dist/chunk-4KIXXJ7B.js.map +1 -0
- package/dist/chunk-4NFDNY3C.js +34 -0
- package/dist/chunk-4NFDNY3C.js.map +1 -0
- package/dist/{chunk-C63AAXK7.js → chunk-4QXCNZMD.js} +5 -5
- package/dist/chunk-4QXCNZMD.js.map +1 -0
- package/dist/{chunk-Q7PR2WGT.js → chunk-6TF7MHG5.js} +2 -2
- package/dist/chunk-6TF7MHG5.js.map +1 -0
- package/dist/{chunk-7ZFK2WEO.js → chunk-6WN37NVN.js} +113 -10
- package/dist/chunk-6WN37NVN.js.map +1 -0
- package/dist/{chunk-GCPEPUD7.js → chunk-6XMV2OOA.js} +6 -6
- package/dist/chunk-6XMV2OOA.js.map +1 -0
- package/dist/{chunk-XXLCMSD3.js → chunk-BEFVJ2OE.js} +1 -1
- package/dist/chunk-BEFVJ2OE.js.map +1 -0
- package/dist/{chunk-N4ENLZEU.js → chunk-BV5WK6VQ.js} +19 -19
- package/dist/chunk-BV5WK6VQ.js.map +1 -0
- package/dist/{chunk-WPTNMYYM.js → chunk-BXPSDNIB.js} +6 -6
- package/dist/chunk-BXPSDNIB.js.map +1 -0
- package/dist/{chunk-Q4ISQHUQ.js → chunk-FBJQGRET.js} +1 -1
- package/dist/chunk-FBJQGRET.js.map +1 -0
- package/dist/{chunk-THI4PI4H.js → chunk-FJCUKXGX.js} +2 -2
- package/dist/chunk-FJCUKXGX.js.map +1 -0
- package/dist/{chunk-L2C5UMKW.js → chunk-FKW5A6HE.js} +23 -7
- package/dist/chunk-FKW5A6HE.js.map +1 -0
- package/dist/{chunk-NDMNMAKP.js → chunk-G5HAIYRM.js} +43 -43
- package/dist/chunk-G5HAIYRM.js.map +1 -0
- package/dist/{chunk-SLJI5BOM.js → chunk-GDIAHWNY.js} +2 -2
- package/dist/chunk-GDIAHWNY.js.map +1 -0
- package/dist/{chunk-QYOUQCC6.js → chunk-GZGLCCEE.js} +1 -1
- package/dist/chunk-GZGLCCEE.js.map +1 -0
- package/dist/{chunk-PSGTHJQU.js → chunk-H53QZQJI.js} +1 -1
- package/dist/chunk-H53QZQJI.js.map +1 -0
- package/dist/{chunk-7HHW23AC.js → chunk-IRUYJD23.js} +29 -29
- package/dist/chunk-IRUYJD23.js.map +1 -0
- package/dist/{chunk-IOJDZJ72.js → chunk-IVAWP6HH.js} +2 -2
- package/dist/chunk-IVAWP6HH.js.map +1 -0
- package/dist/{chunk-3FINQ2ZF.js → chunk-JTN3AKZO.js} +30 -20
- package/dist/chunk-JTN3AKZO.js.map +1 -0
- package/dist/{chunk-4GH2KA7V.js → chunk-KHO5WNTP.js} +1 -1
- package/dist/chunk-KHO5WNTP.js.map +1 -0
- package/dist/{chunk-MLU7NDAZ.js → chunk-KLZBRNFP.js} +12 -12
- package/dist/chunk-KLZBRNFP.js.map +1 -0
- package/dist/{chunk-3EP5V2F4.js → chunk-M6OS4OLU.js} +3 -3
- package/dist/chunk-M6OS4OLU.js.map +1 -0
- package/dist/{chunk-UZZTWWGG.js → chunk-MQPNU2CY.js} +1 -1
- package/dist/chunk-MQPNU2CY.js.map +1 -0
- package/dist/{chunk-LQ55E7QI.js → chunk-N4STCQGP.js} +7 -7
- package/dist/chunk-N4STCQGP.js.map +1 -0
- package/dist/{chunk-KFPSJRHR.js → chunk-NBYKLUF6.js} +2 -2
- package/dist/chunk-NBYKLUF6.js.map +1 -0
- package/dist/{chunk-KM2YXO6V.js → chunk-O7SDRBVB.js} +1 -1
- package/dist/chunk-O7SDRBVB.js.map +1 -0
- package/dist/{chunk-LFWYYWLV.js → chunk-OP4KBXUO.js} +1 -1
- package/dist/chunk-OP4KBXUO.js.map +1 -0
- package/dist/{chunk-XN7S44U4.js → chunk-OPXAP3AC.js} +1 -1
- package/dist/chunk-OPXAP3AC.js.map +1 -0
- package/dist/{chunk-TGZFDXNH.js → chunk-PWCBWAM4.js} +6 -4
- package/dist/chunk-PWCBWAM4.js.map +1 -0
- package/dist/{chunk-Y3K6KJMS.js → chunk-QSY74NAP.js} +2 -2
- package/dist/chunk-QSY74NAP.js.map +1 -0
- package/dist/{chunk-ZSOS2KOR.js → chunk-RK6VBLXP.js} +1 -1
- package/dist/chunk-RK6VBLXP.js.map +1 -0
- package/dist/{chunk-FHYR5Q5T.js → chunk-SFY6YLVK.js} +19 -12
- package/dist/chunk-SFY6YLVK.js.map +1 -0
- package/dist/{chunk-C747DYNT.js → chunk-UM5S7DKK.js} +1 -1
- package/dist/chunk-UM5S7DKK.js.map +1 -0
- package/dist/{chunk-ILWHLGIC.js → chunk-UMQ6NBQR.js} +2 -2
- package/dist/chunk-UMQ6NBQR.js.map +1 -0
- package/dist/{chunk-7PSNXUFK.js → chunk-XD7MY6HB.js} +1 -1
- package/dist/chunk-XD7MY6HB.js.map +1 -0
- package/dist/{chunk-XVEJAFKW.js → chunk-XY3N2U6L.js} +5 -5
- package/dist/chunk-XY3N2U6L.js.map +1 -0
- package/dist/{chunk-XZWMJLIT.js → chunk-YT43MUSJ.js} +1 -1
- package/dist/chunk-YT43MUSJ.js.map +1 -0
- package/dist/{claude-code-QBWDT5RT.js → claude-code-LJ6DVXWQ.js} +24 -14
- package/dist/claude-code-LJ6DVXWQ.js.map +1 -0
- package/dist/{claude-code-FS42PXZO.js → claude-code-NMRKTAP7.js} +4 -4
- package/dist/claude-code-NMRKTAP7.js.map +1 -0
- package/dist/cli/sdk.js +7 -7
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{cline-JKEAYWVR.js → cline-JAPJNOZQ.js} +6 -6
- package/dist/cline-JAPJNOZQ.js.map +1 -0
- package/dist/{codebuddy-EB6EYPC3.js → codebuddy-GC7VAE2Y.js} +7 -7
- package/dist/codebuddy-GC7VAE2Y.js.map +1 -0
- package/dist/{codebuff-5RSXFU6G.js → codebuff-3VODFPD4.js} +6 -6
- package/dist/codebuff-3VODFPD4.js.map +1 -0
- package/dist/{codebuff-6KWBW6CT.js → codebuff-ETYT5UBL.js} +4 -4
- package/dist/codebuff-ETYT5UBL.js.map +1 -0
- package/dist/{codex-ART46CDD.js → codex-RXIS5BHM.js} +9 -9
- package/dist/codex-RXIS5BHM.js.map +1 -0
- package/dist/{codex-DKBAAUCO.js → codex-YAORPCOD.js} +4 -4
- package/dist/codex-YAORPCOD.js.map +1 -0
- package/dist/{continue-JHZCMSPH.js → continue-MECVDV4Z.js} +8 -8
- package/dist/continue-MECVDV4Z.js.map +1 -0
- package/dist/{copilot-cli-CLBJACQ5.js → copilot-cli-MZTAWMPW.js} +4 -4
- package/dist/copilot-cli-MZTAWMPW.js.map +1 -0
- package/dist/{copilot-cli-QVAU5CFM.js → copilot-cli-WVWAWNSM.js} +7 -7
- package/dist/copilot-cli-WVWAWNSM.js.map +1 -0
- package/dist/{crush-A5C5USRL.js → crush-QBXLNN7T.js} +4 -4
- package/dist/crush-QBXLNN7T.js.map +1 -0
- package/dist/{crush-7TORBYUL.js → crush-YB3SK6NK.js} +7 -7
- package/dist/crush-YB3SK6NK.js.map +1 -0
- package/dist/{cursor-D5SWDVSW.js → cursor-DIW43TRZ.js} +3 -3
- package/dist/cursor-DIW43TRZ.js.map +1 -0
- package/dist/cursor-RSLHA2CY.js +22 -0
- package/dist/{define-connector-DTWb46UB.d.ts → define-connector-odRHEC4H.d.ts} +1 -1
- package/dist/{detect-JHSA3G3U.js → detect-ALP4G7WG.js} +4 -4
- package/dist/detect-ALP4G7WG.js.map +1 -0
- package/dist/{devin-SSR7S4WX.js → devin-WPDN3MXE.js} +7 -7
- package/dist/devin-WPDN3MXE.js.map +1 -0
- package/dist/{doctor-CQJ7TZPA.js → doctor-YEQWCWZJ.js} +27 -26
- package/dist/doctor-YEQWCWZJ.js.map +1 -0
- package/dist/{droid-45PJ7JGF.js → droid-HS6MX3IL.js} +10 -8
- package/dist/droid-HS6MX3IL.js.map +1 -0
- package/dist/{droid-PFQ2PZSF.js → droid-U3ZBLQFO.js} +4 -4
- package/dist/droid-U3ZBLQFO.js.map +1 -0
- package/dist/{gemini-cli-Y6RJMU24.js → gemini-cli-NMVVBO3K.js} +4 -4
- package/dist/gemini-cli-NMVVBO3K.js.map +1 -0
- package/dist/{gemini-cli-24PFDK7D.js → gemini-cli-VJ6X5DNF.js} +8 -8
- package/dist/gemini-cli-VJ6X5DNF.js.map +1 -0
- package/dist/{goose-U5D3LCPC.js → goose-3X7ID7YW.js} +9 -9
- package/dist/goose-3X7ID7YW.js.map +1 -0
- package/dist/{goose-K2HKUTBK.js → goose-64V46Y2W.js} +4 -4
- package/dist/goose-64V46Y2W.js.map +1 -0
- package/dist/{grok-cli-L2MHAPBY.js → grok-cli-4VFVF2CQ.js} +7 -7
- package/dist/grok-cli-4VFVF2CQ.js.map +1 -0
- package/dist/{hermes-2S5JUTTJ.js → hermes-AIVUE7LX.js} +10 -8
- package/dist/hermes-AIVUE7LX.js.map +1 -0
- package/dist/{hermes-MF3NX4ZY.js → hermes-F3EGTK6N.js} +4 -4
- package/dist/hermes-F3EGTK6N.js.map +1 -0
- package/dist/{hook-VHICXHXL.js → hook-F63I3SD5.js} +17 -16
- package/dist/hook-F63I3SD5.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +5 -5
- package/dist/{install-WLENR4KF.js → install-23WRRFBY.js} +21 -21
- package/dist/install-23WRRFBY.js.map +1 -0
- package/dist/{introspect-dNekqPDY.d.ts → introspect-gTx6GzpW.d.ts} +1 -1
- package/dist/{jetbrains-copilot-Z4FC3RM3.js → jetbrains-copilot-XBO2JZRO.js} +6 -6
- package/dist/jetbrains-copilot-XBO2JZRO.js.map +1 -0
- package/dist/{junie-ULGJJIHB.js → junie-UCOS6Q37.js} +6 -6
- package/dist/junie-UCOS6Q37.js.map +1 -0
- package/dist/{kilo-SMHPOHJ5.js → kilo-SW7BH6EG.js} +4 -4
- package/dist/kilo-SW7BH6EG.js.map +1 -0
- package/dist/{kilo-WWIJOVWD.js → kilo-T4OXNUYY.js} +8 -8
- package/dist/kilo-T4OXNUYY.js.map +1 -0
- package/dist/{kilo-cli-QKE2EQLS.js → kilo-cli-I2S3W245.js} +8 -8
- package/dist/kilo-cli-I2S3W245.js.map +1 -0
- package/dist/{kilo-cli-T2SRRRJS.js → kilo-cli-ZF272ZHN.js} +5 -5
- package/dist/kilo-cli-ZF272ZHN.js.map +1 -0
- package/dist/{kimi-MSIDEMCI.js → kimi-5FHEXGZD.js} +4 -4
- package/dist/kimi-5FHEXGZD.js.map +1 -0
- package/dist/{kimi-JMUFTVSF.js → kimi-VLSUFLYV.js} +7 -7
- package/dist/kimi-VLSUFLYV.js.map +1 -0
- package/dist/{kiro-UWUCRKR3.js → kiro-AQFXGOJX.js} +10 -8
- package/dist/kiro-AQFXGOJX.js.map +1 -0
- package/dist/{kiro-NYRRBIKW.js → kiro-WGOI5CGT.js} +4 -4
- package/dist/kiro-WGOI5CGT.js.map +1 -0
- package/dist/{leaderboard-NJWKGMXP.js → leaderboard-YBD3IKC2.js} +7 -7
- package/dist/leaderboard-YBD3IKC2.js.map +1 -0
- package/dist/{mimo-code-BPNYYIVM.js → mimo-code-KETL7W7D.js} +7 -7
- package/dist/mimo-code-KETL7W7D.js.map +1 -0
- package/dist/{mistral-vibe-LT3DAJ3L.js → mistral-vibe-3AU7N2CA.js} +6 -6
- package/dist/mistral-vibe-3AU7N2CA.js.map +1 -0
- package/dist/{mux-AHNUAY5Z.js → mux-BO2L5CTW.js} +6 -6
- package/dist/mux-BO2L5CTW.js.map +1 -0
- package/dist/{mux-7PIJ7HUQ.js → mux-XM6AP35L.js} +4 -4
- package/dist/mux-XM6AP35L.js.map +1 -0
- package/dist/{nemoclaw-RE5RZASZ.js → nemoclaw-WA7RSKF2.js} +7 -7
- package/dist/nemoclaw-WA7RSKF2.js.map +1 -0
- package/dist/{omp-D2EXEPH7.js → omp-UDYJ2PYY.js} +9 -7
- package/dist/omp-UDYJ2PYY.js.map +1 -0
- package/dist/{open-interpreter-SSGBEUKX.js → open-interpreter-WMBNM4MQ.js} +6 -6
- package/dist/open-interpreter-WMBNM4MQ.js.map +1 -0
- package/dist/openclaw-3DHVHX5P.js +17 -0
- package/dist/{openclaw-KAFTNLR2.js → openclaw-5EQFGOWL.js} +4 -4
- package/dist/openclaw-5EQFGOWL.js.map +1 -0
- package/dist/{opencode-YKUKZY3J.js → opencode-IKMI3RI7.js} +7 -7
- package/dist/opencode-IKMI3RI7.js.map +1 -0
- package/dist/{opencode-Z65JYILL.js → opencode-QGP4ALQY.js} +4 -4
- package/dist/opencode-QGP4ALQY.js.map +1 -0
- package/dist/{openhands-SEZMCUC3.js → openhands-QGXMQR6I.js} +7 -7
- package/dist/openhands-QGXMQR6I.js.map +1 -0
- package/dist/{package-JECVQEFT.js → package-TAUTPP7Z.js} +15 -15
- package/dist/package-TAUTPP7Z.js.map +1 -0
- package/dist/{pi-YPYV2ULH.js → pi-A2HCGRJG.js} +9 -7
- package/dist/pi-A2HCGRJG.js.map +1 -0
- package/dist/{pi-DLKCPOJE.js → pi-GGDQREVG.js} +4 -4
- package/dist/pi-GGDQREVG.js.map +1 -0
- package/dist/{qwen-code-ZHCLCYMC.js → qwen-code-DNQTGJOF.js} +35 -17
- package/dist/qwen-code-DNQTGJOF.js.map +1 -0
- package/dist/{qwen-code-26CSFDX6.js → qwen-code-GQILBJ5B.js} +4 -4
- package/dist/qwen-code-GQILBJ5B.js.map +1 -0
- package/dist/{roo-code-HSAE2CJU.js → roo-code-SUWI4BBN.js} +4 -4
- package/dist/roo-code-SUWI4BBN.js.map +1 -0
- package/dist/{roo-code-7F4HYB34.js → roo-code-VI2ZKTZC.js} +6 -6
- package/dist/roo-code-VI2ZKTZC.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -8
- package/dist/runtime/index.js +15 -14
- package/dist/sdk/index.d.ts +4 -4
- package/dist/sdk/index.js +6 -6
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/test.d.ts +2 -2
- package/dist/sdk/test.js +12 -11
- package/dist/{serve-LYSBH43G.js → serve-6MDLRQS2.js} +17 -16
- package/dist/serve-6MDLRQS2.js.map +1 -0
- package/dist/{status-PHKKGEW5.js → status-IUP75XHP.js} +11 -11
- package/dist/status-IUP75XHP.js.map +1 -0
- package/dist/{statusline-ZDD4OZ4F.js → statusline-PRODZV2J.js} +16 -15
- package/dist/statusline-PRODZV2J.js.map +1 -0
- package/dist/{synthetic-LUT6V6SD.js → synthetic-6FRA7P5Q.js} +4 -4
- package/dist/synthetic-6FRA7P5Q.js.map +1 -0
- package/dist/{telemetry-HDGMI2BK.js → telemetry-X4PLZEDB.js} +10 -10
- package/dist/telemetry-X4PLZEDB.js.map +1 -0
- package/dist/{trae-SIQI3C66.js → trae-CPPYASR2.js} +4 -4
- package/dist/trae-CPPYASR2.js.map +1 -0
- package/dist/{trae-Y67HSDOW.js → trae-VOJXUYRN.js} +6 -6
- package/dist/trae-VOJXUYRN.js.map +1 -0
- package/dist/{types-JyhpJHJa.d.ts → types-DWXnnx-N.d.ts} +96 -22
- package/dist/{uninstall-RWO2GM2I.js → uninstall-BSIJ4QXN.js} +21 -21
- package/dist/uninstall-BSIJ4QXN.js.map +1 -0
- package/dist/{upgrade-YJCXNUEE.js → upgrade-ZSICU3NE.js} +21 -21
- package/dist/upgrade-ZSICU3NE.js.map +1 -0
- package/dist/{usage-IWO4RQN6.js → usage-EQUNVSCT.js} +4 -4
- package/dist/usage-EQUNVSCT.js.map +1 -0
- package/dist/{usage-event-AFFKCLHE.js → usage-event-J5CQ6LNT.js} +16 -15
- package/dist/usage-event-J5CQ6LNT.js.map +1 -0
- package/dist/{vscode-copilot-5CI5B3X6.js → vscode-copilot-ZBXRPKGG.js} +7 -7
- package/dist/vscode-copilot-ZBXRPKGG.js.map +1 -0
- package/dist/{warp-5YBSP7FP.js → warp-NRBBJQR2.js} +4 -4
- package/dist/warp-NRBBJQR2.js.map +1 -0
- package/dist/{warp-INAKVGBV.js → warp-S444B2S3.js} +9 -7
- package/dist/warp-S444B2S3.js.map +1 -0
- package/dist/{windsurf-4HM57QAY.js → windsurf-R6D2JUTN.js} +6 -6
- package/dist/windsurf-R6D2JUTN.js.map +1 -0
- package/dist/{zed-YN5X37PQ.js → zed-DQV3ZUCU.js} +10 -8
- package/dist/zed-DQV3ZUCU.js.map +1 -0
- package/dist/{zed-XXCNYOIN.js → zed-XJFOOKCO.js} +4 -4
- package/dist/zed-XJFOOKCO.js.map +1 -0
- package/package.json +88 -88
- package/dist/action-IPFDPOZU.js.map +0 -1
- package/dist/amazon-q-IT44LEWV.js.map +0 -1
- package/dist/amp-CEWOSWQO.js.map +0 -1
- package/dist/amp-P35FRU2Z.js.map +0 -1
- package/dist/antigravity-LHFEFNMC.js.map +0 -1
- package/dist/antigravity-TWIWXTQH.js +0 -18
- package/dist/antigravity-cli-MOKFSWOU.js.map +0 -1
- package/dist/antigravity-cli-MPE27LPI.js.map +0 -1
- package/dist/chunk-3EP5V2F4.js.map +0 -1
- package/dist/chunk-3FINQ2ZF.js.map +0 -1
- package/dist/chunk-4GH2KA7V.js.map +0 -1
- package/dist/chunk-7C2IPIIB.js.map +0 -1
- package/dist/chunk-7HHW23AC.js.map +0 -1
- package/dist/chunk-7PSNXUFK.js.map +0 -1
- package/dist/chunk-7ZFK2WEO.js.map +0 -1
- package/dist/chunk-C63AAXK7.js.map +0 -1
- package/dist/chunk-C747DYNT.js.map +0 -1
- package/dist/chunk-FHYR5Q5T.js.map +0 -1
- package/dist/chunk-GCPEPUD7.js.map +0 -1
- package/dist/chunk-GZZCHJDP.js.map +0 -1
- package/dist/chunk-ILWHLGIC.js.map +0 -1
- package/dist/chunk-IOJDZJ72.js.map +0 -1
- package/dist/chunk-KFPSJRHR.js.map +0 -1
- package/dist/chunk-KM2YXO6V.js.map +0 -1
- package/dist/chunk-L2C5UMKW.js.map +0 -1
- package/dist/chunk-LFWYYWLV.js.map +0 -1
- package/dist/chunk-LQ55E7QI.js.map +0 -1
- package/dist/chunk-MLU7NDAZ.js.map +0 -1
- package/dist/chunk-N4ENLZEU.js.map +0 -1
- package/dist/chunk-NDMNMAKP.js.map +0 -1
- package/dist/chunk-PSGTHJQU.js.map +0 -1
- package/dist/chunk-Q4ISQHUQ.js.map +0 -1
- package/dist/chunk-Q7PR2WGT.js.map +0 -1
- package/dist/chunk-QYOUQCC6.js.map +0 -1
- package/dist/chunk-SLJI5BOM.js.map +0 -1
- package/dist/chunk-TGZFDXNH.js.map +0 -1
- package/dist/chunk-THI4PI4H.js.map +0 -1
- package/dist/chunk-UZZTWWGG.js.map +0 -1
- package/dist/chunk-WPTNMYYM.js.map +0 -1
- package/dist/chunk-XN7S44U4.js.map +0 -1
- package/dist/chunk-XVEJAFKW.js.map +0 -1
- package/dist/chunk-XXLCMSD3.js.map +0 -1
- package/dist/chunk-XZWMJLIT.js.map +0 -1
- package/dist/chunk-Y3K6KJMS.js.map +0 -1
- package/dist/chunk-ZSOS2KOR.js.map +0 -1
- package/dist/claude-code-FS42PXZO.js.map +0 -1
- package/dist/claude-code-QBWDT5RT.js.map +0 -1
- package/dist/cline-JKEAYWVR.js.map +0 -1
- package/dist/codebuddy-EB6EYPC3.js.map +0 -1
- package/dist/codebuff-5RSXFU6G.js.map +0 -1
- package/dist/codebuff-6KWBW6CT.js.map +0 -1
- package/dist/codex-ART46CDD.js.map +0 -1
- package/dist/codex-DKBAAUCO.js.map +0 -1
- package/dist/continue-JHZCMSPH.js.map +0 -1
- package/dist/copilot-cli-CLBJACQ5.js.map +0 -1
- package/dist/copilot-cli-QVAU5CFM.js.map +0 -1
- package/dist/crush-7TORBYUL.js.map +0 -1
- package/dist/crush-A5C5USRL.js.map +0 -1
- package/dist/cursor-D5SWDVSW.js.map +0 -1
- package/dist/cursor-W7I4QUFO.js +0 -22
- package/dist/detect-JHSA3G3U.js.map +0 -1
- package/dist/devin-SSR7S4WX.js.map +0 -1
- package/dist/doctor-CQJ7TZPA.js.map +0 -1
- package/dist/droid-45PJ7JGF.js.map +0 -1
- package/dist/droid-PFQ2PZSF.js.map +0 -1
- package/dist/gemini-cli-24PFDK7D.js.map +0 -1
- package/dist/gemini-cli-Y6RJMU24.js.map +0 -1
- package/dist/goose-K2HKUTBK.js.map +0 -1
- package/dist/goose-U5D3LCPC.js.map +0 -1
- package/dist/grok-cli-L2MHAPBY.js.map +0 -1
- package/dist/hermes-2S5JUTTJ.js.map +0 -1
- package/dist/hermes-MF3NX4ZY.js.map +0 -1
- package/dist/hook-VHICXHXL.js.map +0 -1
- package/dist/install-WLENR4KF.js.map +0 -1
- package/dist/jetbrains-copilot-Z4FC3RM3.js.map +0 -1
- package/dist/junie-ULGJJIHB.js.map +0 -1
- package/dist/kilo-SMHPOHJ5.js.map +0 -1
- package/dist/kilo-WWIJOVWD.js.map +0 -1
- package/dist/kilo-cli-QKE2EQLS.js.map +0 -1
- package/dist/kilo-cli-T2SRRRJS.js.map +0 -1
- package/dist/kimi-JMUFTVSF.js.map +0 -1
- package/dist/kimi-MSIDEMCI.js.map +0 -1
- package/dist/kiro-NYRRBIKW.js.map +0 -1
- package/dist/kiro-UWUCRKR3.js.map +0 -1
- package/dist/leaderboard-NJWKGMXP.js.map +0 -1
- package/dist/mimo-code-BPNYYIVM.js.map +0 -1
- package/dist/mistral-vibe-LT3DAJ3L.js.map +0 -1
- package/dist/mux-7PIJ7HUQ.js.map +0 -1
- package/dist/mux-AHNUAY5Z.js.map +0 -1
- package/dist/nemoclaw-RE5RZASZ.js.map +0 -1
- package/dist/omp-D2EXEPH7.js.map +0 -1
- package/dist/open-interpreter-SSGBEUKX.js.map +0 -1
- package/dist/openclaw-IJ33K45M.js +0 -17
- package/dist/openclaw-KAFTNLR2.js.map +0 -1
- package/dist/opencode-YKUKZY3J.js.map +0 -1
- package/dist/opencode-Z65JYILL.js.map +0 -1
- package/dist/openhands-SEZMCUC3.js.map +0 -1
- package/dist/package-JECVQEFT.js.map +0 -1
- package/dist/pi-DLKCPOJE.js.map +0 -1
- package/dist/pi-YPYV2ULH.js.map +0 -1
- package/dist/qwen-code-26CSFDX6.js.map +0 -1
- package/dist/qwen-code-ZHCLCYMC.js.map +0 -1
- package/dist/roo-code-7F4HYB34.js.map +0 -1
- package/dist/roo-code-HSAE2CJU.js.map +0 -1
- package/dist/serve-LYSBH43G.js.map +0 -1
- package/dist/status-PHKKGEW5.js.map +0 -1
- package/dist/statusline-ZDD4OZ4F.js.map +0 -1
- package/dist/synthetic-LUT6V6SD.js.map +0 -1
- package/dist/telemetry-HDGMI2BK.js.map +0 -1
- package/dist/trae-SIQI3C66.js.map +0 -1
- package/dist/trae-Y67HSDOW.js.map +0 -1
- package/dist/uninstall-RWO2GM2I.js.map +0 -1
- package/dist/upgrade-YJCXNUEE.js.map +0 -1
- package/dist/usage-IWO4RQN6.js.map +0 -1
- package/dist/usage-event-AFFKCLHE.js.map +0 -1
- package/dist/vscode-copilot-5CI5B3X6.js.map +0 -1
- package/dist/warp-5YBSP7FP.js.map +0 -1
- package/dist/warp-INAKVGBV.js.map +0 -1
- package/dist/windsurf-4HM57QAY.js.map +0 -1
- package/dist/zed-XXCNYOIN.js.map +0 -1
- package/dist/zed-YN5X37PQ.js.map +0 -1
- /package/dist/{antigravity-TWIWXTQH.js.map → antigravity-VXHL6ZPM.js.map} +0 -0
- /package/dist/{audit-3E5JAOP2.js.map → audit-BO7JQYIH.js.map} +0 -0
- /package/dist/{cursor-W7I4QUFO.js.map → cursor-RSLHA2CY.js.map} +0 -0
- /package/dist/{openclaw-IJ33K45M.js.map → openclaw-3DHVHX5P.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/windsurf/index.ts"],"sourcesContent":["/**\r\n * adapters/windsurf — Windsurf (Codeium / Cognition's Cascade agent) adapter.\r\n *\r\n * Windsurf is an mcp-only host from agent-connector's perspective: there is no\r\n * user-installable hook/plugin layer (it is a GUI editor). AC registers the MCP\r\n * server PLUS three content surfaces (memory, workflows, skills — see below). The\r\n * MCP config is a Claude-Desktop-style OBJECT map keyed by server name (exactly\r\n * like the cursor adapter's `mcpServers`), NOT an array.\r\n *\r\n * MCP config (primary-verified — docs.devin.ai/desktop/cascade/mcp, formerly\r\n * docs.windsurf.com):\r\n * - user/global scope ONLY → ~/.codeium/windsurf/mcp_config.json\r\n * (Windows %USERPROFILE%\\.codeium\\windsurf\\mcp_config.json — homedir()\r\n * covers it). The docs specify NO project/workspace config path, so a\r\n * project-scope install returns a skip ChangeRecord.\r\n * - root key \"mcpServers\" — a JSON object/map keyed by server name.\r\n *\r\n * Server entry shapes (primary-verified):\r\n * - stdio: { command, args?, env? }\r\n * - remote: { serverUrl, headers? } — the docs use `serverUrl` (an `url`\r\n * alias is mentioned but `serverUrl` is the documented primary). There is\r\n * NO `type` discriminator and NO `disabled` field — stdio vs remote is\r\n * distinguished by `command` vs `serverUrl`. `headers` is emitted only when\r\n * the connector's remote server provides them.\r\n *\r\n * Native interpolation: Windsurf supports `${env:VAR}` / `${file:/path}`\r\n * tokens, but AC does not need to emit those — values are resolved to literals\r\n * at install time (the safe path, same as droid/crush/amazon-q).\r\n *\r\n * Memory / rules (primary-verified — docs.windsurf.com/windsurf/cascade/rules,\r\n * llms-full.txt): a `.windsurf/rules/` workspace directory holds `.md` rule\r\n * files, each declaring an activation mode \"in its frontmatter via the `trigger`\r\n * field\". `trigger: always_on` means \"full rule content is included in the\r\n * system prompt on every message\" (the docs' literal Activation-Modes table).\r\n * AC owns a DEDICATED file there (`.windsurf/rules/agent-connector.md`) that MUST\r\n * LEAD with that always-on frontmatter, so — like the continue adapter and unlike\r\n * the cline/amazon-q managed-block targets — we write the WHOLE file\r\n * (frontmatter + body) via the content-file writers and own it end-to-end\r\n * (install creates, uninstall deletes). The connector's memory `content` is\r\n * host-agnostic (MemoryDef forbids its own frontmatter), so the always-on\r\n * directive is an adapter-level wrapper. WORKSPACE/PROJECT SCOPE: `global_rules.md`\r\n * is a single SHARED global file (not an AC-owned dir), so user scope skip-warns.\r\n *\r\n * Content surfaces — workflows (slash commands) + skills, BOTH project AND user\r\n * scope:\r\n * - workflows → project `<projectDir>/.windsurf/workflows/<name>.md`,\r\n * user `~/.codeium/windsurf/global_workflows/<name>.md` (the user dir is\r\n * `global_workflows`, NOT `workflows`). Each becomes a `/<name>` slash\r\n * command. Windsurf caps each workflow file at 12,000 chars — over-budget\r\n * files are still written but warned.\r\n * - skills → project `<projectDir>/.windsurf/skills/<name>/SKILL.md`,\r\n * user `~/.codeium/windsurf/skills/<name>/SKILL.md` (the dir is `skills` in\r\n * BOTH scopes). Same SKILL.md convention cline/claude-code/qwen-code use.\r\n * Both reuse the shared claude-code renderers (renderCommandMd/renderSkillMd).\r\n *\r\n * Hook \"config path\" is aliased to the MCP file (no separate hook file) so the\r\n * base doctor/backup helpers behave sensibly (the amazon-q / roo-code idiom).\r\n */\r\n\r\nimport { existsSync, statSync } from \"node:fs\";\r\nimport { homedir } from \"node:os\";\r\nimport { basename, join } from \"node:path\";\r\n\r\nimport { BaseAdapter } from \"../base.js\";\r\nimport { renderCommandMd, renderSkillMd } from \"../claude-code/render.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 Transport,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport {\r\n buildWrappedStdio,\r\n} from \"../../core/spawn.js\";\r\n\r\nconst HOST: PlatformId = \"windsurf\";\r\nconst MCP_ROOT_KEY = \"mcpServers\";\r\n\r\n/**\r\n * Windsurf caps each workflow (slash-command) file at 12,000 characters\r\n * (docs.windsurf.com). We still write an over-budget file but emit a warn so the\r\n * author can trim it, mirroring base.ts's memory soft-budget warn. Skills have no\r\n * documented size cap, so they are not guarded.\r\n */\r\nconst WORKFLOW_MAX_CHARS = 12000;\r\n\r\n/**\r\n * Native MCP server entry shapes Windsurf accepts under `mcpServers` (an OBJECT\r\n * map keyed by server name, Claude-Desktop-style):\r\n * - stdio: { command, args?, env? } — transport inferred from `command`.\r\n * - remote: { serverUrl, headers? } — `serverUrl` (NOT `url`); NO `type`\r\n * discriminator and NO `disabled` flag. `headers` only when provided.\r\n */\r\ninterface WindsurfStdioServer {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n}\r\ninterface WindsurfRemoteServer {\r\n serverUrl: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\nexport class WindsurfAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Windsurf\";\r\n readonly paradigm: HookParadigm = \"mcp-only\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: WIRED. Windsurf reads `.windsurf/rules/*.md` (NOT\r\n // AGENTS.md), so the AGENTS.md-first BaseAdapter default does not apply — the\r\n // installMemory/uninstallMemory overrides below write a DEDICATED\r\n // agent-connector-owned file (<projectDir>/.windsurf/rules/agent-connector.md)\r\n // that LEADS with `trigger: always_on` frontmatter (full content in the\r\n // system prompt on every message). Workspace/project scope only; user scope\r\n // skip-warns (global_rules.md is a shared global file, not an AC-owned dir).\r\n supportsMemory: true,\r\n //\r\n // mcp-only: Windsurf is a GUI editor with no user-installable hook/plugin\r\n // layer. Every hook flag 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 // No hook layer → no arg/output rewrite, no context injection.\r\n canModifyArgs: false,\r\n canModifyOutput: false,\r\n canInjectSessionContext: false,\r\n // Windsurf registers stdio + remote (http/sse) MCP servers; the remote\r\n // entry is distinguished by `serverUrl` (vs stdio's `command`).\r\n transports: [\"stdio\", \"http\", \"sse\"],\r\n // Content surfaces: WIRED in BOTH scopes. Windsurf reads user-authored\r\n // WORKFLOWS (each becomes a `/<name>` slash command) and Agent SKILLS (the\r\n // same SKILL.md frontmatter convention cline/claude-code/qwen-code use):\r\n // workflows → project .windsurf/workflows/<name>.md,\r\n // user ~/.codeium/windsurf/global_workflows/<name>.md\r\n // skills → project .windsurf/skills/<name>/SKILL.md,\r\n // user ~/.codeium/windsurf/skills/<name>/SKILL.md\r\n // The install overrides below branch the path on ctx.scope and write at both.\r\n // Subagents stay UNSET (no documented user-authored dir): base skip-warns.\r\n supportsCommands: true,\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(), \".codeium\", \"windsurf\");\r\n const userMcp = join(userDir, \"mcp_config.json\");\r\n const installed = existsSync(userDir) || existsSync(userMcp);\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: userMcp,\r\n scope: \"user\",\r\n reason: installed\r\n ? `found Windsurf config under ${userDir}`\r\n : `no Windsurf config at ${userDir}`,\r\n confidence: installed ? \"high\" : \"low\",\r\n };\r\n }\r\n\r\n // ── Native paths ─────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Windsurf's MCP config is USER/GLOBAL scope only — the docs specify no\r\n * project/workspace path. getConfigDir always resolves the user dir\r\n * (homedir() covers USERPROFILE on Windows); a project-scope install is\r\n * handled by installServer returning a skip, never a write under projectDir.\r\n */\r\n getConfigDir(_ctx: InstallContext): string {\r\n return join(homedir(), \".codeium\", \"windsurf\");\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"mcp_config.json\");\r\n }\r\n\r\n /**\r\n * Windsurf has no separate hook file — hook config path aliases the MCP file\r\n * so the generic doctor/backup helpers behave sensibly (amazon-q idiom).\r\n */\r\n getHookConfigPath(ctx: InstallContext): string {\r\n return this.getServerConfigPath(ctx);\r\n }\r\n\r\n // ── Memory surface: the `.windsurf/rules` content tree ────────────────────\r\n // A DEDICATED agent-connector-owned file that MUST LEAD with `trigger:\r\n // always_on` frontmatter (full content in the system prompt on every message).\r\n // Because of that leading frontmatter we do NOT use the base managed-block\r\n // engine — we own the whole file via the content-file writers: install\r\n // writes/updates it idempotently, uninstall deletes it. WORKSPACE/PROJECT scope\r\n // only (global_rules.md is a shared global file, not an AC-owned dir).\r\n\r\n /** <projectDir>/.windsurf/rules/agent-connector.md — the dedicated owned file. */\r\n private memoryFilePath(ctx: InstallContext): string {\r\n return join(ctx.projectDir, \".windsurf\", \"rules\", \"agent-connector.md\");\r\n }\r\n\r\n /** True when `<projectDir>/.windsurf/rules` exists and is a regular FILE. */\r\n private rulesDirIsFile(ctx: InstallContext): boolean {\r\n const p = join(ctx.projectDir, \".windsurf\", \"rules\");\r\n if (!existsSync(p)) return false;\r\n try {\r\n return statSync(p).isFile();\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Compose the dedicated rule file: `trigger: always_on` frontmatter (the\r\n * always-on activation directive) + every declared memory entry's content,\r\n * joined with a blank line. The connector's content is host-agnostic markdown\r\n * (MemoryDef forbids its own frontmatter), so the directive is ours to add.\r\n */\r\n private renderMemoryFile(ctx: InstallContext): string {\r\n const body = (ctx.connector.memory ?? [])\r\n .map((m) => m.content.trim())\r\n .filter((c) => c.length > 0)\r\n .join(\"\\n\\n\");\r\n return this.renderFrontmatterMd({ trigger: \"always_on\" }, body);\r\n }\r\n\r\n override installMemory(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = ctx;\r\n const entries = connector.memory ?? [];\r\n if (connector.platforms[this.id]?.memory === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: `memory disabled for ${this.id}` }];\r\n }\r\n if (entries.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no memory\" }];\r\n }\r\n // Windsurf's verified per-rule `.windsurf/rules` dir is WORKSPACE scope only.\r\n if (ctx.scope !== \"project\") {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n detail:\r\n `no ${ctx.scope}-scope rules dir verified for windsurf ` +\r\n `(.windsurf/rules is workspace-scope; global_rules.md is a shared file); ` +\r\n `${entries.length} skipped`,\r\n },\r\n ];\r\n }\r\n // Rules-path collision: never write under a `.windsurf/rules` that is a FILE.\r\n if (this.rulesDirIsFile(ctx)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: join(ctx.projectDir, \".windsurf\", \"rules\"),\r\n detail:\r\n \"existing .windsurf/rules is a file, not a directory; left untouched — \" +\r\n \"convert it to a .windsurf/rules/ directory to receive agent-connector memory\",\r\n },\r\n ];\r\n }\r\n return [this.writeContentFile(this.memoryFilePath(ctx), this.renderMemoryFile(ctx), ctx.dryRun)];\r\n }\r\n\r\n override uninstallMemory(ctx: InstallContext): ChangeRecord[] {\r\n // Only the project-scope dedicated file was ever written; a `.windsurf/rules`\r\n // that is a FILE was never ours (installMemory warned), so leave it.\r\n if (ctx.scope !== \"project\" || this.rulesDirIsFile(ctx)) {\r\n const path = this.memoryFilePath(ctx);\r\n return [\r\n { platform: this.id, action: \"skip\", path, detail: `${basename(path)} absent` },\r\n ];\r\n }\r\n return [this.removeContentFile(this.memoryFilePath(ctx), ctx.dryRun)];\r\n }\r\n\r\n // ── Content surfaces: commands (workflows) + skills ───────────────────────\r\n // CONTENT-ONLY native-file writers, structured like installMemory: dedicated-\r\n // file ownership, dryRun honored via writeContentFile/removeContentFile. Both\r\n // reuse the shared claude-code renderers (renderCommandMd / renderSkillMd) — no\r\n // new markdown serializer. BOTH scopes write (the project dir AND the\r\n // ~/.codeium/windsurf user/global dirs are documented surfaces):\r\n //\r\n // commands (workflows)\r\n // - project → <projectDir>/.windsurf/workflows/<name>.md\r\n // - user → ~/.codeium/windsurf/global_workflows/<name>.md\r\n // (NOTE: the user dir is `global_workflows`, NOT `workflows`.)\r\n // skills\r\n // - project → <projectDir>/.windsurf/skills/<name>/SKILL.md\r\n // - user → ~/.codeium/windsurf/skills/<name>/SKILL.md\r\n // (the dir is `skills` in BOTH scopes; same SKILL.md convention\r\n // cline/claude-code/qwen-code use.)\r\n //\r\n // renderCommandMd emits Claude-flavored frontmatter keys (argument-hint, model,\r\n // allowed-tools); Windsurf ignores unknown frontmatter keys, so they are inert/\r\n // tolerated — no Windsurf-specific renderer is needed.\r\n\r\n /** Workflow file: project `.windsurf/workflows`, user `~/.codeium/windsurf/global_workflows`. */\r\n private commandPath(ctx: InstallContext, name: string): string {\r\n const dir =\r\n ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".windsurf\", \"workflows\")\r\n : join(homedir(), \".codeium\", \"windsurf\", \"global_workflows\");\r\n return join(dir, `${name}.md`);\r\n }\r\n\r\n /** Skill dir: project `.windsurf/skills/<name>`, user `~/.codeium/windsurf/skills/<name>`. */\r\n private skillDir(ctx: InstallContext, name: string): string {\r\n const base =\r\n ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".windsurf\", \"skills\")\r\n : join(homedir(), \".codeium\", \"windsurf\", \"skills\");\r\n return join(base, name);\r\n }\r\n\r\n // ── Commands (workflows) ──────────────────────────────────────────────────\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 windsurf\" }];\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 const changes: ChangeRecord[] = [];\r\n for (const cmd of connector.commands) {\r\n const rendered = renderCommandMd(cmd);\r\n changes.push(this.writeContentFile(this.commandPath(ctx, cmd.name), rendered, ctx.dryRun));\r\n // Windsurf caps each workflow file at 12,000 characters (docs.windsurf.com).\r\n // Still write the file — warn so the author can trim it (Windsurf may reject\r\n // or truncate the overflow), mirroring base.ts's memory soft-budget warn.\r\n if (rendered.length > WORKFLOW_MAX_CHARS) {\r\n changes.push({\r\n platform: this.id,\r\n action: \"warn\",\r\n path: this.commandPath(ctx, cmd.name),\r\n detail:\r\n `workflow \"${cmd.name}\" is ${rendered.length} chars ` +\r\n `(Windsurf caps each workflow at ${WORKFLOW_MAX_CHARS}); ` +\r\n `the host may reject or truncate it — trim the command`,\r\n });\r\n }\r\n }\r\n return changes;\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 // ── 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 windsurf\" }];\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 // ── MCP server install / uninstall ───────────────────────────────────────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = 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 windsurf\"\r\n : \"connector declares no MCP server\",\r\n },\r\n ];\r\n }\r\n\r\n // Windsurf has no project-level MCP config (user scope only — the docs\r\n // document only ~/.codeium/windsurf/mcp_config.json). A project-scope\r\n // install is reported as a skip rather than written into the project tree.\r\n if (ctx.scope === \"project\") {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"skip\",\r\n detail:\r\n \"Windsurf has no project-level MCP config (user scope only); \" +\r\n \"re-run with --scope user\",\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 serverPath = this.getServerConfigPath(ctx);\r\n\r\n // NEVER clobber a malformed `mcpServers`. The base upsert tolerates a\r\n // missing file / missing key (it creates the object), but a PRESENT-but-\r\n // non-object `mcpServers` (e.g. an array or string from a hand-edit) would\r\n // get a named property bolted on and silently corrupted — so skip-and-warn.\r\n const malformed = this.malformedRootKey(serverPath);\r\n if (malformed) return [malformed];\r\n\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n return [\r\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\r\n ];\r\n }\r\n\r\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\r\n const serverPath = this.getServerConfigPath(ctx);\r\n const malformed = this.malformedRootKey(serverPath);\r\n if (malformed) return [malformed];\r\n return [\r\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\r\n ];\r\n }\r\n\r\n /**\r\n * Guard for a PRESENT-but-non-object `mcpServers` root key: returns a\r\n * skip-warn ChangeRecord when the existing config parses but its `mcpServers`\r\n * value is not a plain object (an array / string / number / null). Returns\r\n * undefined when the file is absent, unparseable (the base upsert's own\r\n * overwrite guard handles that), or `mcpServers` is absent / a plain object.\r\n */\r\n private malformedRootKey(configPath: string): ChangeRecord | undefined {\r\n const cfg = this.readJson<Record<string, unknown>>(configPath);\r\n if (!cfg || !(MCP_ROOT_KEY in cfg)) return undefined;\r\n const root = cfg[MCP_ROOT_KEY];\r\n if (root !== null && typeof root === \"object\" && !Array.isArray(root)) {\r\n return undefined;\r\n }\r\n return {\r\n platform: this.id,\r\n action: \"warn\",\r\n path: configPath,\r\n detail: `existing ${MCP_ROOT_KEY} in ${configPath} is not an object map; left untouched (back it up / fix it, then re-run)`,\r\n };\r\n }\r\n\r\n /** Render a normalized ServerDef into Windsurf's native mcpServers entry. */\r\n private renderServerEntry(\r\n ctx: InstallContext,\r\n server: ServerDef,\r\n ): WindsurfStdioServer | WindsurfRemoteServer {\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 // 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 // Windsurf supports ${env:VAR} natively, but AC resolves references to\r\n // literals at install time (the safe path, same as amazon-q/droid/crush).\r\n const entry: WindsurfStdioServer = {\r\n command: resolveEnvRefsDeep(command),\r\n };\r\n if (args.length > 0) entry.args = resolveEnvRefsDeep(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 // http / sse (and any other remote transport) — Windsurf registers a remote\r\n // URL under `serverUrl` (NOT `url`). NO `type` discriminator, NO `disabled`.\r\n // `headers` only when the connector's remote server provides them.\r\n const entry: WindsurfRemoteServer = {\r\n serverUrl: 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. Windsurf has a native ${env:VAR} token, but AC\r\n * resolves references to literals at install time (the safe path).\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 return resolveEnvRefsDeep({ ...env });\r\n }\r\n\r\n // ── Hooks (unavailable — Windsurf 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 (Windsurf 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 (Windsurf 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 mcpPath = this.getServerConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n return [\r\n {\r\n name: `${this.name}: mcp_config.json 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 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> }>(mcpPath);\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 WindsurfAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
|
package/dist/zed-XXCNYOIN.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/usage/readers/zed.ts"],"sourcesContent":["/**\r\n * usage/readers/zed — Zed Agent hosted-thread usage reader (SQLite + zstd JSON).\r\n *\r\n * Faithful port of tokscale sessions/zed.rs. Zed persists one row per agent\r\n * thread in a `threads` table inside a single SQLite database:\r\n * • Linux/FreeBSD: $XDG_DATA_HOME/zed/threads/threads.db (~/.local/share/zed/…)\r\n * • macOS: ~/Library/Application Support/Zed/threads/threads.db\r\n * • Windows: %LOCALAPPDATA%\\Zed\\threads\\threads.db\r\n * (host roots, incl. the AGENT_CONNECTOR_ZED_DIR override, are resolved by\r\n * paths.ts hostRoots(\"zed\").)\r\n *\r\n * Only Zed-HOSTED model rows (provider == \"zed.dev\", case-insensitive) are\r\n * counted. External ACP agents are billed/logged by their own providers/CLIs, so\r\n * counting their Zed UI rows would double-count those sources.\r\n *\r\n * The thread payload is stored in a `data` BLOB whose `data_type` is either:\r\n * • \"json\" — the raw UTF-8 JSON bytes; or\r\n * • \"zstd\" — ZSTD-compressed JSON, decompressed here via fzstd's decompress().\r\n * Any other data_type, a failed zstd decode, or invalid JSON → the row is skipped\r\n * (fail-open). A decoded payload exceeding 32 MiB is rejected.\r\n *\r\n * One SELECT pulls every thread; the schema is backward-compatible — created_at,\r\n * folder_paths, folder_paths_order are OPTIONAL columns (older Zed builds omit\r\n * them). We probe `PRAGMA table_info(threads)` and substitute NULL for any column\r\n * that is absent so the SELECT never errors on an old schema:\r\n * SELECT id, updated_at, {created_at|NULL}, {folder_paths|NULL},\r\n * {folder_paths_order|NULL}, data_type, data FROM threads\r\n *\r\n * Token extraction (nested JSON in the decoded payload; reasoning always 0 — Zed's\r\n * TokenUsage has no reasoning field). Each TokenUsage object maps:\r\n * input = input_tokens\r\n * output = output_tokens\r\n * cacheRead = cache_read_input_tokens\r\n * cacheWrite = cache_creation_input_tokens\r\n * Primary source is `request_token_usage` (an object map keyed by request id, OR\r\n * an array): each entry with a positive total is summed and counted. When the\r\n * request usage total is > 0 we use it (messageCount = count, min 1). Otherwise we\r\n * fall back to a single `cumulative_token_usage` object (messageCount = 1). A\r\n * thread with no positive token total is dropped.\r\n *\r\n * Model: model.model (trimmed, required non-empty). Provider hard-coded \"zed.dev\"\r\n * (per zed.rs — the row is only kept when model.provider == \"zed.dev\"). Threads\r\n * with imported == true are skipped. Timestamp (port of timestamp_ms): the\r\n * created_at column, else the updated_at column, else the payload's updated_at —\r\n * each parsed via parse_timestamp_str (RFC3339 or numeric s/ms). Session id = the\r\n * `id` column (thread id), which also seeds the dedup key \"zed:<thread_id>\".\r\n * Project: folder_paths (newline-separated) selected by folder_paths_order\r\n * (comma-separated indices; lowest order wins) or the first path, normalized via\r\n * normalizeWorkspaceKey. Confidence is \"host-reported\".\r\n *\r\n * Fail-open: db missing/locked/unreadable/non-sqlite → openSqlite returns null →\r\n * []; a bad/zstd-undecodable/non-hosted row is skipped, never thrown.\r\n */\r\n\r\nimport { decompress } from \"fzstd\";\r\n\r\nimport type { TokenBreakdown, UsageReader, UsageRecord } from \"../types.js\";\r\nimport { emptyTokens } from \"../aggregate.js\";\r\nimport { normalizeWorkspaceKey, workspaceLabelFromKey } from \"../normalize.js\";\r\nimport { firstExistingRoot } from \"../paths.js\";\r\nimport { openSqlite } from \"../sqlite.js\";\r\n\r\nconst PLATFORM_ID = \"zed\" as const;\r\n/** Only Zed-hosted threads (provider == this) are counted (per zed.rs). */\r\nconst ZED_HOSTED_PROVIDER = \"zed.dev\";\r\n/** Reject a decoded thread payload larger than this (mirrors the Rust guard). */\r\nconst MAX_ZED_THREAD_JSON_BYTES = 32 * 1024 * 1024;\r\n\r\n/** The thread columns we read off each SQLite row (everything unknown). */\r\ninterface ZedThreadRow {\r\n id?: unknown;\r\n updated_at?: unknown;\r\n created_at?: unknown;\r\n folder_paths?: unknown;\r\n folder_paths_order?: unknown;\r\n data_type?: unknown;\r\n data?: unknown;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Schema probe + query build (backward-compat optional columns)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** The set of column names on the `threads` table (empty on any probe error). */\r\nfunction threadColumns(db: { all(sql: string): Array<Record<string, unknown>> }): Set<string> {\r\n const cols = new Set<string>();\r\n for (const row of db.all(\"PRAGMA table_info(threads)\")) {\r\n // table_info's column-name field is `name`.\r\n const name = row.name;\r\n if (typeof name === \"string\") cols.add(name);\r\n }\r\n return cols;\r\n}\r\n\r\n/** `column` when present on the table, else the literal `NULL` (port of optional_column). */\r\nfunction optionalColumn(columns: Set<string>, column: string): string {\r\n return columns.has(column) ? column : \"NULL\";\r\n}\r\n\r\n/** Build the threads SELECT, substituting NULL for any absent optional column. */\r\nfunction buildThreadsQuery(columns: Set<string>): string {\r\n const createdAt = optionalColumn(columns, \"created_at\");\r\n const folderPaths = optionalColumn(columns, \"folder_paths\");\r\n const folderPathsOrder = optionalColumn(columns, \"folder_paths_order\");\r\n return (\r\n `SELECT id, updated_at, ${createdAt}, ${folderPaths}, ${folderPathsOrder}, ` +\r\n `data_type, data FROM threads`\r\n );\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// BLOB decode (json / zstd → JSON value)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Coerce a sql.js BLOB cell to a Uint8Array (sql.js returns BLOBs as Uint8Array;\r\n * be tolerant of Buffer / number[] just in case), or null when it is not bytes.\r\n */\r\nfunction toBytes(v: unknown): Uint8Array | null {\r\n if (v instanceof Uint8Array) return v;\r\n if (Array.isArray(v)) return Uint8Array.from(v as number[]);\r\n if (v instanceof ArrayBuffer) return new Uint8Array(v);\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode the `data` BLOB to JSON bytes (port of decode_thread_json): \"json\"\r\n * passes the bytes through; \"zstd\" decompresses via fzstd. Returns null on an\r\n * unsupported data_type, a failed zstd decode, or an over-size payload (the row\r\n * is then skipped — fail-open).\r\n */\r\nfunction decodeThreadJson(dataType: string, data: Uint8Array): Uint8Array | null {\r\n switch (dataType.trim().toLowerCase()) {\r\n case \"json\": {\r\n if (data.length > MAX_ZED_THREAD_JSON_BYTES) return null;\r\n return data;\r\n }\r\n case \"zstd\": {\r\n let decoded: Uint8Array;\r\n try {\r\n decoded = decompress(data);\r\n } catch {\r\n return null; // undecodable zstd → skip the row (fail-open)\r\n }\r\n if (decoded.length > MAX_ZED_THREAD_JSON_BYTES) return null;\r\n return decoded;\r\n }\r\n default:\r\n return null; // unsupported data_type → skip\r\n }\r\n}\r\n\r\n/** Decode a UTF-8 byte payload to a parsed JSON value, or null on failure. */\r\nfunction parseJsonBytes(bytes: Uint8Array): unknown {\r\n let text: string;\r\n try {\r\n text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\r\n } catch {\r\n return null;\r\n }\r\n try {\r\n return JSON.parse(text);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Token usage extraction (port of thread_usage / token_usage_from_value)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** Sum the five token dimensions of a breakdown. */\r\nfunction totalTokens(t: TokenBreakdown): number {\r\n return t.input + t.output + t.cacheRead + t.cacheWrite + t.reasoning;\r\n}\r\n\r\n/**\r\n * Coerce a TokenUsage field to a non-negative integer (port of usage_field):\r\n * accept a number or a numeric string; clamp ≥ 0; 0 on absence/garbage.\r\n */\r\nfunction usageField(obj: Record<string, unknown>, field: string): number {\r\n const v = obj[field];\r\n let n: number;\r\n if (typeof v === \"number\") n = v;\r\n else if (typeof v === \"string\") n = Number(v);\r\n else return 0;\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 * Build a TokenBreakdown from a single TokenUsage value (port of\r\n * token_usage_from_value); reasoning stays 0 (not present in Zed's schema).\r\n * Returns null when the value is not an object.\r\n */\r\nfunction tokenUsageFromValue(value: unknown): TokenBreakdown | null {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return null;\r\n const obj = value as Record<string, unknown>;\r\n const tokens = emptyTokens();\r\n tokens.input = usageField(obj, \"input_tokens\");\r\n tokens.output = usageField(obj, \"output_tokens\");\r\n tokens.cacheRead = usageField(obj, \"cache_read_input_tokens\");\r\n tokens.cacheWrite = usageField(obj, \"cache_creation_input_tokens\");\r\n // reasoning stays 0.\r\n return tokens;\r\n}\r\n\r\n/**\r\n * Sum every positive TokenUsage in `request_token_usage` (port of\r\n * sum_request_token_usage). The value may be an object map (keyed by request id)\r\n * or an array; non-object members and zero-total entries are skipped. Returns the\r\n * summed breakdown and the count of positive entries.\r\n */\r\nfunction sumRequestTokenUsage(value: unknown): { tokens: TokenBreakdown; count: number } {\r\n const total = emptyTokens();\r\n let count = 0;\r\n\r\n let usages: unknown[];\r\n if (Array.isArray(value)) {\r\n usages = value;\r\n } else if (typeof value === \"object\" && value !== null) {\r\n usages = Object.values(value as Record<string, unknown>);\r\n } else {\r\n return { tokens: total, count };\r\n }\r\n\r\n for (const usageValue of usages) {\r\n const usage = tokenUsageFromValue(usageValue);\r\n if (usage === null) continue;\r\n if (totalTokens(usage) <= 0) continue;\r\n total.input += usage.input;\r\n total.output += usage.output;\r\n total.cacheRead += usage.cacheRead;\r\n total.cacheWrite += usage.cacheWrite;\r\n total.reasoning += usage.reasoning;\r\n count += 1;\r\n }\r\n\r\n return { tokens: total, count };\r\n}\r\n\r\n/**\r\n * Resolve a thread's usage (port of thread_usage): prefer the summed\r\n * request_token_usage when its total is > 0 (messageCount = count, min 1),\r\n * otherwise fall back to a single cumulative_token_usage (messageCount = 1).\r\n * Returns null when neither source yields a positive total.\r\n */\r\nfunction threadUsage(thread: Record<string, unknown>): { tokens: TokenBreakdown; messageCount: number } | null {\r\n const { tokens: requestTokens, count } = sumRequestTokenUsage(thread.request_token_usage);\r\n if (totalTokens(requestTokens) > 0) {\r\n return { tokens: requestTokens, messageCount: Math.max(1, count) };\r\n }\r\n\r\n const cumulative = tokenUsageFromValue(thread.cumulative_token_usage);\r\n if (cumulative !== null && totalTokens(cumulative) > 0) {\r\n return { tokens: cumulative, messageCount: 1 };\r\n }\r\n return null;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Timestamp (port of timestamp_ms + parse_timestamp_str)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Parse a timestamp string to epoch ms (port of parse_timestamp_str): RFC3339\r\n * first, else a positive integer disambiguated s↔ms (≥ 1e12 → ms, else × 1000).\r\n * Returns null on a non-positive / unparseable value.\r\n */\r\nfunction parseTimestampStr(value: string): number | null {\r\n const iso = Date.parse(value);\r\n if (!Number.isNaN(iso)) return iso;\r\n\r\n // Strict integer parse (the Rust path uses i64::from_str_radix-style parsing).\r\n if (/^[+-]?\\d+$/.test(value.trim())) {\r\n const numeric = Number(value.trim());\r\n if (!Number.isFinite(numeric) || numeric <= 0) return null;\r\n return numeric >= 1_000_000_000_000 ? Math.trunc(numeric) : Math.trunc(numeric * 1000);\r\n }\r\n return null;\r\n}\r\n\r\n/** A cell that should be a string, else undefined. */\r\nfunction asString(v: unknown): string | undefined {\r\n return typeof v === \"string\" ? v : undefined;\r\n}\r\n\r\n/**\r\n * Resolve the thread timestamp (port of timestamp_ms): created_at column, else\r\n * updated_at column, else the payload's updated_at — first that parses. Returns\r\n * null when none yields a valid timestamp.\r\n */\r\nfunction timestampMs(row: ZedThreadRow, thread: Record<string, unknown>): number | null {\r\n const createdAt = asString(row.created_at);\r\n if (createdAt !== undefined) {\r\n const ms = parseTimestampStr(createdAt);\r\n if (ms !== null) return ms;\r\n }\r\n const updatedAt = asString(row.updated_at);\r\n if (updatedAt !== undefined) {\r\n const ms = parseTimestampStr(updatedAt);\r\n if (ms !== null) return ms;\r\n }\r\n const payloadUpdatedAt = asString(thread.updated_at);\r\n if (payloadUpdatedAt !== undefined) {\r\n const ms = parseTimestampStr(payloadUpdatedAt);\r\n if (ms !== null) return ms;\r\n }\r\n return null;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Project / workspace (port of workspace_key_from_folders)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Pick the index of the lowest-order path (port of first_ordered_path_index):\r\n * `order` is a comma-separated list of indices aligned positionally with the\r\n * paths; we take the position whose parsed order value is smallest, ignoring\r\n * positions beyond the path count. Returns undefined when nothing parses.\r\n */\r\nfunction firstOrderedPathIndex(order: string, pathCount: number): number | undefined {\r\n let bestIndex: number | undefined;\r\n let bestOrder = Number.POSITIVE_INFINITY;\r\n const parts = order.split(\",\");\r\n for (let index = 0; index < parts.length; index++) {\r\n if (index >= pathCount) continue;\r\n const raw = (parts[index] as string).trim();\r\n if (!/^\\d+$/.test(raw)) continue;\r\n const value = Number(raw);\r\n if (!Number.isFinite(value)) continue;\r\n if (value < bestOrder) {\r\n bestOrder = value;\r\n bestIndex = index;\r\n }\r\n }\r\n return bestIndex;\r\n}\r\n\r\n/**\r\n * Derive a normalized workspace key from the folder columns (port of\r\n * workspace_key_from_folders): split `paths` on newlines (trimmed, non-empty),\r\n * select by `order` (lowest-order index) or the first path, then normalize.\r\n */\r\nfunction workspaceKeyFromFolders(paths: unknown, order: unknown): string | undefined {\r\n if (typeof paths !== \"string\") return undefined;\r\n const list = paths\r\n .split(/\\r?\\n/)\r\n .map((p) => p.trim())\r\n .filter((p) => p !== \"\");\r\n if (list.length === 0) return undefined;\r\n\r\n let selected: string | undefined;\r\n if (typeof order === \"string\") {\r\n const idx = firstOrderedPathIndex(order, list.length);\r\n if (idx !== undefined) selected = list[idx];\r\n }\r\n if (selected === undefined) selected = list[0];\r\n\r\n return normalizeWorkspaceKey(selected as string);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Row → record (port of parse_thread_row)\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** Parse one threads row into a UsageRecord, or null when it should be skipped. */\r\nfunction parseThreadRow(row: ZedThreadRow): UsageRecord | null {\r\n const id = asString(row.id);\r\n if (id === undefined || id === \"\") return null;\r\n\r\n const dataType = asString(row.data_type);\r\n if (dataType === undefined) return null;\r\n const dataBytes = toBytes(row.data);\r\n if (dataBytes === null) return null;\r\n\r\n const jsonBytes = decodeThreadJson(dataType, dataBytes);\r\n if (jsonBytes === null) return null; // unsupported / undecodable / oversize → skip\r\n\r\n const parsed = parseJsonBytes(jsonBytes);\r\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) return null;\r\n const thread = parsed as Record<string, unknown>;\r\n\r\n // Skip imported threads.\r\n if (thread.imported === true) return null;\r\n\r\n // Require a hosted (zed.dev) model with a non-empty model id.\r\n const model = thread.model;\r\n if (typeof model !== \"object\" || model === null || Array.isArray(model)) return null;\r\n const modelObj = model as Record<string, unknown>;\r\n const provider = asString(modelObj.provider);\r\n if (provider === undefined) return null;\r\n if (provider.trim().toLowerCase() !== ZED_HOSTED_PROVIDER) return null;\r\n\r\n const modelRaw = asString(modelObj.model);\r\n if (modelRaw === undefined) return null;\r\n const modelId = modelRaw.trim();\r\n if (modelId === \"\") return null;\r\n\r\n const usage = threadUsage(thread);\r\n if (usage === null) return null; // no positive token total → drop\r\n\r\n const ts = timestampMs(row, thread);\r\n if (ts === null) return null;\r\n\r\n const record: UsageRecord = {\r\n platformId: PLATFORM_ID,\r\n modelId,\r\n providerId: ZED_HOSTED_PROVIDER,\r\n sessionId: id,\r\n tokens: usage.tokens,\r\n ts,\r\n messageCount: usage.messageCount,\r\n dedupKey: `zed:${id}`,\r\n confidence: \"host-reported\",\r\n };\r\n\r\n const projectKey = workspaceKeyFromFolders(row.folder_paths, row.folder_paths_order);\r\n if (projectKey !== undefined) {\r\n record.projectKey = projectKey;\r\n const label = workspaceLabelFromKey(projectKey);\r\n if (label !== undefined) record.projectLabel = label;\r\n }\r\n\r\n return record;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────\r\n// Reader\r\n// ─────────────────────────────────────────────────────────────────────────\r\n\r\n/** The Zed Agent hosted-thread usage reader singleton. */\r\nconst zedReader: UsageReader = {\r\n platformId: PLATFORM_ID,\r\n kind: \"local\",\r\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\r\n const dbPath = firstExistingRoot(PLATFORM_ID);\r\n if (dbPath === undefined) return []; // no threads.db → fail-open\r\n\r\n const db = await openSqlite(dbPath);\r\n if (db === null) return []; // missing / locked / unreadable / non-sqlite → fail-open\r\n\r\n try {\r\n const columns = threadColumns(db);\r\n const query = buildThreadsQuery(columns);\r\n const rows = db.all(query); // bad SQL / schema mismatch → [] (fail-open)\r\n const records: UsageRecord[] = [];\r\n\r\n for (const raw of rows) {\r\n let record: UsageRecord | null;\r\n try {\r\n record = parseThreadRow(raw as ZedThreadRow);\r\n } catch {\r\n continue; // any per-row decode failure → skip (fail-open)\r\n }\r\n if (record === null) continue;\r\n if (sinceMs !== undefined && record.ts < sinceMs) continue;\r\n records.push(record);\r\n }\r\n\r\n return records;\r\n } finally {\r\n db.close();\r\n }\r\n },\r\n};\r\n\r\nexport default zedReader;\r\n"],"mappings":"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","names":[]}
|
package/dist/zed-YN5X37PQ.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/zed/index.ts"],"sourcesContent":["/**\r\n * adapters/zed — Zed editor platform adapter for agent-connector.\r\n *\r\n * Zed is an **mcp-only** host: it is an IDE, not a CLI with a hook pipeline, so\r\n * there is NO lifecycle hook system. MCP (\"context servers\") is the only\r\n * integration path, so this adapter installs only the MCP server and reports\r\n * hooks as unavailable — like Warp, it exercises the `mcp-only` paradigm.\r\n *\r\n * MCP config (one JSON-with-comments settings file, NOT a dedicated MCP file):\r\n * - user scope → settings.json under Zed's OS-native config dir (Rust\r\n * `dirs::config_dir()`):\r\n * • Windows: %APPDATA%\\Zed\\settings.json (Roaming, NOT %LOCALAPPDATA%)\r\n * • macOS / Linux: ~/.config/zed/settings.json\r\n * - project scope → <projectDir>/.zed/settings.json\r\n * Root key is \"context_servers\" (NOT \"mcpServers\"). The same file holds the\r\n * (non-existent) hook config — there is no separate hook file here.\r\n *\r\n * MERGE CONTRACT: Zed's settings.json is a large user-owned IDE config. We read\r\n * the whole file, set ONLY context_servers[<id>], and write it back — every\r\n * other top-level key and sibling context server is preserved. (Zed accepts\r\n * JSONC; we WRITE plain JSON, mirroring the other JSON-config adapters.)\r\n *\r\n * ENTRY SHAPE QUIRK (verified against context-mode's proven Zed adapter +\r\n * zed-industries/zed crates/settings_content/src/project.rs): Zed's\r\n * context_servers Stdio variant flattens ContextServerCommand and renames its\r\n * `path` field to the JSON key `command`. The accepted shape is therefore a\r\n * FLAT entry: { \"command\": \"<exe>\", \"args\": [...], \"env\": {...} }. The nested\r\n * { command: { path, args } } form fails to deserialize under Zed's\r\n * #[serde(untagged)] enum and is silently dropped (the server never loads).\r\n *\r\n * Zed documents no native ${env:VAR} interpolation token for context_servers,\r\n * so env refs are resolved to literals at install time (the no-native-token\r\n * path, same as Warp).\r\n *\r\n * Skills surface: Zed reads SKILL.md files from:\r\n * project scope → <projectDir>/.agents/skills/<name>/SKILL.md\r\n * user scope → ~/.agents/skills/<name>/SKILL.md\r\n *\r\n * Actions surface: Zed reads `tasks.json` — a JSON ARRAY of tasks\r\n * `{ label, command, args?, … }` spawned in its integrated terminal and surfaced\r\n * in the command palette (`task: spawn`) / bindable (zed.dev/docs/tasks):\r\n * user scope → ~/.config/zed/tasks.json (%APPDATA%\\Zed on Windows — the\r\n * SAME OS-native config dir as settings.json)\r\n * project scope → <projectDir>/.zed/tasks.json\r\n * For each AC action we add ONE owned task whose `command` execs the home-bin\r\n * action verb. Zed runs `command` in a shell (\"tasks act just like your shell\"),\r\n * so the full `<homeBin> action zed <id> --connector <id>` line is a HEADLESS\r\n * exec (unlike Warp's paste-into-input semantics). tasks.json is a user-owned\r\n * ARRAY, so we array-merge: set-if-absent, keyed on OUR action command (the\r\n * isHomeBinActionCommand ownership predicate), idempotent, and uninstall removes\r\n * ONLY our entries — every foreign task survives.\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, type ActionTrigger } from \"../base.js\";\r\nimport type { Adapter, InstallContext, MemoryTarget } 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 SkillDef,\r\n Transport,\r\n} from \"../../core/types.js\";\r\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\r\nimport { roamingAppData } from \"../../core/host-paths.js\";\r\nimport {\r\n buildWrappedStdio,\r\n isHomeBinActionCommand,\r\n} from \"../../core/spawn.js\";\r\nimport { renderSkillMd } from \"../claude-code/render.js\";\r\n\r\nconst HOST: PlatformId = \"zed\";\r\nconst MCP_ROOT_KEY = \"context_servers\";\r\n\r\n/**\r\n * Zed's context_servers Stdio entry. FLAT shape — `command` is a string, NOT a\r\n * nested { path, args } object (see file header). Remote transports are\r\n * represented as a URL-bearing entry.\r\n */\r\ninterface ZedStdioServer {\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n}\r\ninterface ZedHttpServer {\r\n url: string;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n/**\r\n * One Zed task entry in tasks.json (zed.dev/docs/tasks). Zed accepts many\r\n * optional keys (env, cwd, reveal, …); we write only the minimal owned trio\r\n * { label, command } and preserve every key on FOREIGN entries untouched.\r\n */\r\ninterface ZedTask {\r\n label: string;\r\n command: string;\r\n [key: string]: unknown;\r\n}\r\n\r\nexport class ZedAdapter extends BaseAdapter implements Adapter {\r\n readonly id: PlatformId = HOST;\r\n readonly name = \"Zed\";\r\n readonly paradigm: HookParadigm = \"mcp-only\";\r\n\r\n readonly capabilities: PlatformCapabilities = {\r\n // Memory surface: AGENTS.md-first managed block. Zed's project rules file\r\n // is FIRST-MATCH across nine candidates — memoryTargets below probes that\r\n // order and writes into the file Zed will actually read; user scope is the\r\n // personal ~/.config/zed/AGENTS.md (%APPDATA%\\Zed on Windows, base map).\r\n supportsMemory: true,\r\n // Zed 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 // Zed registers stdio context servers; remote URLs are also accepted.\r\n transports: [\"stdio\", \"sse\", \"http\"],\r\n // Skills: Zed reads SKILL.md from .agents/skills/<name>/SKILL.md (project)\r\n // and ~/.agents/skills/<name>/SKILL.md (user).\r\n supportsSkills: true,\r\n // Actions: Zed reads tasks.json (a JSON ARRAY of { label, command, args? })\r\n // spawned in its integrated terminal + surfaced in the command palette\r\n // (zed.dev/docs/tasks). Each AC action becomes one owned task whose `command`\r\n // execs the home-bin action verb — a headless exec (zed runs it in a shell).\r\n // user → ~/.config/zed/tasks.json; project → <projectDir>/.zed/tasks.json.\r\n supportsActions: true,\r\n };\r\n\r\n // ── Detection ────────────────────────────────────────────────────────────\r\n\r\n detectInstalled(projectDir: string): DetectedPlatform {\r\n const userDir = this.userConfigDir();\r\n const userSettings = this.userSettingsPath();\r\n const projDir = join(projectDir, \".zed\");\r\n const projSettings = join(projDir, \"settings.json\");\r\n\r\n const userInstalled = existsSync(userDir) || existsSync(userSettings);\r\n const projInstalled = existsSync(projDir) || existsSync(projSettings);\r\n const installed = userInstalled || projInstalled;\r\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\r\n const configPath = scope === \"project\" ? projSettings : userSettings;\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 Zed config (${scope}) at ${configPath}`\r\n : `no Zed config at ${userSettings} or ${projSettings}`,\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, \".zed\")\r\n : this.userConfigDir();\r\n }\r\n\r\n getServerConfigPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"settings.json\");\r\n }\r\n\r\n /**\r\n * Zed has no hook file — hooks are not a thing here. The hook \"config path\"\r\n * is the same settings.json 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 /**\r\n * Zed's user config dir is OS-native (Rust `dirs::config_dir()`), NOT a\r\n * uniform ~/.config:\r\n * - Windows: %APPDATA%\\Zed (Roaming, NOT Local/%LOCALAPPDATA%)\r\n * - macOS / Linux: ~/.config/zed\r\n */\r\n private userConfigDir(): string {\r\n if (process.platform === \"win32\") {\r\n return join(roamingAppData(), \"Zed\");\r\n }\r\n return join(homedir(), \".config\", \"zed\");\r\n }\r\n\r\n private userSettingsPath(): string {\r\n return join(this.userConfigDir(), \"settings.json\");\r\n }\r\n\r\n // ── Memory surface: first-match project rules probe ─────────────────────\r\n /**\r\n * Zed reads exactly ONE project rules file — the FIRST existing of these\r\n * worktree-root candidates (zed docs/src/ai/instructions.md order). A block\r\n * in AGENTS.md is silently ignored when e.g. `.cursorrules` exists, so the\r\n * probe targets the file Zed will actually pick; AGENTS.md is created only\r\n * when nothing shadows it.\r\n */\r\n private static readonly PROJECT_RULES_PROBE_ORDER = [\r\n \".rules\",\r\n \".cursorrules\",\r\n \".windsurfrules\",\r\n \".clinerules\",\r\n join(\".github\", \"copilot-instructions.md\"),\r\n \"AGENT.md\",\r\n \"AGENTS.md\",\r\n \"CLAUDE.md\",\r\n \"GEMINI.md\",\r\n ];\r\n\r\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\r\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"project\") {\r\n return super.memoryTargets(ctx); // user scope: personal AGENTS.md (base map)\r\n }\r\n for (const rel of ZedAdapter.PROJECT_RULES_PROBE_ORDER) {\r\n const candidate = join(ctx.projectDir, rel);\r\n if (existsSync(candidate)) {\r\n return [\r\n {\r\n path: candidate,\r\n reason: `zed first-match project rules file (${rel} shadows later candidates)`,\r\n },\r\n ];\r\n }\r\n }\r\n return [\r\n {\r\n path: join(ctx.projectDir, \"AGENTS.md\"),\r\n reason: \"AGENTS.md (created; no zed first-match rules file present)\",\r\n },\r\n ];\r\n }\r\n\r\n // ── MCP server install / uninstall ───────────────────────────────────────\r\n\r\n installServer(ctx: InstallContext): ChangeRecord[] {\r\n const { connector } = 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 zed\"\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 serverPath = this.getServerConfigPath(ctx);\r\n const entry = this.renderServerEntry(ctx, server);\r\n\r\n // upsertServerInJson reads the WHOLE settings file, sets only\r\n // context_servers[<id>], and writes it back — preserving every other\r\n // top-level key and sibling context server (the merge contract).\r\n return [\r\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\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(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\r\n ];\r\n }\r\n\r\n /** Render a normalized ServerDef into Zed's native context_servers entry. */\r\n private renderServerEntry(\r\n ctx: InstallContext,\r\n server: ServerDef,\r\n ): ZedStdioServer | ZedHttpServer {\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 // 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 // Zed has no documented native interpolation token, so resolve every\r\n // ${env:VAR} to a literal at install time.\r\n // FLAT shape: `command` is a string, never a nested { path, args }.\r\n const entry: ZedStdioServer = { command: resolveEnvRefsDeep(command) };\r\n if (args.length > 0) entry.args = resolveEnvRefsDeep(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 // sse / http (and any other remote transport) — Zed registers a URL.\r\n const entry: ZedHttpServer = { url: resolveEnvRefsDeep(server.url ?? \"\") };\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. Zed documents no native interpolation token, so\r\n * resolve `${env:VAR}` references to literals at install time.\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 return resolveEnvRefsDeep({ ...env });\r\n }\r\n\r\n // ── Skills surface ───────────────────────────────────────────────────────\r\n // Zed reads SKILL.md files from:\r\n // project scope → <projectDir>/.agents/skills/<name>/SKILL.md\r\n // user scope → ~/.agents/skills/<name>/SKILL.md\r\n\r\n private skillsDir(ctx: InstallContext): string {\r\n return ctx.scope === \"project\"\r\n ? join(ctx.projectDir, \".agents\", \"skills\")\r\n : join(homedir(), \".agents\", \"skills\");\r\n }\r\n\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 zed\" }];\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\"), this.renderSkill(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 private renderSkill(skill: SkillDef): string {\r\n return renderSkillMd(skill);\r\n }\r\n\r\n // ── Action surface (owned entries array-merged into tasks.json) ───────────\r\n // Zed reads tasks.json (zed.dev/docs/tasks): a JSON ARRAY of tasks\r\n // `{ label, command, args? }` spawned in the integrated terminal + invocable\r\n // from the command palette (`task: spawn`). Per AC action we add ONE task\r\n // whose `command` execs the home-bin action verb. Zed runs `command` in a\r\n // shell, so this is a HEADLESS exec (not Warp's paste-into-input).\r\n //\r\n // OWNERSHIP: tasks.json is a USER-OWNED array, so we never clobber it. We\r\n // read the whole array, upsert only OUR tasks (identity = isHomeBinActionCommand\r\n // on `command`, anchored to this connector id so a sibling connector's tasks\r\n // are foreign), and write back. Idempotent (byte-identical entry → skip).\r\n // Uninstall filters out ONLY our entries, leaving every foreign task intact.\r\n\r\n /** tasks.json path: <configDir>/tasks.json (~/.config/zed | <projectDir>/.zed). */\r\n private tasksPath(ctx: InstallContext): string {\r\n return join(this.getConfigDir(ctx), \"tasks.json\");\r\n }\r\n\r\n /** Render the owned task entry: minimal { label, command }. */\r\n private renderTask(trigger: ActionTrigger): ZedTask {\r\n return { label: trigger.label, command: trigger.command };\r\n }\r\n\r\n override installActions(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n if (connector.platforms[HOST]?.actions === false) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"actions disabled for zed\" }];\r\n }\r\n const triggers = this.actionTriggers(ctx);\r\n if (triggers.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no actions\" }];\r\n }\r\n\r\n const path = this.tasksPath(ctx);\r\n const symlink = this.symlinkPathWarning(path);\r\n if (symlink) return [symlink];\r\n\r\n // Overwrite guard: a present-but-unparseable tasks.json must never be blanked\r\n // (symmetric with the settings.json merge contract — see review-fixes tests).\r\n if (this.isPresentButUnparseable(path)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path,\r\n detail: `${path} is present but not parseable as JSON; left untouched (fix it, then re-run)`,\r\n },\r\n ];\r\n }\r\n\r\n // tasks.json IS a top-level array. A null parse means \"absent\" (create\r\n // fresh); a present non-array value was hand-edited to the wrong shape, so\r\n // warn-skip rather than clobber it (mirrors continue's mcpServers guard).\r\n const raw = this.readJson<unknown>(path);\r\n if (raw !== null && !Array.isArray(raw)) {\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"warn\",\r\n path,\r\n detail: `${path} is not a JSON array of tasks; left untouched (fix it, then re-run)`,\r\n },\r\n ];\r\n }\r\n const list = (raw ?? []) as ZedTask[];\r\n\r\n const changes: ChangeRecord[] = [];\r\n let mutated = false;\r\n for (const trigger of triggers) {\r\n const entry = this.renderTask(trigger);\r\n // Identity is OUR action command (anchored to this connector id), NOT the\r\n // label — a user could relabel. Match the SPECIFIC action by its command,\r\n // which is unique per action id (one slot per action).\r\n const slot = list.findIndex(\r\n (t) => this.isOurTask(t, ctx) && t.command === entry.command,\r\n );\r\n if (slot < 0) {\r\n list.push(entry);\r\n mutated = true;\r\n changes.push({ platform: this.id, action: \"create\", path, detail: `tasks.json [${trigger.id}]` });\r\n } else if (JSON.stringify(list[slot]) === JSON.stringify(entry)) {\r\n changes.push({ platform: this.id, action: \"skip\", path, detail: `tasks.json [${trigger.id}]` });\r\n } else {\r\n list[slot] = entry;\r\n mutated = true;\r\n changes.push({ platform: this.id, action: \"update\", path, detail: `tasks.json [${trigger.id}]` });\r\n }\r\n }\r\n\r\n if (mutated && !dryRun) this.writeJson(path, list);\r\n return changes;\r\n }\r\n\r\n override uninstallActions(ctx: InstallContext): ChangeRecord[] {\r\n const { connector, dryRun } = ctx;\r\n if (connector.actions.length === 0) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no actions\" }];\r\n }\r\n\r\n const path = this.tasksPath(ctx);\r\n const raw = this.readJson<unknown>(path);\r\n if (raw === null || !Array.isArray(raw)) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"tasks.json absent or not an array\" }];\r\n }\r\n\r\n const list = raw as ZedTask[];\r\n const kept = list.filter((t) => !this.isOurTask(t, ctx));\r\n if (kept.length === list.length) {\r\n return [{ platform: this.id, action: \"skip\", detail: \"no owned tasks in tasks.json\" }];\r\n }\r\n if (!dryRun) this.writeJson(path, kept);\r\n return [\r\n {\r\n platform: this.id,\r\n action: \"remove\",\r\n path,\r\n detail: `tasks.json (${list.length - kept.length} owned task(s) removed)`,\r\n },\r\n ];\r\n }\r\n\r\n /**\r\n * True when a task entry is OURS — its `command` is the home-bin action verb\r\n * for exactly this connector id (anchored so a shared-prefix id can't collide,\r\n * and the ` action ` verb so a future hook/serve task is never misread).\r\n */\r\n private isOurTask(task: ZedTask | undefined, ctx: InstallContext): boolean {\r\n return isHomeBinActionCommand(task?.command, ctx.homeBinPath, ctx.connector.id);\r\n }\r\n\r\n // ── Hooks (unavailable — Zed 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 (Zed 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 (Zed 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 settingsPath = this.getServerConfigPath(ctx);\r\n const connectorId = ctx.connector.id;\r\n return [\r\n {\r\n name: `${this.name}: settings.json present`,\r\n check: () =>\r\n existsSync(settingsPath)\r\n ? { status: \"OK\", detail: settingsPath }\r\n : { status: \"FAIL\", detail: `not found: ${settingsPath}` },\r\n },\r\n {\r\n name: `${this.name}: context server entry registered`,\r\n check: () => {\r\n // Only assert what the connector declares: a server-less connector —\r\n // e.g. a catalog-only bundle of agents/skills/commands — never writes\r\n // a context_servers 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> }>(settingsPath);\r\n const bucket = cfg?.[MCP_ROOT_KEY];\r\n if (!cfg || !bucket) {\r\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${settingsPath}` };\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 ${settingsPath}`,\r\n };\r\n },\r\n },\r\n ];\r\n }\r\n}\r\n\r\nexport const adapter = new ZedAdapter();\r\nexport default adapter;\r\n"],"mappings":"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","names":["entry"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|