@ken-jo/agent-connector 0.5.0 → 0.6.1
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/README.md +9 -6
- package/dist/{action-LEYTHNIU.js → action-BCD2GOJA.js} +8 -8
- package/dist/{amazon-q-7DPVJXJN.js → amazon-q-KCNHU3BI.js} +2 -2
- package/dist/{amp-VYXZWHXW.js → amp-HI6CGN36.js} +2 -2
- package/dist/{amp-BQZOL5GR.js → amp-NDP2J4K3.js} +2 -2
- package/dist/{antigravity-EA4L225L.js → antigravity-FY5553OR.js} +2 -2
- package/dist/{antigravity-VXHL6ZPM.js → antigravity-I2L4WSJN.js} +3 -3
- package/dist/{antigravity-cli-B2HXZFYQ.js → antigravity-cli-IUAE3SEX.js} +2 -2
- package/dist/{antigravity-cli-JHQ7JGNX.js → antigravity-cli-T24Y54NG.js} +3 -3
- package/dist/{audit-HPKCUCES.js → audit-F47H2PLT.js} +5 -5
- package/dist/{chunk-O7SDRBVB.js → chunk-6ZZQXEL7.js} +2 -1
- package/dist/{chunk-O7SDRBVB.js.map → chunk-6ZZQXEL7.js.map} +1 -1
- package/dist/{chunk-IRUYJD23.js → chunk-AN7QCLT7.js} +27 -33
- package/dist/chunk-AN7QCLT7.js.map +1 -0
- package/dist/{chunk-BXPSDNIB.js → chunk-BD72ZF6D.js} +2 -2
- package/dist/{chunk-M6OS4OLU.js → chunk-BGPVMJOG.js} +2 -2
- package/dist/{chunk-2Y2MZRLP.js → chunk-CWUPIT72.js} +2 -2
- package/dist/{chunk-FKW5A6HE.js → chunk-HUL5CRF2.js} +4 -4
- package/dist/{chunk-SFY6YLVK.js → chunk-K67UJSJI.js} +5 -6
- package/dist/{chunk-SFY6YLVK.js.map → chunk-K67UJSJI.js.map} +1 -1
- package/dist/{chunk-UM5S7DKK.js → chunk-KOFCNA5T.js} +11 -2
- package/dist/{chunk-UM5S7DKK.js.map → chunk-KOFCNA5T.js.map} +1 -1
- package/dist/{chunk-WZMSSIDN.js → chunk-LO6NIZSL.js} +14 -6
- package/dist/chunk-LO6NIZSL.js.map +1 -0
- package/dist/{chunk-6WN37NVN.js → chunk-O7CFTOM5.js} +2 -2
- package/dist/{chunk-4KIXXJ7B.js → chunk-OXANBA4I.js} +2 -2
- package/dist/{chunk-JTN3AKZO.js → chunk-PMOFA5BT.js} +12 -5
- package/dist/chunk-PMOFA5BT.js.map +1 -0
- package/dist/{chunk-G5HAIYRM.js → chunk-QG26JEJF.js} +66 -58
- package/dist/chunk-QG26JEJF.js.map +1 -0
- package/dist/{chunk-U2XJWG7N.js → chunk-STR3CRH3.js} +4 -4
- package/dist/{chunk-6XMV2OOA.js → chunk-W4GVN3TJ.js} +3 -3
- package/dist/{chunk-PWCBWAM4.js → chunk-W67GINTF.js} +2 -2
- package/dist/{chunk-XY3N2U6L.js → chunk-WAALPWR4.js} +2 -2
- package/dist/{chunk-4QXCNZMD.js → chunk-X2XEE4DO.js} +2 -2
- package/dist/{chunk-T5AI3AW3.js → chunk-ZHG7Q424.js} +19 -19
- package/dist/{claude-code-LJ6DVXWQ.js → claude-code-EIC4Q7OT.js} +5 -5
- package/dist/{claude-code-NMRKTAP7.js → claude-code-L4VXCHKA.js} +2 -2
- package/dist/cli/sdk.js +4 -4
- package/dist/cli.js +1 -1
- package/dist/{cline-JAPJNOZQ.js → cline-AJZ67XEE.js} +3 -3
- package/dist/cline-AJZ67XEE.js.map +1 -0
- package/dist/{codebuddy-GC7VAE2Y.js → codebuddy-EZZFEP35.js} +2 -2
- package/dist/{codebuff-ETYT5UBL.js → codebuff-GUNT2KBT.js} +2 -2
- package/dist/{codebuff-3VODFPD4.js → codebuff-HFI3MHNO.js} +12 -12
- package/dist/codebuff-HFI3MHNO.js.map +1 -0
- package/dist/{codex-RXIS5BHM.js → codex-C7ERS3TW.js} +3 -3
- package/dist/{codex-YAORPCOD.js → codex-H4MY6747.js} +2 -2
- package/dist/{continue-MECVDV4Z.js → continue-K2CWUNX5.js} +2 -2
- package/dist/{copilot-cli-MZTAWMPW.js → copilot-cli-FIQNEHFC.js} +2 -2
- package/dist/{copilot-cli-WVWAWNSM.js → copilot-cli-GCRZCLTV.js} +2 -2
- package/dist/{crush-QBXLNN7T.js → crush-HLM2DFW2.js} +2 -2
- package/dist/{crush-YB3SK6NK.js → crush-KFWUUVZ3.js} +3 -3
- package/dist/{cursor-RSLHA2CY.js → cursor-CKSMXWKG.js} +3 -3
- package/dist/{cursor-DIW43TRZ.js → cursor-Y3X7YK3S.js} +2 -2
- package/dist/{define-connector-odRHEC4H.d.ts → define-connector-iosc34CA.d.ts} +1 -1
- package/dist/{detect-USP5JMWM.js → detect-IX6U2FBV.js} +4 -4
- package/dist/{devin-WPDN3MXE.js → devin-VD6VCB4Y.js} +2 -2
- package/dist/{doctor-VSW5KHBM.js → doctor-DEZPJXGY.js} +15 -15
- package/dist/{droid-HS6MX3IL.js → droid-BNWFLMZU.js} +2 -2
- package/dist/{droid-U3ZBLQFO.js → droid-SNF6TQK2.js} +2 -2
- package/dist/{gemini-cli-NMVVBO3K.js → gemini-cli-2B6TS7KU.js} +2 -2
- package/dist/{gemini-cli-VJ6X5DNF.js → gemini-cli-RH63NCVC.js} +2 -2
- package/dist/{goose-3X7ID7YW.js → goose-G4JBHXLJ.js} +3 -3
- package/dist/{goose-64V46Y2W.js → goose-KDHNJE7Z.js} +2 -2
- package/dist/grok-build-FSN4TNLQ.js +682 -0
- package/dist/grok-build-FSN4TNLQ.js.map +1 -0
- package/dist/{grok-cli-4VFVF2CQ.js → grok-cli-TAIK7VEP.js} +5 -4
- package/dist/grok-cli-TAIK7VEP.js.map +1 -0
- package/dist/{hermes-AIVUE7LX.js → hermes-BOTDXP3F.js} +2 -2
- package/dist/{hermes-F3EGTK6N.js → hermes-MVCJAPSI.js} +2 -2
- package/dist/{hook-QRW3ON6C.js → hook-Q3MDXE56.js} +8 -8
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/{install-ASTAUZKB.js → install-FD7XL3YC.js} +12 -12
- package/dist/{introspect-gTx6GzpW.d.ts → introspect-z3eKVWHN.d.ts} +1 -1
- package/dist/{jetbrains-copilot-XBO2JZRO.js → jetbrains-copilot-TMU324FM.js} +2 -2
- package/dist/{junie-UCOS6Q37.js → junie-RU564IK7.js} +2 -2
- package/dist/{kilo-SW7BH6EG.js → kilo-CHH3XI7H.js} +2 -2
- package/dist/kilo-CHH3XI7H.js.map +1 -0
- package/dist/{kilo-T4OXNUYY.js → kilo-P32GL6JM.js} +3 -3
- package/dist/{kilo-cli-ZF272ZHN.js → kilo-cli-L57AGENB.js} +2 -2
- package/dist/{kilo-cli-I2S3W245.js → kilo-cli-WBVPQNVP.js} +3 -3
- package/dist/{kimi-5FHEXGZD.js → kimi-BDW32HPV.js} +2 -2
- package/dist/{kimi-VLSUFLYV.js → kimi-GY2XXIJB.js} +2 -2
- package/dist/{kiro-AQFXGOJX.js → kiro-D73LXTUV.js} +2 -2
- package/dist/{kiro-WGOI5CGT.js → kiro-HZF4BADZ.js} +2 -2
- package/dist/{leaderboard-3XSVSGAJ.js → leaderboard-44GN3NBH.js} +3 -3
- package/dist/{mimo-code-KETL7W7D.js → mimo-code-F3BZAQZK.js} +2 -2
- package/dist/{mistral-vibe-3AU7N2CA.js → mistral-vibe-ETTSQPK5.js} +2 -2
- package/dist/{mux-XM6AP35L.js → mux-H4PNZRKG.js} +2 -2
- package/dist/mux-H4PNZRKG.js.map +1 -0
- package/dist/{mux-BO2L5CTW.js → mux-WKBVW6DA.js} +28 -22
- package/dist/mux-WKBVW6DA.js.map +1 -0
- package/dist/{nemoclaw-WA7RSKF2.js → nemoclaw-SGRSTG6V.js} +3 -3
- package/dist/{omp-UDYJ2PYY.js → omp-DBW2I6HC.js} +2 -2
- package/dist/{open-interpreter-WMBNM4MQ.js → open-interpreter-CXUCCZI3.js} +2 -2
- package/dist/{openclaw-3DHVHX5P.js → openclaw-CVCZR63Q.js} +3 -3
- package/dist/{openclaw-5EQFGOWL.js → openclaw-QC6ROV5Z.js} +2 -2
- package/dist/{opencode-IKMI3RI7.js → opencode-MSAR4Y42.js} +2 -2
- package/dist/{opencode-QGP4ALQY.js → opencode-USR7ONCJ.js} +2 -2
- package/dist/{openhands-QGXMQR6I.js → openhands-IWT4DWJC.js} +2 -2
- package/dist/{package-VWBPHCLA.js → package-3J7LLRIP.js} +8 -8
- package/dist/{pi-GGDQREVG.js → pi-34CVX5WX.js} +2 -2
- package/dist/{pi-A2HCGRJG.js → pi-5EPSCZ2G.js} +2 -2
- package/dist/{qwen-code-GQILBJ5B.js → qwen-code-42TRBZ47.js} +2 -2
- package/dist/{qwen-code-DNQTGJOF.js → qwen-code-JW5F5B5M.js} +2 -2
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +6 -6
- package/dist/sdk/index.d.ts +4 -4
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/test.d.ts +2 -2
- package/dist/sdk/test.js +6 -6
- package/dist/{serve-IQGHE4SJ.js → serve-WCKL53H7.js} +8 -8
- package/dist/{status-BVLY6XDL.js → status-PMVGLWXM.js} +8 -8
- package/dist/{statusline-PRODZV2J.js → statusline-OKW44KFR.js} +7 -7
- package/dist/{synthetic-6FRA7P5Q.js → synthetic-YZ4FO7YR.js} +2 -2
- package/dist/{telemetry-UU4SHJ23.js → telemetry-7H2DLNON.js} +5 -5
- package/dist/{trae-CPPYASR2.js → trae-7PXIXNQO.js} +2 -2
- package/dist/{trae-VOJXUYRN.js → trae-IAAKEBFD.js} +2 -2
- package/dist/{types-DWXnnx-N.d.ts → types-CAKApZpX.d.ts} +4 -4
- package/dist/{uninstall-WI5YLDCT.js → uninstall-KSMFBGOR.js} +12 -12
- package/dist/{upgrade-L45BTG6X.js → upgrade-AGC3ABMS.js} +12 -12
- package/dist/{usage-K3NQTAJP.js → usage-NTSSJ2O5.js} +3 -3
- package/dist/{usage-event-J5CQ6LNT.js → usage-event-FH3X232T.js} +7 -7
- package/dist/{vscode-copilot-ZBXRPKGG.js → vscode-copilot-WF2DX4AN.js} +2 -2
- package/dist/{warp-NRBBJQR2.js → warp-57BIWGD3.js} +2 -2
- package/dist/{warp-S444B2S3.js → warp-NCQPWGRZ.js} +2 -2
- package/dist/{windsurf-R6D2JUTN.js → windsurf-YQOBRY2Y.js} +2 -2
- package/dist/windsurf-YQOBRY2Y.js.map +1 -0
- package/dist/{zed-XJFOOKCO.js → zed-23T4G4CT.js} +2 -2
- package/dist/{zed-DQV3ZUCU.js → zed-U2T6VU6N.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-G5HAIYRM.js.map +0 -1
- package/dist/chunk-IRUYJD23.js.map +0 -1
- package/dist/chunk-JTN3AKZO.js.map +0 -1
- package/dist/chunk-WZMSSIDN.js.map +0 -1
- package/dist/cline-JAPJNOZQ.js.map +0 -1
- package/dist/codebuff-3VODFPD4.js.map +0 -1
- package/dist/grok-cli-4VFVF2CQ.js.map +0 -1
- package/dist/kilo-SW7BH6EG.js.map +0 -1
- package/dist/mux-BO2L5CTW.js.map +0 -1
- package/dist/mux-XM6AP35L.js.map +0 -1
- package/dist/roo-code-SUWI4BBN.js +0 -229
- package/dist/roo-code-SUWI4BBN.js.map +0 -1
- package/dist/roo-code-VI2ZKTZC.js +0 -361
- package/dist/roo-code-VI2ZKTZC.js.map +0 -1
- package/dist/windsurf-R6D2JUTN.js.map +0 -1
- /package/dist/{action-LEYTHNIU.js.map → action-BCD2GOJA.js.map} +0 -0
- /package/dist/{amazon-q-7DPVJXJN.js.map → amazon-q-KCNHU3BI.js.map} +0 -0
- /package/dist/{amp-VYXZWHXW.js.map → amp-HI6CGN36.js.map} +0 -0
- /package/dist/{amp-BQZOL5GR.js.map → amp-NDP2J4K3.js.map} +0 -0
- /package/dist/{antigravity-EA4L225L.js.map → antigravity-FY5553OR.js.map} +0 -0
- /package/dist/{antigravity-VXHL6ZPM.js.map → antigravity-I2L4WSJN.js.map} +0 -0
- /package/dist/{antigravity-cli-B2HXZFYQ.js.map → antigravity-cli-IUAE3SEX.js.map} +0 -0
- /package/dist/{antigravity-cli-JHQ7JGNX.js.map → antigravity-cli-T24Y54NG.js.map} +0 -0
- /package/dist/{audit-HPKCUCES.js.map → audit-F47H2PLT.js.map} +0 -0
- /package/dist/{chunk-BXPSDNIB.js.map → chunk-BD72ZF6D.js.map} +0 -0
- /package/dist/{chunk-M6OS4OLU.js.map → chunk-BGPVMJOG.js.map} +0 -0
- /package/dist/{chunk-2Y2MZRLP.js.map → chunk-CWUPIT72.js.map} +0 -0
- /package/dist/{chunk-FKW5A6HE.js.map → chunk-HUL5CRF2.js.map} +0 -0
- /package/dist/{chunk-6WN37NVN.js.map → chunk-O7CFTOM5.js.map} +0 -0
- /package/dist/{chunk-4KIXXJ7B.js.map → chunk-OXANBA4I.js.map} +0 -0
- /package/dist/{chunk-U2XJWG7N.js.map → chunk-STR3CRH3.js.map} +0 -0
- /package/dist/{chunk-6XMV2OOA.js.map → chunk-W4GVN3TJ.js.map} +0 -0
- /package/dist/{chunk-PWCBWAM4.js.map → chunk-W67GINTF.js.map} +0 -0
- /package/dist/{chunk-XY3N2U6L.js.map → chunk-WAALPWR4.js.map} +0 -0
- /package/dist/{chunk-4QXCNZMD.js.map → chunk-X2XEE4DO.js.map} +0 -0
- /package/dist/{chunk-T5AI3AW3.js.map → chunk-ZHG7Q424.js.map} +0 -0
- /package/dist/{claude-code-LJ6DVXWQ.js.map → claude-code-EIC4Q7OT.js.map} +0 -0
- /package/dist/{claude-code-NMRKTAP7.js.map → claude-code-L4VXCHKA.js.map} +0 -0
- /package/dist/{codebuddy-GC7VAE2Y.js.map → codebuddy-EZZFEP35.js.map} +0 -0
- /package/dist/{codebuff-ETYT5UBL.js.map → codebuff-GUNT2KBT.js.map} +0 -0
- /package/dist/{codex-RXIS5BHM.js.map → codex-C7ERS3TW.js.map} +0 -0
- /package/dist/{codex-YAORPCOD.js.map → codex-H4MY6747.js.map} +0 -0
- /package/dist/{continue-MECVDV4Z.js.map → continue-K2CWUNX5.js.map} +0 -0
- /package/dist/{copilot-cli-MZTAWMPW.js.map → copilot-cli-FIQNEHFC.js.map} +0 -0
- /package/dist/{copilot-cli-WVWAWNSM.js.map → copilot-cli-GCRZCLTV.js.map} +0 -0
- /package/dist/{crush-QBXLNN7T.js.map → crush-HLM2DFW2.js.map} +0 -0
- /package/dist/{crush-YB3SK6NK.js.map → crush-KFWUUVZ3.js.map} +0 -0
- /package/dist/{cursor-RSLHA2CY.js.map → cursor-CKSMXWKG.js.map} +0 -0
- /package/dist/{cursor-DIW43TRZ.js.map → cursor-Y3X7YK3S.js.map} +0 -0
- /package/dist/{detect-USP5JMWM.js.map → detect-IX6U2FBV.js.map} +0 -0
- /package/dist/{devin-WPDN3MXE.js.map → devin-VD6VCB4Y.js.map} +0 -0
- /package/dist/{doctor-VSW5KHBM.js.map → doctor-DEZPJXGY.js.map} +0 -0
- /package/dist/{droid-HS6MX3IL.js.map → droid-BNWFLMZU.js.map} +0 -0
- /package/dist/{droid-U3ZBLQFO.js.map → droid-SNF6TQK2.js.map} +0 -0
- /package/dist/{gemini-cli-NMVVBO3K.js.map → gemini-cli-2B6TS7KU.js.map} +0 -0
- /package/dist/{gemini-cli-VJ6X5DNF.js.map → gemini-cli-RH63NCVC.js.map} +0 -0
- /package/dist/{goose-3X7ID7YW.js.map → goose-G4JBHXLJ.js.map} +0 -0
- /package/dist/{goose-64V46Y2W.js.map → goose-KDHNJE7Z.js.map} +0 -0
- /package/dist/{hermes-AIVUE7LX.js.map → hermes-BOTDXP3F.js.map} +0 -0
- /package/dist/{hermes-F3EGTK6N.js.map → hermes-MVCJAPSI.js.map} +0 -0
- /package/dist/{hook-QRW3ON6C.js.map → hook-Q3MDXE56.js.map} +0 -0
- /package/dist/{install-ASTAUZKB.js.map → install-FD7XL3YC.js.map} +0 -0
- /package/dist/{jetbrains-copilot-XBO2JZRO.js.map → jetbrains-copilot-TMU324FM.js.map} +0 -0
- /package/dist/{junie-UCOS6Q37.js.map → junie-RU564IK7.js.map} +0 -0
- /package/dist/{kilo-T4OXNUYY.js.map → kilo-P32GL6JM.js.map} +0 -0
- /package/dist/{kilo-cli-ZF272ZHN.js.map → kilo-cli-L57AGENB.js.map} +0 -0
- /package/dist/{kilo-cli-I2S3W245.js.map → kilo-cli-WBVPQNVP.js.map} +0 -0
- /package/dist/{kimi-5FHEXGZD.js.map → kimi-BDW32HPV.js.map} +0 -0
- /package/dist/{kimi-VLSUFLYV.js.map → kimi-GY2XXIJB.js.map} +0 -0
- /package/dist/{kiro-AQFXGOJX.js.map → kiro-D73LXTUV.js.map} +0 -0
- /package/dist/{kiro-WGOI5CGT.js.map → kiro-HZF4BADZ.js.map} +0 -0
- /package/dist/{leaderboard-3XSVSGAJ.js.map → leaderboard-44GN3NBH.js.map} +0 -0
- /package/dist/{mimo-code-KETL7W7D.js.map → mimo-code-F3BZAQZK.js.map} +0 -0
- /package/dist/{mistral-vibe-3AU7N2CA.js.map → mistral-vibe-ETTSQPK5.js.map} +0 -0
- /package/dist/{nemoclaw-WA7RSKF2.js.map → nemoclaw-SGRSTG6V.js.map} +0 -0
- /package/dist/{omp-UDYJ2PYY.js.map → omp-DBW2I6HC.js.map} +0 -0
- /package/dist/{open-interpreter-WMBNM4MQ.js.map → open-interpreter-CXUCCZI3.js.map} +0 -0
- /package/dist/{openclaw-3DHVHX5P.js.map → openclaw-CVCZR63Q.js.map} +0 -0
- /package/dist/{openclaw-5EQFGOWL.js.map → openclaw-QC6ROV5Z.js.map} +0 -0
- /package/dist/{opencode-IKMI3RI7.js.map → opencode-MSAR4Y42.js.map} +0 -0
- /package/dist/{opencode-QGP4ALQY.js.map → opencode-USR7ONCJ.js.map} +0 -0
- /package/dist/{openhands-QGXMQR6I.js.map → openhands-IWT4DWJC.js.map} +0 -0
- /package/dist/{package-VWBPHCLA.js.map → package-3J7LLRIP.js.map} +0 -0
- /package/dist/{pi-GGDQREVG.js.map → pi-34CVX5WX.js.map} +0 -0
- /package/dist/{pi-A2HCGRJG.js.map → pi-5EPSCZ2G.js.map} +0 -0
- /package/dist/{qwen-code-GQILBJ5B.js.map → qwen-code-42TRBZ47.js.map} +0 -0
- /package/dist/{qwen-code-DNQTGJOF.js.map → qwen-code-JW5F5B5M.js.map} +0 -0
- /package/dist/{serve-IQGHE4SJ.js.map → serve-WCKL53H7.js.map} +0 -0
- /package/dist/{status-BVLY6XDL.js.map → status-PMVGLWXM.js.map} +0 -0
- /package/dist/{statusline-PRODZV2J.js.map → statusline-OKW44KFR.js.map} +0 -0
- /package/dist/{synthetic-6FRA7P5Q.js.map → synthetic-YZ4FO7YR.js.map} +0 -0
- /package/dist/{telemetry-UU4SHJ23.js.map → telemetry-7H2DLNON.js.map} +0 -0
- /package/dist/{trae-CPPYASR2.js.map → trae-7PXIXNQO.js.map} +0 -0
- /package/dist/{trae-VOJXUYRN.js.map → trae-IAAKEBFD.js.map} +0 -0
- /package/dist/{uninstall-WI5YLDCT.js.map → uninstall-KSMFBGOR.js.map} +0 -0
- /package/dist/{upgrade-L45BTG6X.js.map → upgrade-AGC3ABMS.js.map} +0 -0
- /package/dist/{usage-K3NQTAJP.js.map → usage-NTSSJ2O5.js.map} +0 -0
- /package/dist/{usage-event-J5CQ6LNT.js.map → usage-event-FH3X232T.js.map} +0 -0
- /package/dist/{vscode-copilot-ZBXRPKGG.js.map → vscode-copilot-WF2DX4AN.js.map} +0 -0
- /package/dist/{warp-NRBBJQR2.js.map → warp-57BIWGD3.js.map} +0 -0
- /package/dist/{warp-S444B2S3.js.map → warp-NCQPWGRZ.js.map} +0 -0
- /package/dist/{zed-XJFOOKCO.js.map → zed-23T4G4CT.js.map} +0 -0
- /package/dist/{zed-DQV3ZUCU.js.map → zed-U2T6VU6N.js.map} +0 -0
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
readJsonFile
|
|
4
|
-
} from "./chunk-RK6VBLXP.js";
|
|
5
|
-
import {
|
|
6
|
-
expandHome,
|
|
7
|
-
walkFiles
|
|
8
|
-
} from "./chunk-O7SDRBVB.js";
|
|
9
|
-
import {
|
|
10
|
-
emptyTokens
|
|
11
|
-
} from "./chunk-XD7MY6HB.js";
|
|
12
|
-
|
|
13
|
-
// src/usage/readers/roo-code.ts
|
|
14
|
-
import { existsSync, readFileSync } from "fs";
|
|
15
|
-
import { homedir, platform as osPlatform } from "os";
|
|
16
|
-
import { basename, dirname, isAbsolute, join, resolve } from "path";
|
|
17
|
-
var PLATFORM_ID = "roo-code";
|
|
18
|
-
var DEFAULT_MODEL = "unknown";
|
|
19
|
-
var DEFAULT_PROVIDER = "unknown";
|
|
20
|
-
var DEFAULT_SESSION = "unknown";
|
|
21
|
-
var ROO_EXTENSION_ID = "rooveterinaryinc.roo-cline";
|
|
22
|
-
function vscodeUserDir() {
|
|
23
|
-
const home = homedir();
|
|
24
|
-
switch (osPlatform()) {
|
|
25
|
-
case "darwin":
|
|
26
|
-
return join(home, "Library", "Application Support", "Code", "User");
|
|
27
|
-
case "win32": {
|
|
28
|
-
const appData = process.env.APPDATA ?? join(home, "AppData", "Roaming");
|
|
29
|
-
return join(appData, "Code", "User");
|
|
30
|
-
}
|
|
31
|
-
default:
|
|
32
|
-
return join(home, ".config", "Code", "User");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function tasksRoot() {
|
|
36
|
-
const raw = process.env.AGENT_CONNECTOR_ROO_CODE_DIR;
|
|
37
|
-
if (raw != null && raw.trim() !== "") {
|
|
38
|
-
const expanded = expandHome(raw.trim());
|
|
39
|
-
return isAbsolute(expanded) ? expanded : resolve(expanded);
|
|
40
|
-
}
|
|
41
|
-
return join(vscodeUserDir(), "globalStorage", ROO_EXTENSION_ID, "tasks");
|
|
42
|
-
}
|
|
43
|
-
function extractI64(v) {
|
|
44
|
-
if (typeof v === "number") {
|
|
45
|
-
if (!Number.isFinite(v)) return void 0;
|
|
46
|
-
return Math.trunc(v);
|
|
47
|
-
}
|
|
48
|
-
if (typeof v === "string") {
|
|
49
|
-
const trimmed = v.trim();
|
|
50
|
-
if (!/^[+-]?\d+$/.test(trimmed)) return void 0;
|
|
51
|
-
const n = Number(trimmed);
|
|
52
|
-
return Number.isFinite(n) ? Math.trunc(n) : void 0;
|
|
53
|
-
}
|
|
54
|
-
return void 0;
|
|
55
|
-
}
|
|
56
|
-
function tokenField(v) {
|
|
57
|
-
const n = extractI64(v);
|
|
58
|
-
return n === void 0 ? 0 : Math.max(0, n);
|
|
59
|
-
}
|
|
60
|
-
function extractF64(v) {
|
|
61
|
-
if (typeof v === "number") return Number.isFinite(v) ? v : void 0;
|
|
62
|
-
if (typeof v === "string") {
|
|
63
|
-
const n = Number(v.trim());
|
|
64
|
-
return Number.isFinite(n) ? n : void 0;
|
|
65
|
-
}
|
|
66
|
-
return void 0;
|
|
67
|
-
}
|
|
68
|
-
function parseEntryTimestamp(v) {
|
|
69
|
-
let s;
|
|
70
|
-
if (typeof v === "string") s = v;
|
|
71
|
-
else if (typeof v === "number" && Number.isFinite(v)) s = String(Math.trunc(v));
|
|
72
|
-
else return null;
|
|
73
|
-
return parseTimestampStr(s);
|
|
74
|
-
}
|
|
75
|
-
function parseTimestampStr(value) {
|
|
76
|
-
const ms = Date.parse(value);
|
|
77
|
-
if (!Number.isNaN(ms)) return ms;
|
|
78
|
-
if (/^[+-]?\d+$/.test(value.trim())) {
|
|
79
|
-
const numeric = Number(value.trim());
|
|
80
|
-
if (!Number.isFinite(numeric) || numeric <= 0) return null;
|
|
81
|
-
return numeric >= 1e12 ? numeric : numeric * 1e3;
|
|
82
|
-
}
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
function extractSessionId(path) {
|
|
86
|
-
const parent = basename(dirname(path));
|
|
87
|
-
return parent !== "" ? parent : DEFAULT_SESSION;
|
|
88
|
-
}
|
|
89
|
-
function readTaskMetadata(uiMessagesPath) {
|
|
90
|
-
const historyPath = join(dirname(uiMessagesPath), "api_conversation_history.json");
|
|
91
|
-
let content;
|
|
92
|
-
try {
|
|
93
|
-
content = readFileSync(historyPath, "utf8");
|
|
94
|
-
} catch {
|
|
95
|
-
return { model: DEFAULT_MODEL };
|
|
96
|
-
}
|
|
97
|
-
return extractModelAndAgent(content);
|
|
98
|
-
}
|
|
99
|
-
function extractModelAndAgent(content) {
|
|
100
|
-
const ENV_START = "<environment_details>";
|
|
101
|
-
const ENV_END = "</environment_details>";
|
|
102
|
-
let offset = 0;
|
|
103
|
-
let lastModel;
|
|
104
|
-
let lastSlug;
|
|
105
|
-
let lastName;
|
|
106
|
-
for (; ; ) {
|
|
107
|
-
const startRel = content.indexOf(ENV_START, offset);
|
|
108
|
-
if (startRel < 0) break;
|
|
109
|
-
const startIdx = startRel + ENV_START.length;
|
|
110
|
-
const endRel = content.indexOf(ENV_END, startIdx);
|
|
111
|
-
if (endRel < 0) break;
|
|
112
|
-
const block = content.slice(startIdx, endRel);
|
|
113
|
-
const model = extractTagValue(block, "model");
|
|
114
|
-
if (model !== void 0) lastModel = model;
|
|
115
|
-
const slug = extractTagValue(block, "slug");
|
|
116
|
-
if (slug !== void 0) lastSlug = slug;
|
|
117
|
-
const name = extractTagValue(block, "name");
|
|
118
|
-
if (name !== void 0) lastName = name;
|
|
119
|
-
offset = endRel + ENV_END.length;
|
|
120
|
-
}
|
|
121
|
-
const agent = lastSlug ?? lastName;
|
|
122
|
-
const result = { model: lastModel ?? DEFAULT_MODEL };
|
|
123
|
-
if (agent !== void 0) result.agent = agent;
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
126
|
-
function extractTagValue(block, tag) {
|
|
127
|
-
const open = `<${tag}>`;
|
|
128
|
-
const close = `</${tag}>`;
|
|
129
|
-
const openIdx = block.indexOf(open);
|
|
130
|
-
if (openIdx < 0) return void 0;
|
|
131
|
-
const start = openIdx + open.length;
|
|
132
|
-
const endRel = block.indexOf(close, start);
|
|
133
|
-
if (endRel < 0) return void 0;
|
|
134
|
-
const value = block.slice(start, endRel).trim();
|
|
135
|
-
return value === "" ? void 0 : value;
|
|
136
|
-
}
|
|
137
|
-
function parseApiReqStartedPayload(text) {
|
|
138
|
-
let value;
|
|
139
|
-
try {
|
|
140
|
-
value = JSON.parse(text);
|
|
141
|
-
} catch {
|
|
142
|
-
return void 0;
|
|
143
|
-
}
|
|
144
|
-
if (typeof value !== "object" || value === null) return void 0;
|
|
145
|
-
const obj = value;
|
|
146
|
-
const cost = Math.max(0, extractF64(obj["cost"]) ?? 0);
|
|
147
|
-
const apiProtocolRaw = typeof obj["apiProtocol"] === "string" ? obj["apiProtocol"] : void 0;
|
|
148
|
-
const payload = {
|
|
149
|
-
cost,
|
|
150
|
-
tokensIn: tokenField(obj["tokensIn"]),
|
|
151
|
-
tokensOut: tokenField(obj["tokensOut"]),
|
|
152
|
-
cacheReads: tokenField(obj["cacheReads"]),
|
|
153
|
-
cacheWrites: tokenField(obj["cacheWrites"])
|
|
154
|
-
};
|
|
155
|
-
if (apiProtocolRaw !== void 0) payload.apiProtocol = apiProtocolRaw;
|
|
156
|
-
return payload;
|
|
157
|
-
}
|
|
158
|
-
function providerFromApiProtocol(apiProtocol) {
|
|
159
|
-
if (apiProtocol === void 0) return DEFAULT_PROVIDER;
|
|
160
|
-
const trimmed = apiProtocol.trim();
|
|
161
|
-
return trimmed === "" ? DEFAULT_PROVIDER : trimmed;
|
|
162
|
-
}
|
|
163
|
-
function parseRooCodeFile(path) {
|
|
164
|
-
const data = readJsonFile(path);
|
|
165
|
-
if (!Array.isArray(data)) return [];
|
|
166
|
-
const sessionId = extractSessionId(path);
|
|
167
|
-
const { model, agent } = readTaskMetadata(path);
|
|
168
|
-
const out = [];
|
|
169
|
-
for (const raw of data) {
|
|
170
|
-
if (typeof raw !== "object" || raw === null) continue;
|
|
171
|
-
const entry = raw;
|
|
172
|
-
if (entry.type !== "say" || entry.say !== "api_req_started") continue;
|
|
173
|
-
if (typeof entry.text !== "string") continue;
|
|
174
|
-
const ts = parseEntryTimestamp(entry.ts);
|
|
175
|
-
if (ts === null) continue;
|
|
176
|
-
const payload = parseApiReqStartedPayload(entry.text);
|
|
177
|
-
if (payload === void 0) continue;
|
|
178
|
-
const providerId = providerFromApiProtocol(payload.apiProtocol);
|
|
179
|
-
const tokens = emptyTokens();
|
|
180
|
-
tokens.input = payload.tokensIn;
|
|
181
|
-
tokens.output = payload.tokensOut;
|
|
182
|
-
tokens.cacheRead = payload.cacheReads;
|
|
183
|
-
tokens.cacheWrite = payload.cacheWrites;
|
|
184
|
-
const record = {
|
|
185
|
-
platformId: PLATFORM_ID,
|
|
186
|
-
modelId: model,
|
|
187
|
-
providerId,
|
|
188
|
-
sessionId,
|
|
189
|
-
tokens,
|
|
190
|
-
ts,
|
|
191
|
-
messageCount: 1,
|
|
192
|
-
confidence: "host-reported"
|
|
193
|
-
};
|
|
194
|
-
if (payload.cost > 0) record.cost = payload.cost;
|
|
195
|
-
if (agent !== void 0) record.agent = agent;
|
|
196
|
-
out.push(record);
|
|
197
|
-
}
|
|
198
|
-
return out;
|
|
199
|
-
}
|
|
200
|
-
var rooCodeReader = {
|
|
201
|
-
platformId: PLATFORM_ID,
|
|
202
|
-
kind: "local",
|
|
203
|
-
async read({ sinceMs }) {
|
|
204
|
-
const root = tasksRoot();
|
|
205
|
-
if (!existsSync(root)) return [];
|
|
206
|
-
const files = walkFiles(root, (name, abs) => {
|
|
207
|
-
return name === "ui_messages.json" && /[\\/]ui_messages\.json$/.test(abs);
|
|
208
|
-
});
|
|
209
|
-
const records = [];
|
|
210
|
-
for (const file of files) {
|
|
211
|
-
let rows;
|
|
212
|
-
try {
|
|
213
|
-
rows = parseRooCodeFile(file);
|
|
214
|
-
} catch {
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
for (const row of rows) {
|
|
218
|
-
if (sinceMs !== void 0 && row.ts < sinceMs) continue;
|
|
219
|
-
records.push(row);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return records;
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
var roo_code_default = rooCodeReader;
|
|
226
|
-
export {
|
|
227
|
-
roo_code_default as default
|
|
228
|
-
};
|
|
229
|
-
//# sourceMappingURL=roo-code-SUWI4BBN.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/usage/readers/roo-code.ts"],"sourcesContent":["/**\n * usage/readers/roo-code — Roo Code (VS Code extension) task-log reader.\n *\n * Faithful port of tokscale sessions/roocode.rs (parse_roo_kilo_file, source\n * \"roocode\"). Roo Code (rooveterinaryinc.roo-cline) is a Cline-fork VS Code\n * extension that persists per-task logs under its VS Code globalStorage:\n * <vscodeUserDir>/globalStorage/rooveterinaryinc.roo-cline/tasks/<taskId>/\n * ui_messages.json (the UI message stream — token source)\n * api_conversation_history.json (sibling — model/agent source)\n *\n * roo-code is NOT in paths.ts hostRoots (the framework's per-platform table\n * targets CLIs with ~/.<tool> roots, not VS Code extension globalStorage), so\n * this reader resolves the cross-OS VS Code \"User\" dir itself, mirroring the\n * roo-code platform adapter (adapters/roo-code/index.ts vscodeUserDir):\n * - macOS → ~/Library/Application Support/Code/User\n * - Windows → %APPDATA%/Code/User (else ~/AppData/Roaming/Code/User)\n * - Linux → ~/.config/Code/User\n * An AGENT_CONNECTOR_ROO_CODE_DIR override (verbatim, non-empty, ~-expanded)\n * points directly at a `tasks` parent when set, matching the env convention in\n * paths.ts hostRoots.\n *\n * Tokens (ui_messages.json): the file is a JSON ARRAY of entries; only entries\n * with type==\"say\" AND say==\"api_req_started\" carry usage. Each such entry's\n * `text` field is a JSON-in-string payload:\n * tokensIn → input\n * tokensOut → output\n * cacheReads → cacheRead\n * cacheWrites → cacheWrite\n * cost (f64) → cost\n * apiProtocol → providerId (preserved verbatim, e.g. \"bedrock/anthropic\")\n * reasoning is ALWAYS 0 (Roo Code does not report it). A malformed text payload,\n * a missing text, or an unparseable `ts` skips just that entry.\n *\n * model / agent (api_conversation_history.json): scan every\n * <environment_details>…</environment_details> block for <model>, <slug>, <name>\n * tags; the LAST <model> wins (default \"unknown\"); agent prefers <slug> then\n * <name> (optional). When the sibling file is absent/unreadable: model \"unknown\",\n * no agent — exactly the Rust read_task_metadata fallback.\n *\n * session id is the taskId — the parent directory name of ui_messages.json\n * (port of extract_session_id), defaulting to \"unknown\". provider from\n * apiProtocol (trimmed, default \"unknown\"). No project attribution (Roo Code's\n * logs carry no cwd). No dedup — one row per api_req_started event. Confidence is\n * \"host-reported\".\n *\n * Fail-open: no root → []; unreadable/malformed file, entry, or payload → skipped\n * (never throws). Read-only.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir, platform as osPlatform } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, resolve } from \"node:path\";\n\nimport type { UsageReader, UsageRecord } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { readJsonFile } from \"../jsonl.js\";\nimport { expandHome, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"roo-code\" as const;\nconst DEFAULT_MODEL = \"unknown\";\nconst DEFAULT_PROVIDER = \"unknown\";\nconst DEFAULT_SESSION = \"unknown\";\n\n/** Roo Code extension id → its VS Code globalStorage folder. */\nconst ROO_EXTENSION_ID = \"rooveterinaryinc.roo-cline\";\n\n// ─────────────────────────────────────────────────────────────────────────\n// Storage-root resolution (mirrors adapters/roo-code vscodeUserDir + the\n// AGENT_CONNECTOR_<PLATFORM>_DIR env convention in paths.ts hostRoots)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Resolve the cross-OS VS Code per-user \"User\" dir (the globalStorage parent). */\nfunction vscodeUserDir(): string {\n const home = homedir();\n switch (osPlatform()) {\n case \"darwin\":\n return join(home, \"Library\", \"Application Support\", \"Code\", \"User\");\n case \"win32\": {\n const appData = process.env.APPDATA ?? join(home, \"AppData\", \"Roaming\");\n return join(appData, \"Code\", \"User\");\n }\n default:\n return join(home, \".config\", \"Code\", \"User\");\n }\n}\n\n/**\n * The `tasks` root holding per-task subdirectories. Honors an\n * AGENT_CONNECTOR_ROO_CODE_DIR override (verbatim, non-empty, ~-expanded,\n * resolved against CWD when relative), else the extension's globalStorage tasks\n * dir under the resolved VS Code user dir.\n */\nfunction tasksRoot(): string {\n const raw = process.env.AGENT_CONNECTOR_ROO_CODE_DIR;\n if (raw != null && raw.trim() !== \"\") {\n const expanded = expandHome(raw.trim());\n return isAbsolute(expanded) ? expanded : resolve(expanded);\n }\n return join(vscodeUserDir(), \"globalStorage\", ROO_EXTENSION_ID, \"tasks\");\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Value coercion (ports of utils.rs extract_i64 / extract_f64 / parse_timestamp_str)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Port of extract_i64: number / numeric-string → integer, else undefined. */\nfunction extractI64(v: unknown): number | undefined {\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return undefined;\n return Math.trunc(v);\n }\n if (typeof v === \"string\") {\n const trimmed = v.trim();\n if (!/^[+-]?\\d+$/.test(trimmed)) return undefined; // Rust parses as i64 (integer-only)\n const n = Number(trimmed);\n return Number.isFinite(n) ? Math.trunc(n) : undefined;\n }\n return undefined;\n}\n\n/** A non-negative integer from a payload field (0 on absence/garbage, clamped ≥ 0). */\nfunction tokenField(v: unknown): number {\n const n = extractI64(v);\n return n === undefined ? 0 : Math.max(0, n);\n}\n\n/** Port of extract_f64: number / numeric-string → f64, else undefined. */\nfunction extractF64(v: unknown): number | undefined {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : undefined;\n if (typeof v === \"string\") {\n const n = Number(v.trim());\n return Number.isFinite(n) ? n : undefined;\n }\n return undefined;\n}\n\n/**\n * Port of utils.rs parse_timestamp_str / parse_entry_timestamp: an RFC3339 string\n * → epoch ms; an integer (string or number) → ms (×1000 when below the 1e12 ms\n * threshold); rejects ≤ 0. Returns null when unusable so the entry is skipped.\n */\nfunction parseEntryTimestamp(v: unknown): number | null {\n let s: string;\n if (typeof v === \"string\") s = v;\n else if (typeof v === \"number\" && Number.isFinite(v)) s = String(Math.trunc(v));\n else return null;\n\n return parseTimestampStr(s);\n}\n\nfunction parseTimestampStr(value: string): number | null {\n const ms = Date.parse(value);\n if (!Number.isNaN(ms)) return ms; // RFC3339 / any Date-parseable form\n\n if (/^[+-]?\\d+$/.test(value.trim())) {\n const numeric = Number(value.trim());\n if (!Number.isFinite(numeric) || numeric <= 0) return null;\n return numeric >= 1_000_000_000_000 ? numeric : numeric * 1000;\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// session id (port of extract_session_id)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Session id = the parent directory (taskId) of ui_messages.json, else \"unknown\". */\nfunction extractSessionId(path: string): string {\n const parent = basename(dirname(path));\n return parent !== \"\" ? parent : DEFAULT_SESSION;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// model / agent (ports of read_task_metadata / extract_model_and_agent / extract_tag_value)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface TaskMetadata {\n model: string;\n agent?: string;\n}\n\n/** Read the sibling api_conversation_history.json for model/agent (fail-open). */\nfunction readTaskMetadata(uiMessagesPath: string): TaskMetadata {\n const historyPath = join(dirname(uiMessagesPath), \"api_conversation_history.json\");\n let content: string;\n try {\n content = readFileSync(historyPath, \"utf8\");\n } catch {\n return { model: DEFAULT_MODEL }; // missing/unreadable → (\"unknown\", None)\n }\n return extractModelAndAgent(content);\n}\n\n/**\n * Scan every <environment_details>…</environment_details> block, extracting\n * <model>, <slug>, <name>. The LAST non-empty value of each tag wins (port of the\n * Rust last_* accumulation). model defaults to \"unknown\"; agent prefers slug then\n * name (and is omitted when neither is present).\n */\nfunction extractModelAndAgent(content: string): TaskMetadata {\n const ENV_START = \"<environment_details>\";\n const ENV_END = \"</environment_details>\";\n\n let offset = 0;\n let lastModel: string | undefined;\n let lastSlug: string | undefined;\n let lastName: string | undefined;\n\n for (;;) {\n const startRel = content.indexOf(ENV_START, offset);\n if (startRel < 0) break;\n const startIdx = startRel + ENV_START.length;\n\n const endRel = content.indexOf(ENV_END, startIdx);\n if (endRel < 0) break;\n\n const block = content.slice(startIdx, endRel);\n\n const model = extractTagValue(block, \"model\");\n if (model !== undefined) lastModel = model;\n const slug = extractTagValue(block, \"slug\");\n if (slug !== undefined) lastSlug = slug;\n const name = extractTagValue(block, \"name\");\n if (name !== undefined) lastName = name;\n\n offset = endRel + ENV_END.length;\n }\n\n const agent = lastSlug ?? lastName;\n const result: TaskMetadata = { model: lastModel ?? DEFAULT_MODEL };\n if (agent !== undefined) result.agent = agent;\n return result;\n}\n\n/** First <tag>…</tag> value in `block`, trimmed; undefined when absent or empty. */\nfunction extractTagValue(block: string, tag: string): string | undefined {\n const open = `<${tag}>`;\n const close = `</${tag}>`;\n\n const openIdx = block.indexOf(open);\n if (openIdx < 0) return undefined;\n const start = openIdx + open.length;\n const endRel = block.indexOf(close, start);\n if (endRel < 0) return undefined;\n\n const value = block.slice(start, endRel).trim();\n return value === \"\" ? undefined : value;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// api_req_started payload (port of parse_api_req_started_payload + provider_from_api_protocol)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface ApiReqStartedPayload {\n cost: number;\n tokensIn: number;\n tokensOut: number;\n cacheReads: number;\n cacheWrites: number;\n apiProtocol?: string;\n}\n\n/** Parse the JSON-in-string `text` payload of an api_req_started entry. */\nfunction parseApiReqStartedPayload(text: string): ApiReqStartedPayload | undefined {\n let value: unknown;\n try {\n value = JSON.parse(text);\n } catch {\n return undefined;\n }\n if (typeof value !== \"object\" || value === null) return undefined;\n const obj = value as Record<string, unknown>;\n\n // cost: extract_f64(.cost).unwrap_or(0.0).max(0.0)\n const cost = Math.max(0, extractF64(obj[\"cost\"]) ?? 0);\n const apiProtocolRaw = typeof obj[\"apiProtocol\"] === \"string\" ? (obj[\"apiProtocol\"] as string) : undefined;\n\n const payload: ApiReqStartedPayload = {\n cost,\n tokensIn: tokenField(obj[\"tokensIn\"]),\n tokensOut: tokenField(obj[\"tokensOut\"]),\n cacheReads: tokenField(obj[\"cacheReads\"]),\n cacheWrites: tokenField(obj[\"cacheWrites\"]),\n };\n if (apiProtocolRaw !== undefined) payload.apiProtocol = apiProtocolRaw;\n return payload;\n}\n\n/** Provider from apiProtocol: trimmed, non-empty, else \"unknown\" (verbatim — no inference). */\nfunction providerFromApiProtocol(apiProtocol: string | undefined): string {\n if (apiProtocol === undefined) return DEFAULT_PROVIDER;\n const trimmed = apiProtocol.trim();\n return trimmed === \"\" ? DEFAULT_PROVIDER : trimmed;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// File parse (port of parse_roo_kilo_file with source \"roocode\")\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The fields we read off a ui_messages.json entry (all optional / unknown). */\ninterface UiMessageEntry {\n type?: unknown;\n say?: unknown;\n text?: unknown;\n ts?: unknown;\n}\n\n/** Parse one task's ui_messages.json into usage records. */\nfunction parseRooCodeFile(path: string): UsageRecord[] {\n const data = readJsonFile(path);\n if (!Array.isArray(data)) return []; // malformed / non-array → no rows\n\n const sessionId = extractSessionId(path);\n const { model, agent } = readTaskMetadata(path);\n\n const out: UsageRecord[] = [];\n for (const raw of data) {\n if (typeof raw !== \"object\" || raw === null) continue;\n const entry = raw as UiMessageEntry;\n\n if (entry.type !== \"say\" || entry.say !== \"api_req_started\") continue;\n\n if (typeof entry.text !== \"string\") continue; // None => skip\n const ts = parseEntryTimestamp(entry.ts);\n if (ts === null) continue; // unparseable ts => skip\n\n const payload = parseApiReqStartedPayload(entry.text);\n if (payload === undefined) continue; // malformed payload => skip\n\n const providerId = providerFromApiProtocol(payload.apiProtocol);\n\n const tokens = emptyTokens();\n tokens.input = payload.tokensIn;\n tokens.output = payload.tokensOut;\n tokens.cacheRead = payload.cacheReads;\n tokens.cacheWrite = payload.cacheWrites;\n // reasoning stays 0 (Roo Code does not report it).\n\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId: model,\n providerId,\n sessionId,\n tokens,\n ts,\n messageCount: 1,\n confidence: \"host-reported\",\n };\n if (payload.cost > 0) record.cost = payload.cost;\n if (agent !== undefined) record.agent = agent;\n out.push(record);\n }\n\n return out;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Reader singleton\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The Roo Code (VS Code extension) usage reader singleton. */\nconst rooCodeReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const root = tasksRoot();\n if (!existsSync(root)) return []; // no tasks dir → fail-open\n\n // <root>/<taskId>/ui_messages.json\n const files = walkFiles(root, (name, abs) => {\n return name === \"ui_messages.json\" && /[\\\\/]ui_messages\\.json$/.test(abs);\n });\n\n const records: UsageRecord[] = [];\n for (const file of files) {\n let rows: UsageRecord[];\n try {\n rows = parseRooCodeFile(file);\n } catch {\n continue; // fail-open per file\n }\n for (const row of rows) {\n if (sinceMs !== undefined && row.ts < sinceMs) continue;\n records.push(row);\n }\n }\n return records;\n },\n};\n\nexport default rooCodeReader;\n"],"mappings":"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","names":[]}
|
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
resolveEnvRefsDeep
|
|
4
|
-
} from "./chunk-BEFVJ2OE.js";
|
|
5
|
-
import {
|
|
6
|
-
BaseAdapter,
|
|
7
|
-
renderCommandMd,
|
|
8
|
-
renderSkillMd
|
|
9
|
-
} from "./chunk-JTN3AKZO.js";
|
|
10
|
-
import {
|
|
11
|
-
buildWrappedStdio
|
|
12
|
-
} from "./chunk-QSY74NAP.js";
|
|
13
|
-
import "./chunk-UMQ6NBQR.js";
|
|
14
|
-
import "./chunk-GZGLCCEE.js";
|
|
15
|
-
|
|
16
|
-
// src/adapters/roo-code/index.ts
|
|
17
|
-
import { existsSync } from "fs";
|
|
18
|
-
import { homedir, platform as osPlatform } from "os";
|
|
19
|
-
import { join } from "path";
|
|
20
|
-
var HOST = "roo-code";
|
|
21
|
-
var MCP_ROOT_KEY = "mcpServers";
|
|
22
|
-
var ROO_EXTENSION_ID = "rooveterinaryinc.roo-cline";
|
|
23
|
-
var MCP_SETTINGS_FILE = "mcp_settings.json";
|
|
24
|
-
var LEGACY_MCP_SETTINGS_FILE = "cline_mcp_settings.json";
|
|
25
|
-
function vscodeUserDir() {
|
|
26
|
-
const home = homedir();
|
|
27
|
-
switch (osPlatform()) {
|
|
28
|
-
case "darwin":
|
|
29
|
-
return join(home, "Library", "Application Support", "Code", "User");
|
|
30
|
-
case "win32": {
|
|
31
|
-
const appData = process.env.APPDATA ?? join(home, "AppData", "Roaming");
|
|
32
|
-
return join(appData, "Code", "User");
|
|
33
|
-
}
|
|
34
|
-
default:
|
|
35
|
-
return join(home, ".config", "Code", "User");
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
var RooCodeAdapter = class extends BaseAdapter {
|
|
39
|
-
id = HOST;
|
|
40
|
-
name = "Roo Code";
|
|
41
|
-
paradigm = "mcp-only";
|
|
42
|
-
capabilities = {
|
|
43
|
-
// Memory surface: AGENTS.md-first managed block (project <projectDir>/AGENTS.md
|
|
44
|
-
// via the base default — Roo's "Agent Rules standard" support is default-on;
|
|
45
|
-
// user scope → ~/.roo/rules/agent-connector.md below).
|
|
46
|
-
supportsMemory: true,
|
|
47
|
-
// Roo Code has no lifecycle hook system — every hook capability is false.
|
|
48
|
-
preToolUse: false,
|
|
49
|
-
postToolUse: false,
|
|
50
|
-
preCompact: false,
|
|
51
|
-
sessionStart: false,
|
|
52
|
-
sessionEnd: false,
|
|
53
|
-
userPromptSubmit: false,
|
|
54
|
-
stop: false,
|
|
55
|
-
notification: false,
|
|
56
|
-
canModifyArgs: false,
|
|
57
|
-
canModifyOutput: false,
|
|
58
|
-
canInjectSessionContext: false,
|
|
59
|
-
// Roo Code registers stdio, SSE, and Streamable HTTP MCP servers.
|
|
60
|
-
transports: ["stdio", "sse", "http"],
|
|
61
|
-
// Content surfaces: Roo Code reads custom slash commands and AgentSkills from
|
|
62
|
-
// its `.roo` config dir (BOTH user ~/.roo and project <projectDir>/.roo).
|
|
63
|
-
// command → <configDir>/commands/<name>.md (md+optional frontmatter)
|
|
64
|
-
// skill → <configDir>/skills/<name>/SKILL.md (+ resources)
|
|
65
|
-
supportsCommands: true,
|
|
66
|
-
supportsSkills: true
|
|
67
|
-
};
|
|
68
|
-
// ── Detection ────────────────────────────────────────────────────────────
|
|
69
|
-
detectInstalled(projectDir) {
|
|
70
|
-
const userSettings = this.userSettingsPath();
|
|
71
|
-
const userExtDir = join(
|
|
72
|
-
vscodeUserDir(),
|
|
73
|
-
"globalStorage",
|
|
74
|
-
ROO_EXTENSION_ID
|
|
75
|
-
);
|
|
76
|
-
const userLegacySettings = join(
|
|
77
|
-
userExtDir,
|
|
78
|
-
"settings",
|
|
79
|
-
LEGACY_MCP_SETTINGS_FILE
|
|
80
|
-
);
|
|
81
|
-
const projectMcp = join(projectDir, ".roo", "mcp.json");
|
|
82
|
-
const userMatch = existsSync(userSettings) || existsSync(userLegacySettings) || existsSync(userExtDir);
|
|
83
|
-
const projectMatch = existsSync(projectMcp);
|
|
84
|
-
const installed = userMatch || projectMatch;
|
|
85
|
-
const scope = userMatch || !projectMatch ? "user" : "project";
|
|
86
|
-
const configPath = scope === "user" ? userSettings : projectMcp;
|
|
87
|
-
const reason = installed ? userMatch ? `found Roo Code globalStorage under ${userExtDir}` : `found Roo Code project config at ${projectMcp}` : `no Roo Code config at ${userExtDir} or ${projectMcp}`;
|
|
88
|
-
return {
|
|
89
|
-
id: this.id,
|
|
90
|
-
name: this.name,
|
|
91
|
-
installed,
|
|
92
|
-
paradigm: this.paradigm,
|
|
93
|
-
capabilities: this.capabilities,
|
|
94
|
-
configPath,
|
|
95
|
-
scope,
|
|
96
|
-
reason,
|
|
97
|
-
confidence: installed ? "high" : "low"
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// ── Native paths ─────────────────────────────────────────────────────────
|
|
101
|
-
/** Absolute path to the user-scope MCP settings file (VS Code globalStorage). */
|
|
102
|
-
userSettingsPath() {
|
|
103
|
-
return join(
|
|
104
|
-
vscodeUserDir(),
|
|
105
|
-
"globalStorage",
|
|
106
|
-
ROO_EXTENSION_ID,
|
|
107
|
-
"settings",
|
|
108
|
-
MCP_SETTINGS_FILE
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
// ── Memory surface: global rules dir at user scope ──────────────────────
|
|
112
|
-
// Project scope stays on the AGENTS.md base default ("Agent Rules standard",
|
|
113
|
-
// default-on). User scope targets a dedicated agent-connector.md in Roo's
|
|
114
|
-
// documented ~/.roo/rules/ dir (files concatenated; AC-created → cleanly
|
|
115
|
-
// deletable on uninstall).
|
|
116
|
-
memoryTargets(ctx) {
|
|
117
|
-
if (this.memoryOverride(ctx)?.path || ctx.scope !== "user") {
|
|
118
|
-
return super.memoryTargets(ctx);
|
|
119
|
-
}
|
|
120
|
-
return [
|
|
121
|
-
{
|
|
122
|
-
path: join(homedir(), ".roo", "rules", "agent-connector.md"),
|
|
123
|
-
reason: "roo-code global rules dir (~/.roo/rules; agent-connector-owned file)"
|
|
124
|
-
}
|
|
125
|
-
];
|
|
126
|
-
}
|
|
127
|
-
getConfigDir(ctx) {
|
|
128
|
-
return ctx.scope === "project" ? join(ctx.projectDir, ".roo") : join(
|
|
129
|
-
vscodeUserDir(),
|
|
130
|
-
"globalStorage",
|
|
131
|
-
ROO_EXTENSION_ID,
|
|
132
|
-
"settings"
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
getServerConfigPath(ctx) {
|
|
136
|
-
return ctx.scope === "project" ? join(ctx.projectDir, ".roo", "mcp.json") : this.userSettingsPath();
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Roo Code has no hook file — hooks are not a thing here. The hook "config
|
|
140
|
-
* path" is the same MCP settings file so the generic doctor/backup behave
|
|
141
|
-
* sensibly.
|
|
142
|
-
*/
|
|
143
|
-
getHookConfigPath(ctx) {
|
|
144
|
-
return this.getServerConfigPath(ctx);
|
|
145
|
-
}
|
|
146
|
-
// ── MCP server install / uninstall ───────────────────────────────────────
|
|
147
|
-
installServer(ctx) {
|
|
148
|
-
const { connector } = ctx;
|
|
149
|
-
const override = connector.platforms[HOST]?.server;
|
|
150
|
-
if (!connector.server || override === false) {
|
|
151
|
-
return [
|
|
152
|
-
{
|
|
153
|
-
platform: this.id,
|
|
154
|
-
action: "skip",
|
|
155
|
-
detail: connector.server ? "server registration disabled for roo-code" : "connector declares no MCP server"
|
|
156
|
-
}
|
|
157
|
-
];
|
|
158
|
-
}
|
|
159
|
-
const server = override && typeof override === "object" ? { ...connector.server, ...override } : connector.server;
|
|
160
|
-
const serverPath = this.getServerConfigPath(ctx);
|
|
161
|
-
const entry = this.renderServerEntry(ctx, server);
|
|
162
|
-
return [
|
|
163
|
-
this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun)
|
|
164
|
-
];
|
|
165
|
-
}
|
|
166
|
-
uninstallServer(ctx) {
|
|
167
|
-
const serverPath = this.getServerConfigPath(ctx);
|
|
168
|
-
return [
|
|
169
|
-
this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun)
|
|
170
|
-
];
|
|
171
|
-
}
|
|
172
|
-
/** Render a normalized ServerDef into Roo Code's native mcpServers entry. */
|
|
173
|
-
renderServerEntry(ctx, server) {
|
|
174
|
-
const transport = server.transport;
|
|
175
|
-
if (transport === "stdio") {
|
|
176
|
-
let command = server.command ?? "";
|
|
177
|
-
let args = [...server.args ?? []];
|
|
178
|
-
({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));
|
|
179
|
-
const entry2 = {
|
|
180
|
-
command: resolveEnvRefsDeep(command),
|
|
181
|
-
// Honor the per-call server's enabled flag (mirror droid) rather than
|
|
182
|
-
// hardcoding enabled — a server marked enabled:false installs disabled.
|
|
183
|
-
disabled: server.enabled === false
|
|
184
|
-
};
|
|
185
|
-
if (args.length > 0) entry2.args = resolveEnvRefsDeep(args);
|
|
186
|
-
const env = this.renderEnv(server.env);
|
|
187
|
-
if (env) entry2.env = env;
|
|
188
|
-
return entry2;
|
|
189
|
-
}
|
|
190
|
-
const entry = {
|
|
191
|
-
url: resolveEnvRefsDeep(server.url ?? ""),
|
|
192
|
-
type: transport === "http" ? "streamable-http" : "sse",
|
|
193
|
-
disabled: server.enabled === false
|
|
194
|
-
};
|
|
195
|
-
const headers = this.renderEnv(server.headers);
|
|
196
|
-
if (headers) entry.headers = headers;
|
|
197
|
-
return entry;
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Render env/header values. Roo Code documents no native interpolation token,
|
|
201
|
-
* so resolve `${env:VAR}` references to literals at install time.
|
|
202
|
-
*/
|
|
203
|
-
renderEnv(env) {
|
|
204
|
-
if (!env || Object.keys(env).length === 0) return void 0;
|
|
205
|
-
return resolveEnvRefsDeep({ ...env });
|
|
206
|
-
}
|
|
207
|
-
// ── Hooks (unavailable — Roo Code is mcp-only) ───────────────────────────
|
|
208
|
-
installHooks(_ctx) {
|
|
209
|
-
return [
|
|
210
|
-
{
|
|
211
|
-
platform: this.id,
|
|
212
|
-
action: "skip",
|
|
213
|
-
detail: "hooks unavailable (Roo Code is mcp-only)"
|
|
214
|
-
}
|
|
215
|
-
];
|
|
216
|
-
}
|
|
217
|
-
uninstallHooks(_ctx) {
|
|
218
|
-
return [
|
|
219
|
-
{
|
|
220
|
-
platform: this.id,
|
|
221
|
-
action: "skip",
|
|
222
|
-
detail: "hooks unavailable (Roo Code is mcp-only)"
|
|
223
|
-
}
|
|
224
|
-
];
|
|
225
|
-
}
|
|
226
|
-
// ── Content surfaces: commands / skills ──────────────────────────────────
|
|
227
|
-
// CONTENT-ONLY: pure native-file writers. No runtime dispatch, no home-bin
|
|
228
|
-
// pointer, no telemetry wrap. Each method is idempotent (byte-identical →
|
|
229
|
-
// skip) via writeContentFile and reversible via removeContentFile. Honors
|
|
230
|
-
// platforms["roo-code"] per-surface false to skip. BOTH scopes are supported:
|
|
231
|
-
// user → ~/.roo, project → <projectDir>/.roo.
|
|
232
|
-
//
|
|
233
|
-
// Native locations (the `.roo` content root, NOT the globalStorage MCP dir):
|
|
234
|
-
// command → <rooDir>/commands/<name>.md md+optional frontmatter
|
|
235
|
-
// (description, argument-hint, + `mode` when cmd.extra carries it)
|
|
236
|
-
// skill → <rooDir>/skills/<name>/SKILL.md (+ resources)
|
|
237
|
-
/**
|
|
238
|
-
* The `.roo` content root for the active scope: ~/.roo (user) or
|
|
239
|
-
* <projectDir>/.roo (project). Distinct from getConfigDir's user-scope path
|
|
240
|
-
* (the VS Code globalStorage `settings` dir, which holds MCP settings only).
|
|
241
|
-
*/
|
|
242
|
-
rooDir(ctx) {
|
|
243
|
-
return ctx.scope === "project" ? join(ctx.projectDir, ".roo") : join(homedir(), ".roo");
|
|
244
|
-
}
|
|
245
|
-
commandPath(ctx, name) {
|
|
246
|
-
return join(this.rooDir(ctx), "commands", `${name}.md`);
|
|
247
|
-
}
|
|
248
|
-
skillDir(ctx, name) {
|
|
249
|
-
return join(this.rooDir(ctx), "skills", name);
|
|
250
|
-
}
|
|
251
|
-
// ── Commands ─────────────────────────────────────────────────────────────
|
|
252
|
-
installCommands(ctx) {
|
|
253
|
-
const { connector } = ctx;
|
|
254
|
-
if (connector.platforms[this.id]?.commands === false) {
|
|
255
|
-
return [{ platform: this.id, action: "skip", detail: "commands disabled for roo-code" }];
|
|
256
|
-
}
|
|
257
|
-
if (connector.commands.length === 0) {
|
|
258
|
-
return [{ platform: this.id, action: "skip", detail: "connector declares no commands" }];
|
|
259
|
-
}
|
|
260
|
-
return connector.commands.map(
|
|
261
|
-
(cmd) => this.writeContentFile(
|
|
262
|
-
this.commandPath(ctx, cmd.name),
|
|
263
|
-
renderCommandMd(cmd, { includeToolsAndModel: false }),
|
|
264
|
-
ctx.dryRun
|
|
265
|
-
)
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
uninstallCommands(ctx) {
|
|
269
|
-
const { connector } = ctx;
|
|
270
|
-
if (connector.commands.length === 0) {
|
|
271
|
-
return [{ platform: this.id, action: "skip", detail: "connector declares no commands" }];
|
|
272
|
-
}
|
|
273
|
-
return connector.commands.map(
|
|
274
|
-
(cmd) => this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun)
|
|
275
|
-
);
|
|
276
|
-
}
|
|
277
|
-
// ── Skills ───────────────────────────────────────────────────────────────
|
|
278
|
-
installSkills(ctx) {
|
|
279
|
-
const { connector } = ctx;
|
|
280
|
-
if (connector.platforms[this.id]?.skills === false) {
|
|
281
|
-
return [{ platform: this.id, action: "skip", detail: "skills disabled for roo-code" }];
|
|
282
|
-
}
|
|
283
|
-
if (connector.skills.length === 0) {
|
|
284
|
-
return [{ platform: this.id, action: "skip", detail: "connector declares no skills" }];
|
|
285
|
-
}
|
|
286
|
-
const changes = [];
|
|
287
|
-
for (const skill of connector.skills) {
|
|
288
|
-
const dir = this.skillDir(ctx, skill.name);
|
|
289
|
-
changes.push(
|
|
290
|
-
this.writeContentFile(join(dir, "SKILL.md"), renderSkillMd(skill), ctx.dryRun)
|
|
291
|
-
);
|
|
292
|
-
for (const [rel, contents] of Object.entries(skill.resources ?? {})) {
|
|
293
|
-
const target = this.resolveWithin(dir, rel);
|
|
294
|
-
if (target === null) {
|
|
295
|
-
changes.push({
|
|
296
|
-
platform: this.id,
|
|
297
|
-
action: "warn",
|
|
298
|
-
detail: `skill resource "${rel}" escapes the skill dir; skipped`
|
|
299
|
-
});
|
|
300
|
-
continue;
|
|
301
|
-
}
|
|
302
|
-
changes.push(this.writeContentFile(target, contents, ctx.dryRun));
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
return changes;
|
|
306
|
-
}
|
|
307
|
-
uninstallSkills(ctx) {
|
|
308
|
-
const { connector } = ctx;
|
|
309
|
-
if (connector.skills.length === 0) {
|
|
310
|
-
return [{ platform: this.id, action: "skip", detail: "connector declares no skills" }];
|
|
311
|
-
}
|
|
312
|
-
const changes = [];
|
|
313
|
-
for (const skill of connector.skills) {
|
|
314
|
-
const dir = this.skillDir(ctx, skill.name);
|
|
315
|
-
changes.push(this.removeContentFile(join(dir, "SKILL.md"), ctx.dryRun));
|
|
316
|
-
for (const rel of Object.keys(skill.resources ?? {})) {
|
|
317
|
-
const target = this.resolveWithin(dir, rel);
|
|
318
|
-
if (target === null) continue;
|
|
319
|
-
changes.push(this.removeContentFile(target, ctx.dryRun));
|
|
320
|
-
}
|
|
321
|
-
changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));
|
|
322
|
-
}
|
|
323
|
-
return changes;
|
|
324
|
-
}
|
|
325
|
-
// ── Diagnostics ──────────────────────────────────────────────────────────
|
|
326
|
-
getHealthChecks(ctx) {
|
|
327
|
-
const mcpPath = this.getServerConfigPath(ctx);
|
|
328
|
-
const connectorId = ctx.connector.id;
|
|
329
|
-
return [
|
|
330
|
-
{
|
|
331
|
-
name: `${this.name}: MCP settings present`,
|
|
332
|
-
check: () => existsSync(mcpPath) ? { status: "OK", detail: mcpPath } : { status: "FAIL", detail: `not found: ${mcpPath}` }
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
name: `${this.name}: server entry registered`,
|
|
336
|
-
check: () => {
|
|
337
|
-
if (!ctx.connector.server) {
|
|
338
|
-
return { status: "OK", detail: "no MCP server declared" };
|
|
339
|
-
}
|
|
340
|
-
const cfg = this.readJson(mcpPath);
|
|
341
|
-
const bucket = cfg?.[MCP_ROOT_KEY];
|
|
342
|
-
if (!cfg || !bucket) {
|
|
343
|
-
return { status: "FAIL", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };
|
|
344
|
-
}
|
|
345
|
-
return connectorId in bucket ? { status: "OK", detail: `${MCP_ROOT_KEY}.${connectorId} present` } : {
|
|
346
|
-
status: "FAIL",
|
|
347
|
-
detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
];
|
|
352
|
-
}
|
|
353
|
-
};
|
|
354
|
-
var adapter = new RooCodeAdapter();
|
|
355
|
-
var roo_code_default = adapter;
|
|
356
|
-
export {
|
|
357
|
-
RooCodeAdapter,
|
|
358
|
-
adapter,
|
|
359
|
-
roo_code_default as default
|
|
360
|
-
};
|
|
361
|
-
//# sourceMappingURL=roo-code-VI2ZKTZC.js.map
|