@ken-jo/agent-connector 0.4.95 → 0.4.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -202
- package/NOTICE +6 -6
- package/README.md +605 -599
- package/dist/{action-Q7GGO4PA.js → action-5JM23CFJ.js} +16 -16
- package/dist/action-5JM23CFJ.js.map +1 -0
- package/dist/{amazon-q-ETMAGY3D.js → amazon-q-LFZNGN27.js} +6 -6
- package/dist/amazon-q-LFZNGN27.js.map +1 -0
- package/dist/{amp-BQZOL5GR.js → amp-CEWOSWQO.js} +4 -4
- package/dist/amp-CEWOSWQO.js.map +1 -0
- package/dist/{amp-67BZONGF.js → amp-S22XTPEQ.js} +7 -7
- package/dist/amp-S22XTPEQ.js.map +1 -0
- package/dist/{antigravity-EA4L225L.js → antigravity-LHFEFNMC.js} +5 -5
- package/dist/antigravity-LHFEFNMC.js.map +1 -0
- package/dist/antigravity-PZXYAO3X.js +18 -0
- package/dist/{antigravity-cli-B2HXZFYQ.js → antigravity-cli-MOKFSWOU.js} +5 -5
- package/dist/antigravity-cli-MOKFSWOU.js.map +1 -0
- package/dist/{antigravity-cli-OM6SC3PE.js → antigravity-cli-PN474FXM.js} +9 -9
- package/dist/antigravity-cli-PN474FXM.js.map +1 -0
- package/dist/audit-2H7E3Z4N.js +311 -0
- package/dist/audit-2H7E3Z4N.js.map +1 -0
- package/dist/{chunk-KHO5WNTP.js → chunk-4GH2KA7V.js} +1 -1
- package/dist/chunk-4GH2KA7V.js.map +1 -0
- package/dist/{chunk-7F5KHLEP.js → chunk-6XWORQM6.js} +4 -4
- package/dist/chunk-6XWORQM6.js.map +1 -0
- package/dist/{chunk-2Y2MZRLP.js → chunk-7C2IPIIB.js} +3 -3
- package/dist/chunk-7C2IPIIB.js.map +1 -0
- package/dist/{chunk-NLE2J5P4.js → chunk-7HHW23AC.js} +29 -29
- package/dist/chunk-7HHW23AC.js.map +1 -0
- package/dist/{chunk-XD7MY6HB.js → chunk-7PSNXUFK.js} +1 -1
- package/dist/chunk-7PSNXUFK.js.map +1 -0
- package/dist/{chunk-YPAXJ7EW.js → chunk-7VSZXOXJ.js} +13 -13
- package/dist/chunk-7VSZXOXJ.js.map +1 -0
- package/dist/{chunk-ISEJWBFF.js → chunk-B6PKHS5I.js} +2 -2
- package/dist/chunk-B6PKHS5I.js.map +1 -0
- package/dist/{chunk-UM5S7DKK.js → chunk-C747DYNT.js} +1 -1
- package/dist/chunk-C747DYNT.js.map +1 -0
- package/dist/{chunk-PW42ZXCB.js → chunk-DOPFBUCX.js} +3 -3
- package/dist/chunk-DOPFBUCX.js.map +1 -0
- package/dist/{chunk-I5UXHIDT.js → chunk-DWZ5IWF4.js} +8 -8
- package/dist/chunk-DWZ5IWF4.js.map +1 -0
- package/dist/{chunk-6WZODR3Z.js → chunk-FJ6F5U3W.js} +5 -5
- package/dist/chunk-FJ6F5U3W.js.map +1 -0
- package/dist/{chunk-H33M77DD.js → chunk-HATCOSQT.js} +22 -19
- package/dist/chunk-HATCOSQT.js.map +1 -0
- package/dist/{chunk-UMQ6NBQR.js → chunk-ILWHLGIC.js} +2 -2
- package/dist/chunk-ILWHLGIC.js.map +1 -0
- package/dist/{chunk-IVAWP6HH.js → chunk-IOJDZJ72.js} +2 -2
- package/dist/chunk-IOJDZJ72.js.map +1 -0
- package/dist/{chunk-NBYKLUF6.js → chunk-KFPSJRHR.js} +2 -2
- package/dist/chunk-KFPSJRHR.js.map +1 -0
- package/dist/{chunk-O7SDRBVB.js → chunk-KM2YXO6V.js} +1 -1
- package/dist/chunk-KM2YXO6V.js.map +1 -0
- package/dist/{chunk-3NH2ARIS.js → chunk-KTBAB556.js} +6 -6
- package/dist/chunk-KTBAB556.js.map +1 -0
- package/dist/{chunk-5IOTP7LQ.js → chunk-KWC5DQ5Z.js} +7 -5
- package/dist/chunk-KWC5DQ5Z.js.map +1 -0
- package/dist/{chunk-JKKU2WKG.js → chunk-LD5HAN6O.js} +4 -4
- package/dist/chunk-LD5HAN6O.js.map +1 -0
- package/dist/{chunk-OP4KBXUO.js → chunk-LFWYYWLV.js} +1 -1
- package/dist/chunk-LFWYYWLV.js.map +1 -0
- package/dist/{chunk-APZDTY76.js → chunk-LZL2YITN.js} +7 -7
- package/dist/chunk-LZL2YITN.js.map +1 -0
- package/dist/{chunk-H53QZQJI.js → chunk-PSGTHJQU.js} +1 -1
- package/dist/chunk-PSGTHJQU.js.map +1 -0
- package/dist/{chunk-FBJQGRET.js → chunk-Q4ISQHUQ.js} +1 -1
- package/dist/chunk-Q4ISQHUQ.js.map +1 -0
- package/dist/{chunk-6TF7MHG5.js → chunk-Q7PR2WGT.js} +2 -2
- package/dist/chunk-Q7PR2WGT.js.map +1 -0
- package/dist/{chunk-GZGLCCEE.js → chunk-QYOUQCC6.js} +1 -1
- package/dist/chunk-QYOUQCC6.js.map +1 -0
- package/dist/{chunk-Z2MRSS2I.js → chunk-RNVIK5YJ.js} +2 -2
- package/dist/chunk-RNVIK5YJ.js.map +1 -0
- package/dist/{chunk-XC5SJ35F.js → chunk-RPWD5H6Y.js} +5 -5
- package/dist/chunk-RPWD5H6Y.js.map +1 -0
- package/dist/{chunk-PAPMUAR5.js → chunk-S25MVWBP.js} +12 -12
- package/dist/chunk-S25MVWBP.js.map +1 -0
- package/dist/{chunk-FJCUKXGX.js → chunk-THI4PI4H.js} +2 -2
- package/dist/chunk-THI4PI4H.js.map +1 -0
- package/dist/{chunk-D4ELPBB5.js → chunk-TOSNS2BY.js} +43 -43
- package/dist/chunk-TOSNS2BY.js.map +1 -0
- package/dist/{chunk-MGTDQLJJ.js → chunk-UNU2KPYJ.js} +11 -9
- package/dist/chunk-UNU2KPYJ.js.map +1 -0
- package/dist/{chunk-MQPNU2CY.js → chunk-UZZTWWGG.js} +1 -1
- package/dist/chunk-UZZTWWGG.js.map +1 -0
- package/dist/{chunk-4NHXLXSD.js → chunk-W7AGWAMH.js} +2 -2
- package/dist/chunk-W7AGWAMH.js.map +1 -0
- package/dist/{chunk-OPXAP3AC.js → chunk-XN7S44U4.js} +1 -1
- package/dist/chunk-XN7S44U4.js.map +1 -0
- package/dist/{chunk-BEFVJ2OE.js → chunk-XXLCMSD3.js} +1 -1
- package/dist/chunk-XXLCMSD3.js.map +1 -0
- package/dist/{chunk-YT43MUSJ.js → chunk-XZWMJLIT.js} +1 -1
- package/dist/chunk-XZWMJLIT.js.map +1 -0
- package/dist/{chunk-RK6VBLXP.js → chunk-ZSOS2KOR.js} +1 -1
- package/dist/chunk-ZSOS2KOR.js.map +1 -0
- package/dist/{claude-code-NMRKTAP7.js → claude-code-FS42PXZO.js} +4 -4
- package/dist/claude-code-FS42PXZO.js.map +1 -0
- package/dist/{claude-code-GRWO6XBZ.js → claude-code-TA53454O.js} +13 -13
- package/dist/claude-code-TA53454O.js.map +1 -0
- package/dist/cli/sdk.js +9 -8
- package/dist/cli/sdk.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/{cline-25KW25IN.js → cline-GZFN32BM.js} +6 -6
- package/dist/cline-GZFN32BM.js.map +1 -0
- package/dist/{codebuddy-ZNYQACMF.js → codebuddy-IYS3TQZ3.js} +7 -7
- package/dist/codebuddy-IYS3TQZ3.js.map +1 -0
- package/dist/{codebuff-ETYT5UBL.js → codebuff-6KWBW6CT.js} +4 -4
- package/dist/codebuff-6KWBW6CT.js.map +1 -0
- package/dist/{codebuff-VR6JUDIY.js → codebuff-D3MIKJHC.js} +6 -6
- package/dist/codebuff-D3MIKJHC.js.map +1 -0
- package/dist/{codex-YAORPCOD.js → codex-DKBAAUCO.js} +4 -4
- package/dist/codex-DKBAAUCO.js.map +1 -0
- package/dist/{codex-CPNKTXG3.js → codex-ZKLP5IXZ.js} +9 -9
- package/dist/codex-ZKLP5IXZ.js.map +1 -0
- package/dist/{continue-WU2IB5KS.js → continue-I34FNSTJ.js} +8 -8
- package/dist/continue-I34FNSTJ.js.map +1 -0
- package/dist/{copilot-cli-MZTAWMPW.js → copilot-cli-CLBJACQ5.js} +4 -4
- package/dist/copilot-cli-CLBJACQ5.js.map +1 -0
- package/dist/{copilot-cli-PAP377OM.js → copilot-cli-NWPM5GE6.js} +7 -7
- package/dist/copilot-cli-NWPM5GE6.js.map +1 -0
- package/dist/{crush-QBXLNN7T.js → crush-A5C5USRL.js} +4 -4
- package/dist/crush-A5C5USRL.js.map +1 -0
- package/dist/{crush-3AVQA4YU.js → crush-MDGPZSZU.js} +7 -7
- package/dist/crush-MDGPZSZU.js.map +1 -0
- package/dist/{cursor-DIW43TRZ.js → cursor-D5SWDVSW.js} +3 -3
- package/dist/cursor-D5SWDVSW.js.map +1 -0
- package/dist/cursor-JRVK56QA.js +22 -0
- package/dist/{define-connector-DTWb46UB.d.ts → define-connector-B7tLHVnx.d.ts} +1 -1
- package/dist/{detect-6V4LC3MA.js → detect-FKJC36P4.js} +4 -4
- package/dist/detect-FKJC36P4.js.map +1 -0
- package/dist/{devin-QMEM3OFA.js → devin-TZMRC57O.js} +7 -7
- package/dist/devin-TZMRC57O.js.map +1 -0
- package/dist/{doctor-2YDUVSAU.js → doctor-PGVYUQYG.js} +26 -26
- package/dist/doctor-PGVYUQYG.js.map +1 -0
- package/dist/{droid-U3ZBLQFO.js → droid-PFQ2PZSF.js} +4 -4
- package/dist/droid-PFQ2PZSF.js.map +1 -0
- package/dist/{droid-MOKV53J4.js → droid-SCFWDJR4.js} +7 -7
- package/dist/droid-SCFWDJR4.js.map +1 -0
- package/dist/{gemini-cli-47ZHCOZR.js → gemini-cli-MLDGOR2L.js} +8 -8
- package/dist/gemini-cli-MLDGOR2L.js.map +1 -0
- package/dist/{gemini-cli-NMVVBO3K.js → gemini-cli-Y6RJMU24.js} +4 -4
- package/dist/gemini-cli-Y6RJMU24.js.map +1 -0
- package/dist/{goose-4EI5MYTI.js → goose-5DBHDSJW.js} +9 -9
- package/dist/goose-5DBHDSJW.js.map +1 -0
- package/dist/{goose-64V46Y2W.js → goose-K2HKUTBK.js} +4 -4
- package/dist/goose-K2HKUTBK.js.map +1 -0
- package/dist/{grok-cli-QYQPDSVB.js → grok-cli-LX6Q6RUY.js} +7 -7
- package/dist/grok-cli-LX6Q6RUY.js.map +1 -0
- package/dist/{hermes-F75OSK3Y.js → hermes-LJB3SJKB.js} +7 -7
- package/dist/hermes-LJB3SJKB.js.map +1 -0
- package/dist/{hermes-F3EGTK6N.js → hermes-MF3NX4ZY.js} +4 -4
- package/dist/hermes-MF3NX4ZY.js.map +1 -0
- package/dist/{hook-OEVRDMXD.js → hook-PVGBQUQI.js} +16 -16
- package/dist/hook-PVGBQUQI.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +5 -5
- package/dist/{install-5NMCUDG5.js → install-HPDIK7F6.js} +192 -28
- package/dist/install-HPDIK7F6.js.map +1 -0
- package/dist/{introspect-dNekqPDY.d.ts → introspect-DWCu0Krk.d.ts} +1 -1
- package/dist/{jetbrains-copilot-ZGIWI6YV.js → jetbrains-copilot-2DSVAJMJ.js} +6 -6
- package/dist/jetbrains-copilot-2DSVAJMJ.js.map +1 -0
- package/dist/{junie-DIFN2P22.js → junie-GUBDRADP.js} +6 -6
- package/dist/junie-GUBDRADP.js.map +1 -0
- package/dist/{kilo-EMZJBEBB.js → kilo-HRLWMENX.js} +8 -8
- package/dist/kilo-HRLWMENX.js.map +1 -0
- package/dist/{kilo-SW7BH6EG.js → kilo-SMHPOHJ5.js} +4 -4
- package/dist/kilo-SMHPOHJ5.js.map +1 -0
- package/dist/{kilo-cli-S3GXBPAE.js → kilo-cli-IQMFMYZF.js} +8 -8
- package/dist/kilo-cli-IQMFMYZF.js.map +1 -0
- package/dist/{kilo-cli-ZF272ZHN.js → kilo-cli-T2SRRRJS.js} +5 -5
- package/dist/kilo-cli-T2SRRRJS.js.map +1 -0
- package/dist/{kimi-IQJOIY6B.js → kimi-EPD46UJK.js} +7 -7
- package/dist/kimi-EPD46UJK.js.map +1 -0
- package/dist/{kimi-5FHEXGZD.js → kimi-MSIDEMCI.js} +4 -4
- package/dist/kimi-MSIDEMCI.js.map +1 -0
- package/dist/{kiro-BYX4HEAJ.js → kiro-A7DL52FX.js} +7 -7
- package/dist/kiro-A7DL52FX.js.map +1 -0
- package/dist/{kiro-WGOI5CGT.js → kiro-NYRRBIKW.js} +4 -4
- package/dist/kiro-NYRRBIKW.js.map +1 -0
- package/dist/{leaderboard-XEKS7B3H.js → leaderboard-KCT7XPCI.js} +7 -7
- package/dist/leaderboard-KCT7XPCI.js.map +1 -0
- package/dist/{mimo-code-7R53QDHB.js → mimo-code-NDGLBXNC.js} +7 -7
- package/dist/mimo-code-NDGLBXNC.js.map +1 -0
- package/dist/{mistral-vibe-LHJ55FSB.js → mistral-vibe-LLWASF5X.js} +6 -6
- package/dist/mistral-vibe-LLWASF5X.js.map +1 -0
- package/dist/{mux-XM6AP35L.js → mux-7PIJ7HUQ.js} +4 -4
- package/dist/mux-7PIJ7HUQ.js.map +1 -0
- package/dist/{mux-NYCNGL43.js → mux-ON4QK3OC.js} +6 -6
- package/dist/mux-ON4QK3OC.js.map +1 -0
- package/dist/{nemoclaw-WSIPSE7U.js → nemoclaw-45R5MFBF.js} +7 -7
- package/dist/nemoclaw-45R5MFBF.js.map +1 -0
- package/dist/{omp-562NK5BJ.js → omp-ROCTFV3A.js} +7 -7
- package/dist/omp-ROCTFV3A.js.map +1 -0
- package/dist/{open-interpreter-I2CNOEXY.js → open-interpreter-V6CN542J.js} +6 -6
- package/dist/open-interpreter-V6CN542J.js.map +1 -0
- package/dist/openclaw-AOKFJGRQ.js +17 -0
- package/dist/{openclaw-5EQFGOWL.js → openclaw-KAFTNLR2.js} +4 -4
- package/dist/openclaw-KAFTNLR2.js.map +1 -0
- package/dist/{opencode-YS4WX2E2.js → opencode-YYWQ45LF.js} +7 -7
- package/dist/opencode-YYWQ45LF.js.map +1 -0
- package/dist/{opencode-QGP4ALQY.js → opencode-Z65JYILL.js} +4 -4
- package/dist/opencode-Z65JYILL.js.map +1 -0
- package/dist/{openhands-QMYIKNOS.js → openhands-OFFMWCQW.js} +7 -7
- package/dist/openhands-OFFMWCQW.js.map +1 -0
- package/dist/{package-G25GVTH2.js → package-TALOSRQ4.js} +15 -15
- package/dist/package-TALOSRQ4.js.map +1 -0
- package/dist/{pi-644FIN3A.js → pi-4W74ETTI.js} +6 -6
- package/dist/pi-4W74ETTI.js.map +1 -0
- package/dist/{pi-GGDQREVG.js → pi-DLKCPOJE.js} +4 -4
- package/dist/pi-DLKCPOJE.js.map +1 -0
- package/dist/{qwen-code-GQILBJ5B.js → qwen-code-26CSFDX6.js} +4 -4
- package/dist/qwen-code-26CSFDX6.js.map +1 -0
- package/dist/{qwen-code-STDMX7EM.js → qwen-code-JOBFNEVT.js} +16 -16
- package/dist/qwen-code-JOBFNEVT.js.map +1 -0
- package/dist/{roo-code-SUWI4BBN.js → roo-code-HSAE2CJU.js} +4 -4
- package/dist/roo-code-HSAE2CJU.js.map +1 -0
- package/dist/{roo-code-DLPIHHQ6.js → roo-code-RHIGJZNY.js} +6 -6
- package/dist/roo-code-RHIGJZNY.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -8
- package/dist/runtime/index.js +14 -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 +11 -11
- package/dist/{serve-XTMIUHKK.js → serve-4TEHK726.js} +16 -16
- package/dist/serve-4TEHK726.js.map +1 -0
- package/dist/{status-VJAGO4Z7.js → status-DVD4EHMX.js} +11 -11
- package/dist/status-DVD4EHMX.js.map +1 -0
- package/dist/{statusline-EY2E2UGF.js → statusline-ZVNH7XBK.js} +15 -15
- package/dist/statusline-ZVNH7XBK.js.map +1 -0
- package/dist/{synthetic-6FRA7P5Q.js → synthetic-LUT6V6SD.js} +4 -4
- package/dist/synthetic-LUT6V6SD.js.map +1 -0
- package/dist/{telemetry-OLZQBADT.js → telemetry-NWUJPIK3.js} +10 -10
- package/dist/telemetry-NWUJPIK3.js.map +1 -0
- package/dist/{trae-CPPYASR2.js → trae-SIQI3C66.js} +4 -4
- package/dist/trae-SIQI3C66.js.map +1 -0
- package/dist/{trae-UOYD6JZZ.js → trae-TLAFSQRQ.js} +6 -6
- package/dist/trae-TLAFSQRQ.js.map +1 -0
- package/dist/{types-JyhpJHJa.d.ts → types-C6j18a6R.d.ts} +13 -14
- package/dist/{uninstall-AZEUPAND.js → uninstall-DZVFV7KE.js} +21 -21
- package/dist/uninstall-DZVFV7KE.js.map +1 -0
- package/dist/{upgrade-CAUUHSSC.js → upgrade-OUE4ED52.js} +21 -21
- package/dist/upgrade-OUE4ED52.js.map +1 -0
- package/dist/{usage-3KHZ4RYZ.js → usage-NT3ZXALZ.js} +4 -4
- package/dist/usage-NT3ZXALZ.js.map +1 -0
- package/dist/{usage-event-TZWOZPRJ.js → usage-event-IELZE6WO.js} +15 -15
- package/dist/usage-event-IELZE6WO.js.map +1 -0
- package/dist/{vscode-copilot-NIMH2DGU.js → vscode-copilot-VZ5XYSTK.js} +7 -7
- package/dist/vscode-copilot-VZ5XYSTK.js.map +1 -0
- package/dist/{warp-NRBBJQR2.js → warp-5YBSP7FP.js} +4 -4
- package/dist/warp-5YBSP7FP.js.map +1 -0
- package/dist/{warp-QYJGKURM.js → warp-P2HWXIKT.js} +6 -6
- package/dist/warp-P2HWXIKT.js.map +1 -0
- package/dist/{windsurf-75LLZ37C.js → windsurf-3JC73GZK.js} +6 -6
- package/dist/windsurf-3JC73GZK.js.map +1 -0
- package/dist/{zed-HKAZXEJW.js → zed-6CMUKXLI.js} +7 -7
- package/dist/zed-6CMUKXLI.js.map +1 -0
- package/dist/{zed-XJFOOKCO.js → zed-XXCNYOIN.js} +4 -4
- package/dist/zed-XXCNYOIN.js.map +1 -0
- package/package.json +92 -88
- package/dist/action-Q7GGO4PA.js.map +0 -1
- package/dist/amazon-q-ETMAGY3D.js.map +0 -1
- package/dist/amp-67BZONGF.js.map +0 -1
- package/dist/amp-BQZOL5GR.js.map +0 -1
- package/dist/antigravity-EA4L225L.js.map +0 -1
- package/dist/antigravity-VXLDLTO7.js +0 -18
- package/dist/antigravity-cli-B2HXZFYQ.js.map +0 -1
- package/dist/antigravity-cli-OM6SC3PE.js.map +0 -1
- package/dist/chunk-2Y2MZRLP.js.map +0 -1
- package/dist/chunk-3NH2ARIS.js.map +0 -1
- package/dist/chunk-4NHXLXSD.js.map +0 -1
- package/dist/chunk-5IOTP7LQ.js.map +0 -1
- package/dist/chunk-6TF7MHG5.js.map +0 -1
- package/dist/chunk-6WZODR3Z.js.map +0 -1
- package/dist/chunk-7F5KHLEP.js.map +0 -1
- package/dist/chunk-APZDTY76.js.map +0 -1
- package/dist/chunk-BEFVJ2OE.js.map +0 -1
- package/dist/chunk-D4ELPBB5.js.map +0 -1
- package/dist/chunk-FBJQGRET.js.map +0 -1
- package/dist/chunk-FJCUKXGX.js.map +0 -1
- package/dist/chunk-GZGLCCEE.js.map +0 -1
- package/dist/chunk-H33M77DD.js.map +0 -1
- package/dist/chunk-H53QZQJI.js.map +0 -1
- package/dist/chunk-I5UXHIDT.js.map +0 -1
- package/dist/chunk-ISEJWBFF.js.map +0 -1
- package/dist/chunk-IVAWP6HH.js.map +0 -1
- package/dist/chunk-JKKU2WKG.js.map +0 -1
- package/dist/chunk-KHO5WNTP.js.map +0 -1
- package/dist/chunk-MGTDQLJJ.js.map +0 -1
- package/dist/chunk-MQPNU2CY.js.map +0 -1
- package/dist/chunk-NBYKLUF6.js.map +0 -1
- package/dist/chunk-NLE2J5P4.js.map +0 -1
- package/dist/chunk-O7SDRBVB.js.map +0 -1
- package/dist/chunk-OP4KBXUO.js.map +0 -1
- package/dist/chunk-OPXAP3AC.js.map +0 -1
- package/dist/chunk-PAPMUAR5.js.map +0 -1
- package/dist/chunk-PW42ZXCB.js.map +0 -1
- package/dist/chunk-RK6VBLXP.js.map +0 -1
- package/dist/chunk-UM5S7DKK.js.map +0 -1
- package/dist/chunk-UMQ6NBQR.js.map +0 -1
- package/dist/chunk-XC5SJ35F.js.map +0 -1
- package/dist/chunk-XD7MY6HB.js.map +0 -1
- package/dist/chunk-YPAXJ7EW.js.map +0 -1
- package/dist/chunk-YT43MUSJ.js.map +0 -1
- package/dist/chunk-Z2MRSS2I.js.map +0 -1
- package/dist/claude-code-GRWO6XBZ.js.map +0 -1
- package/dist/claude-code-NMRKTAP7.js.map +0 -1
- package/dist/cline-25KW25IN.js.map +0 -1
- package/dist/codebuddy-ZNYQACMF.js.map +0 -1
- package/dist/codebuff-ETYT5UBL.js.map +0 -1
- package/dist/codebuff-VR6JUDIY.js.map +0 -1
- package/dist/codex-CPNKTXG3.js.map +0 -1
- package/dist/codex-YAORPCOD.js.map +0 -1
- package/dist/continue-WU2IB5KS.js.map +0 -1
- package/dist/copilot-cli-MZTAWMPW.js.map +0 -1
- package/dist/copilot-cli-PAP377OM.js.map +0 -1
- package/dist/crush-3AVQA4YU.js.map +0 -1
- package/dist/crush-QBXLNN7T.js.map +0 -1
- package/dist/cursor-DIW43TRZ.js.map +0 -1
- package/dist/cursor-GSLUET3V.js +0 -22
- package/dist/detect-6V4LC3MA.js.map +0 -1
- package/dist/devin-QMEM3OFA.js.map +0 -1
- package/dist/doctor-2YDUVSAU.js.map +0 -1
- package/dist/droid-MOKV53J4.js.map +0 -1
- package/dist/droid-U3ZBLQFO.js.map +0 -1
- package/dist/gemini-cli-47ZHCOZR.js.map +0 -1
- package/dist/gemini-cli-NMVVBO3K.js.map +0 -1
- package/dist/goose-4EI5MYTI.js.map +0 -1
- package/dist/goose-64V46Y2W.js.map +0 -1
- package/dist/grok-cli-QYQPDSVB.js.map +0 -1
- package/dist/hermes-F3EGTK6N.js.map +0 -1
- package/dist/hermes-F75OSK3Y.js.map +0 -1
- package/dist/hook-OEVRDMXD.js.map +0 -1
- package/dist/install-5NMCUDG5.js.map +0 -1
- package/dist/jetbrains-copilot-ZGIWI6YV.js.map +0 -1
- package/dist/junie-DIFN2P22.js.map +0 -1
- package/dist/kilo-EMZJBEBB.js.map +0 -1
- package/dist/kilo-SW7BH6EG.js.map +0 -1
- package/dist/kilo-cli-S3GXBPAE.js.map +0 -1
- package/dist/kilo-cli-ZF272ZHN.js.map +0 -1
- package/dist/kimi-5FHEXGZD.js.map +0 -1
- package/dist/kimi-IQJOIY6B.js.map +0 -1
- package/dist/kiro-BYX4HEAJ.js.map +0 -1
- package/dist/kiro-WGOI5CGT.js.map +0 -1
- package/dist/leaderboard-XEKS7B3H.js.map +0 -1
- package/dist/mimo-code-7R53QDHB.js.map +0 -1
- package/dist/mistral-vibe-LHJ55FSB.js.map +0 -1
- package/dist/mux-NYCNGL43.js.map +0 -1
- package/dist/mux-XM6AP35L.js.map +0 -1
- package/dist/nemoclaw-WSIPSE7U.js.map +0 -1
- package/dist/omp-562NK5BJ.js.map +0 -1
- package/dist/open-interpreter-I2CNOEXY.js.map +0 -1
- package/dist/openclaw-5EQFGOWL.js.map +0 -1
- package/dist/openclaw-7EYBQS4R.js +0 -17
- package/dist/opencode-QGP4ALQY.js.map +0 -1
- package/dist/opencode-YS4WX2E2.js.map +0 -1
- package/dist/openhands-QMYIKNOS.js.map +0 -1
- package/dist/package-G25GVTH2.js.map +0 -1
- package/dist/pi-644FIN3A.js.map +0 -1
- package/dist/pi-GGDQREVG.js.map +0 -1
- package/dist/qwen-code-GQILBJ5B.js.map +0 -1
- package/dist/qwen-code-STDMX7EM.js.map +0 -1
- package/dist/roo-code-DLPIHHQ6.js.map +0 -1
- package/dist/roo-code-SUWI4BBN.js.map +0 -1
- package/dist/serve-XTMIUHKK.js.map +0 -1
- package/dist/status-VJAGO4Z7.js.map +0 -1
- package/dist/statusline-EY2E2UGF.js.map +0 -1
- package/dist/synthetic-6FRA7P5Q.js.map +0 -1
- package/dist/telemetry-OLZQBADT.js.map +0 -1
- package/dist/trae-CPPYASR2.js.map +0 -1
- package/dist/trae-UOYD6JZZ.js.map +0 -1
- package/dist/uninstall-AZEUPAND.js.map +0 -1
- package/dist/upgrade-CAUUHSSC.js.map +0 -1
- package/dist/usage-3KHZ4RYZ.js.map +0 -1
- package/dist/usage-event-TZWOZPRJ.js.map +0 -1
- package/dist/vscode-copilot-NIMH2DGU.js.map +0 -1
- package/dist/warp-NRBBJQR2.js.map +0 -1
- package/dist/warp-QYJGKURM.js.map +0 -1
- package/dist/windsurf-75LLZ37C.js.map +0 -1
- package/dist/zed-HKAZXEJW.js.map +0 -1
- package/dist/zed-XJFOOKCO.js.map +0 -1
- /package/dist/{antigravity-VXLDLTO7.js.map → antigravity-PZXYAO3X.js.map} +0 -0
- /package/dist/{cursor-GSLUET3V.js.map → cursor-JRVK56QA.js.map} +0 -0
- /package/dist/{openclaw-7EYBQS4R.js.map → openclaw-AOKFJGRQ.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/usage/sqlite.ts"],"sourcesContent":["/**\n * usage/sqlite — a lazy, read-only sql.js (WASM) loader for SQLite readers.\n *\n * Why sql.js: pure WASM, zero native build / node-gyp / prebuilt-binary matrix,\n * so it installs identically on Linux/macOS/Windows and in CI (the decisive\n * constraint — see docs/research/usage-design.md §2). We never write the host DB:\n * we load its bytes and run SELECTs, then discard.\n *\n * Read-only by construction:\n * • open by reading the file into a Uint8Array → new SQL.Database(bytes);\n * • if a -wal/-shm sidecar exists, the on-disk file may be a half-flushed\n * snapshot, so we copy the db (+ sidecars) into an os.tmpdir temp path,\n * open the copy, and clean it up afterward. This avoids reading a torn page\n * of a live DB (Crush/OpenCode can be running).\n *\n * Fail-open: ANY failure (missing wasm, unreadable file, corrupt db, bad SQL)\n * returns null / [] — a SQLite reader degrades to zero rows, never throws.\n *\n * The WASM module is initialized once (lazy singleton) so report runs that touch\n * no SQLite reader pay nothing.\n */\n\nimport { copyFileSync, existsSync, mkdtempSync, readFileSync, rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\n/** Minimal handle a SQLite reader needs: run a SELECT, then close. */\nexport interface SqliteDb {\n /** Run a SQL statement and return all rows as plain objects (column → value). */\n all(sql: string): Array<Record<string, unknown>>;\n /** Release the in-memory database. Idempotent. */\n close(): void;\n}\n\n/** The sql.js factory signature we depend on (a tiny structural subset). */\ninterface SqlJsStatic {\n Database: new (data: Uint8Array) => SqlJsDatabase;\n}\ninterface SqlJsDatabase {\n exec(sql: string): Array<{ columns: string[]; values: unknown[][] }>;\n close(): void;\n}\ntype InitSqlJs = (config?: { locateFile?: (file: string) => string }) => Promise<SqlJsStatic>;\n\nconst require = createRequire(import.meta.url);\n\n/** Lazy singleton: the initialized sql.js module (or null if it failed to load). */\nlet sqlPromise: Promise<SqlJsStatic | null> | undefined;\n\n/** Resolve the sql-wasm.wasm next to the resolved sql.js package entry. */\nfunction locateWasm(file: string): string {\n try {\n const entry = require.resolve(\"sql.js\"); // → node_modules/sql.js/dist/sql-wasm.js\n return join(dirname(entry), file);\n } catch {\n return file;\n }\n}\n\n/** Initialize sql.js once. Returns null (cached) when the module cannot load. */\nfunction loadSqlJs(): Promise<SqlJsStatic | null> {\n if (sqlPromise === undefined) {\n sqlPromise = (async () => {\n try {\n // sql.js's default export is the initializer (a CommonJS module).\n const mod = require(\"sql.js\") as InitSqlJs | { default: InitSqlJs };\n const init: InitSqlJs = typeof mod === \"function\" ? mod : mod.default;\n return await init({ locateFile: locateWasm });\n } catch {\n return null;\n }\n })();\n }\n return sqlPromise;\n}\n\n/** SQLite WAL/SHM sidecar suffixes that signal a possibly-live database file. */\nconst SIDECAR_SUFFIXES = [\"-wal\", \"-shm\"] as const;\n\n/**\n * Open a SQLite file read-only via sql.js. Returns a small {@link SqliteDb} or\n * null on any failure. When a -wal/-shm sidecar is present the db is copied to a\n * temp dir first (and the copy is removed when the handle is closed) to avoid\n * reading a torn snapshot of a live database.\n */\nexport async function openSqlite(path: string): Promise<SqliteDb | null> {\n if (!existsSync(path)) return null;\n\n const SQL = await loadSqlJs();\n if (SQL === null) return null;\n\n const hasSidecar = SIDECAR_SUFFIXES.some((s) => existsSync(path + s));\n let openPath = path;\n let tempDir: string | undefined;\n\n if (hasSidecar) {\n try {\n tempDir = mkdtempSync(join(tmpdir(), \"agent-connector-usage-\"));\n const dst = join(tempDir, basename(path));\n copyFileSync(path, dst);\n for (const suffix of SIDECAR_SUFFIXES) {\n const side = path + suffix;\n if (existsSync(side)) copyFileSync(side, dst + suffix);\n }\n openPath = dst;\n } catch {\n // If the copy fails, fall back to opening the original bytes directly.\n openPath = path;\n if (tempDir) {\n cleanupTemp(tempDir);\n tempDir = undefined;\n }\n }\n }\n\n let bytes: Uint8Array;\n try {\n bytes = readFileSync(openPath);\n } catch {\n if (tempDir) cleanupTemp(tempDir);\n return null;\n }\n\n // Reject anything that is not a SQLite file up front (the 16-byte header magic\n // \"SQLite format 3\\0\"). sql.js would otherwise accept arbitrary bytes and only\n // fail at query time; this keeps the documented \"null on non-db\" contract.\n if (!hasSqliteMagic(bytes)) {\n if (tempDir) cleanupTemp(tempDir);\n return null;\n }\n\n let db: SqlJsDatabase;\n try {\n db = new SQL.Database(bytes);\n } catch {\n if (tempDir) cleanupTemp(tempDir);\n return null;\n }\n\n let closed = false;\n return {\n all(sql: string): Array<Record<string, unknown>> {\n if (closed) return [];\n let result: Array<{ columns: string[]; values: unknown[][] }>;\n try {\n result = db.exec(sql);\n } catch {\n return []; // bad SQL / schema mismatch → no rows\n }\n const out: Array<Record<string, unknown>> = [];\n for (const block of result) {\n const { columns, values } = block;\n for (const row of values) {\n const obj: Record<string, unknown> = {};\n for (let i = 0; i < columns.length; i++) {\n const col = columns[i];\n if (col !== undefined) obj[col] = row[i];\n }\n out.push(obj);\n }\n }\n return out;\n },\n close(): void {\n if (closed) return;\n closed = true;\n try {\n db.close();\n } catch {\n /* ignore */\n }\n if (tempDir) cleanupTemp(tempDir);\n },\n };\n}\n\n/** The 16-byte SQLite file header: \"SQLite format 3\\0\". */\nconst SQLITE_MAGIC = Uint8Array.from([\n 0x53, 0x51, 0x4c, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x33, 0x00,\n]);\n\n/** Does `bytes` begin with the SQLite file-header magic? */\nfunction hasSqliteMagic(bytes: Uint8Array): boolean {\n if (bytes.length < SQLITE_MAGIC.length) return false;\n for (let i = 0; i < SQLITE_MAGIC.length; i++) {\n if (bytes[i] !== SQLITE_MAGIC[i]) return false;\n }\n return true;\n}\n\nfunction cleanupTemp(dir: string): void {\n try {\n rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n}\n"],"mappings":"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","names":["require"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/spawn-child.ts"],"sourcesContent":["/**\n * core/spawn-child — the cross-platform child_process.spawn wrapper.\n *\n * Kept SEPARATE from core/spawn.ts (pure string/path helpers, imported widely\n * and early) so that pulling in `node:child_process` here does not perturb the\n * module-eval order of test suites that vi.mock(\"node:child_process\").\n */\n\nimport { type ChildProcess, type SpawnOptions, spawn } from \"node:child_process\";\n\nimport { resolveSpawnCommand } from \"./spawn.js\";\n\n/**\n * Quote one token for a cmd.exe command line: wrap in double quotes, doubling any\n * embedded double quote. Sufficient for the paths / package names / flags we\n * spawn (connector config, not untrusted end-user input) — we intentionally do\n * not escape cmd metacharacters (& | ^ %), which never appear in those tokens.\n */\nfunction winQuoteArg(s: string): string {\n return `\"${s.replace(/\"/g, '\"\"')}\"`;\n}\n\n/**\n * Cross-platform child spawn that fixes native-Windows package-runner launches.\n * Direct spawn on macOS/Linux. On win32 it routes through\n * {@link resolveSpawnCommand}; an `.exe` runs directly, while a `.cmd`/`.bat`\n * (npx.cmd, the agent-connector.cmd launcher) is launched via a SINGLE quoted\n * command line with `shell: true` — a string rather than an args array, which\n * Node requires for a batch file AND which avoids the DEP0190 deprecation that\n * `shell: true` + an args array triggers on Node ≥ 24.\n */\nexport function spawnChild(\n command: string,\n args: string[],\n options: SpawnOptions,\n): ChildProcess {\n const resolved = resolveSpawnCommand(command);\n if (!resolved.needsShell) return spawn(resolved.file, args, options);\n const line = [resolved.file, ...args].map(winQuoteArg).join(\" \");\n return spawn(line, { ...options, shell: true });\n}\n"],"mappings":";;;;;;AAQA,SAA+C,aAAa;AAU5D,SAAS,YAAY,GAAmB;AACtC,SAAO,IAAI,EAAE,QAAQ,MAAM,IAAI,CAAC;AAClC;AAWO,SAAS,WACd,SACA,MACA,SACc;AACd,QAAM,WAAW,oBAAoB,OAAO;AAC5C,MAAI,CAAC,SAAS,WAAY,QAAO,MAAM,SAAS,MAAM,MAAM,OAAO;AACnE,QAAM,OAAO,CAAC,SAAS,MAAM,GAAG,IAAI,EAAE,IAAI,WAAW,EAAE,KAAK,GAAG;AAC/D,SAAO,MAAM,MAAM,EAAE,GAAG,SAAS,OAAO,KAAK,CAAC;AAChD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/claude-code/index.ts"],"sourcesContent":["/**\n * adapters/claude-code — Claude Code platform adapter for agent-connector.\n *\n * Generalized from context-mode's proven 15-platform Claude adapter: the served\n * identity is now `ctx.connector` (not a hardcoded \"context-mode\"), and every\n * hook command points at the single stable home binary\n * (`buildHomeBinHookCommand`) so one framework update propagates everywhere.\n *\n * Claude Code is a json-stdio host:\n * - MCP servers: user scope → ~/.claude.json (\"mcpServers\"); project scope →\n * <projectDir>/.mcp.json (\"mcpServers\").\n * - Hooks: <configDir>/settings.json under \"hooks\", keyed by event name, each\n * value an array of { matcher, hooks:[{ type:\"command\", command }] }.\n * - Reply: a `hookSpecificOutput` object (allow|deny|ask + reason,\n * additionalContext, updatedInput) on stdout with exit 0.\n */\n\nimport { copyFileSync, existsSync, lstatSync, readFileSync, realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n CommandDef,\n ConfigPatchDef,\n DetectedPlatform,\n DiagnosticResult,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n JsonValue,\n NotificationEvent,\n PermissionRequestEvent,\n PlatformCapabilities,\n PlatformId,\n PostCompactEvent,\n PostToolUseEvent,\n PostToolUseFailureEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n SkillDef,\n StatuslineContext,\n StopEvent,\n SubagentDef,\n SubagentStartEvent,\n SubagentStopEvent,\n Transport,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { resolveEnvRefsDeep, rewriteEnvRefs } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinStatuslineCommand,\n buildWrappedStdio,\n isHomeBinHookCommand,\n isHomeBinStatuslineCommand,\n} from \"../../core/spawn.js\";\nimport {\n type ConfigPatchLedgerEntry,\n addLedgerOwner,\n configPatchManualEdit,\n configPatchNamespaceViolation,\n createLedgerEntry,\n describeJsonValue,\n dropLedgerEntry,\n findLedgerEntry,\n hashJsonValue,\n isValidConfigPatchKey,\n jsonDeepEquals,\n ledgerEntriesOwnedBy,\n loadConfigPatchLedger,\n removeLedgerOwner,\n saveConfigPatchLedger,\n} from \"../../core/config-patch-ledger.js\";\nimport { readRegisteredMeta } from \"../../core/load-connector.js\";\nimport {\n linesOutsideFences,\n listManagedBlocks,\n loadMemoryLedger,\n recordMemoryTarget,\n removeBlocksFromText,\n removeManagedBlocksFile,\n saveMemoryLedger,\n upsertManagedBlockFile,\n} from \"../../core/managed-block.js\";\nimport { backupsDir, ensureDir } from \"../../core/paths.js\";\nimport {\n type ClaudeHookEvent,\n type ClaudeWireInput,\n extractSessionId,\n normalizeSessionSource,\n toolResponseToString,\n} from \"./wire.js\";\nimport { renderCommandMd, renderSkillMd, renderSubagentMd } from \"./render.js\";\n\nconst HOST: PlatformId = \"claude-code\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/**\n * settings.json leaf key the statusline surface owns. Wired through the SAME\n * set-if-absent ownership ledger as configPatch (it is NOT on the configPatch\n * sensitive-key denylist — verified — and is a single top-level leaf), so a\n * non-AC statusLine is never clobbered.\n */\nconst STATUSLINE_KEY = \"statusLine\";\n\n/**\n * Reserved blockId of the SHARED `@AGENTS.md` import bridge in CLAUDE.md\n * (agents-import mode). The `_shared/` prefix cannot collide with a connector\n * blockId (connector ids match ^[a-z0-9][a-z0-9-]*$), and the bridge is\n * refcounted namespace-wide: it is removed only when the LAST agent-connector\n * block leaves the sibling AGENTS.md.\n */\nconst CLAUDE_AGENTS_IMPORT_BLOCK_ID = \"_shared/claude-agents-import\";\n\n/** A single hook registration entry as Claude Code stores it in settings.json. */\ninterface ClaudeHookEntry {\n matcher: string;\n hooks: Array<{ type: \"command\"; command: string }>;\n}\n\n/** Native MCP server entry shapes Claude Code accepts under `mcpServers`. */\ninterface ClaudeStdioServer {\n type: \"stdio\";\n command: string;\n args: string[];\n env?: Record<string, string>;\n cwd?: string;\n}\ninterface ClaudeHttpServer {\n type: \"http\";\n url: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Claude Code statusLine command stdin payload (the documented status-line hook\n * input). Every field optional — a refresh only carries what the host knows.\n * `version` and any unmodeled fields stay in StatuslineContext.raw.\n */\ninterface ClaudeStatuslineInput {\n session_id?: string;\n transcript_path?: string;\n cwd?: string;\n version?: string;\n model?: { id?: string; display_name?: string };\n workspace?: { current_dir?: string; project_dir?: string };\n cost?: { total_cost_usd?: number };\n}\n\nexport class ClaudeCodeAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Claude Code\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n preToolUse: true,\n postToolUse: true,\n preCompact: true,\n sessionStart: true,\n sessionEnd: true,\n userPromptSubmit: true,\n stop: true,\n notification: true,\n // Newer events — Claude Code is the reference host for all four.\n permissionRequest: true,\n postToolUseFailure: true,\n subagentStart: true,\n subagentStop: true,\n // Claude Code can rewrite PreToolUse input (updatedInput) but does NOT let a\n // PostToolUse hook rewrite already-emitted tool output.\n canModifyArgs: true,\n canModifyOutput: false,\n canInjectSessionContext: true,\n // Native passthrough hooks: settings.json hook keys are free-form event\n // names, so any host event (TaskCreated, TeammateIdle, WorktreeCreate, …)\n // declared under platforms[\"claude-code\"].nativeHooks installs verbatim.\n supportsNativeHooks: true,\n // Declarative host-config key patches: claude-code is the ONLY v1 host\n // (set-if-absent leaf keys in settings.json, refcounted ownership ledger,\n // sensitive-key denylist — see SENSITIVE_KEY_RULES below).\n supportsConfigPatch: true,\n // Statusline surface: claude-code is the ONLY v1 host. installStatusline\n // wires settings.json.statusLine = {type:\"command\", command:<home-bin\n // statusline cmd>} through the SAME set-if-absent ownership ledger as\n // configPatch (never clobbers a statusLine agent-connector does not own).\n supportsStatusline: true,\n transports: [\"stdio\", \"http\"],\n // Server secret-bearing fields use Claude's NATIVE ${VAR} interpolation\n // (rewriteEnvRefs) — the token survives into the config, never a baked\n // literal — so the installer's unset-env-ref bake warn does not apply here.\n nativeServerEnvInterpolation: true,\n // Content surfaces: Claude Code is the reference implementation for all three.\n supportsCommands: true,\n supportsSkills: true,\n supportsSubagents: true,\n // Memory surface — EXCEPTION host: Claude Code reads CLAUDE.md, NOT\n // AGENTS.md (docs are explicit; no AGENTS.md support through v2.1.172), so\n // memoryTargets/installMemory below override the base AGENTS.md default.\n supportsMemory: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userDir = join(homedir(), \".claude\");\n const userSettings = join(userDir, \"settings.json\");\n const userServers = join(homedir(), \".claude.json\");\n const projectServers = join(projectDir, \".mcp.json\");\n const userInstalled =\n existsSync(userDir) || existsSync(userSettings) || existsSync(userServers);\n const projInstalled = existsSync(projectServers);\n const installed = userInstalled || projInstalled;\n // Report the scope/path/reason for the marker that actually matched, so a\n // project-only install isn't misreported as a (non-existent) user install.\n const scope = projInstalled && !userInstalled ? \"project\" : \"user\";\n const configPath = scope === \"project\" ? projectServers : userSettings;\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason: installed\n ? scope === \"project\"\n ? `found project Claude Code config at ${projectServers}`\n : `found Claude Code config under ${userDir}`\n : `no Claude Code config at ${userDir}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n getConfigDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".claude\")\n : join(homedir(), \".claude\");\n }\n\n getServerConfigPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".mcp.json\")\n : join(homedir(), \".claude.json\");\n }\n\n getHookConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"settings.json\");\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for claude-code\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /** Render a normalized ServerDef into Claude Code's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): ClaudeStdioServer | ClaudeHttpServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n const entry: ClaudeStdioServer = { type: \"stdio\", command, args };\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n if (server.cwd) entry.cwd = resolveEnvRefsDeep(server.cwd);\n return entry;\n }\n\n // http (and any other remote transport we surface) — Claude registers a URL.\n const entry: ClaudeHttpServer = {\n type: \"http\",\n url: rewriteEnvRefs(server.url ?? \"\", claudeEnvToken),\n };\n if (server.headers) {\n entry.headers = this.renderEnv(server.headers) ?? {};\n }\n return entry;\n }\n\n /**\n * Render env/header values. Claude Code supports its own `${VAR}` native\n * interpolation, so translate `${env:VAR}` refs to that native token rather\n * than baking secrets into the file. Literals pass through unchanged.\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(env)) {\n out[k] = rewriteEnvRefs(v, claudeEnvToken);\n }\n return out;\n }\n\n // ── Hook install / uninstall ─────────────────────────────────────────────\n\n installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST];\n\n // `hooks: false` disables only the NORMALIZED hooks. nativeHooks is a\n // sibling, explicitly claude-code-scoped declaration on the same override —\n // it installs regardless (the dev wrote both keys on the same object).\n const normalizedEvents = override?.hooks === false ? [] : connector.hookEvents;\n const nativeHooks = override?.nativeHooks ?? {};\n const nativeEvents = Object.keys(nativeHooks);\n\n if (normalizedEvents.length === 0 && nativeEvents.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail:\n override?.hooks === false\n ? \"hooks disabled for claude-code\"\n : \"connector declares no hooks\",\n },\n ];\n }\n\n const settingsPath = this.getHookConfigPath(ctx);\n\n // One pass over normalized + NATIVE events: native event-name keys are\n // written VERBATIM (e.g. \"TaskCreated\"), matcher from the def, and the\n // exact same home-bin command shape — so uninstall/doctor/telemetry treat\n // both identically.\n const pending: Array<{ event: string; matcher: string }> = [\n ...normalizedEvents.map((event) => ({\n event: event as string,\n matcher: connector.hooks[event]?.matcher ?? \"\",\n })),\n ...nativeEvents.map((event) => ({\n event,\n matcher: nativeHooks[event]?.matcher ?? \"\",\n })),\n ];\n\n return this.upsertHookEntries(ctx, settingsPath, pending, this.hookDescriptor());\n }\n\n uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor());\n }\n\n /**\n * Claude's hook-merge descriptor (NESTED shape `{ matcher, hooks: [...] }`):\n * - install find = THIS exact command present in the entry's inner `hooks`;\n * - uninstall = inner-strip ONLY (connector-generic `isOurCommand` over the\n * inner commands, drop entries left empty) — claude never removes a whole\n * entry by ownership, so `ownsEntryForRemove` is a never-true predicate;\n * - every detail string is the literal claude-code wording.\n */\n private hookDescriptor(): HookMergeDescriptor<ClaudeHookEntry> {\n return {\n renderEntry: (_event, matcher, command) => ({\n matcher,\n hooks: [{ type: \"command\", command }],\n }),\n entryOwnsCommand: (entry, command) =>\n (entry.hooks ?? []).some((h) => h.command === command),\n ownsEntryForRemove: () => () => false,\n stripInner: (ctx) => (entry) => {\n const innerBefore = entry.hooks?.length ?? 0;\n const inner = (entry.hooks ?? []).filter((h) => !this.isOurCommand(h.command, ctx));\n return {\n next: inner.length > 0 ? { matcher: entry.matcher ?? \"\", hooks: inner } : null,\n removed: innerBefore - inner.length,\n };\n },\n skipDetail: (event) => `hooks.${event} already registered`,\n removeDetail: (event, removed) => `hooks.${event} (${removed})`,\n absentDetail: \"no hooks section present\",\n noMatchDetail: \"no matching hook entries\",\n };\n }\n\n // ── Declarative host-config key patches (configPatch) ────────────────────\n // FIXED semantics (docs/ARCHITECTURE.md §4): set-if-absent on a single\n // dotted LEAF key of settings.json, skip-warn on ANY conflict (present key,\n // non-object intermediate, drift), refcounted ownership in the persisted\n // ledger at <dataRoot>/state/config-patches.json. Reuses the adapter's\n // existing whole-file settings.json JSON IO (the same handling the hook\n // install performs on this exact file) — Claude Code itself rewrites this\n // file, so format preservation is a non-issue here. NOTE for future hosts:\n // VS Code JSONC needs jsonc-parser modify/applyEdits and Codex TOML needs an\n // anchored edit — core/toml.ts's round-trip is BANNED for configPatch.\n\n /** The ONLY file configPatch may touch on claude-code: settings.json at scope. */\n getPatchableConfigPath(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"settings.json\");\n }\n\n override installConfigPatches(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const patches = connector.platforms[HOST]?.configPatch ?? [];\n if (patches.length === 0) {\n return [\n { platform: this.id, action: \"skip\", detail: \"connector declares no configPatch entries\" },\n ];\n }\n return this.applyConfigPatches(ctx, patches);\n }\n\n /**\n * The shared set-if-absent / ownership-ledger apply loop behind BOTH\n * {@link installConfigPatches} and {@link installStatusline}. Routing the\n * statusline through the EXACT same path is how a connector's statusLine\n * inherits the configPatch contract verbatim: never clobber a statusLine\n * agent-connector does not own (skip-warn), record prior state + owner,\n * refcounted across connectors, reversible by uninstallConfigPatches.\n */\n private applyConfigPatches(\n ctx: InstallContext,\n patches: ConfigPatchDef[],\n opts: { surfaceLabel?: \"configPatch\" | \"statusline\" } = {},\n ): ChangeRecord[] {\n // The user-facing surface name in every ChangeRecord.detail. \"statusline\"\n // routes the AC-modeled statusLine key through this loop INTERNALLY — that\n // key is namespace-reserved against raw configPatch, so the internal path\n // bypasses the namespace guard (the surface, not a smuggled patch, owns it).\n const surfaceLabel = opts.surfaceLabel ?? \"configPatch\";\n const internal = surfaceLabel !== \"configPatch\";\n const { connector } = ctx;\n const filePath = this.getPatchableConfigPath(ctx);\n const symlink = this.symlinkPathWarning(filePath);\n if (symlink) return [symlink];\n\n // OVERWRITE GUARD (upsertServerInJson precedent): never round-trip a\n // present-but-unparseable settings file into `{}`.\n if (this.isPresentButUnparseable(filePath)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `existing ${filePath} is not parseable; configPatch left unapplied (back it up / fix it, then re-run)`,\n },\n ];\n }\n const settings = this.readJson<Record<string, unknown>>(filePath) ?? {};\n if (typeof settings !== \"object\" || Array.isArray(settings)) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `existing ${filePath} is not a JSON object; configPatch left unapplied`,\n },\n ];\n }\n\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n const changes: ChangeRecord[] = [];\n let fileMutated = false;\n let ledgerMutated = false;\n\n for (const patch of patches) {\n // Defense in depth: re-validate grammar + AC-namespace here (a connector\n // loaded from raw meta/JSON must not bypass defineConnector's checks).\n if (!isValidConfigPatchKey(patch.key)) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail:\n `configPatch ${JSON.stringify(patch.key)} refused: not a dotted leaf path ` +\n `(segments must match [A-Za-z0-9_-]+; no array indices)`,\n });\n continue;\n }\n // The statusline surface intentionally models the (now namespace-reserved)\n // statusLine key, so its internal patches skip this guard.\n if (!internal) {\n const namespace = configPatchNamespaceViolation(patch.key);\n if (namespace) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `configPatch refused: ${namespace}`,\n });\n continue;\n }\n }\n // SENSITIVE-KEY DENYLIST — hard refuse, no override flag in v1.\n const sensitive = claudeSensitiveKeyViolation(patch.key);\n if (sensitive) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail:\n `configPatch ${patch.key} refused: matches the claude-code sensitive-key ` +\n `denylist (${sensitive}); security-relevant keys are never patched`,\n });\n continue;\n }\n\n // `${env:VAR}` refs resolve at install time, matching server-entry behavior.\n const desired = resolveEnvRefsDeep(patch.value) as JsonValue;\n const segments = patch.key.split(\".\");\n const leaf = readJsonLeaf(settings, segments);\n const entry = findLedgerEntry(ledger, HOST, filePath, patch.key);\n\n if (leaf.kind === \"blocked\") {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: \"${leaf.atPath}\" exists but is not an ` +\n `object — ${configPatchManualEdit(patch)}`,\n });\n continue;\n }\n\n if (leaf.kind === \"absent\") {\n // SET-IF-ABSENT: the one write path. Intermediates created only as needed.\n writeJsonLeaf(settings, segments, desired);\n fileMutated = true;\n if (entry) {\n // Stale ledger row (key was deleted out from under us): re-assert the\n // value, keep existing owners (they still rely on the key existing),\n // and record what was actually (re)written.\n entry.writtenValue = desired;\n entry.writtenValueHash = hashJsonValue(desired);\n addLedgerOwner(entry, connector.id, connector.version);\n } else {\n createLedgerEntry(ledger, {\n platform: HOST,\n file: filePath,\n key: patch.key,\n value: desired,\n connectorId: connector.id,\n connectorVersion: connector.version,\n });\n }\n ledgerMutated = true;\n changes.push({\n platform: this.id,\n action: \"create\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key}: <absent> → ${describeJsonValue(desired)} (${patch.reason})`,\n });\n continue;\n }\n\n // Key PRESENT — never overwrite; the only question is ownership/refcount.\n if (!entry) {\n // User- (or other-tool-) owned. No ownership is taken even when values\n // happen to match — uninstall must never delete a key we did not create.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: already set to ${describeJsonValue(leaf.value)} ` +\n `(not created by agent-connector; desired ${describeJsonValue(desired)}) — ` +\n configPatchManualEdit(patch),\n });\n continue;\n }\n\n if (!jsonDeepEquals(leaf.value, entry.writtenValue)) {\n // DRIFT: the user edited the value after we wrote it. Never revert —\n // sync re-asserts only ABSENT keys.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key}: value changed since install ` +\n `(current ${describeJsonValue(leaf.value)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\n `leaving in place — ${configPatchManualEdit(patch)}`,\n });\n continue;\n }\n\n if (jsonDeepEquals(desired, leaf.value)) {\n // Same value we own: register as co-owner (refcount++) or plain\n // idempotent skip when this connector is already an owner.\n const owners = entry.owners.map((o) => o.connectorId);\n if (addLedgerOwner(entry, connector.id, connector.version)) {\n ledgerMutated = true;\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key} already installed; registered as co-owner (co-owned with ${owners.join(\", \")})`,\n });\n } else {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${patch.key} already installed`,\n });\n }\n continue;\n }\n\n // FIRST-WRITER-WINS: another connector owns this key with a different value.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${patch.key} skipped: already owned by ${entry.owners\n .map((o) => o.connectorId)\n .join(\", \")} with a different value ` +\n `(current ${describeJsonValue(leaf.value)}, desired ${describeJsonValue(desired)}) — ` +\n configPatchManualEdit(patch),\n });\n }\n\n if (fileMutated) this.writeJson(filePath, settings, ctx.dryRun);\n if (ledgerMutated && !ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\n return changes;\n }\n\n override uninstallConfigPatches(ctx: InstallContext): ChangeRecord[] {\n const connectorId = ctx.connector.id;\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n // Keyed off the LEDGER (not the declaration): releases ownership for every\n // file/scope this connector ever patched, even when the uninstall context\n // is a minimal synthetic connector or the scope flag differs from install.\n // EXCLUDE the statusLine key — that surface releases via uninstallStatusline\n // (the installer runs both), so this never double-processes the same row.\n const owned = ledgerEntriesOwnedBy(ledger, HOST, connectorId).filter(\n (e) => e.key !== STATUSLINE_KEY,\n );\n const declared = ctx.connector.platforms[HOST]?.configPatch ?? [];\n const changes: ChangeRecord[] = [];\n\n // Declared patches with NO ownership record anywhere: never delete a key\n // we did not create (rule 1) — explicit skip so the outcome is never silent.\n const ownedKeys = new Set(owned.map((e) => e.key));\n for (const patch of declared) {\n if (!ownedKeys.has(patch.key)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n detail: `configPatch ${patch.key}: no ownership recorded; left untouched`,\n });\n }\n }\n if (owned.length === 0) return changes;\n changes.push(...this.releaseOwnedConfigPatches(ctx, ledger, owned));\n return changes;\n }\n\n /**\n * The shared last-owner-verified release loop behind BOTH\n * {@link uninstallConfigPatches} and {@link uninstallStatusline}: for each\n * already-selected owned ledger entry, drop this connector's ownership and\n * remove the key ONLY when last-owner ∧ value-unchanged ∧ prior-absent (else\n * skip-warn + leave the key). Saves the ledger when it mutated.\n */\n private releaseOwnedConfigPatches(\n ctx: InstallContext,\n ledger: ReturnType<typeof loadConfigPatchLedger>,\n owned: ConfigPatchLedgerEntry[],\n opts: { surfaceLabel?: \"configPatch\" | \"statusline\" } = {},\n ): ChangeRecord[] {\n const surfaceLabel = opts.surfaceLabel ?? \"configPatch\";\n const connectorId = ctx.connector.id;\n const changes: ChangeRecord[] = [];\n let ledgerMutated = false;\n const backedUp = new Set<string>();\n\n // Group by file (entries may span scopes/files).\n const byFile = new Map<string, ConfigPatchLedgerEntry[]>();\n for (const entry of owned) {\n const bucket = byFile.get(entry.file) ?? [];\n bucket.push(entry);\n byFile.set(entry.file, bucket);\n }\n\n for (const [filePath, entries] of byFile) {\n const symlink = this.symlinkPathWarning(filePath);\n if (symlink) {\n changes.push(symlink);\n continue;\n }\n\n const unparseable = this.isPresentButUnparseable(filePath);\n const settings = unparseable\n ? null\n : this.readJson<Record<string, unknown>>(filePath);\n let fileMutated = false;\n\n for (const entry of entries) {\n const { lastOwner } = removeLedgerOwner(entry, connectorId);\n ledgerMutated = true;\n\n if (!lastOwner) {\n // The shared-flag case: A uninstalls, B still relies on the key.\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} retained: still owned by ${entry.owners\n .map((o) => o.connectorId)\n .join(\", \")}`,\n });\n continue;\n }\n\n // Last owner out → the ledger row is dropped on every branch below;\n // the KEY is removed only on the fully-verified branch.\n dropLedgerEntry(ledger, entry);\n\n if (unparseable) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key}: ${filePath} is not parseable; key left in place (ownership released)`,\n });\n continue;\n }\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} already absent (no settings file); ownership record dropped`,\n });\n continue;\n }\n const leaf = readJsonLeaf(settings, entry.key.split(\".\"));\n if (leaf.kind !== \"present\") {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} already absent; ownership record dropped`,\n });\n continue;\n }\n if (entry.prior?.present !== false || !jsonDeepEquals(leaf.value, entry.writtenValue)) {\n // User edited the value after install (or the row predates the\n // set-if-absent guarantee): deleting would clobber them. Leave it.\n changes.push({\n platform: this.id,\n action: \"warn\",\n path: filePath,\n detail:\n `${surfaceLabel} ${entry.key}: value changed since install ` +\n `(current ${describeJsonValue(leaf.value)}, wrote ${describeJsonValue(entry.writtenValue)}); ` +\n `left in place`,\n });\n continue;\n }\n\n // VERIFIED: last owner + current === writtenValue + prior was absent.\n // Back up the exact file before its first mutation, then delete the\n // leaf key (intermediate objects we created are left in place).\n if (!ctx.dryRun && !backedUp.has(filePath) && existsSync(filePath)) {\n const backup = this.backupFileForConfigPatch(filePath);\n backedUp.add(filePath);\n if (backup) {\n changes.push({\n platform: this.id,\n action: \"create\",\n path: backup,\n detail: \"backed up settings before configPatch removal\",\n });\n }\n }\n deleteJsonLeaf(settings, entry.key.split(\".\"));\n fileMutated = true;\n changes.push({\n platform: this.id,\n action: \"remove\",\n path: filePath,\n detail: `${surfaceLabel} ${entry.key} removed (was ${describeJsonValue(entry.writtenValue)})`,\n });\n }\n\n if (fileMutated && settings) this.writeJson(filePath, settings, ctx.dryRun);\n }\n\n if (ledgerMutated && !ctx.dryRun) saveConfigPatchLedger(ctx.dataRoot, ledger);\n return changes;\n }\n\n // ── Statusline surface (a HUD/status line) ────────────────────────────────\n // Wires settings.json.statusLine = { type:\"command\", command:<home-bin\n // statusline cmd> } through the SAME ownership ledger as configPatch: a\n // synthetic ConfigPatchDef routed through applyConfigPatches, so the statusLine\n // inherits the full set-if-absent contract verbatim — never clobbers a\n // statusLine agent-connector does not own (skip-warn), records prior state +\n // owner, reversible. The home-bin command makes the host exec\n // `<homeBin> statusline claude-code --connector <id>` for every status refresh,\n // which re-imports the connector module and renders the line (runtime/\n // statusline-entrypoint). No telemetry in v1.\n\n /** The synthetic statusLine configPatch this connector would write. */\n private statuslineConfigPatch(ctx: InstallContext): ConfigPatchDef {\n const command = buildHomeBinStatuslineCommand(ctx.homeBinPath, HOST, ctx.connector.id);\n return {\n key: STATUSLINE_KEY,\n value: { type: \"command\", command },\n reason: \"agent-connector statusline surface\",\n };\n }\n\n override installStatusline(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.statusline == null) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no statusline\" }];\n }\n if (connector.platforms[HOST]?.statusline === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"statusline disabled for claude-code\" }];\n }\n // Reuse the configPatch apply path (set-if-absent, ownership ledger, skip-warn\n // on any non-AC statusLine). This is the SAME machinery installConfigPatches\n // uses on this exact file, so the ownership semantics are identical — only the\n // surface LABEL differs (statusLine is namespace-reserved against raw\n // configPatch; this internal path bypasses that guard and owns the key).\n return this.applyConfigPatches(ctx, [this.statuslineConfigPatch(ctx)], {\n surfaceLabel: \"statusline\",\n });\n }\n\n override uninstallStatusline(ctx: InstallContext): ChangeRecord[] {\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n // Release ONLY the statusLine ledger row this connector owns (keyed off the\n // ledger, not the declaration, so an id-only synthetic uninstall still\n // reclaims it). Same last-owner-verified delete as uninstallConfigPatches.\n const owned = ledgerEntriesOwnedBy(ledger, HOST, ctx.connector.id).filter(\n (e) => e.key === STATUSLINE_KEY,\n );\n if (owned.length === 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"statusline: no ownership recorded; left untouched\",\n },\n ];\n }\n return this.releaseOwnedConfigPatches(ctx, ledger, owned, {\n surfaceLabel: \"statusline\",\n });\n }\n\n /**\n * Parse Claude Code's statusLine stdin JSON into the normalized\n * {@link StatuslineContext}. Claude pipes a JSON object to the statusLine\n * command on stdin (model, workspace, cost, etc.); fields the payload omits\n * stay undefined. `raw` keeps the verbatim payload (incl. `version`).\n */\n parseStatusInput(raw: unknown): StatuslineContext {\n const input = (raw ?? {}) as ClaudeStatuslineInput;\n const model: { id?: string; displayName?: string } = {};\n if (typeof input.model?.id === \"string\") model.id = input.model.id;\n if (typeof input.model?.display_name === \"string\") {\n model.displayName = input.model.display_name;\n }\n const cwd =\n typeof input.cwd === \"string\"\n ? input.cwd\n : typeof input.workspace?.current_dir === \"string\"\n ? input.workspace.current_dir\n : undefined;\n\n const ctx: StatuslineContext = {\n host: HOST,\n capabilities: this.capabilities,\n raw,\n };\n if (typeof input.session_id === \"string\" && input.session_id !== \"\") {\n ctx.sessionId = input.session_id;\n }\n if (cwd !== undefined) ctx.cwd = cwd;\n if (model.id !== undefined || model.displayName !== undefined) ctx.model = model;\n if (typeof input.cost?.total_cost_usd === \"number\") {\n ctx.cost = { totalUsd: input.cost.total_cost_usd };\n }\n if (typeof input.transcript_path === \"string\") {\n ctx.transcriptPath = input.transcript_path;\n }\n return ctx;\n }\n\n /** Format the rendered status line into Claude's native reply: stdout = line, exit 0. */\n formatStatusOutput(rendered: string): HookReply {\n return { exitCode: 0, stdout: rendered };\n }\n\n /**\n * Back up ONE exact file (the ledger-recorded patch target, which may belong\n * to a different scope than the current ctx) into the standard backups dir.\n * Best-effort: a failed copy returns null and the caller proceeds — the\n * removal is already value-verified.\n */\n private backupFileForConfigPatch(filePath: string): string | null {\n try {\n ensureDir(backupsDir());\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dest = join(backupsDir(), `${this.id}-${stamp}-${basename(filePath)}`);\n copyFileSync(filePath, dest);\n return dest;\n } catch {\n return null;\n }\n }\n\n /**\n * Doctor: per-ledger-entry configPatch state for this connector —\n * ok → key present and still exactly what we wrote;\n * drifted → user changed the value (we print the manual edit, NEVER\n * auto-fix — sync re-asserts only absent keys);\n * missing → key deleted by the user; sync will re-assert it;\n * orphaned → ledger row whose owners' connector records are all gone.\n * Plus a re-print of the manual edit for declared patches that hold no\n * ownership (skipped at install).\n */\n private configPatchDiagnostics(ctx: InstallContext): DiagnosticResult[] {\n const results: DiagnosticResult[] = [];\n const ledger = loadConfigPatchLedger(ctx.dataRoot);\n const connectorId = ctx.connector.id;\n // EXCLUDE the statusLine row: it is owned by the statusline surface and gets\n // its own dedicated health check in getHealthChecks. Reporting it here too\n // would double-report the key and (on a user edit) print a bogus configPatch\n // \"drifted\" hint to restore a configPatch the connector never declared.\n const platformEntries = ledger.entries.filter(\n (e) => e.platform === this.id && e.key !== STATUSLINE_KEY,\n );\n\n for (const entry of platformEntries) {\n const ownedByThis = entry.owners.some((o) => o.connectorId === connectorId);\n if (!ownedByThis) {\n // ORPHAN check (global hygiene): every owner's connector record is gone.\n const orphaned =\n entry.owners.length === 0 ||\n entry.owners.every((o) => readRegisteredMeta(o.connectorId) === null);\n if (orphaned) {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message:\n `orphaned ledger entry in ${entry.file}: owning connector record(s) ` +\n `gone (${entry.owners.map((o) => o.connectorId).join(\", \") || \"none\"})`,\n fix:\n `re-run \\`agent-connector uninstall <owner-id>\\` to release it, or remove ` +\n `${entry.key} from ${entry.file} manually`,\n });\n }\n continue;\n }\n\n const state = this.configPatchState(entry);\n if (state.kind === \"ok\") {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"pass\",\n message: `ok — ${entry.key} = ${describeJsonValue(entry.writtenValue)} (${entry.file})`,\n });\n } else if (state.kind === \"missing\") {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message: `missing — key deleted from ${entry.file} since install`,\n fix: `agent-connector install (sync) will re-assert it`,\n fixable: true,\n });\n } else {\n results.push({\n check: `${this.name}: configPatch ${entry.key}`,\n status: \"warn\",\n message:\n `drifted — value changed since install (current ${describeJsonValue(state.current)}, ` +\n `wrote ${describeJsonValue(entry.writtenValue)}); never auto-fixed`,\n fix: `manual edit if wanted: set ${entry.key} = ${describeJsonValue(entry.writtenValue)} in ${entry.file}`,\n });\n }\n }\n\n // Declared-but-unowned patches: re-print the manual edit (the patch was\n // skipped at install — conflict, denylist, or simply not installed yet).\n const declared = ctx.connector.platforms[HOST]?.configPatch ?? [];\n const ownedKeys = new Set(\n ledgerEntriesOwnedBy(ledger, HOST, connectorId).map((e) => e.key),\n );\n for (const patch of declared) {\n if (ownedKeys.has(patch.key)) continue;\n results.push({\n check: `${this.name}: configPatch ${patch.key}`,\n status: \"warn\",\n message: `declared but not owned (skipped at install or not yet installed)`,\n fix: configPatchManualEdit(patch),\n });\n }\n return results;\n }\n\n /** Current on-disk state of one owned ledger entry. */\n private configPatchState(\n entry: ConfigPatchLedgerEntry,\n ): { kind: \"ok\" } | { kind: \"missing\" } | { kind: \"drifted\"; current: JsonValue } {\n const settings = this.readJson<Record<string, unknown>>(entry.file);\n if (!settings || typeof settings !== \"object\" || Array.isArray(settings)) {\n return { kind: \"missing\" };\n }\n const leaf = readJsonLeaf(settings, entry.key.split(\".\"));\n if (leaf.kind !== \"present\") return { kind: \"missing\" };\n if (jsonDeepEquals(leaf.value, entry.writtenValue)) return { kind: \"ok\" };\n return { kind: \"drifted\", current: leaf.value };\n }\n\n override doctor(ctx: InstallContext): DiagnosticResult[] {\n const results = super.doctor(ctx);\n results.push(...this.configPatchDiagnostics(ctx));\n return results;\n }\n\n // ── Content surfaces: commands / skills / subagents ──────────────────────\n // CONTENT-ONLY: pure native-file writers under <configDir>/{commands,skills,\n // agents}. No runtime dispatch, no home-bin pointer, no telemetry wrap. Each\n // method is idempotent (byte-identical → skip) via BaseAdapter.writeContentFile\n // and reversible via removeContentFile. Honors platforms[\"claude-code\"]\n // per-surface false to skip.\n\n private commandsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"commands\");\n }\n private skillsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"skills\");\n }\n private agentsDir(ctx: InstallContext): string {\n return join(this.getConfigDir(ctx), \"agents\");\n }\n\n /** Native command file path: <configDir>/commands/<name>.md. */\n private commandPath(ctx: InstallContext, name: string): string {\n return join(this.commandsDir(ctx), `${name}.md`);\n }\n /** Native skill dir: <configDir>/skills/<name>. */\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.skillsDir(ctx), name);\n }\n /** Native subagent file path: <configDir>/agents/<name>.md. */\n private subagentPath(ctx: InstallContext, name: string): string {\n return join(this.agentsDir(ctx), `${name}.md`);\n }\n\n // ── Commands ──────────────────────────────────────────────────────────────\n\n override installCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.commands === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"commands disabled for claude-code\" }];\n }\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.writeContentFile(\n this.commandPath(ctx, cmd.name),\n this.renderCommand(cmd),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\n );\n }\n\n /** Render a command to md+frontmatter (delegates to the shared renderer). */\n private renderCommand(cmd: CommandDef): string {\n return renderCommandMd(cmd);\n }\n\n // ── Skills ────────────────────────────────────────────────────────────────\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for claude-code\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), this.renderSkill(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n /** Render a skill's SKILL.md (delegates to the shared renderer). */\n private renderSkill(skill: SkillDef): string {\n return renderSkillMd(skill);\n }\n\n // ── Subagents ───────────────────────────────────────────────────────────────\n\n override installSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.subagents === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"subagents disabled for claude-code\" }];\n }\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.writeContentFile(\n this.subagentPath(ctx, agent.name),\n this.renderSubagent(agent),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallSubagents(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.subagents.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no subagents\" }];\n }\n return connector.subagents.map((agent) =>\n this.removeContentFile(this.subagentPath(ctx, agent.name), ctx.dryRun),\n );\n }\n\n /** Render a subagent to md+frontmatter (delegates to the shared renderer). */\n private renderSubagent(agent: SubagentDef): string {\n return renderSubagentMd(agent);\n }\n\n // ── Memory surface: CLAUDE.md managed block + AGENTS.md interop ────────────\n // EXCEPTION host. Claude Code reads CLAUDE.md, NOT AGENTS.md (docs verbatim:\n // \"Claude Code reads CLAUDE.md, not AGENTS.md\"; no AGENTS.md support through\n // v2.1.172), so the base AGENTS.md-first default is overridden:\n // - mode \"block\" (default): the managed block goes straight into CLAUDE.md.\n // HTML-comment markers are CORRECT here — Claude strips HTML comments\n // from CLAUDE.md before context injection, so the markers and the\n // do-not-edit notice are INVISIBLE to the model while remaining fully\n // parseable by us for sync/doctor/uninstall.\n // - mode \"agents-import\" (opt-in via platforms[\"claude-code\"].memory.mode):\n // canonical block goes into AGENTS.md, plus a SHARED `@AGENTS.md` import\n // bridge block in CLAUDE.md (Anthropic's documented interop). Opt-in\n // because the import makes Claude read the ENTIRE AGENTS.md — a behavior\n // change agent-connector must not make silently.\n // - AUTO interop: when CLAUDE.md ALREADY imports `@AGENTS.md` (a line\n // outside code fences and outside our own blocks) or IS a symlink\n // resolving to AGENTS.md, the canonical block goes to AGENTS.md and\n // CLAUDE.md is NOT touched — the pre-existing user wiring is never\n // claimed as agent-connector-managed (prevents double-reads and writes\n // \"through\" a symlink). Order-independent: keyed off the import/symlink\n // existing, never off whether the AGENTS.md block was written yet.\n\n /** CLAUDE.md path: project `<projectDir>/CLAUDE.md`, user `~/.claude/CLAUDE.md`. */\n private claudeMdPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \"CLAUDE.md\")\n : join(homedir(), \".claude\", \"CLAUDE.md\");\n }\n\n /** Sibling AGENTS.md at the same scope (agents-import / auto-interop target). */\n private agentsMdPath(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \"AGENTS.md\")\n : join(homedir(), \".claude\", \"AGENTS.md\");\n }\n\n /**\n * True when the user ALREADY wired CLAUDE.md to AGENTS.md themselves:\n * an `@AGENTS.md` import line outside code fences and outside agent-connector\n * managed blocks (our own bridge must not count), or CLAUDE.md being a\n * symlink that resolves to the sibling AGENTS.md.\n */\n private claudeMdWiredToAgentsMd(ctx: InstallContext): boolean {\n const claudeMd = this.claudeMdPath(ctx);\n if (!existsSync(claudeMd)) return false;\n try {\n if (lstatSync(claudeMd).isSymbolicLink()) {\n const agentsMd = this.agentsMdPath(ctx);\n const resolved = realpathSync(claudeMd);\n const agentsResolved = existsSync(agentsMd) ? realpathSync(agentsMd) : agentsMd;\n if (resolved === agentsResolved) return true;\n }\n } catch {\n /* unreadable link — fall through to the content probe */\n }\n let raw: string;\n try {\n raw = readFileSync(claudeMd, \"utf8\");\n } catch {\n return false;\n }\n // Strip every agent-connector managed block first so OUR bridge import is\n // never mistaken for user wiring (idempotence across modes).\n const withoutBlocks = removeBlocksFromText(raw, { blockIdPrefix: \"\" }).text;\n const importRe = /(^|\\s)@(?:AGENTS\\.md|~\\/\\.claude\\/AGENTS\\.md)(\\s|$)/;\n return linesOutsideFences(withoutBlocks).some((line) => importRe.test(line));\n }\n\n /**\n * Effective memory mode for this install:\n * \"user-import\" — the user already wired CLAUDE.md→AGENTS.md (wins over\n * everything; we never write a duplicate or a second import);\n * \"agents-import\" — explicit opt-in via platforms[\"claude-code\"].memory.mode;\n * \"block\" — the default (managed block directly in CLAUDE.md).\n */\n private effectiveMemoryMode(ctx: InstallContext): \"block\" | \"agents-import\" | \"user-import\" {\n if (this.claudeMdWiredToAgentsMd(ctx)) return \"user-import\";\n return this.memoryOverride(ctx)?.mode === \"agents-import\" ? \"agents-import\" : \"block\";\n }\n\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n // An explicit path override keeps the base resolution (escape hatch wins).\n if (this.memoryOverride(ctx)?.path) return super.memoryTargets(ctx);\n if (ctx.scope !== \"project\" && ctx.scope !== \"user\") return [];\n const mode = this.effectiveMemoryMode(ctx);\n if (mode === \"block\") {\n return [\n {\n path: this.claudeMdPath(ctx),\n reason:\n \"CLAUDE.md (Claude Code reads CLAUDE.md, not AGENTS.md; \" +\n \"HTML-comment markers are stripped from the model's context)\",\n },\n ];\n }\n return [\n {\n path: this.agentsMdPath(ctx),\n reason:\n mode === \"user-import\"\n ? \"AGENTS.md (CLAUDE.md already imports/symlinks it — user wiring respected)\"\n : \"AGENTS.md (agents-import mode; @AGENTS.md bridge managed in CLAUDE.md)\",\n },\n ];\n }\n\n override installMemory(ctx: InstallContext): ChangeRecord[] {\n const changes = super.installMemory(ctx);\n const { connector } = ctx;\n // Bridge management applies only when the generic path actually installed.\n if (connector.platforms[HOST]?.memory === false || (connector.memory ?? []).length === 0) {\n return changes;\n }\n if (ctx.scope !== \"project\" && ctx.scope !== \"user\") return changes;\n if (this.memoryOverride(ctx)?.path) return changes;\n\n const mode = this.effectiveMemoryMode(ctx);\n if (mode === \"user-import\") {\n changes.push({\n platform: this.id,\n action: \"skip\",\n path: this.claudeMdPath(ctx),\n detail:\n \"memory: CLAUDE.md already imports AGENTS.md; canonical block in AGENTS.md \" +\n \"suffices (pre-existing user import never claimed as managed)\",\n });\n return changes;\n }\n if (mode !== \"agents-import\") return changes;\n\n // agents-import: ensure the SHARED `@AGENTS.md` bridge block in CLAUDE.md.\n const claudeMd = this.claudeMdPath(ctx);\n const importLine = ctx.scope === \"project\" ? \"@AGENTS.md\" : \"@~/.claude/AGENTS.md\";\n const res = upsertManagedBlockFile(claudeMd, {\n blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n connectorId: \"_shared\",\n content: importLine,\n notice:\n \"Managed by agent-connector (shared bridge). This import makes Claude Code read \" +\n \"AGENTS.md; it is removed automatically when the last agent-connector block \" +\n \"leaves AGENTS.md.\",\n force: ctx.force ?? false,\n dryRun: ctx.dryRun,\n });\n changes.push({\n platform: this.id,\n action: res.action,\n path: claudeMd,\n detail: `memory: ${res.detail} — @AGENTS.md import bridge (agents-import mode)`,\n });\n if (res.backupPath) {\n changes.push({\n platform: this.id,\n action: \"create\",\n path: res.backupPath,\n detail: \"backed up CLAUDE.md before destructive change\",\n });\n }\n if (res.action !== \"warn\" && !ctx.dryRun) {\n const ledger = loadMemoryLedger(connector.id);\n recordMemoryTarget(ledger, {\n platform: this.id,\n scope: ctx.scope,\n path: claudeMd,\n blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n createdFile: res.createdFile,\n hash: res.hash,\n });\n saveMemoryLedger(connector.id, ledger);\n }\n return changes;\n }\n\n override uninstallMemory(ctx: InstallContext): ChangeRecord[] {\n // Capture bridge facts BEFORE super prunes this platform's ledger rows.\n const priorRows = loadMemoryLedger(ctx.connector.id).targets.filter(\n (t) => t.platform === this.id && t.blockId === CLAUDE_AGENTS_IMPORT_BLOCK_ID,\n );\n const changes = super.uninstallMemory(ctx);\n\n // Bridge candidates: the current-scope CLAUDE.md plus any CLAUDE.md the\n // ledger recorded a bridge in (scope drift between install and uninstall).\n const pairs = new Map<string, { agentsMd: string; createdFile: boolean }>();\n if (ctx.scope === \"project\" || ctx.scope === \"user\") {\n pairs.set(this.claudeMdPath(ctx), {\n agentsMd: this.agentsMdPath(ctx),\n createdFile: false,\n });\n }\n for (const row of priorRows) {\n const existing = pairs.get(row.path);\n pairs.set(row.path, {\n agentsMd: existing?.agentsMd ?? join(dirname(row.path), \"AGENTS.md\"),\n createdFile: (existing?.createdFile ?? false) || row.createdFile,\n });\n }\n for (const [claudeMd, { agentsMd, createdFile }] of pairs) {\n changes.push(...this.releaseAgentsImportBridge(ctx, claudeMd, agentsMd, createdFile));\n }\n return changes;\n }\n\n /**\n * Refcounted bridge release: remove the `_shared/claude-agents-import` block\n * from CLAUDE.md ONLY when the sibling AGENTS.md holds zero agent-connector\n * blocks from OTHER connectors (namespace-wide count, excluding this\n * connector's own blocks so the answer is identical on dry-run and real run).\n * A user-authored `@AGENTS.md` import (no markers) is NEVER touched.\n */\n private releaseAgentsImportBridge(\n ctx: InstallContext,\n claudeMd: string,\n agentsMd: string,\n createdFile: boolean,\n ): ChangeRecord[] {\n if (!existsSync(claudeMd)) return [];\n let raw: string;\n try {\n raw = readFileSync(claudeMd, \"utf8\");\n } catch {\n return [];\n }\n if (!listManagedBlocks(raw).some((b) => b.blockId === CLAUDE_AGENTS_IMPORT_BLOCK_ID)) {\n return []; // no managed bridge here (user wiring or block mode) — nothing to release\n }\n let remaining = 0;\n if (existsSync(agentsMd)) {\n try {\n remaining = listManagedBlocks(readFileSync(agentsMd, \"utf8\")).filter(\n (b) => !b.blockId.startsWith(`${ctx.connector.id}/`),\n ).length;\n } catch {\n remaining = 1; // unreadable → conservative: keep the bridge\n }\n }\n if (remaining > 0) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path: claudeMd,\n detail:\n `memory: @AGENTS.md import bridge retained — ${remaining} agent-connector ` +\n `block(s) from other connectors remain in ${agentsMd}`,\n },\n ];\n }\n return removeManagedBlocksFile(\n claudeMd,\n { blockId: CLAUDE_AGENTS_IMPORT_BLOCK_ID },\n { dryRun: ctx.dryRun, deleteFileIfCreated: createdFile },\n ).map((r) => ({\n platform: this.id,\n action: r.action,\n path: r.path,\n detail: `memory: ${r.detail}`,\n }));\n }\n\n /** True when a hook command references our home binary AND this connector id\n * (anchored so a shared-prefix id can't collide — see isHomeBinHookCommand). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const settingsPath = this.getHookConfigPath(ctx);\n const connectorId = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n // Native passthrough hooks count toward \"declares hooks\" ONLY when declared\n // for this platform (the serialized meta keeps the event-name keys, so this\n // works for doctor's handler-less meta-derived connectors too).\n const declaredHookCount =\n hookEvents.length +\n Object.keys(ctx.connector.platforms[HOST]?.nativeHooks ?? {}).length;\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: settings.json present`,\n check: () => {\n // Same \"only assert what the connector declares\" rule as the\n // content-surface checks below: a hookless connector never writes\n // hooks into settings.json, so its absence is healthy, not a failure.\n if (declaredHookCount === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n return existsSync(settingsPath)\n ? { status: \"OK\", detail: settingsPath }\n : { status: \"FAIL\", detail: `not found: ${settingsPath}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (declaredHookCount === 0) {\n return { status: \"OK\", detail: \"no hooks declared\" };\n }\n const settings = this.readJson<{ hooks?: Record<string, ClaudeHookEntry[]> }>(\n settingsPath,\n );\n if (!settings) return { status: \"FAIL\", detail: `cannot read ${settingsPath}` };\n const hooks = settings.hooks ?? {};\n const registered = Object.values(hooks).some((entries) =>\n (entries ?? []).some((e) =>\n (e.hooks ?? []).some((h) =>\n isHomeBinHookCommand(h.command, homeBin, connectorId),\n ),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : {\n status: \"FAIL\",\n detail: `no hook for ${connectorId} in ${settingsPath}`,\n };\n },\n },\n ];\n\n // Content-surface checks: only assert presence of the files this connector\n // declares (skip silently for surfaces it never asked for).\n for (const cmd of ctx.connector.commands) {\n const p = this.commandPath(ctx, cmd.name);\n checks.push({\n name: `${this.name}: command ${cmd.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n for (const agent of ctx.connector.subagents) {\n const p = this.subagentPath(ctx, agent.name);\n checks.push({\n name: `${this.name}: subagent ${agent.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n\n // Statusline check: only assert it when the connector declares one AND it\n // is not disabled for this host. settings.json.statusLine.command must be OUR\n // home-bin statusline command (ok); present but not ours → drifted/skip-warn\n // (never our concern to fix); absent → missing.\n // Fire the check when the connector DECLARES a statusline (the live-config\n // doctor path) OR when the ownership ledger holds a statusLine row this\n // connector owns (the REGISTERED-connector path: connectorFromMeta can't\n // re-expose the render fn, so statusline comes back undefined — but the\n // ledger row proves the surface was wired). Mirrors uninstallStatusline,\n // which is also ledger-keyed; without this the wired statusLine has ZERO\n // doctor coverage in the registered path (configPatchDiagnostics excludes it).\n const statuslineLedgerOwned = ledgerEntriesOwnedBy(\n loadConfigPatchLedger(ctx.dataRoot),\n HOST,\n connectorId,\n ).some((e) => e.key === STATUSLINE_KEY);\n if (\n (ctx.connector.statusline != null || statuslineLedgerOwned) &&\n ctx.connector.platforms[HOST]?.statusline !== false\n ) {\n checks.push({\n name: `${this.name}: statusline wired`,\n check: () => {\n const settings = this.readJson<{ statusLine?: { command?: unknown } }>(settingsPath);\n const command = settings?.statusLine?.command;\n if (command === undefined) {\n return { status: \"FAIL\", detail: `statusLine not set in ${settingsPath}` };\n }\n if (\n typeof command === \"string\" &&\n isHomeBinStatuslineCommand(command, homeBin, connectorId)\n ) {\n return { status: \"OK\", detail: \"statusLine command present\" };\n }\n // Present but not ours — a non-AC statusLine we must never clobber.\n return {\n status: \"FAIL\",\n detail: `statusLine in ${settingsPath} is not agent-connector's (left untouched)`,\n };\n },\n });\n }\n return checks;\n }\n\n // ── Runtime: parse Claude stdin JSON → normalized event ──────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as ClaudeWireInput;\n const connectorId = typeof input.connector === \"string\" ? input.connector : \"\";\n const sessionId = extractSessionId(input);\n const projectDir = typeof input.cwd === \"string\" ? input.cwd : undefined;\n\n const base = {\n hostPlatform: HOST,\n connectorId,\n sessionId,\n raw,\n ...(projectDir !== undefined ? { projectDir } : {}),\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(toolResponseToString(input.tool_response) !== undefined\n ? { toolOutput: toolResponseToString(input.tool_response) }\n : {}),\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = {\n ...base,\n source: normalizeSessionSource(input.source),\n };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = {\n ...base,\n ...(typeof input.reason === \"string\" ? { reason: input.reason } : {}),\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = {\n ...base,\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"PermissionRequest\": {\n const ev: PermissionRequestEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(Array.isArray(input.permission_suggestions)\n ? { permissionSuggestions: input.permission_suggestions }\n : {}),\n };\n return ev;\n }\n case \"PostToolUseFailure\": {\n const ev: PostToolUseFailureEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n error: typeof input.error === \"string\" ? input.error : \"\",\n ...(typeof input.tool_use_id === \"string\"\n ? { toolUseId: input.tool_use_id }\n : {}),\n ...(typeof input.is_interrupt === \"boolean\"\n ? { isInterrupt: input.is_interrupt }\n : {}),\n ...(typeof input.duration_ms === \"number\"\n ? { durationMs: input.duration_ms }\n : {}),\n };\n return ev;\n }\n case \"SubagentStart\": {\n const ev: SubagentStartEvent = {\n ...base,\n ...(typeof input.agent_id === \"string\" ? { agentId: input.agent_id } : {}),\n ...(typeof input.agent_type === \"string\"\n ? { agentType: input.agent_type }\n : {}),\n };\n return ev;\n }\n case \"SubagentStop\": {\n // agent_id/agent_type stay optional — the SDK does not reliably\n // populate agent_type on SubagentStop (real-world quirk).\n const ev: SubagentStopEvent = {\n ...base,\n ...(typeof input.agent_id === \"string\" ? { agentId: input.agent_id } : {}),\n ...(typeof input.agent_type === \"string\"\n ? { agentType: input.agent_type }\n : {}),\n ...(typeof input.agent_transcript_path === \"string\"\n ? { agentTranscriptPath: input.agent_transcript_path }\n : {}),\n ...(typeof input.last_assistant_message === \"string\"\n ? { lastAssistantMessage: input.last_assistant_message }\n : {}),\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"PostCompact\": {\n // Claude Code does NOT wire PostCompact as a normalized lifecycle hook\n // (capabilities.postCompact is unset, so installHooks never registers\n // it) — but the exhaustive guard below requires a case for every\n // HookEventName. This arm is a SAFE passthrough: it normalizes the\n // PreCompact-shaped `trigger` defensively, so a manual\n // `hook claude-code PostCompact` invocation normalizes instead of\n // throwing. It mirrors the PreCompact case byte-for-byte.\n const ev: PostCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n default: {\n // Exhaustive guard — every HookEventName is handled above.\n const _never: never = event;\n throw new Error(`unsupported claude-code hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Claude native hook reply ──────────────\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const hookEventName = event as ClaudeHookEvent;\n const decision = response.decision ?? \"allow\";\n\n // PermissionRequest replies use Claude's nested decision{behavior} envelope\n // and are the ONE event where an EXPLICIT \"allow\" is an ACTIVE grant (it\n // suppresses the permission dialog) rather than passthrough:\n // allow → decision{behavior:\"allow\"} (+updatedInput when set);\n // Claude still enforces its own deny rules — an allow\n // never overrides a matching deny rule (host-enforced).\n // modify → an allow grant carrying updatedInput.\n // deny → decision{behavior:\"deny\", message} (shown to Claude).\n // ask/context/void → NO decision output: fall through to the native\n // dialog (the dialog IS the ask).\n if (event === \"PermissionRequest\") {\n if (response.decision === \"deny\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n decision: {\n behavior: \"deny\",\n message: response.reason ?? \"Blocked by hook\",\n },\n },\n });\n }\n if (\n response.decision === \"allow\" ||\n (response.decision === \"modify\" && response.updatedInput)\n ) {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n decision: {\n behavior: \"allow\",\n ...(response.updatedInput\n ? { updatedInput: response.updatedInput }\n : {}),\n },\n },\n });\n }\n return { exitCode: 0 };\n }\n\n // PostToolUseFailure (feedback beside the error) and SubagentStart (context\n // injected at the start of the SUBAGENT's conversation) are observe/context-\n // only on Claude: \"context\" emits additionalContext, and a \"deny\" DEGRADES\n // to the same shape carrying the reason (the tool already failed / the\n // spawn is not blockable). Everything else passes through.\n if (event === \"PostToolUseFailure\" || event === \"SubagentStart\") {\n const context =\n decision === \"context\"\n ? response.additionalContext\n : decision === \"deny\"\n ? response.reason ?? response.additionalContext\n : undefined;\n if (context) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, additionalContext: context },\n });\n }\n return { exitCode: 0 };\n }\n\n // deny → block the action with a reason (exit 0; JSON carries the decision).\n // Claude's deny shape is EVENT-SPECIFIC: PreToolUse uses\n // hookSpecificOutput.permissionDecision, but Stop / SubagentStop /\n // UserPromptSubmit / PostToolUse honor only the TOP-LEVEL\n // {\"decision\":\"block\",\"reason\"} — rendering those as permissionDecision is\n // silently ignored by Claude (found porting oh-my-claudecode: its ralph\n // persistence loop denies the Stop event, which never blocked through the\n // old shape). A SubagentStop block keeps the subagent running with `reason`\n // as its next instruction (Stop semantics).\n if (decision === \"deny\") {\n if (\n event === \"Stop\" ||\n event === \"SubagentStop\" ||\n event === \"UserPromptSubmit\" ||\n event === \"PostToolUse\"\n ) {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n });\n }\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n permissionDecision: \"deny\",\n permissionDecisionReason: response.reason ?? \"Blocked by hook\",\n },\n });\n }\n\n // ask → prompt the user to confirm.\n if (decision === \"ask\") {\n return this.stdout({\n hookSpecificOutput: {\n hookEventName,\n permissionDecision: \"ask\",\n permissionDecisionReason:\n response.reason ?? \"Confirmation required by hook\",\n },\n });\n }\n\n // modify → rewrite PreToolUse input (only where Claude supports it).\n if (decision === \"modify\") {\n if (event === \"PreToolUse\" && response.updatedInput) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, updatedInput: response.updatedInput },\n });\n }\n // Output rewrite is unsupported on Claude; fall through to allow.\n }\n\n // context → inject soft guidance (also the SessionStart context path).\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({\n hookSpecificOutput: { hookEventName, additionalContext: response.additionalContext },\n });\n }\n\n // allow / void / unsupported-degradation → pass through with exit 0.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// configPatch: sensitive-key denylist + JSON leaf-path helpers\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * SENSITIVE-KEY DENYLIST (claude-code, v1) — THE documented list. configPatch\n * targeting any key below is HARD-REFUSED (warn ChangeRecord, never applied;\n * no override flag in v1). Rationale: configPatch writes bare host keys with\n * no inherent attribution, and these keys are security-relevant — permission\n * grants, tool allowlists, credential/auth helpers, login pinning, and any\n * env var that can reroute credentials or traffic. The OMC case\n * `env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` passes; credential rerouting and\n * self-granted permissions do not. Reviewed whenever the host matrix updates.\n *\n * permissions, permissions.* — self-granted permission rules\n * allowedTools / disallowedTools (.*) — tool allowlist tampering\n * apiKey* (e.g. apiKeyHelper) — credential helpers\n * awsAuthRefresh / awsCredentialExport — AWS credential plumbing\n * forceLoginMethod / forceLoginOrgUUID — login/org pinning\n * otelHeadersHelper — telemetry-header (token) helper\n * hooks*, mcpServers* (+ enable/enabled/disabledMcpjsonServers)\n * — refused upstream by the\n * agent-connector NAMESPACE guard\n * env.ANTHROPIC_* — API key / base-URL rerouting\n * env.AWS_* — AWS credentials\n * env.*_PROXY — traffic interception\n * env.*TOKEN* / env.*KEY* / env.*SECRET* — generic credential patterns\n */\nconst SENSITIVE_KEY_RULES: ReadonlyArray<{ re: RegExp; label: string }> = [\n { re: /^permissions(\\.|$)/, label: \"permissions\" },\n { re: /^allowedTools(\\.|$)/, label: \"allowedTools\" },\n { re: /^disallowedTools(\\.|$)/, label: \"disallowedTools\" },\n { re: /^apiKey/i, label: \"apiKey*\" },\n { re: /^awsAuthRefresh$/, label: \"awsAuthRefresh\" },\n { re: /^awsCredentialExport$/, label: \"awsCredentialExport\" },\n { re: /^forceLoginMethod$/, label: \"forceLoginMethod\" },\n { re: /^forceLoginOrgUUID$/, label: \"forceLoginOrgUUID\" },\n { re: /^otelHeadersHelper$/, label: \"otelHeadersHelper\" },\n { re: /^env\\.ANTHROPIC_/, label: \"env.ANTHROPIC_*\" },\n { re: /^env\\.AWS_/, label: \"env.AWS_*\" },\n { re: /^env\\.[^.]*_PROXY(\\.|$)/i, label: \"env.*_PROXY\" },\n { re: /^env\\.[^.]*TOKEN/i, label: \"env.*TOKEN*\" },\n { re: /^env\\.[^.]*KEY/i, label: \"env.*KEY*\" },\n { re: /^env\\.[^.]*SECRET/i, label: \"env.*SECRET*\" },\n];\n\n/**\n * The matched denylist pattern label when `key` is sensitive on claude-code,\n * else null. Exported so tests and docs stay pinned to the real list.\n */\nexport function claudeSensitiveKeyViolation(key: string): string | null {\n for (const rule of SENSITIVE_KEY_RULES) {\n if (rule.re.test(key)) return rule.label;\n }\n return null;\n}\n\n/** Result of looking up a dotted leaf path in a parsed JSON object. */\ntype JsonLeafLookup =\n | { kind: \"absent\" }\n | { kind: \"present\"; value: JsonValue }\n | { kind: \"blocked\"; atPath: string };\n\n/**\n * Walk `segments` (a validated dotted leaf path) through `root`. \"blocked\"\n * reports the first intermediate that exists but is not a plain object —\n * the skip-warn case (we never replace a non-object intermediate).\n */\nfunction readJsonLeaf(root: Record<string, unknown>, segments: string[]): JsonLeafLookup {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const next = node[segments[i]!];\n if (next === undefined) return { kind: \"absent\" };\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) {\n return { kind: \"blocked\", atPath: segments.slice(0, i + 1).join(\".\") };\n }\n node = next as Record<string, unknown>;\n }\n const leaf = node[segments[segments.length - 1]!];\n if (leaf === undefined) return { kind: \"absent\" };\n return { kind: \"present\", value: leaf as JsonValue };\n}\n\n/**\n * Write `value` at the leaf, creating ONLY absent intermediate objects along\n * the way (callers must have verified the path is not blocked).\n */\nfunction writeJsonLeaf(\n root: Record<string, unknown>,\n segments: string[],\n value: JsonValue,\n): void {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i]!;\n const next = node[seg];\n if (next === undefined) {\n const created: Record<string, unknown> = {};\n node[seg] = created;\n node = created;\n } else {\n node = next as Record<string, unknown>;\n }\n }\n node[segments[segments.length - 1]!] = value;\n}\n\n/**\n * Delete the leaf key only. Intermediate objects — even ones we created — are\n * deliberately left in place (harmless; pruning risks collateral).\n */\nfunction deleteJsonLeaf(root: Record<string, unknown>, segments: string[]): void {\n let node: Record<string, unknown> = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const next = node[segments[i]!];\n if (next === null || typeof next !== \"object\" || Array.isArray(next)) return;\n node = next as Record<string, unknown>;\n }\n delete node[segments[segments.length - 1]!];\n}\n\n/** Claude Code native interpolation token: `${env:VAR}` → `${VAR}`. */\nfunction claudeEnvToken(name: string): string {\n return `\\${${name}}`;\n}\n\nexport const adapter = new ClaudeCodeAdapter();\nexport default adapter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,SAAS,cAAc,YAAY,WAAW,cAAc,oBAAoB;AAChF,SAAS,eAAe;AACxB,SAAS,UAAU,SAAS,YAAY;AAiFxC,IAAM,OAAmB;AACzB,IAAM,eAAe;AAQrB,IAAM,iBAAiB;AASvB,IAAM,gCAAgC;AAqC/B,IAAM,oBAAN,cAAgC,YAA+B;AAAA,EAC3D,KAAiB;AAAA,EACjB,OAAO;AAAA,EACP,WAAyB;AAAA,EAEzB,eAAqC;AAAA,IAC5C,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,MAAM;AAAA,IACN,cAAc;AAAA;AAAA,IAEd,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,cAAc;AAAA;AAAA;AAAA,IAGd,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,yBAAyB;AAAA;AAAA;AAAA;AAAA,IAIzB,qBAAqB;AAAA;AAAA;AAAA;AAAA,IAIrB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKrB,oBAAoB;AAAA,IACpB,YAAY,CAAC,SAAS,MAAM;AAAA;AAAA;AAAA;AAAA,IAI5B,8BAA8B;AAAA;AAAA,IAE9B,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA;AAAA;AAAA;AAAA,IAInB,gBAAgB;AAAA,EAClB;AAAA;AAAA,EAIA,gBAAgB,YAAsC;AACpD,UAAM,UAAU,KAAK,QAAQ,GAAG,SAAS;AACzC,UAAM,eAAe,KAAK,SAAS,eAAe;AAClD,UAAM,cAAc,KAAK,QAAQ,GAAG,cAAc;AAClD,UAAM,iBAAiB,KAAK,YAAY,WAAW;AACnD,UAAM,gBACJ,WAAW,OAAO,KAAK,WAAW,YAAY,KAAK,WAAW,WAAW;AAC3E,UAAM,gBAAgB,WAAW,cAAc;AAC/C,UAAM,YAAY,iBAAiB;AAGnC,UAAM,QAAQ,iBAAiB,CAAC,gBAAgB,YAAY;AAC5D,UAAM,aAAa,UAAU,YAAY,iBAAiB;AAC1D,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB;AAAA,MACA;AAAA,MACA,QAAQ,YACJ,UAAU,YACR,uCAAuC,cAAc,KACrD,kCAAkC,OAAO,KAC3C,4BAA4B,OAAO;AAAA,MACvC,YAAY,YAAY,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAIA,aAAa,KAA6B;AACxC,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,SAAS,IAC9B,KAAK,QAAQ,GAAG,SAAS;AAAA,EAC/B;AAAA,EAEA,oBAAoB,KAA6B;AAC/C,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,WAAW,IAChC,KAAK,QAAQ,GAAG,cAAc;AAAA,EACpC;AAAA,EAEA,kBAAkB,KAA6B;AAC7C,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,eAAe;AAAA,EACrD;AAAA;AAAA,EAIA,cAAc,KAAqC;AACjD,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,WAAW,UAAU,UAAU,IAAI,GAAG;AAC5C,QAAI,CAAC,UAAU,UAAU,aAAa,OAAO;AAC3C,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ,UAAU,SACd,iDACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAGA,UAAM,SACJ,YAAY,OAAO,aAAa,WAC5B,EAAE,GAAG,UAAU,QAAQ,GAAG,SAAS,IACnC,UAAU;AAEhB,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAC/C,UAAM,QAAQ,KAAK,kBAAkB,KAAK,MAAM;AAEhD,WAAO;AAAA,MACL,KAAK,mBAAmB,YAAY,cAAc,UAAU,IAAI,OAAO,IAAI,MAAM;AAAA,IACnF;AAAA,EACF;AAAA,EAEA,gBAAgB,KAAqC;AACnD,UAAM,aAAa,KAAK,oBAAoB,GAAG;AAC/C,WAAO;AAAA,MACL,KAAK,qBAAqB,YAAY,cAAc,IAAI,UAAU,IAAI,IAAI,MAAM;AAAA,IAClF;AAAA,EACF;AAAA;AAAA,EAGQ,kBACN,KACA,QACsC;AACtC,UAAM,YAAuB,OAAO;AAEpC,QAAI,cAAc,SAAS;AACzB,UAAI,UAAU,OAAO,WAAW;AAChC,UAAI,OAAO,CAAC,GAAI,OAAO,QAAQ,CAAC,CAAE;AAIlC,OAAC,EAAE,SAAS,KAAK,IAAI,kBAAkB,KAAK,QAAQ,KAAK,IAAI,SAAS,IAAI;AAE1E,YAAMA,SAA2B,EAAE,MAAM,SAAS,SAAS,KAAK;AAChE,YAAM,MAAM,KAAK,UAAU,OAAO,GAAG;AACrC,UAAI,IAAK,CAAAA,OAAM,MAAM;AACrB,UAAI,OAAO,IAAK,CAAAA,OAAM,MAAM,mBAAmB,OAAO,GAAG;AACzD,aAAOA;AAAA,IACT;AAGA,UAAM,QAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,KAAK,eAAe,OAAO,OAAO,IAAI,cAAc;AAAA,IACtD;AACA,QAAI,OAAO,SAAS;AAClB,YAAM,UAAU,KAAK,UAAU,OAAO,OAAO,KAAK,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,UACN,KACoC;AACpC,QAAI,CAAC,OAAO,OAAO,KAAK,GAAG,EAAE,WAAW,EAAG,QAAO;AAClD,UAAM,MAA8B,CAAC;AACrC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,UAAI,CAAC,IAAI,eAAe,GAAG,cAAc;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,aAAa,KAAqC;AAChD,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,WAAW,UAAU,UAAU,IAAI;AAKzC,UAAM,mBAAmB,UAAU,UAAU,QAAQ,CAAC,IAAI,UAAU;AACpE,UAAM,cAAc,UAAU,eAAe,CAAC;AAC9C,UAAM,eAAe,OAAO,KAAK,WAAW;AAE5C,QAAI,iBAAiB,WAAW,KAAK,aAAa,WAAW,GAAG;AAC9D,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QACE,UAAU,UAAU,QAChB,mCACA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,kBAAkB,GAAG;AAM/C,UAAM,UAAqD;AAAA,MACzD,GAAG,iBAAiB,IAAI,CAAC,WAAW;AAAA,QAClC;AAAA,QACA,SAAS,UAAU,MAAM,KAAK,GAAG,WAAW;AAAA,MAC9C,EAAE;AAAA,MACF,GAAG,aAAa,IAAI,CAAC,WAAW;AAAA,QAC9B;AAAA,QACA,SAAS,YAAY,KAAK,GAAG,WAAW;AAAA,MAC1C,EAAE;AAAA,IACJ;AAEA,WAAO,KAAK,kBAAkB,KAAK,cAAc,SAAS,KAAK,eAAe,CAAC;AAAA,EACjF;AAAA,EAEA,eAAe,KAAqC;AAClD,WAAO,KAAK,kBAAkB,KAAK,KAAK,kBAAkB,GAAG,GAAG,KAAK,eAAe,CAAC;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,iBAAuD;AAC7D,WAAO;AAAA,MACL,aAAa,CAAC,QAAQ,SAAS,aAAa;AAAA,QAC1C;AAAA,QACA,OAAO,CAAC,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,MACtC;AAAA,MACA,kBAAkB,CAAC,OAAO,aACvB,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO;AAAA,MACvD,oBAAoB,MAAM,MAAM;AAAA,MAChC,YAAY,CAAC,QAAQ,CAAC,UAAU;AAC9B,cAAM,cAAc,MAAM,OAAO,UAAU;AAC3C,cAAM,SAAS,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,aAAa,EAAE,SAAS,GAAG,CAAC;AAClF,eAAO;AAAA,UACL,MAAM,MAAM,SAAS,IAAI,EAAE,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM,IAAI;AAAA,UAC1E,SAAS,cAAc,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,MACA,YAAY,CAAC,UAAU,SAAS,KAAK;AAAA,MACrC,cAAc,CAAC,OAAO,YAAY,SAAS,KAAK,KAAK,OAAO;AAAA,MAC5D,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,uBAAuB,KAA6B;AAClD,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,eAAe;AAAA,EACrD;AAAA,EAES,qBAAqB,KAAqC;AACjE,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,UAAU,UAAU,UAAU,IAAI,GAAG,eAAe,CAAC;AAC3D,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,4CAA4C;AAAA,MAC3F;AAAA,IACF;AACA,WAAO,KAAK,mBAAmB,KAAK,OAAO;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,mBACN,KACA,SACA,OAAwD,CAAC,GACzC;AAKhB,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,WAAW,iBAAiB;AAClC,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,WAAW,KAAK,uBAAuB,GAAG;AAChD,UAAM,UAAU,KAAK,mBAAmB,QAAQ;AAChD,QAAI,QAAS,QAAO,CAAC,OAAO;AAI5B,QAAI,KAAK,wBAAwB,QAAQ,GAAG;AAC1C,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,YAAY,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,KAAK,SAAkC,QAAQ,KAAK,CAAC;AACtE,QAAI,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AAC3D,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,YAAY,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,sBAAsB,IAAI,QAAQ;AACjD,UAAM,UAA0B,CAAC;AACjC,QAAI,cAAc;AAClB,QAAI,gBAAgB;AAEpB,eAAW,SAAS,SAAS;AAG3B,UAAI,CAAC,sBAAsB,MAAM,GAAG,GAAG;AACrC,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QACE,eAAe,KAAK,UAAU,MAAM,GAAG,CAAC;AAAA,QAE5C,CAAC;AACD;AAAA,MACF;AAGA,UAAI,CAAC,UAAU;AACb,cAAM,YAAY,8BAA8B,MAAM,GAAG;AACzD,YAAI,WAAW;AACb,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,wBAAwB,SAAS;AAAA,UAC3C,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,4BAA4B,MAAM,GAAG;AACvD,UAAI,WAAW;AACb,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QACE,eAAe,MAAM,GAAG,6DACX,SAAS;AAAA,QAC1B,CAAC;AACD;AAAA,MACF;AAGA,YAAM,UAAU,mBAAmB,MAAM,KAAK;AAC9C,YAAM,WAAW,MAAM,IAAI,MAAM,GAAG;AACpC,YAAM,OAAO,aAAa,UAAU,QAAQ;AAC5C,YAAM,QAAQ,gBAAgB,QAAQ,MAAM,UAAU,MAAM,GAAG;AAE/D,UAAI,KAAK,SAAS,WAAW;AAC3B,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QACE,GAAG,YAAY,IAAI,MAAM,GAAG,cAAc,KAAK,MAAM,wCACzC,sBAAsB,KAAK,CAAC;AAAA,QAC5C,CAAC;AACD;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,UAAU;AAE1B,sBAAc,UAAU,UAAU,OAAO;AACzC,sBAAc;AACd,YAAI,OAAO;AAIT,gBAAM,eAAe;AACrB,gBAAM,mBAAmB,cAAc,OAAO;AAC9C,yBAAe,OAAO,UAAU,IAAI,UAAU,OAAO;AAAA,QACvD,OAAO;AACL,4BAAkB,QAAQ;AAAA,YACxB,UAAU;AAAA,YACV,MAAM;AAAA,YACN,KAAK,MAAM;AAAA,YACX,OAAO;AAAA,YACP,aAAa,UAAU;AAAA,YACvB,kBAAkB,UAAU;AAAA,UAC9B,CAAC;AAAA,QACH;AACA,wBAAgB;AAChB,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG,qBAAgB,kBAAkB,OAAO,CAAC,KAAK,MAAM,MAAM;AAAA,QACjG,CAAC;AACD;AAAA,MACF;AAGA,UAAI,CAAC,OAAO;AAGV,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QACE,GAAG,YAAY,IAAI,MAAM,GAAG,4BAA4B,kBAAkB,KAAK,KAAK,CAAC,6CACzC,kBAAkB,OAAO,CAAC,cACtE,sBAAsB,KAAK;AAAA,QAC/B,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,KAAK,OAAO,MAAM,YAAY,GAAG;AAGnD,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QACE,GAAG,YAAY,IAAI,MAAM,GAAG,0CAChB,kBAAkB,KAAK,KAAK,CAAC,WAAW,kBAAkB,MAAM,YAAY,CAAC,8BACnE,sBAAsB,KAAK,CAAC;AAAA,QACtD,CAAC;AACD;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,KAAK,KAAK,GAAG;AAGvC,cAAM,SAAS,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW;AACpD,YAAI,eAAe,OAAO,UAAU,IAAI,UAAU,OAAO,GAAG;AAC1D,0BAAgB;AAChB,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG,6DAA6D,OAAO,KAAK,IAAI,CAAC;AAAA,UACpH,CAAC;AAAA,QACH,OAAO;AACL,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG;AAAA,UACtC,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAGA,cAAQ,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QACE,GAAG,YAAY,IAAI,MAAM,GAAG,8BAA8B,MAAM,OAC7D,IAAI,CAAC,MAAM,EAAE,WAAW,EACxB,KAAK,IAAI,CAAC,oCACD,kBAAkB,KAAK,KAAK,CAAC,aAAa,kBAAkB,OAAO,CAAC,cAChF,sBAAsB,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,QAAI,YAAa,MAAK,UAAU,UAAU,UAAU,IAAI,MAAM;AAC9D,QAAI,iBAAiB,CAAC,IAAI,OAAQ,uBAAsB,IAAI,UAAU,MAAM;AAC5E,WAAO;AAAA,EACT;AAAA,EAES,uBAAuB,KAAqC;AACnE,UAAM,cAAc,IAAI,UAAU;AAClC,UAAM,SAAS,sBAAsB,IAAI,QAAQ;AAMjD,UAAM,QAAQ,qBAAqB,QAAQ,MAAM,WAAW,EAAE;AAAA,MAC5D,CAAC,MAAM,EAAE,QAAQ;AAAA,IACnB;AACA,UAAM,WAAW,IAAI,UAAU,UAAU,IAAI,GAAG,eAAe,CAAC;AAChE,UAAM,UAA0B,CAAC;AAIjC,UAAM,YAAY,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACjD,eAAW,SAAS,UAAU;AAC5B,UAAI,CAAC,UAAU,IAAI,MAAM,GAAG,GAAG;AAC7B,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ,eAAe,MAAM,GAAG;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,YAAQ,KAAK,GAAG,KAAK,0BAA0B,KAAK,QAAQ,KAAK,CAAC;AAClE,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,0BACN,KACA,QACA,OACA,OAAwD,CAAC,GACzC;AAChB,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,cAAc,IAAI,UAAU;AAClC,UAAM,UAA0B,CAAC;AACjC,QAAI,gBAAgB;AACpB,UAAM,WAAW,oBAAI,IAAY;AAGjC,UAAM,SAAS,oBAAI,IAAsC;AACzD,eAAW,SAAS,OAAO;AACzB,YAAM,SAAS,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC;AAC1C,aAAO,KAAK,KAAK;AACjB,aAAO,IAAI,MAAM,MAAM,MAAM;AAAA,IAC/B;AAEA,eAAW,CAAC,UAAU,OAAO,KAAK,QAAQ;AACxC,YAAM,UAAU,KAAK,mBAAmB,QAAQ;AAChD,UAAI,SAAS;AACX,gBAAQ,KAAK,OAAO;AACpB;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,wBAAwB,QAAQ;AACzD,YAAM,WAAW,cACb,OACA,KAAK,SAAkC,QAAQ;AACnD,UAAI,cAAc;AAElB,iBAAW,SAAS,SAAS;AAC3B,cAAM,EAAE,UAAU,IAAI,kBAAkB,OAAO,WAAW;AAC1D,wBAAgB;AAEhB,YAAI,CAAC,WAAW;AAEd,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG,6BAA6B,MAAM,OACpE,IAAI,CAAC,MAAM,EAAE,WAAW,EACxB,KAAK,IAAI,CAAC;AAAA,UACf,CAAC;AACD;AAAA,QACF;AAIA,wBAAgB,QAAQ,KAAK;AAE7B,YAAI,aAAa;AACf,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG,KAAK,QAAQ;AAAA,UACnD,CAAC;AACD;AAAA,QACF;AACA,YAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG;AAAA,UACtC,CAAC;AACD;AAAA,QACF;AACA,cAAM,OAAO,aAAa,UAAU,MAAM,IAAI,MAAM,GAAG,CAAC;AACxD,YAAI,KAAK,SAAS,WAAW;AAC3B,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG;AAAA,UACtC,CAAC;AACD;AAAA,QACF;AACA,YAAI,MAAM,OAAO,YAAY,SAAS,CAAC,eAAe,KAAK,OAAO,MAAM,YAAY,GAAG;AAGrF,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,QACE,GAAG,YAAY,IAAI,MAAM,GAAG,0CAChB,kBAAkB,KAAK,KAAK,CAAC,WAAW,kBAAkB,MAAM,YAAY,CAAC;AAAA,UAE7F,CAAC;AACD;AAAA,QACF;AAKA,YAAI,CAAC,IAAI,UAAU,CAAC,SAAS,IAAI,QAAQ,KAAK,WAAW,QAAQ,GAAG;AAClE,gBAAM,SAAS,KAAK,yBAAyB,QAAQ;AACrD,mBAAS,IAAI,QAAQ;AACrB,cAAI,QAAQ;AACV,oBAAQ,KAAK;AAAA,cACX,UAAU,KAAK;AAAA,cACf,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF;AACA,uBAAe,UAAU,MAAM,IAAI,MAAM,GAAG,CAAC;AAC7C,sBAAc;AACd,gBAAQ,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QAAQ,GAAG,YAAY,IAAI,MAAM,GAAG,iBAAiB,kBAAkB,MAAM,YAAY,CAAC;AAAA,QAC5F,CAAC;AAAA,MACH;AAEA,UAAI,eAAe,SAAU,MAAK,UAAU,UAAU,UAAU,IAAI,MAAM;AAAA,IAC5E;AAEA,QAAI,iBAAiB,CAAC,IAAI,OAAQ,uBAAsB,IAAI,UAAU,MAAM;AAC5E,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcQ,sBAAsB,KAAqC;AACjE,UAAM,UAAU,8BAA8B,IAAI,aAAa,MAAM,IAAI,UAAU,EAAE;AACrF,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO,EAAE,MAAM,WAAW,QAAQ;AAAA,MAClC,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAES,kBAAkB,KAAqC;AAC9D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,cAAc,MAAM;AAChC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,mCAAmC,CAAC;AAAA,IAC3F;AACA,QAAI,UAAU,UAAU,IAAI,GAAG,eAAe,OAAO;AACnD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,sCAAsC,CAAC;AAAA,IAC9F;AAMA,WAAO,KAAK,mBAAmB,KAAK,CAAC,KAAK,sBAAsB,GAAG,CAAC,GAAG;AAAA,MACrE,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAES,oBAAoB,KAAqC;AAChE,UAAM,SAAS,sBAAsB,IAAI,QAAQ;AAIjD,UAAM,QAAQ,qBAAqB,QAAQ,MAAM,IAAI,UAAU,EAAE,EAAE;AAAA,MACjE,CAAC,MAAM,EAAE,QAAQ;AAAA,IACnB;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK,0BAA0B,KAAK,QAAQ,OAAO;AAAA,MACxD,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,KAAiC;AAChD,UAAM,QAAS,OAAO,CAAC;AACvB,UAAM,QAA+C,CAAC;AACtD,QAAI,OAAO,MAAM,OAAO,OAAO,SAAU,OAAM,KAAK,MAAM,MAAM;AAChE,QAAI,OAAO,MAAM,OAAO,iBAAiB,UAAU;AACjD,YAAM,cAAc,MAAM,MAAM;AAAA,IAClC;AACA,UAAM,MACJ,OAAO,MAAM,QAAQ,WACjB,MAAM,MACN,OAAO,MAAM,WAAW,gBAAgB,WACtC,MAAM,UAAU,cAChB;AAER,UAAM,MAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,cAAc,KAAK;AAAA,MACnB;AAAA,IACF;AACA,QAAI,OAAO,MAAM,eAAe,YAAY,MAAM,eAAe,IAAI;AACnE,UAAI,YAAY,MAAM;AAAA,IACxB;AACA,QAAI,QAAQ,OAAW,KAAI,MAAM;AACjC,QAAI,MAAM,OAAO,UAAa,MAAM,gBAAgB,OAAW,KAAI,QAAQ;AAC3E,QAAI,OAAO,MAAM,MAAM,mBAAmB,UAAU;AAClD,UAAI,OAAO,EAAE,UAAU,MAAM,KAAK,eAAe;AAAA,IACnD;AACA,QAAI,OAAO,MAAM,oBAAoB,UAAU;AAC7C,UAAI,iBAAiB,MAAM;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,mBAAmB,UAA6B;AAC9C,WAAO,EAAE,UAAU,GAAG,QAAQ,SAAS;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,yBAAyB,UAAiC;AAChE,QAAI;AACF,gBAAU,WAAW,CAAC;AACtB,YAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC3D,YAAM,OAAO,KAAK,WAAW,GAAG,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,SAAS,QAAQ,CAAC,EAAE;AAC3E,mBAAa,UAAU,IAAI;AAC3B,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,uBAAuB,KAAyC;AACtE,UAAM,UAA8B,CAAC;AACrC,UAAM,SAAS,sBAAsB,IAAI,QAAQ;AACjD,UAAM,cAAc,IAAI,UAAU;AAKlC,UAAM,kBAAkB,OAAO,QAAQ;AAAA,MACrC,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,EAAE,QAAQ;AAAA,IAC7C;AAEA,eAAW,SAAS,iBAAiB;AACnC,YAAM,cAAc,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAC1E,UAAI,CAAC,aAAa;AAEhB,cAAM,WACJ,MAAM,OAAO,WAAW,KACxB,MAAM,OAAO,MAAM,CAAC,MAAM,mBAAmB,EAAE,WAAW,MAAM,IAAI;AACtE,YAAI,UAAU;AACZ,kBAAQ,KAAK;AAAA,YACX,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG;AAAA,YAC7C,QAAQ;AAAA,YACR,SACE,4BAA4B,MAAM,IAAI,sCAC7B,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,KAAK,MAAM;AAAA,YACtE,KACE,4EACG,MAAM,GAAG,SAAS,MAAM,IAAI;AAAA,UACnC,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,iBAAiB,KAAK;AACzC,UAAI,MAAM,SAAS,MAAM;AACvB,gBAAQ,KAAK;AAAA,UACX,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS,aAAQ,MAAM,GAAG,MAAM,kBAAkB,MAAM,YAAY,CAAC,KAAK,MAAM,IAAI;AAAA,QACtF,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,WAAW;AACnC,gBAAQ,KAAK;AAAA,UACX,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SAAS,mCAA8B,MAAM,IAAI;AAAA,UACjD,KAAK;AAAA,UACL,SAAS;AAAA,QACX,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG;AAAA,UAC7C,QAAQ;AAAA,UACR,SACE,uDAAkD,kBAAkB,MAAM,OAAO,CAAC,WACzE,kBAAkB,MAAM,YAAY,CAAC;AAAA,UAChD,KAAK,8BAA8B,MAAM,GAAG,MAAM,kBAAkB,MAAM,YAAY,CAAC,OAAO,MAAM,IAAI;AAAA,QAC1G,CAAC;AAAA,MACH;AAAA,IACF;AAIA,UAAM,WAAW,IAAI,UAAU,UAAU,IAAI,GAAG,eAAe,CAAC;AAChE,UAAM,YAAY,IAAI;AAAA,MACpB,qBAAqB,QAAQ,MAAM,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,IAClE;AACA,eAAW,SAAS,UAAU;AAC5B,UAAI,UAAU,IAAI,MAAM,GAAG,EAAG;AAC9B,cAAQ,KAAK;AAAA,QACX,OAAO,GAAG,KAAK,IAAI,iBAAiB,MAAM,GAAG;AAAA,QAC7C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,KAAK,sBAAsB,KAAK;AAAA,MAClC,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,iBACN,OACgF;AAChF,UAAM,WAAW,KAAK,SAAkC,MAAM,IAAI;AAClE,QAAI,CAAC,YAAY,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AACxE,aAAO,EAAE,MAAM,UAAU;AAAA,IAC3B;AACA,UAAM,OAAO,aAAa,UAAU,MAAM,IAAI,MAAM,GAAG,CAAC;AACxD,QAAI,KAAK,SAAS,UAAW,QAAO,EAAE,MAAM,UAAU;AACtD,QAAI,eAAe,KAAK,OAAO,MAAM,YAAY,EAAG,QAAO,EAAE,MAAM,KAAK;AACxE,WAAO,EAAE,MAAM,WAAW,SAAS,KAAK,MAAM;AAAA,EAChD;AAAA,EAES,OAAO,KAAyC;AACvD,UAAM,UAAU,MAAM,OAAO,GAAG;AAChC,YAAQ,KAAK,GAAG,KAAK,uBAAuB,GAAG,CAAC;AAChD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,KAA6B;AAC/C,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,UAAU;AAAA,EAChD;AAAA,EACQ,UAAU,KAA6B;AAC7C,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,QAAQ;AAAA,EAC9C;AAAA,EACQ,UAAU,KAA6B;AAC7C,WAAO,KAAK,KAAK,aAAa,GAAG,GAAG,QAAQ;AAAA,EAC9C;AAAA;AAAA,EAGQ,YAAY,KAAqB,MAAsB;AAC7D,WAAO,KAAK,KAAK,YAAY,GAAG,GAAG,GAAG,IAAI,KAAK;AAAA,EACjD;AAAA;AAAA,EAEQ,SAAS,KAAqB,MAAsB;AAC1D,WAAO,KAAK,KAAK,UAAU,GAAG,GAAG,IAAI;AAAA,EACvC;AAAA;AAAA,EAEQ,aAAa,KAAqB,MAAsB;AAC9D,WAAO,KAAK,KAAK,UAAU,GAAG,GAAG,GAAG,IAAI,KAAK;AAAA,EAC/C;AAAA;AAAA,EAIS,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,aAAa,OAAO;AACjD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,oCAAoC,CAAC;AAAA,IAC5F;AACA,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK;AAAA,QACH,KAAK,YAAY,KAAK,IAAI,IAAI;AAAA,QAC9B,KAAK,cAAc,GAAG;AAAA,QACtB,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,kBAAkB,KAAqC;AAC9D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,iCAAiC,CAAC;AAAA,IACzF;AACA,WAAO,UAAU,SAAS;AAAA,MAAI,CAAC,QAC7B,KAAK,kBAAkB,KAAK,YAAY,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM;AAAA,IACpE;AAAA,EACF;AAAA;AAAA,EAGQ,cAAc,KAAyB;AAC7C,WAAO,gBAAgB,GAAG;AAAA,EAC5B;AAAA;AAAA,EAIS,cAAc,KAAqC;AAC1D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,WAAW,OAAO;AAC/C,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AACzC,cAAQ;AAAA,QACN,KAAK,iBAAiB,KAAK,KAAK,UAAU,GAAG,KAAK,YAAY,KAAK,GAAG,IAAI,MAAM;AAAA,MAClF;AAIA,iBAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC,GAAG;AACnE,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,MAAM;AACnB,kBAAQ,KAAK;AAAA,YACX,UAAU,KAAK;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,mBAAmB,GAAG;AAAA,UAChC,CAAC;AACD;AAAA,QACF;AACA,gBAAQ,KAAK,KAAK,iBAAiB,QAAQ,UAAU,IAAI,MAAM,CAAC;AAAA,MAClE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAES,gBAAgB,KAAqC;AAC5D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,+BAA+B,CAAC;AAAA,IACvF;AACA,UAAM,UAA0B,CAAC;AACjC,eAAW,SAAS,UAAU,QAAQ;AACpC,YAAM,MAAM,KAAK,SAAS,KAAK,MAAM,IAAI;AAGzC,cAAQ,KAAK,KAAK,kBAAkB,KAAK,KAAK,UAAU,GAAG,IAAI,MAAM,CAAC;AACtE,iBAAW,OAAO,OAAO,KAAK,MAAM,aAAa,CAAC,CAAC,GAAG;AACpD,cAAM,SAAS,KAAK,cAAc,KAAK,GAAG;AAC1C,YAAI,WAAW,KAAM;AACrB,gBAAQ,KAAK,KAAK,kBAAkB,QAAQ,IAAI,MAAM,CAAC;AAAA,MACzD;AAGA,cAAQ,KAAK,KAAK,iBAAiB,KAAK,IAAI,MAAM,CAAC;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,YAAY,OAAyB;AAC3C,WAAO,cAAc,KAAK;AAAA,EAC5B;AAAA;AAAA,EAIS,iBAAiB,KAAqC;AAC7D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,IAAI,GAAG,cAAc,OAAO;AAClD,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,qCAAqC,CAAC;AAAA,IAC7F;AACA,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK;AAAA,QACH,KAAK,aAAa,KAAK,MAAM,IAAI;AAAA,QACjC,KAAK,eAAe,KAAK;AAAA,QACzB,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAES,mBAAmB,KAAqC;AAC/D,UAAM,EAAE,UAAU,IAAI;AACtB,QAAI,UAAU,UAAU,WAAW,GAAG;AACpC,aAAO,CAAC,EAAE,UAAU,KAAK,IAAI,QAAQ,QAAQ,QAAQ,kCAAkC,CAAC;AAAA,IAC1F;AACA,WAAO,UAAU,UAAU;AAAA,MAAI,CAAC,UAC9B,KAAK,kBAAkB,KAAK,aAAa,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGQ,eAAe,OAA4B;AACjD,WAAO,iBAAiB,KAAK;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBQ,aAAa,KAA6B;AAChD,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,WAAW,IAChC,KAAK,QAAQ,GAAG,WAAW,WAAW;AAAA,EAC5C;AAAA;AAAA,EAGQ,aAAa,KAA6B;AAChD,WAAO,IAAI,UAAU,YACjB,KAAK,IAAI,YAAY,WAAW,IAChC,KAAK,QAAQ,GAAG,WAAW,WAAW;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,wBAAwB,KAA8B;AAC5D,UAAM,WAAW,KAAK,aAAa,GAAG;AACtC,QAAI,CAAC,WAAW,QAAQ,EAAG,QAAO;AAClC,QAAI;AACF,UAAI,UAAU,QAAQ,EAAE,eAAe,GAAG;AACxC,cAAM,WAAW,KAAK,aAAa,GAAG;AACtC,cAAM,WAAW,aAAa,QAAQ;AACtC,cAAM,iBAAiB,WAAW,QAAQ,IAAI,aAAa,QAAQ,IAAI;AACvE,YAAI,aAAa,eAAgB,QAAO;AAAA,MAC1C;AAAA,IACF,QAAQ;AAAA,IAER;AACA,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,UAAU,MAAM;AAAA,IACrC,QAAQ;AACN,aAAO;AAAA,IACT;AAGA,UAAM,gBAAgB,qBAAqB,KAAK,EAAE,eAAe,GAAG,CAAC,EAAE;AACvE,UAAM,WAAW;AACjB,WAAO,mBAAmB,aAAa,EAAE,KAAK,CAAC,SAAS,SAAS,KAAK,IAAI,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,oBAAoB,KAAgE;AAC1F,QAAI,KAAK,wBAAwB,GAAG,EAAG,QAAO;AAC9C,WAAO,KAAK,eAAe,GAAG,GAAG,SAAS,kBAAkB,kBAAkB;AAAA,EAChF;AAAA,EAEmB,cAAc,KAAqC;AAEpE,QAAI,KAAK,eAAe,GAAG,GAAG,KAAM,QAAO,MAAM,cAAc,GAAG;AAClE,QAAI,IAAI,UAAU,aAAa,IAAI,UAAU,OAAQ,QAAO,CAAC;AAC7D,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,QACL;AAAA,UACE,MAAM,KAAK,aAAa,GAAG;AAAA,UAC3B,QACE;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,MAAM,KAAK,aAAa,GAAG;AAAA,QAC3B,QACE,SAAS,gBACL,mFACA;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAES,cAAc,KAAqC;AAC1D,UAAM,UAAU,MAAM,cAAc,GAAG;AACvC,UAAM,EAAE,UAAU,IAAI;AAEtB,QAAI,UAAU,UAAU,IAAI,GAAG,WAAW,UAAU,UAAU,UAAU,CAAC,GAAG,WAAW,GAAG;AACxF,aAAO;AAAA,IACT;AACA,QAAI,IAAI,UAAU,aAAa,IAAI,UAAU,OAAQ,QAAO;AAC5D,QAAI,KAAK,eAAe,GAAG,GAAG,KAAM,QAAO;AAE3C,UAAM,OAAO,KAAK,oBAAoB,GAAG;AACzC,QAAI,SAAS,eAAe;AAC1B,cAAQ,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,KAAK,aAAa,GAAG;AAAA,QAC3B,QACE;AAAA,MAEJ,CAAC;AACD,aAAO;AAAA,IACT;AACA,QAAI,SAAS,gBAAiB,QAAO;AAGrC,UAAM,WAAW,KAAK,aAAa,GAAG;AACtC,UAAM,aAAa,IAAI,UAAU,YAAY,eAAe;AAC5D,UAAM,MAAM,uBAAuB,UAAU;AAAA,MAC3C,SAAS;AAAA,MACT,aAAa;AAAA,MACb,SAAS;AAAA,MACT,QACE;AAAA,MAGF,OAAO,IAAI,SAAS;AAAA,MACpB,QAAQ,IAAI;AAAA,IACd,CAAC;AACD,YAAQ,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,QAAQ,IAAI;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ,WAAW,IAAI,MAAM;AAAA,IAC/B,CAAC;AACD,QAAI,IAAI,YAAY;AAClB,cAAQ,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,IAAI,WAAW,UAAU,CAAC,IAAI,QAAQ;AACxC,YAAM,SAAS,iBAAiB,UAAU,EAAE;AAC5C,yBAAmB,QAAQ;AAAA,QACzB,UAAU,KAAK;AAAA,QACf,OAAO,IAAI;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,IAAI;AAAA,QACjB,MAAM,IAAI;AAAA,MACZ,CAAC;AACD,uBAAiB,UAAU,IAAI,MAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAES,gBAAgB,KAAqC;AAE5D,UAAM,YAAY,iBAAiB,IAAI,UAAU,EAAE,EAAE,QAAQ;AAAA,MAC3D,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,EAAE,YAAY;AAAA,IACjD;AACA,UAAM,UAAU,MAAM,gBAAgB,GAAG;AAIzC,UAAM,QAAQ,oBAAI,IAAwD;AAC1E,QAAI,IAAI,UAAU,aAAa,IAAI,UAAU,QAAQ;AACnD,YAAM,IAAI,KAAK,aAAa,GAAG,GAAG;AAAA,QAChC,UAAU,KAAK,aAAa,GAAG;AAAA,QAC/B,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,eAAW,OAAO,WAAW;AAC3B,YAAM,WAAW,MAAM,IAAI,IAAI,IAAI;AACnC,YAAM,IAAI,IAAI,MAAM;AAAA,QAClB,UAAU,UAAU,YAAY,KAAK,QAAQ,IAAI,IAAI,GAAG,WAAW;AAAA,QACnE,cAAc,UAAU,eAAe,UAAU,IAAI;AAAA,MACvD,CAAC;AAAA,IACH;AACA,eAAW,CAAC,UAAU,EAAE,UAAU,YAAY,CAAC,KAAK,OAAO;AACzD,cAAQ,KAAK,GAAG,KAAK,0BAA0B,KAAK,UAAU,UAAU,WAAW,CAAC;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,0BACN,KACA,UACA,UACA,aACgB;AAChB,QAAI,CAAC,WAAW,QAAQ,EAAG,QAAO,CAAC;AACnC,QAAI;AACJ,QAAI;AACF,YAAM,aAAa,UAAU,MAAM;AAAA,IACrC,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AACA,QAAI,CAAC,kBAAkB,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,YAAY,6BAA6B,GAAG;AACpF,aAAO,CAAC;AAAA,IACV;AACA,QAAI,YAAY;AAChB,QAAI,WAAW,QAAQ,GAAG;AACxB,UAAI;AACF,oBAAY,kBAAkB,aAAa,UAAU,MAAM,CAAC,EAAE;AAAA,UAC5D,CAAC,MAAM,CAAC,EAAE,QAAQ,WAAW,GAAG,IAAI,UAAU,EAAE,GAAG;AAAA,QACrD,EAAE;AAAA,MACJ,QAAQ;AACN,oBAAY;AAAA,MACd;AAAA,IACF;AACA,QAAI,YAAY,GAAG;AACjB,aAAO;AAAA,QACL;AAAA,UACE,UAAU,KAAK;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,QACE,oDAA+C,SAAS,6DACZ,QAAQ;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,EAAE,SAAS,8BAA8B;AAAA,MACzC,EAAE,QAAQ,IAAI,QAAQ,qBAAqB,YAAY;AAAA,IACzD,EAAE,IAAI,CAAC,OAAO;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,MAAM,EAAE;AAAA,MACR,QAAQ,WAAW,EAAE,MAAM;AAAA,IAC7B,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA,EAIQ,aAAa,SAA6B,KAA8B;AAC9E,WAAO,qBAAqB,SAAS,IAAI,aAAa,IAAI,UAAU,EAAE;AAAA,EACxE;AAAA;AAAA,EAIS,gBAAgB,KAA6C;AACpE,UAAM,eAAe,KAAK,kBAAkB,GAAG;AAC/C,UAAM,cAAc,IAAI,UAAU;AAClC,UAAM,UAAU,IAAI;AACpB,UAAM,aAAa,IAAI,UAAU;AAIjC,UAAM,oBACJ,WAAW,SACX,OAAO,KAAK,IAAI,UAAU,UAAU,IAAI,GAAG,eAAe,CAAC,CAAC,EAAE;AAChE,UAAM,SAAwB;AAAA,MAC5B;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MAAM;AAIX,cAAI,sBAAsB,GAAG;AAC3B,mBAAO,EAAE,QAAQ,MAAM,QAAQ,oBAAoB;AAAA,UACrD;AACA,iBAAO,WAAW,YAAY,IAC1B,EAAE,QAAQ,MAAM,QAAQ,aAAa,IACrC,EAAE,QAAQ,QAAQ,QAAQ,cAAc,YAAY,GAAG;AAAA,QAC7D;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MAAM;AACX,cAAI,sBAAsB,GAAG;AAC3B,mBAAO,EAAE,QAAQ,MAAM,QAAQ,oBAAoB;AAAA,UACrD;AACA,gBAAM,WAAW,KAAK;AAAA,YACpB;AAAA,UACF;AACA,cAAI,CAAC,SAAU,QAAO,EAAE,QAAQ,QAAQ,QAAQ,eAAe,YAAY,GAAG;AAC9E,gBAAM,QAAQ,SAAS,SAAS,CAAC;AACjC,gBAAM,aAAa,OAAO,OAAO,KAAK,EAAE;AAAA,YAAK,CAAC,aAC3C,WAAW,CAAC,GAAG;AAAA,cAAK,CAAC,OACnB,EAAE,SAAS,CAAC,GAAG;AAAA,gBAAK,CAAC,MACpB,qBAAqB,EAAE,SAAS,SAAS,WAAW;AAAA,cACtD;AAAA,YACF;AAAA,UACF;AACA,iBAAO,aACH,EAAE,QAAQ,MAAM,QAAQ,uBAAuB,IAC/C;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ,eAAe,WAAW,OAAO,YAAY;AAAA,UACvD;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAIA,eAAW,OAAO,IAAI,UAAU,UAAU;AACxC,YAAM,IAAI,KAAK,YAAY,KAAK,IAAI,IAAI;AACxC,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,aAAa,IAAI,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,QAAQ;AACxC,YAAM,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,UAAU;AACzD,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,WAAW,MAAM,IAAI;AAAA,QACvC,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AACA,eAAW,SAAS,IAAI,UAAU,WAAW;AAC3C,YAAM,IAAI,KAAK,aAAa,KAAK,MAAM,IAAI;AAC3C,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI,cAAc,MAAM,IAAI;AAAA,QAC1C,OAAO,MACL,WAAW,CAAC,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ,QAAQ,cAAc,CAAC,GAAG;AAAA,MAC9F,CAAC;AAAA,IACH;AAaA,UAAM,wBAAwB;AAAA,MAC5B,sBAAsB,IAAI,QAAQ;AAAA,MAClC;AAAA,MACA;AAAA,IACF,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,cAAc;AACtC,SACG,IAAI,UAAU,cAAc,QAAQ,0BACrC,IAAI,UAAU,UAAU,IAAI,GAAG,eAAe,OAC9C;AACA,aAAO,KAAK;AAAA,QACV,MAAM,GAAG,KAAK,IAAI;AAAA,QAClB,OAAO,MAAM;AACX,gBAAM,WAAW,KAAK,SAAiD,YAAY;AACnF,gBAAM,UAAU,UAAU,YAAY;AACtC,cAAI,YAAY,QAAW;AACzB,mBAAO,EAAE,QAAQ,QAAQ,QAAQ,yBAAyB,YAAY,GAAG;AAAA,UAC3E;AACA,cACE,OAAO,YAAY,YACnB,2BAA2B,SAAS,SAAS,WAAW,GACxD;AACA,mBAAO,EAAE,QAAQ,MAAM,QAAQ,6BAA6B;AAAA,UAC9D;AAEA,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ,iBAAiB,YAAY;AAAA,UACvC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,WAAW,OAAsB,KAA+B;AAC9D,UAAM,QAAS,OAAO,CAAC;AACvB,UAAM,cAAc,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAC5E,UAAM,YAAY,iBAAiB,KAAK;AACxC,UAAM,aAAa,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAE/D,UAAM,OAAO;AAAA,MACX,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,IACnD;AAEA,YAAQ,OAAO;AAAA,MACb,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,QAClC;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,KAAuB;AAAA,UAC3B,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,UAChC,GAAI,qBAAqB,MAAM,aAAa,MAAM,SAC9C,EAAE,YAAY,qBAAqB,MAAM,aAAa,EAAE,IACxD,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,KAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,QAAQ,uBAAuB,MAAM,MAAM;AAAA,QAC7C;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,WAAW,WAAW,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,QACrE;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,oBAAoB;AACvB,cAAM,KAA4B;AAAA,UAChC,GAAG;AAAA,UACH,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,QAC5D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,cAAc;AACjB,cAAM,KAAsB;AAAA,UAC1B,GAAG;AAAA,UACH,GAAI,MAAM,YAAY,UAAU,MAAM,YAAY,WAC9C,EAAE,SAAS,MAAM,QAAQ,IACzB,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,KAAgB;AAAA,UACpB,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,qBAAqB,YAClC,EAAE,gBAAgB,MAAM,iBAAiB,IACzC,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,KAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,QAC/D;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,KAA6B;AAAA,UACjC,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,UAChC,GAAI,MAAM,QAAQ,MAAM,sBAAsB,IAC1C,EAAE,uBAAuB,MAAM,uBAAuB,IACtD,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,sBAAsB;AACzB,cAAM,KAA8B;AAAA,UAClC,GAAG;AAAA,UACH,UAAU,MAAM,aAAa;AAAA,UAC7B,WAAW,MAAM,cAAc,CAAC;AAAA,UAChC,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,UACvD,GAAI,OAAO,MAAM,gBAAgB,WAC7B,EAAE,WAAW,MAAM,YAAY,IAC/B,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,iBAAiB,YAC9B,EAAE,aAAa,MAAM,aAAa,IAClC,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,gBAAgB,WAC7B,EAAE,YAAY,MAAM,YAAY,IAChC,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,KAAyB;AAAA,UAC7B,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,aAAa,WAAW,EAAE,SAAS,MAAM,SAAS,IAAI,CAAC;AAAA,UACxE,GAAI,OAAO,MAAM,eAAe,WAC5B,EAAE,WAAW,MAAM,WAAW,IAC9B,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,gBAAgB;AAGnB,cAAM,KAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,GAAI,OAAO,MAAM,aAAa,WAAW,EAAE,SAAS,MAAM,SAAS,IAAI,CAAC;AAAA,UACxE,GAAI,OAAO,MAAM,eAAe,WAC5B,EAAE,WAAW,MAAM,WAAW,IAC9B,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,0BAA0B,WACvC,EAAE,qBAAqB,MAAM,sBAAsB,IACnD,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,2BAA2B,WACxC,EAAE,sBAAsB,MAAM,uBAAuB,IACrD,CAAC;AAAA,UACL,GAAI,OAAO,MAAM,qBAAqB,YAClC,EAAE,gBAAgB,MAAM,iBAAiB,IACzC,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,KAAK,eAAe;AAQlB,cAAM,KAAuB;AAAA,UAC3B,GAAG;AAAA,UACH,GAAI,MAAM,YAAY,UAAU,MAAM,YAAY,WAC9C,EAAE,SAAS,MAAM,QAAQ,IACzB,CAAC;AAAA,QACP;AACA,eAAO;AAAA,MACT;AAAA,MACA,SAAS;AAEP,cAAM,SAAgB;AACtB,cAAM,IAAI,MAAM,uCAAuC,OAAO,MAAM,CAAC,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,OAAsB,UAAmC;AACnE,UAAM,gBAAgB;AACtB,UAAM,WAAW,SAAS,YAAY;AAYtC,QAAI,UAAU,qBAAqB;AACjC,UAAI,SAAS,aAAa,QAAQ;AAChC,eAAO,KAAK,OAAO;AAAA,UACjB,oBAAoB;AAAA,YAClB;AAAA,YACA,UAAU;AAAA,cACR,UAAU;AAAA,cACV,SAAS,SAAS,UAAU;AAAA,YAC9B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,UACE,SAAS,aAAa,WACrB,SAAS,aAAa,YAAY,SAAS,cAC5C;AACA,eAAO,KAAK,OAAO;AAAA,UACjB,oBAAoB;AAAA,YAClB;AAAA,YACA,UAAU;AAAA,cACR,UAAU;AAAA,cACV,GAAI,SAAS,eACT,EAAE,cAAc,SAAS,aAAa,IACtC,CAAC;AAAA,YACP;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAOA,QAAI,UAAU,wBAAwB,UAAU,iBAAiB;AAC/D,YAAM,UACJ,aAAa,YACT,SAAS,oBACT,aAAa,SACX,SAAS,UAAU,SAAS,oBAC5B;AACR,UAAI,SAAS;AACX,eAAO,KAAK,OAAO;AAAA,UACjB,oBAAoB,EAAE,eAAe,mBAAmB,QAAQ;AAAA,QAClE,CAAC;AAAA,MACH;AACA,aAAO,EAAE,UAAU,EAAE;AAAA,IACvB;AAWA,QAAI,aAAa,QAAQ;AACvB,UACE,UAAU,UACV,UAAU,kBACV,UAAU,sBACV,UAAU,eACV;AACA,eAAO,KAAK,OAAO;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ,SAAS,UAAU;AAAA,QAC7B,CAAC;AAAA,MACH;AACA,aAAO,KAAK,OAAO;AAAA,QACjB,oBAAoB;AAAA,UAClB;AAAA,UACA,oBAAoB;AAAA,UACpB,0BAA0B,SAAS,UAAU;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,aAAa,OAAO;AACtB,aAAO,KAAK,OAAO;AAAA,QACjB,oBAAoB;AAAA,UAClB;AAAA,UACA,oBAAoB;AAAA,UACpB,0BACE,SAAS,UAAU;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,aAAa,UAAU;AACzB,UAAI,UAAU,gBAAgB,SAAS,cAAc;AACnD,eAAO,KAAK,OAAO;AAAA,UACjB,oBAAoB,EAAE,eAAe,cAAc,SAAS,aAAa;AAAA,QAC3E,CAAC;AAAA,MACH;AAAA,IAEF;AAGA,QAAI,aAAa,aAAa,SAAS,mBAAmB;AACxD,aAAO,KAAK,OAAO;AAAA,QACjB,oBAAoB,EAAE,eAAe,mBAAmB,SAAS,kBAAkB;AAAA,MACrF,CAAC;AAAA,IACH;AAGA,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AAAA,EAEQ,OAAO,SAA6B;AAC1C,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,OAAO,EAAE;AAAA,EACxD;AACF;AA8BA,IAAM,sBAAoE;AAAA,EACxE,EAAE,IAAI,sBAAsB,OAAO,cAAc;AAAA,EACjD,EAAE,IAAI,uBAAuB,OAAO,eAAe;AAAA,EACnD,EAAE,IAAI,0BAA0B,OAAO,kBAAkB;AAAA,EACzD,EAAE,IAAI,YAAY,OAAO,UAAU;AAAA,EACnC,EAAE,IAAI,oBAAoB,OAAO,iBAAiB;AAAA,EAClD,EAAE,IAAI,yBAAyB,OAAO,sBAAsB;AAAA,EAC5D,EAAE,IAAI,sBAAsB,OAAO,mBAAmB;AAAA,EACtD,EAAE,IAAI,uBAAuB,OAAO,oBAAoB;AAAA,EACxD,EAAE,IAAI,uBAAuB,OAAO,oBAAoB;AAAA,EACxD,EAAE,IAAI,oBAAoB,OAAO,kBAAkB;AAAA,EACnD,EAAE,IAAI,cAAc,OAAO,YAAY;AAAA,EACvC,EAAE,IAAI,4BAA4B,OAAO,cAAc;AAAA,EACvD,EAAE,IAAI,qBAAqB,OAAO,cAAc;AAAA,EAChD,EAAE,IAAI,mBAAmB,OAAO,YAAY;AAAA,EAC5C,EAAE,IAAI,sBAAsB,OAAO,eAAe;AACpD;AAMO,SAAS,4BAA4B,KAA4B;AACtE,aAAW,QAAQ,qBAAqB;AACtC,QAAI,KAAK,GAAG,KAAK,GAAG,EAAG,QAAO,KAAK;AAAA,EACrC;AACA,SAAO;AACT;AAaA,SAAS,aAAa,MAA+B,UAAoC;AACvF,MAAI,OAAgC;AACpC,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,OAAO,KAAK,SAAS,CAAC,CAAE;AAC9B,QAAI,SAAS,OAAW,QAAO,EAAE,MAAM,SAAS;AAChD,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AACpE,aAAO,EAAE,MAAM,WAAW,QAAQ,SAAS,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,EAAE;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,SAAS,SAAS,SAAS,CAAC,CAAE;AAChD,MAAI,SAAS,OAAW,QAAO,EAAE,MAAM,SAAS;AAChD,SAAO,EAAE,MAAM,WAAW,OAAO,KAAkB;AACrD;AAMA,SAAS,cACP,MACA,UACA,OACM;AACN,MAAI,OAAgC;AACpC,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,MAAM,SAAS,CAAC;AACtB,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,SAAS,QAAW;AACtB,YAAM,UAAmC,CAAC;AAC1C,WAAK,GAAG,IAAI;AACZ,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AACA,OAAK,SAAS,SAAS,SAAS,CAAC,CAAE,IAAI;AACzC;AAMA,SAAS,eAAe,MAA+B,UAA0B;AAC/E,MAAI,OAAgC;AACpC,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,OAAO,KAAK,SAAS,CAAC,CAAE;AAC9B,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AACtE,WAAO;AAAA,EACT;AACA,SAAO,KAAK,SAAS,SAAS,SAAS,CAAC,CAAE;AAC5C;AAGA,SAAS,eAAe,MAAsB;AAC5C,SAAO,MAAM,IAAI;AACnB;AAEO,IAAM,UAAU,IAAI,kBAAkB;AAC7C,IAAO,sBAAQ;","names":["entry"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/usage/readers/claude-code.ts"],"sourcesContent":["/**\n * usage/readers/claude-code — Claude Code native session-log reader.\n *\n * Faithful port of tokscale sessions/claudecode.rs. Reads\n * ~/.claude/projects/<key>/**.jsonl (one entry per line) plus the two subagent\n * layouts (nested projects/<key>/<session>/subagents/agent-*.jsonl and flat\n * projects/<key>/agent-*.jsonl) and headless .json transcripts.\n *\n * Token fields live under message.usage:\n * input_tokens → input\n * output_tokens → output\n * cache_read_input_tokens → cacheRead\n * cache_creation_input_tokens → cacheWrite\n * (reasoning is never reported → always 0)\n *\n * CRITICAL DEDUP — Claude Code's streaming API rewrites the SAME logical message\n * (keyed by message.id : requestId) multiple times as the response streams in,\n * each write carrying CUMULATIVE token counts. Summing them over-counts 5–10x.\n * We therefore keep one record per dedup key and MERGE duplicates with a PER-FIELD\n * MAX (each token dimension independently keeps the highest value seen). The dedup\n * key is \"<messageId>:<requestId>\" when both exist, \"message:<messageId>\" when\n * only the id exists, and absent otherwise (such records always pass through).\n *\n * tool_result lines (type \"user\"/\"tool_result\") contribute extra INPUT tokens\n * (explicit token fields, else chars/4 estimate), deduped per tool_use_id under\n * \"claude:tool_result:<session>:tool_result:<id>\" (per-field max on input).\n *\n * Headless transcripts: .json files parse a single message_start/message_delta/\n * message_stop stream OR a flat usage object; same usage paths, per-field max.\n *\n * Session id = the file stem; for sidechain transcripts the parent sessionId on\n * the line is used instead (so subagent rows roll up under the parent session,\n * not an inflated synthetic one). Subagent name resolved via meta.json sidecar →\n * parent tool_use lookup → \"claude-code-subagent\" fallback. Project key/label\n * decoded from the dir-name-encoded cwd (.claude/projects/<key>/ window).\n *\n * Provider inferred from message.model (anthropic for claude-*), overridable by\n * an explicit providerId/provider hint on the message or entry, and by cc-mirror\n * variant metadata. Confidence is always \"host-reported\" (real token counts).\n *\n * Fail-open: no root → []; unreadable/malformed file or line → skipped.\n */\n\nimport { basename, dirname, sep } from \"node:path\";\n\nimport type { TokenBreakdown, UsageReader, UsageRecord } from \"../types.js\";\nimport { emptyTokens } from \"../aggregate.js\";\nimport { fileMtimeMs, readJsonFile, readJsonlLines } from \"../jsonl.js\";\nimport { inferProvider, normalizeWorkspaceKey, workspaceLabelFromKey } from \"../normalize.js\";\nimport { firstExistingRoot, isFile, walkFiles } from \"../paths.js\";\n\nconst PLATFORM_ID = \"claude-code\" as const;\nconst DEFAULT_MODEL = \"unknown\";\nconst DEFAULT_PROVIDER = \"anthropic\";\nconst SUBAGENT_FALLBACK = \"claude-code-subagent\";\n\n/** Internal Claude Code user-content tags that are NOT genuine human turns. */\nconst INTERNAL_USER_TAGS = [\n \"<local-command-stdout>\",\n \"<local-command-stderr>\",\n \"<command-name>\",\n \"<command-message>\",\n \"<system-reminder>\",\n \"<bash-input>\",\n \"<bash-stdout>\",\n \"<bash-stderr>\",\n] as const;\n\n// ─────────────────────────────────────────────────────────────────────────\n// Coercion helpers\n// ─────────────────────────────────────────────────────────────────────────\n\n/** Coerce an unknown to a non-negative integer (0 on absence/garbage). */\nfunction toNonNegInt(v: unknown): number {\n const n = typeof v === \"number\" ? v : typeof v === \"string\" ? Number(v) : NaN;\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.trunc(n));\n}\n\n/** Coerce an unknown to an integer or null (port of extract_i64: number/string only). */\nfunction toIntOrNull(v: unknown): number | null {\n if (typeof v === \"number\" && Number.isFinite(v)) return Math.trunc(v);\n if (typeof v === \"string\") {\n const n = Number(v);\n if (Number.isFinite(n)) return Math.trunc(n);\n }\n return null;\n}\n\n/** A non-empty string, or undefined. */\nfunction asNonEmptyString(v: unknown): string | undefined {\n return typeof v === \"string\" && v !== \"\" ? v : undefined;\n}\n\n/** Parse an RFC3339 / numeric timestamp to epoch ms, or null when unusable. */\nfunction parseTs(v: unknown): number | null {\n if (typeof v === \"string\") {\n const ms = Date.parse(v);\n if (!Number.isNaN(ms)) return ms;\n const num = Number(v);\n if (Number.isFinite(num) && num > 0) return num >= 1e12 ? num : num * 1000;\n return null;\n }\n if (typeof v === \"number\" && Number.isFinite(v) && v > 0) {\n return v >= 1e12 ? v : v * 1000;\n }\n return null;\n}\n\nfunction isObject(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Provider / model resolution (port of claude_provider_choice + canonicalize)\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Resolve the provider id from a raw model and an optional provider hint.\n * Mirrors claude_provider_choice/_from_parts:\n * - an explicit hint that canonicalizes to a non-anthropic provider wins;\n * - a hint of \"anthropic\" yields the model-inferred provider when that differs\n * (e.g. an \"anthropic\" wrapper actually serving a non-claude model), else\n * \"anthropic\";\n * - with no hint, a \"provider/model\" prefix wins, then model inference, then\n * \"unknown\" (we surface the platform default DEFAULT_PROVIDER instead of a\n * bare \"unknown\" only when nothing at all is known and the model is absent).\n */\nfunction resolveProvider(rawModel: string | undefined, hint: string | undefined): string {\n const canonicalHint = canonicalProvider(hint);\n if (canonicalHint !== undefined) {\n if (canonicalHint === \"anthropic\") {\n const inferred = rawModel !== undefined ? inferProvider(rawModel) : null;\n if (inferred !== null && inferred !== \"anthropic\") return inferred;\n return \"anthropic\";\n }\n return canonicalHint;\n }\n\n if (rawModel === undefined) return DEFAULT_PROVIDER;\n\n // provider_from_model_prefix: a \"provider/model\" form canonicalizes the prefix.\n if (rawModel.trim().includes(\"/\")) {\n const prefixProvider = canonicalProvider(rawModel);\n if (prefixProvider !== undefined) return prefixProvider;\n }\n\n const inferred = inferProvider(rawModel);\n if (inferred !== null) return inferred;\n\n return DEFAULT_PROVIDER;\n}\n\n/**\n * Lightweight stand-in for provider_identity::canonical_provider. The fixed infra\n * exposes inferProvider (model→provider family); for an explicit provider hint we\n * canonicalize a \"vendor/model\" or bare-vendor token via the same family table,\n * with the documented cc-mirror \"mirror\"→anthropic special case folded in by the\n * caller. Returns undefined for an empty/unrecognized hint.\n */\nfunction canonicalProvider(hint: string | undefined): string | undefined {\n if (hint === undefined) return undefined;\n const trimmed = hint.trim();\n if (trimmed === \"\") return undefined;\n // A \"vendor/model\" hint: infer from the whole string (covers \"openrouter/anthropic\").\n const inferred = inferProvider(trimmed);\n if (inferred !== null) return inferred;\n // Bare vendor token: take the segment before any '/' as the provider id.\n const head = trimmed.split(\"/\")[0];\n if (head !== undefined && head !== \"\") return head.toLowerCase();\n return undefined;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Workspace (project) from path (port of claude_workspace_from_path)\n// ─────────────────────────────────────────────────────────────────────────\n\n/**\n * Decode the project key/label from a path. Scans for a `[.claude, projects, key]`\n * window, then a cc-mirror `[.cc-mirror, *, config, projects, key]` window, then a\n * trailing `[projects, key]` window (last match). The key is the dir-name-encoded\n * cwd (e.g. \"-Users-me-work\"); we keep it verbatim as the stable key, exactly as\n * the Rust normalize_workspace_key/workspace_label_from_key do.\n */\nfunction workspaceFromPath(path: string): { projectKey?: string; projectLabel?: string } {\n const components = path.split(/[\\\\/]+/).filter((c) => c !== \"\");\n\n for (let i = 0; i + 2 < components.length; i++) {\n if (components[i] === \".claude\" && components[i + 1] === \"projects\") {\n return keyAndLabel(components[i + 2]);\n }\n }\n\n for (let i = 0; i + 4 < components.length; i++) {\n if (\n components[i] === \".cc-mirror\" &&\n components[i + 2] === \"config\" &&\n components[i + 3] === \"projects\"\n ) {\n return keyAndLabel(components[i + 4]);\n }\n }\n\n for (let i = components.length - 2; i >= 0; i--) {\n if (components[i] === \"projects\") {\n return keyAndLabel(components[i + 1]);\n }\n }\n\n return {};\n}\n\nfunction keyAndLabel(raw: string | undefined): { projectKey?: string; projectLabel?: string } {\n if (raw === undefined) return {};\n const key = normalizeWorkspaceKey(raw);\n if (key === undefined) return {};\n const label = workspaceLabelFromKey(key);\n return label === undefined ? { projectKey: key } : { projectKey: key, projectLabel: label };\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Subagent name resolution (port of resolve_subagent_name)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** A small per-scan cache of parent-session agentId→subagent_type lookups. */\ntype ParentSubagentCache = Map<string, Map<string, string>>;\n\nfunction stripExt(name: string): string {\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(0, dot) : name;\n}\n\n/**\n * Resolve the subagent display name for a sidechain transcript.\n * Tier 1: sibling `<stem>.meta.json` agentType.\n * Tier 2: scan the parent session JSONL for the spawning tool_use's subagent_type.\n * Tier 3: \"claude-code-subagent\".\n */\nfunction resolveSubagentName(\n path: string,\n parentSessionId: string | undefined,\n entryAgentId: string | undefined,\n cache: ParentSubagentCache,\n): string {\n const stem = stripExt(basename(path));\n if (stem === \"\") return SUBAGENT_FALLBACK;\n\n // Tier 1: sibling meta.json\n const metaPath = `${dirname(path)}${sep}${stem}.meta.json`;\n const meta = readJsonFile(metaPath);\n if (isObject(meta)) {\n const agentType = asNonEmptyString(meta[\"agentType\"]);\n if (agentType !== undefined && agentType.trim() !== \"\") return agentType;\n }\n\n // Tier 2: parent session tool_use inference\n const lookupAgentId =\n entryAgentId !== undefined && entryAgentId.trim() !== \"\"\n ? entryAgentId\n : agentIdFromStem(stem);\n if (parentSessionId !== undefined && lookupAgentId !== undefined) {\n const parentPath = findParentSessionPath(path, parentSessionId);\n if (parentPath !== undefined) {\n const subagentType = lookupSubagentTypeInParent(parentPath, lookupAgentId, cache);\n if (subagentType !== undefined) return subagentType;\n }\n }\n\n // Tier 3\n return SUBAGENT_FALLBACK;\n}\n\n/** Derive an agentId from an \"agent-<id>\" stem (port of sidechain_agent_id_from_stem). */\nfunction agentIdFromStem(stem: string): string | undefined {\n if (!stem.startsWith(\"agent-\")) return undefined;\n const agentStem = stem.slice(\"agent-\".length);\n if (!agentStem.includes(\"-\")) return agentStem;\n const trailing = agentStem.slice(agentStem.lastIndexOf(\"-\") + 1);\n if (trailing !== \"\" && /^[0-9a-fA-F]+$/.test(trailing)) return trailing;\n return agentStem;\n}\n\n/** Locate the parent main-session JSONL for a sidechain transcript. */\nfunction findParentSessionPath(sidechainPath: string, parentSessionId: string): string | undefined {\n const parentFilename = `${parentSessionId}.jsonl`;\n const dir = dirname(sidechainPath);\n\n // Nested layout: file → subagents → session-dir → project-dir\n if (basename(dir) === \"subagents\") {\n const projectDir = dirname(dirname(dir));\n const candidate = `${projectDir}${sep}${parentFilename}`;\n if (isFile(candidate)) return candidate;\n }\n\n // Flat layout: parent dir is one level up\n const flat = `${dir}${sep}${parentFilename}`;\n if (isFile(flat)) return flat;\n\n return undefined;\n}\n\n/** Cached agentId→subagent_type lookup for a parent session. */\nfunction lookupSubagentTypeInParent(\n parentPath: string,\n targetAgentId: string,\n cache: ParentSubagentCache,\n): string | undefined {\n let lookup = cache.get(parentPath);\n if (lookup === undefined) {\n lookup = buildParentSubagentLookup(parentPath);\n cache.set(parentPath, lookup);\n }\n return lookup.get(targetAgentId);\n}\n\n/**\n * Scan a parent session JSONL to recover subagent_type per agentId. Joins\n * tool_use.id→subagent_type with tool_result.tool_use_id→agentId (from result text).\n * Port of build_parent_subagent_type_lookup.\n */\nfunction buildParentSubagentLookup(parentPath: string): Map<string, string> {\n const out = new Map<string, string>();\n const toolUseTypes = new Map<string, string>(); // tool_use.id → subagent_type\n const agentIdLinks = new Map<string, string>(); // tool_use_id → agentId\n\n for (const raw of readJsonlLines(parentPath)) {\n if (!isObject(raw)) continue;\n const message = raw[\"message\"];\n if (!isObject(message)) continue;\n const content = message[\"content\"];\n if (!Array.isArray(content)) continue;\n\n for (const block of content) {\n if (!isObject(block)) continue;\n const blockType = block[\"type\"];\n if (blockType === \"tool_use\") {\n const id = asNonEmptyString(block[\"id\"]);\n const input = block[\"input\"];\n const subagentType = isObject(input) ? asNonEmptyString(input[\"subagent_type\"]) : undefined;\n if (id !== undefined && subagentType !== undefined) {\n toolUseTypes.set(id, subagentType);\n }\n } else if (blockType === \"tool_result\") {\n const toolUseId = asNonEmptyString(block[\"tool_use_id\"]);\n if (toolUseId === undefined) continue;\n const resultContent = block[\"content\"];\n if (!Array.isArray(resultContent)) continue;\n for (const cb of resultContent) {\n if (!isObject(cb)) continue;\n const text = cb[\"text\"];\n if (typeof text === \"string\") {\n const aid = extractAgentIdFromText(text);\n if (aid !== undefined) {\n agentIdLinks.set(toolUseId, aid);\n break;\n }\n }\n }\n }\n }\n }\n\n for (const [toolUseId, agentId] of agentIdLinks) {\n const subagentType = toolUseTypes.get(toolUseId);\n if (subagentType !== undefined) out.set(agentId, subagentType);\n }\n return out;\n}\n\n/** Extract `agentId: <alphanumeric>` from a tool_result text block. */\nfunction extractAgentIdFromText(text: string): string | undefined {\n const marker = \"agentId: \";\n const pos = text.indexOf(marker);\n if (pos < 0) return undefined;\n const rest = text.slice(pos + marker.length);\n let end = 0;\n while (end < rest.length && /[0-9a-zA-Z]/.test(rest[end] as string)) end++;\n return end > 0 ? rest.slice(0, end) : undefined;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// tool_result input-token extraction (port of extract_claude_tool_result_usage)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface ToolResultUsage {\n inputTokens: number;\n /** \"tool_result:<id>\" when an id was present, else undefined. */\n dedupId?: string;\n}\n\n/** Sum input tokens across all tool_result blocks in a line, deduping by id. */\nfunction extractToolResultUsage(value: Record<string, unknown>): ToolResultUsage | undefined {\n let total = 0;\n let firstDedupId: string | undefined;\n const seen = new Set<string>();\n\n for (const toolResult of collectToolResultValues(value)) {\n const id = extractToolResultId(toolResult);\n if (id !== undefined) {\n if (seen.has(id)) continue;\n seen.add(id);\n }\n if (firstDedupId === undefined && id !== undefined) firstDedupId = `tool_result:${id}`;\n total += extractToolResultInputTokens(toolResult);\n }\n\n if (total <= 0) return undefined;\n return firstDedupId === undefined\n ? { inputTokens: total }\n : { inputTokens: total, dedupId: firstDedupId };\n}\n\n/** Gather every tool_result Value reachable from a line (port of claude_tool_result_values). */\nfunction collectToolResultValues(value: Record<string, unknown>): Array<Record<string, unknown>> {\n const results: Array<Record<string, unknown>> = [];\n\n if (value[\"type\"] === \"tool_result\") results.push(value);\n\n const directTr = value[\"tool_result\"];\n if (isObject(directTr)) results.push(directTr);\n\n const message = value[\"message\"];\n if (isObject(message)) {\n const msgTr = message[\"tool_result\"];\n if (isObject(msgTr)) results.push(msgTr);\n }\n\n const content = isObject(message) ? message[\"content\"] : value[\"content\"];\n if (Array.isArray(content)) {\n for (const block of content) {\n if (isObject(block) && block[\"type\"] === \"tool_result\") results.push(block);\n }\n }\n\n return results;\n}\n\nfunction extractToolResultId(tr: Record<string, unknown>): string | undefined {\n return (\n asNonEmptyString(tr[\"tool_use_id\"]) ??\n asNonEmptyString(tr[\"id\"]) ??\n asNonEmptyString(tr[\"tool_result_id\"])\n );\n}\n\n/** Explicit input-token count for a tool_result, else a chars/4 estimate. */\nfunction extractToolResultInputTokens(tr: Record<string, unknown>): number {\n const explicit = explicitToolResultInputTokens(tr);\n if (explicit !== undefined) return explicit;\n const chars = toolResultOutputCharCount(tr);\n return chars > 0 ? Math.ceil(chars / 4) : 0;\n}\n\nfunction explicitToolResultInputTokens(tr: Record<string, unknown>): number | undefined {\n const toolOutput = isObject(tr[\"tool_output\"]) ? (tr[\"tool_output\"] as Record<string, unknown>) : undefined;\n const usage = isObject(tr[\"usage\"]) ? (tr[\"usage\"] as Record<string, unknown>) : undefined;\n const toolOutputUsage =\n toolOutput !== undefined && isObject(toolOutput[\"usage\"])\n ? (toolOutput[\"usage\"] as Record<string, unknown>)\n : undefined;\n\n const candidates: unknown[] = [\n tr[\"input_tokens\"],\n tr[\"token_count\"],\n tr[\"tokens\"],\n usage?.[\"input_tokens\"],\n toolOutput?.[\"input_tokens\"],\n toolOutput?.[\"token_count\"],\n toolOutput?.[\"tokens\"],\n toolOutputUsage?.[\"input_tokens\"],\n ];\n for (const c of candidates) {\n const n = toIntOrNull(c);\n if (n !== null) return Math.max(0, n);\n }\n return undefined;\n}\n\n/** Count chars across a tool_result's output/content text (port of tool_result_output_char_count). */\nfunction toolResultOutputCharCount(tr: Record<string, unknown>): number {\n let chars = 0;\n\n const toolOutput = tr[\"tool_output\"];\n if (isObject(toolOutput)) {\n const output = toolOutput[\"output\"];\n if (typeof output === \"string\") chars += [...output].length;\n }\n\n const content = tr[\"content\"];\n if (typeof content === \"string\") {\n chars += [...content].length;\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (!isObject(block)) continue;\n const blockToolOutput = block[\"tool_output\"];\n const blockOutput = isObject(blockToolOutput) ? blockToolOutput[\"output\"] : undefined;\n const text =\n typeof blockOutput === \"string\"\n ? blockOutput\n : typeof block[\"text\"] === \"string\"\n ? (block[\"text\"] as string)\n : undefined;\n if (text !== undefined) chars += [...text].length;\n }\n }\n\n return chars;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// is_human_turn (kept for parity; does not affect token counts)\n// ─────────────────────────────────────────────────────────────────────────\n\n/** True when a `type:\"user\"` line is genuine human input (not tool/system). */\nfunction isHumanTurn(rawLine: string): boolean {\n const pos = rawLine.indexOf('\"content\":');\n if (pos < 0) return false;\n const after = rawLine.slice(pos + '\"content\":'.length).trimStart();\n if (after.startsWith(\"[\")) return false;\n if (after.startsWith('\"')) {\n const contentStart = after.slice(1);\n for (const tag of INTERNAL_USER_TAGS) {\n if (contentStart.startsWith(tag)) return false;\n }\n return true;\n }\n return false;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Accumulator (one entry per dedup key, per-field MAX merge)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface Accum {\n record: UsageRecord;\n /** Provider confidence rank (0..3) so a stronger hint from a later duplicate wins. */\n providerConfidence: number;\n}\n\nconst PC_DEFAULT = 1; // hint canonicalized to anthropic\nconst PC_INFERRED = 2; // model-inferred / stored non-anthropic\nconst PC_EXPLICIT = 3; // explicit \"vendor/model\" hint or prefix\n\n/** Provider confidence for a freshly resolved choice (port of the confidence ranks). */\nfunction providerConfidence(rawModel: string | undefined, hint: string | undefined): number {\n const canonicalHint = canonicalProvider(hint);\n if (canonicalHint !== undefined) {\n if (canonicalHint === \"anthropic\") {\n const inferred = rawModel !== undefined ? inferProvider(rawModel) : null;\n if (inferred !== null && inferred !== \"anthropic\") return PC_INFERRED;\n return PC_DEFAULT;\n }\n return PC_EXPLICIT;\n }\n if (rawModel !== undefined) {\n if (rawModel.trim().includes(\"/\") && canonicalProvider(rawModel) !== undefined) return PC_EXPLICIT;\n if (inferProvider(rawModel) !== null) return PC_INFERRED;\n }\n return 0;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// JSONL file parse\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface ClaudeUsage {\n input_tokens?: unknown;\n output_tokens?: unknown;\n cache_read_input_tokens?: unknown;\n cache_creation_input_tokens?: unknown;\n}\n\n/**\n * Parse a Claude Code session file (.jsonl, or headless .json) into usage records.\n * Each record carries a dedupKey; streaming duplicates are pre-merged here so the\n * dedupKey is unique per logical message (the aggregate-level dedup is then a\n * cross-source backstop, not the primary defense against streaming over-count).\n */\nfunction parseClaudeFile(path: string, parentCache: ParentSubagentCache): UsageRecord[] {\n const fallbackTs = fileMtimeMs(path);\n const { projectKey, projectLabel } = workspaceFromPath(path);\n\n // Headless .json: try the whole-file JSON shape first.\n if (path.endsWith(\".json\")) {\n const headless = parseHeadlessJson(path, fallbackTs, projectKey, projectLabel);\n if (headless.length > 0) return headless;\n }\n\n const lines = readJsonlLines(path);\n if (lines.length === 0) return [];\n\n // session id defaults to the file stem.\n let sessionId = stripExt(basename(path)) || \"unknown\";\n\n // Per-key accumulators, in insertion order.\n const byKey = new Map<string, Accum>();\n const ordered: Accum[] = [];\n\n let lastModel: string | undefined;\n let lastProviderHint: string | undefined;\n let sidechainAgent: string | undefined;\n let sidechainDetected = false;\n\n // Headless streaming state (for message_start/_delta/_stop lines inside a .jsonl).\n const headlessState = newHeadlessState();\n const headlessOut: UsageRecord[] = [];\n\n for (let li = 0; li < lines.length; li++) {\n const value = lines[li];\n if (!isObject(value)) continue;\n const rawLine = JSON.stringify(value); // for the is_human_turn / nothing-critical path\n\n const entryType = value[\"type\"];\n const message = isObject(value[\"message\"]) ? (value[\"message\"] as Record<string, unknown>) : undefined;\n const entryProviderHint =\n asNonEmptyString(value[\"providerId\"]) ??\n asNonEmptyString(value[\"provider_id\"]) ??\n asNonEmptyString(value[\"provider\"]);\n\n // Detect sidechain on the first parseable entry.\n if (!sidechainDetected) {\n sidechainDetected = true;\n if (value[\"isSidechain\"] === true) {\n const parentId = asNonEmptyString(value[\"sessionId\"]);\n if (parentId !== undefined) sessionId = parentId;\n sidechainAgent = resolveSubagentName(\n path,\n asNonEmptyString(value[\"sessionId\"]),\n asNonEmptyString(value[\"agentId\"]),\n parentCache,\n );\n }\n }\n\n // ── user / tool_result lines ──────────────────────────────────────────\n if (entryType === \"user\" || entryType === \"tool_result\") {\n const tr = extractToolResultUsage(value);\n if (tr !== undefined) {\n const rawModel =\n extractModel(value) ??\n (message !== undefined ? asNonEmptyString(message[\"model\"]) : undefined) ??\n lastModel;\n const providerHint =\n extractProviderHint(value) ??\n (message !== undefined ? messageProviderHint(message) : undefined) ??\n entryProviderHint ??\n lastProviderHint;\n const ts =\n parseTs(value[\"timestamp\"]) ?? extractClaudeTimestamp(value) ?? fallbackTs;\n\n const dedupKey =\n tr.dedupId !== undefined\n ? `claude:tool_result:${sessionId}:${tr.dedupId}`\n : undefined;\n\n if (dedupKey !== undefined) {\n const existing = byKey.get(dedupKey);\n if (existing !== undefined) {\n existing.record.tokens.input = Math.max(existing.record.tokens.input, tr.inputTokens);\n if (ts >= existing.record.ts) existing.record.ts = ts;\n continue;\n }\n }\n\n const tokens = emptyTokens();\n tokens.input = tr.inputTokens;\n const record = buildRecord({\n rawModel,\n providerHint,\n sessionId,\n ts,\n tokens,\n messageCount: 0,\n dedupKey,\n projectKey,\n projectLabel,\n agent: sidechainAgent,\n });\n const accum: Accum = { record, providerConfidence: providerConfidence(rawModel, providerHint) };\n if (dedupKey !== undefined) byKey.set(dedupKey, accum);\n ordered.push(accum);\n }\n continue;\n }\n\n // ── assistant lines (the token-bearing path) ─────────────────────────\n if (entryType === \"assistant\") {\n if (message === undefined) continue;\n\n const msgModel = asNonEmptyString(message[\"model\"]);\n if (msgModel !== undefined) {\n lastModel = msgModel;\n lastProviderHint = messageProviderHint(message) ?? entryProviderHint;\n }\n\n const usage = message[\"usage\"];\n if (!isObject(usage)) continue;\n const u = usage as ClaudeUsage;\n\n const msgId = asNonEmptyString(message[\"id\"]);\n const reqId = asNonEmptyString(value[\"requestId\"]);\n const providerHint = messageProviderHint(message) ?? entryProviderHint;\n\n // Dedup key: messageId:requestId, else message:messageId, else none.\n let dedupKey: string | undefined;\n if (msgId !== undefined && reqId !== undefined) dedupKey = `${msgId}:${reqId}`;\n else if (msgId !== undefined) dedupKey = `message:${msgId}`;\n\n const ts = parseTs(value[\"timestamp\"]) ?? fallbackTs;\n\n // Merge into an existing duplicate via PER-FIELD MAX.\n if (dedupKey !== undefined) {\n const existing = byKey.get(dedupKey);\n if (existing !== undefined) {\n mergeUsageMax(existing.record.tokens, u);\n if (ts >= existing.record.ts) existing.record.ts = ts;\n // A later duplicate may carry a stronger provider hint; promote it.\n const cand = providerConfidence(msgModel, providerHint);\n if (cand > existing.providerConfidence) {\n existing.providerConfidence = cand;\n existing.record.providerId = resolveProvider(msgModel, providerHint);\n }\n continue;\n }\n }\n\n // First occurrence: model is required to keep the record (matches Rust:\n // a model:None assistant entry is skipped without polluting the dedup map).\n if (msgModel === undefined) continue;\n\n const tokens = emptyTokens();\n tokens.input = toNonNegInt(u.input_tokens);\n tokens.output = toNonNegInt(u.output_tokens);\n tokens.cacheRead = toNonNegInt(u.cache_read_input_tokens);\n tokens.cacheWrite = toNonNegInt(u.cache_creation_input_tokens);\n\n const record = buildRecord({\n rawModel: msgModel,\n providerHint,\n sessionId,\n ts,\n tokens,\n messageCount: 1,\n dedupKey,\n projectKey,\n projectLabel,\n agent: sidechainAgent,\n });\n const accum: Accum = { record, providerConfidence: providerConfidence(msgModel, providerHint) };\n if (dedupKey !== undefined) byKey.set(dedupKey, accum);\n ordered.push(accum);\n continue;\n }\n\n // ── headless streaming lines inside a .jsonl (message_start/_delta/_stop) ─\n const completed = processHeadlessLine(value, rawLine, sessionId, headlessState, fallbackTs);\n if (completed !== undefined) {\n if (projectKey !== undefined) completed.projectKey = projectKey;\n if (projectLabel !== undefined) completed.projectLabel = projectLabel;\n headlessOut.push(completed);\n }\n }\n\n const finalHeadless = finalizeHeadlessState(headlessState, sessionId, fallbackTs);\n if (finalHeadless !== undefined) {\n if (projectKey !== undefined) finalHeadless.projectKey = projectKey;\n if (projectLabel !== undefined) finalHeadless.projectLabel = projectLabel;\n headlessOut.push(finalHeadless);\n }\n\n return [...ordered.map((a) => a.record), ...headlessOut];\n}\n\n/** Per-field MAX merge of a usage block into an existing token breakdown. */\nfunction mergeUsageMax(tokens: TokenBreakdown, u: ClaudeUsage): void {\n tokens.input = Math.max(tokens.input, toNonNegInt(u.input_tokens));\n tokens.output = Math.max(tokens.output, toNonNegInt(u.output_tokens));\n tokens.cacheRead = Math.max(tokens.cacheRead, toNonNegInt(u.cache_read_input_tokens));\n tokens.cacheWrite = Math.max(tokens.cacheWrite, toNonNegInt(u.cache_creation_input_tokens));\n}\n\ninterface BuildRecordArgs {\n rawModel: string | undefined;\n providerHint: string | undefined;\n sessionId: string;\n ts: number;\n tokens: TokenBreakdown;\n messageCount: number;\n dedupKey: string | undefined;\n projectKey: string | undefined;\n projectLabel: string | undefined;\n agent: string | undefined;\n}\n\nfunction buildRecord(a: BuildRecordArgs): UsageRecord {\n const modelId = a.rawModel !== undefined && a.rawModel !== \"\" ? a.rawModel : DEFAULT_MODEL;\n const record: UsageRecord = {\n platformId: PLATFORM_ID,\n modelId,\n providerId: resolveProvider(a.rawModel, a.providerHint),\n sessionId: a.sessionId,\n tokens: a.tokens,\n ts: a.ts,\n messageCount: a.messageCount,\n confidence: \"host-reported\",\n };\n if (a.dedupKey !== undefined) record.dedupKey = a.dedupKey;\n if (a.projectKey !== undefined) record.projectKey = a.projectKey;\n if (a.projectLabel !== undefined) record.projectLabel = a.projectLabel;\n if (a.agent !== undefined) record.agent = a.agent;\n return record;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Model / provider / timestamp extraction off a generic value\n// ─────────────────────────────────────────────────────────────────────────\n\nfunction extractModel(value: Record<string, unknown>): string | undefined {\n const top = asNonEmptyString(value[\"model\"]);\n if (top !== undefined) return top;\n const message = value[\"message\"];\n return isObject(message) ? asNonEmptyString(message[\"model\"]) : undefined;\n}\n\nfunction messageProviderHint(message: Record<string, unknown>): string | undefined {\n return (\n asNonEmptyString(message[\"providerId\"]) ??\n asNonEmptyString(message[\"provider_id\"]) ??\n asNonEmptyString(message[\"provider\"])\n );\n}\n\nfunction extractProviderHint(value: Record<string, unknown>): string | undefined {\n const top =\n asNonEmptyString(value[\"providerId\"]) ??\n asNonEmptyString(value[\"provider_id\"]) ??\n asNonEmptyString(value[\"provider\"]);\n if (top !== undefined) return top;\n const message = value[\"message\"];\n return isObject(message) ? messageProviderHint(message) : undefined;\n}\n\nfunction extractClaudeTimestamp(value: Record<string, unknown>): number | null {\n const direct = parseTs(value[\"timestamp\"]) ?? parseTs(value[\"created_at\"]);\n if (direct !== null) return direct;\n const message = value[\"message\"];\n if (isObject(message)) {\n const m = parseTs(message[\"created_at\"]);\n if (m !== null) return m;\n }\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────\n// Headless JSON / streaming-line support (port of *_headless_*)\n// ─────────────────────────────────────────────────────────────────────────\n\ninterface HeadlessState {\n model?: string;\n providerHint?: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n ts: number | null;\n}\n\nfunction newHeadlessState(): HeadlessState {\n return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, ts: null };\n}\n\nfunction resetHeadlessState(s: HeadlessState): void {\n s.model = undefined;\n s.providerHint = undefined;\n s.input = 0;\n s.output = 0;\n s.cacheRead = 0;\n s.cacheWrite = 0;\n s.ts = null;\n}\n\n/** Whole-file headless JSON parse (a single usage object). */\nfunction parseHeadlessJson(\n path: string,\n fallbackTs: number,\n projectKey: string | undefined,\n projectLabel: string | undefined,\n): UsageRecord[] {\n const value = readJsonFile(path);\n if (!isObject(value)) return [];\n const record = extractHeadlessMessage(value, \"unknown-session\", fallbackTs);\n if (record === undefined) return [];\n // session id is the file stem (matches Rust passing session_id from the stem).\n record.sessionId = stripExt(basename(path)) || \"unknown\";\n if (projectKey !== undefined) record.projectKey = projectKey;\n if (projectLabel !== undefined) record.projectLabel = projectLabel;\n return [record];\n}\n\n/** Process one streaming line; returns a completed record on message_start/_stop. */\nfunction processHeadlessLine(\n value: Record<string, unknown>,\n _rawLine: string,\n sessionId: string,\n state: HeadlessState,\n fallbackTs: number,\n): UsageRecord | undefined {\n const eventType = typeof value[\"type\"] === \"string\" ? (value[\"type\"] as string) : \"\";\n\n switch (eventType) {\n case \"message_start\": {\n const completed = finalizeHeadlessState(state, sessionId, fallbackTs);\n state.model = extractModel(value);\n state.providerHint = extractProviderHint(value);\n const ts = extractClaudeTimestamp(value);\n if (ts !== null) state.ts = ts;\n const message = value[\"message\"];\n const usage =\n (isObject(message) && isObject(message[\"usage\"]) ? (message[\"usage\"] as Record<string, unknown>) : undefined) ??\n (isObject(value[\"usage\"]) ? (value[\"usage\"] as Record<string, unknown>) : undefined);\n if (usage !== undefined) updateHeadlessUsage(state, usage);\n return completed;\n }\n case \"message_delta\": {\n const delta = value[\"delta\"];\n const usage =\n (isObject(value[\"usage\"]) ? (value[\"usage\"] as Record<string, unknown>) : undefined) ??\n (isObject(delta) && isObject(delta[\"usage\"]) ? (delta[\"usage\"] as Record<string, unknown>) : undefined);\n if (usage !== undefined) updateHeadlessUsage(state, usage);\n return undefined;\n }\n case \"message_stop\":\n return finalizeHeadlessState(state, sessionId, fallbackTs);\n default:\n return extractHeadlessMessage(value, sessionId, fallbackTs);\n }\n}\n\nfunction updateHeadlessUsage(state: HeadlessState, usage: Record<string, unknown>): void {\n const input = toIntOrNull(usage[\"input_tokens\"]);\n if (input !== null) state.input = Math.max(state.input, input);\n const output = toIntOrNull(usage[\"output_tokens\"]);\n if (output !== null) state.output = Math.max(state.output, output);\n const cacheRead = toIntOrNull(usage[\"cache_read_input_tokens\"]);\n if (cacheRead !== null) state.cacheRead = Math.max(state.cacheRead, cacheRead);\n const cacheWrite = toIntOrNull(usage[\"cache_creation_input_tokens\"]);\n if (cacheWrite !== null) state.cacheWrite = Math.max(state.cacheWrite, cacheWrite);\n}\n\n/** Emit a record from accumulated streaming state, then reset (port of finalize_headless_state). */\nfunction finalizeHeadlessState(\n state: HeadlessState,\n sessionId: string,\n fallbackTs: number,\n): UsageRecord | undefined {\n const rawModel = state.model;\n if (rawModel === undefined) return undefined;\n if (state.input === 0 && state.output === 0 && state.cacheRead === 0 && state.cacheWrite === 0) {\n resetHeadlessState(state);\n return undefined;\n }\n const tokens = emptyTokens();\n tokens.input = Math.max(0, state.input);\n tokens.output = Math.max(0, state.output);\n tokens.cacheRead = Math.max(0, state.cacheRead);\n tokens.cacheWrite = Math.max(0, state.cacheWrite);\n\n const record = buildRecord({\n rawModel,\n providerHint: state.providerHint,\n sessionId,\n ts: state.ts ?? fallbackTs,\n tokens,\n messageCount: 1,\n dedupKey: undefined,\n projectKey: undefined,\n projectLabel: undefined,\n agent: undefined,\n });\n resetHeadlessState(state);\n return record;\n}\n\n/** Extract a flat usage-bearing message (port of extract_claude_headless_message). */\nfunction extractHeadlessMessage(\n value: Record<string, unknown>,\n sessionId: string,\n fallbackTs: number,\n): UsageRecord | undefined {\n const message = value[\"message\"];\n const usage =\n (isObject(value[\"usage\"]) ? (value[\"usage\"] as Record<string, unknown>) : undefined) ??\n (isObject(message) && isObject(message[\"usage\"]) ? (message[\"usage\"] as Record<string, unknown>) : undefined);\n if (usage === undefined) return undefined;\n const rawModel = extractModel(value);\n if (rawModel === undefined) return undefined;\n const providerHint = extractProviderHint(value);\n const ts = extractClaudeTimestamp(value) ?? fallbackTs;\n\n const tokens = emptyTokens();\n tokens.input = Math.max(0, toIntOrNull(usage[\"input_tokens\"]) ?? 0);\n tokens.output = Math.max(0, toIntOrNull(usage[\"output_tokens\"]) ?? 0);\n tokens.cacheRead = Math.max(0, toIntOrNull(usage[\"cache_read_input_tokens\"]) ?? 0);\n tokens.cacheWrite = Math.max(0, toIntOrNull(usage[\"cache_creation_input_tokens\"]) ?? 0);\n\n return buildRecord({\n rawModel,\n providerHint,\n sessionId,\n ts,\n tokens,\n messageCount: 1,\n dedupKey: undefined,\n projectKey: undefined,\n projectLabel: undefined,\n agent: undefined,\n });\n}\n\n// Touch the parity-only helper so a strict no-unused-locals build stays clean\n// without changing behavior: isHumanTurn mirrors the Rust turn-detection used\n// for is_turn_start, which the usage record does not carry.\nvoid isHumanTurn;\n\n// ─────────────────────────────────────────────────────────────────────────\n// Reader\n// ─────────────────────────────────────────────────────────────────────────\n\n/** The Claude Code usage reader singleton. */\nconst claudeCodeReader: UsageReader = {\n platformId: PLATFORM_ID,\n kind: \"local\",\n async read({ sinceMs }: { sinceMs?: number }): Promise<UsageRecord[]> {\n const root = firstExistingRoot(PLATFORM_ID);\n if (root === undefined) return []; // no ~/.claude/projects → fail-open\n\n // ~/.claude/projects/<key>/**.jsonl (+ subagents/agent-*.jsonl) + .json headless\n const files = walkFiles(root, (name) => {\n if (name.endsWith(\".meta.json\")) return false; // sidecar, not a transcript\n return name.endsWith(\".jsonl\") || name.endsWith(\".json\");\n });\n\n const parentCache: ParentSubagentCache = new Map();\n const records: UsageRecord[] = [];\n for (const file of files) {\n let rows: UsageRecord[];\n try {\n rows = parseClaudeFile(file, parentCache);\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 claudeCodeReader;\n"],"mappings":"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","names":["inferred"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/cline/index.ts"],"sourcesContent":["/**\n * adapters/cline — Cline (VS Code extension) platform adapter.\n *\n * Cline (`saoudrizwan.claude-dev`) is the most-installed AI coding VS Code\n * extension and the PARENT that Roo Code (`rooveterinaryinc.roo-cline`) and Kilo\n * Code (`kilocode.kilo-code`) forked. From agent-connector's perspective it is an\n * **mcp-only** host: it exposes no lifecycle hook / event-callback plugin API, so\n * MCP server registration is the only runtime surface we install and every hook\n * capability is reported false. This mirrors the Roo Code adapter (a Cline fork).\n *\n * SCOPE NOTE: this adapter targets the VS Code EXTENSION, NOT the newer Cline\n * CLI/SDK (which would live under ~/.cline and is a separate future adapter).\n *\n * MCP config (cline/cline `main`, disk.ts GlobalFileNames):\n * - USER SCOPE ONLY → <vscodeUserDir>/globalStorage/saoudrizwan.claude-dev/\n * settings/cline_mcp_settings.json (root key \"mcpServers\").\n * There is NO project-scope MCP file — the VS Code extension only reads this\n * single global path (so, unlike roo-code, there is no `.roo/mcp.json` branch\n * and no legacy-filename probe: `cline_mcp_settings.json` is Cline's canonical,\n * never-renamed settings file).\n * Per-server shape: stdio { command, args?, env?, disabled? }; remote\n * { url, type:\"sse\"|\"streamableHttp\" }. An untyped remote url defaults to sse\n * in Cline, so we ALWAYS write `type` explicitly for remote entries.\n *\n * VS Code user-dir resolution (cross-OS) — reused VERBATIM from roo-code:\n * - macOS → ~/Library/Application Support/Code/User\n * - Linux → ~/.config/Code/User\n * - Windows → %APPDATA%/Code/User (falls back to ~/AppData/Roaming/Code/User)\n *\n * Memory / commands / skills (docs.cline.bot) — the `.clinerules` content tree:\n * - memory → project <projectDir>/.clinerules/agent-connector.md (DIRECTORY\n * form); user ~/Documents/Cline/Rules/agent-connector.md. Markdown.\n * - command → project <projectDir>/.clinerules/workflows/<name>.md; user\n * ~/Documents/Cline/Workflows/<name>.md. (Cline \"Workflows\" are the\n * slash-command equivalent.) Plain markdown (frontmatter + body).\n * - skill → project <projectDir>/.clinerules/skills/<name>/SKILL.md;\n * user ~/.cline/skills/<name>/SKILL.md (homedir/.cline, cross-OS)\n * (SKILL.md-in-named-dir, YAML frontmatter; both scopes are\n * documented in cline/cline docs/customization/skills.mdx).\n *\n * READ-ONLY interop (NEVER written under this adapter): Cline also reads\n * `.cursor/rules`, `AGENTS.md`, `.claude/skills`, `.agents/skills` for cross-tool\n * interop. Those are other tools' surfaces — AC owns only the `.clinerules`/\n * Documents-dir paths above.\n *\n * Env interpolation: Cline's settings file documents no native `${env:VAR}`\n * token, so every `${env:VAR}` reference is resolved to a literal at install time\n * (the no-native-token path, same as roo-code / gemini-cli).\n *\n * The hook \"config path\" is the SAME MCP settings file (there is no hook file),\n * so the generic doctor/backup behave sensibly.\n */\n\nimport { existsSync, statSync } from \"node:fs\";\nimport { homedir, platform as osPlatform } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { BaseAdapter } from \"../base.js\";\nimport type { Adapter, InstallContext, MemoryTarget } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookParadigm,\n PlatformCapabilities,\n PlatformId,\n ServerDef,\n Transport,\n} from \"../../core/types.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n buildWrappedStdio,\n} from \"../../core/spawn.js\";\nimport { renderCommandMd, renderSkillMd } from \"../claude-code/render.js\";\n\nconst HOST: PlatformId = \"cline\";\nconst MCP_ROOT_KEY = \"mcpServers\";\n\n/** Cline extension id → its VS Code globalStorage folder. */\nconst CLINE_EXTENSION_ID = \"saoudrizwan.claude-dev\";\n/** User-scope MCP settings filename — Cline's canonical, never-renamed name. */\nconst MCP_SETTINGS_FILE = \"cline_mcp_settings.json\";\n\n/**\n * Native MCP server entry shapes Cline accepts under `mcpServers`. We write the\n * minimal stdio shape { command, args?, env?, disabled }; for remote servers we\n * ALWAYS emit `type` (Cline defaults an untyped url to sse, so the type must be\n * explicit to register a streamable-http server).\n */\ninterface ClineStdioServer {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n disabled: boolean;\n}\ninterface ClineRemoteServer {\n url: string;\n type: \"sse\" | \"streamableHttp\";\n headers?: Record<string, string>;\n disabled: boolean;\n}\n\n/**\n * Resolve the cross-OS VS Code per-user data directory (the \"User\" folder that\n * contains `globalStorage`). REUSED VERBATIM from the roo-code adapter — Cline\n * is its parent and the published extension lives under the same stable \"Code\"\n * tree. See module header for the per-platform mapping.\n */\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 // Linux / other POSIX: XDG-style config dir.\n return join(home, \".config\", \"Code\", \"User\");\n }\n}\n\n/**\n * Resolve the cross-OS user Documents directory. Cline's user-scope memory +\n * workflows live under `<documentsDir>/Cline/{Rules,Workflows}`.\n *\n * CAVEAT (documented, honest approximation — NOT a fabricated path): on Windows\n * the real Cline uses the MyDocuments known-folder, which a user CAN relocate\n * (we do not read the registry to discover a moved folder). `~/Documents` is the\n * Windows default and covers the common case. POSIX additionally honors\n * `XDG_DOCUMENTS_DIR` when set. The path SHAPE `Documents/Cline/{Rules,Workflows}`\n * is source-verified against docs.cline.bot.\n */\nfunction documentsDir(): string {\n if (osPlatform() === \"win32\") {\n return join(homedir(), \"Documents\");\n }\n const xdg = process.env.XDG_DOCUMENTS_DIR;\n return xdg && xdg.trim() !== \"\" ? xdg : join(homedir(), \"Documents\");\n}\n\nexport class ClineAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Cline\";\n readonly paradigm: HookParadigm = \"mcp-only\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: the `.clinerules` content tree (project\n // <projectDir>/.clinerules/agent-connector.md; user\n // ~/Documents/Cline/Rules/agent-connector.md) — overrides memoryTargets()\n // below (Cline does NOT use the AGENTS.md base default for its OWN file).\n supportsMemory: true,\n // Cline has no lifecycle hook system — every hook capability is false.\n preToolUse: false,\n postToolUse: false,\n preCompact: false,\n sessionStart: false,\n sessionEnd: false,\n userPromptSubmit: false,\n stop: false,\n notification: false,\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: false,\n // Cline registers stdio, SSE, and Streamable HTTP MCP servers.\n transports: [\"stdio\", \"sse\", \"http\"],\n // Content surfaces: Workflows (the slash-command equivalent) and AgentSkills.\n // command → <clineRulesDir>/workflows/<name>.md (md + optional frontmatter)\n // skill → <projectDir>/.clinerules/skills/<name>/SKILL.md (project only)\n supportsCommands: true,\n supportsSkills: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(projectDir: string): DetectedPlatform {\n const userSettings = this.userSettingsPath();\n const userExtDir = join(\n vscodeUserDir(),\n \"globalStorage\",\n CLINE_EXTENSION_ID,\n );\n // Project marker: the `.clinerules` content root (file OR directory form).\n const projectRules = join(projectDir, \".clinerules\");\n\n const userMatch = existsSync(userSettings) || existsSync(userExtDir);\n const projectMatch = existsSync(projectRules);\n const installed = userMatch || projectMatch;\n\n // Prefer the user scope/path when present; otherwise surface the project one.\n const scope = userMatch || !projectMatch ? \"user\" : \"project\";\n const configPath = scope === \"user\" ? userSettings : projectRules;\n const reason = installed\n ? userMatch\n ? `found Cline globalStorage under ${userExtDir}`\n : `found Cline project rules at ${projectRules}`\n : `no Cline config at ${userExtDir} or ${projectRules}`;\n\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope,\n reason,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n /** Absolute path to the user-scope MCP settings file (VS Code globalStorage). */\n private userSettingsPath(): string {\n return join(\n vscodeUserDir(),\n \"globalStorage\",\n CLINE_EXTENSION_ID,\n \"settings\",\n MCP_SETTINGS_FILE,\n );\n }\n\n /**\n * MCP config is USER-SCOPE ONLY (the VS Code ext reads one global file). At\n * project scope we still return the global path so a project-scope install\n * lands the server where Cline actually reads it.\n */\n getConfigDir(_ctx: InstallContext): string {\n return join(\n vscodeUserDir(),\n \"globalStorage\",\n CLINE_EXTENSION_ID,\n \"settings\",\n );\n }\n\n getServerConfigPath(_ctx: InstallContext): string {\n return this.userSettingsPath();\n }\n\n /**\n * Cline has no hook file — hooks are not a thing here. The hook \"config path\"\n * is the same MCP settings file so the generic doctor/backup behave sensibly.\n */\n getHookConfigPath(ctx: InstallContext): string {\n return this.getServerConfigPath(ctx);\n }\n\n // ── Memory surface: the `.clinerules` content tree ───────────────────────\n // Cline uses .clinerules (NOT AGENTS.md) for its OWN rules, so this override\n // replaces the AGENTS.md base default entirely:\n // project → <projectDir>/.clinerules/agent-connector.md (DIRECTORY form)\n // user → ~/Documents/Cline/Rules/agent-connector.md\n // When `.clinerules` exists as a single FILE (the legacy single-file form),\n // we must NOT create a `.clinerules/agent-connector.md` underneath it — that\n // would throw ENOTDIR — so we return [] here and installMemory() emits a\n // precise skip-warn (see below) rather than clobbering the user's file.\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n // An explicit platforms[cline].memory.path override wins (escape hatch).\n if (this.memoryOverride(ctx)?.path) return super.memoryTargets(ctx);\n if (ctx.scope === \"project\") {\n if (this.clineRulesIsFile(ctx.projectDir)) return [];\n return [\n {\n path: join(ctx.projectDir, \".clinerules\", \"agent-connector.md\"),\n reason: \"cline project rules dir (.clinerules/; agent-connector-owned file)\",\n },\n ];\n }\n if (ctx.scope === \"user\") {\n return [\n {\n path: join(documentsDir(), \"Cline\", \"Rules\", \"agent-connector.md\"),\n reason: \"cline user rules dir (~/Documents/Cline/Rules; agent-connector-owned file)\",\n },\n ];\n }\n return [];\n }\n\n /**\n * Override installMemory ONLY to surface a precise warn when `.clinerules`\n * exists as a single FILE at project scope (so memoryTargets() returned []):\n * we never clobber the user's single-file rules. All other behavior delegates\n * to the base implementation.\n */\n override installMemory(ctx: InstallContext): ChangeRecord[] {\n if (\n ctx.scope === \"project\" &&\n !this.memoryOverride(ctx)?.path &&\n (ctx.connector.memory ?? []).length > 0 &&\n ctx.connector.platforms[this.id]?.memory !== false &&\n this.clineRulesIsFile(ctx.projectDir)\n ) {\n return [\n {\n platform: this.id,\n action: \"warn\",\n path: join(ctx.projectDir, \".clinerules\"),\n detail:\n \"existing .clinerules is a single file (legacy form); left untouched — \" +\n \"convert it to a .clinerules/ directory to receive agent-connector memory\",\n },\n ];\n }\n return super.installMemory(ctx);\n }\n\n /** True when `<dir>/.clinerules` exists and is a regular FILE (not a directory). */\n private clineRulesIsFile(dir: string): boolean {\n const p = join(dir, \".clinerules\");\n if (!existsSync(p)) return false;\n try {\n return statSync(p).isFile();\n } catch {\n return false;\n }\n }\n\n // ── MCP server install / uninstall ───────────────────────────────────────\n\n installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const override = connector.platforms[HOST]?.server;\n if (!connector.server || override === false) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: connector.server\n ? \"server registration disabled for cline\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n // Shallow-merge any per-platform server override into the base ServerDef.\n const server: ServerDef =\n override && typeof override === \"object\"\n ? { ...connector.server, ...override }\n : connector.server;\n\n const serverPath = this.getServerConfigPath(ctx);\n const entry = this.renderServerEntry(ctx, server);\n\n return [\n this.upsertServerInJson(serverPath, MCP_ROOT_KEY, connector.id, entry, ctx.dryRun),\n ];\n }\n\n uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const serverPath = this.getServerConfigPath(ctx);\n return [\n this.removeServerFromJson(serverPath, MCP_ROOT_KEY, ctx.connector.id, ctx.dryRun),\n ];\n }\n\n /** Render a normalized ServerDef into Cline's native mcpServers entry. */\n private renderServerEntry(\n ctx: InstallContext,\n server: ServerDef,\n ): ClineStdioServer | ClineRemoteServer {\n const transport: Transport = server.transport;\n\n if (transport === \"stdio\") {\n let command = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n // Transparent telemetry wrapping: route the real command through\n // `<homeBin> serve --connector <id> -- <command> <args...>`.\n ({ command, args } = buildWrappedStdio(ctx, server, this.id, command, args));\n\n // Cline documents no native interpolation token, so resolve every\n // ${env:VAR} to a literal at install time.\n const entry: ClineStdioServer = {\n command: resolveEnvRefsDeep(command),\n // Honor the per-call server's enabled flag — a server marked\n // enabled:false installs disabled (mirror roo-code).\n disabled: server.enabled === false,\n };\n if (args.length > 0) entry.args = resolveEnvRefsDeep(args);\n const env = this.renderEnv(server.env);\n if (env) entry.env = env;\n return entry;\n }\n\n // sse / http (and any other remote transport) — Cline registers a URL. We\n // ALWAYS emit `type` (an untyped url defaults to sse in Cline, so streamable\n // http must be explicit): map our \"http\" transport to \"streamableHttp\".\n const entry: ClineRemoteServer = {\n url: resolveEnvRefsDeep(server.url ?? \"\"),\n type: transport === \"http\" ? \"streamableHttp\" : \"sse\",\n disabled: server.enabled === false,\n };\n const headers = this.renderEnv(server.headers);\n if (headers) entry.headers = headers;\n return entry;\n }\n\n /**\n * Render env/header values. Cline documents no native interpolation token, so\n * resolve `${env:VAR}` references to literals at install time.\n */\n private renderEnv(\n env: Record<string, string> | undefined,\n ): Record<string, string> | undefined {\n if (!env || Object.keys(env).length === 0) return undefined;\n return resolveEnvRefsDeep({ ...env });\n }\n\n // ── Hooks (unavailable — Cline is mcp-only) ──────────────────────────────\n\n installHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Cline is mcp-only)\",\n },\n ];\n }\n\n uninstallHooks(_ctx: InstallContext): ChangeRecord[] {\n return [\n {\n platform: this.id,\n action: \"skip\",\n detail: \"hooks unavailable (Cline is mcp-only)\",\n },\n ];\n }\n\n // ── Content surfaces: commands (Workflows) / skills ──────────────────────\n // CONTENT-ONLY: pure native-file writers. No runtime dispatch, no home-bin\n // pointer, no telemetry wrap. Each method is idempotent (byte-identical →\n // skip) via writeContentFile and reversible via removeContentFile. Honors\n // platforms[\"cline\"] per-surface false to skip.\n //\n // Native locations (the `.clinerules` content tree + the Documents-dir):\n // command → project <projectDir>/.clinerules/workflows/<name>.md\n // user ~/Documents/Cline/Workflows/<name>.md\n // skill → project <projectDir>/.clinerules/skills/<name>/SKILL.md\n // user (undocumented for the VS Code ext → skip-warn)\n\n /** The project-scope `.clinerules` content root. */\n private clineRulesDir(ctx: InstallContext): string {\n return join(ctx.projectDir, \".clinerules\");\n }\n\n private commandPath(ctx: InstallContext, name: string): string {\n return ctx.scope === \"project\"\n ? join(this.clineRulesDir(ctx), \"workflows\", `${name}.md`)\n : join(documentsDir(), \"Cline\", \"Workflows\", `${name}.md`);\n }\n\n private skillDir(ctx: InstallContext, name: string): string {\n // User/global scope → ~/.cline/skills/<name> (homedir/.cline, cross-OS via\n // homedir(); primary-verified cline/cline docs/customization/skills.mdx).\n // Project scope → <projectDir>/.clinerules/skills/<name> (a documented\n // project skills location alongside .cline/skills; AC owns the .clinerules tree).\n if (ctx.scope !== \"project\") {\n return join(homedir(), \".cline\", \"skills\", name);\n }\n return join(this.clineRulesDir(ctx), \"skills\", name);\n }\n\n // ── Commands (Workflows — both scopes) ────────────────────────────────────\n\n override installCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[this.id]?.commands === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"commands disabled for cline\" }];\n }\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.writeContentFile(\n this.commandPath(ctx, cmd.name),\n renderCommandMd(cmd, { includeToolsAndModel: false }),\n ctx.dryRun,\n ),\n );\n }\n\n override uninstallCommands(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.commands.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no commands\" }];\n }\n return connector.commands.map((cmd) =>\n this.removeContentFile(this.commandPath(ctx, cmd.name), ctx.dryRun),\n );\n }\n\n // ── Skills (project .clinerules/skills + user ~/.cline/skills) ────────────\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[this.id]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for cline\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const mcpPath = this.getServerConfigPath(ctx);\n const connectorId = ctx.connector.id;\n return [\n {\n name: `${this.name}: MCP settings present`,\n check: () =>\n existsSync(mcpPath)\n ? { status: \"OK\", detail: mcpPath }\n : { status: \"FAIL\", detail: `not found: ${mcpPath}` },\n },\n {\n name: `${this.name}: server entry registered`,\n check: () => {\n // Only assert what the connector declares: a server-less connector —\n // e.g. a catalog-only bundle of skills/commands — never writes an\n // mcpServers entry, so its absence is healthy.\n if (!ctx.connector.server) {\n return { status: \"OK\", detail: \"no MCP server declared\" };\n }\n const cfg = this.readJson<{ [k: string]: Record<string, unknown> }>(mcpPath);\n const bucket = cfg?.[MCP_ROOT_KEY];\n if (!cfg || !bucket) {\n return { status: \"FAIL\", detail: `no ${MCP_ROOT_KEY} in ${mcpPath}` };\n }\n return connectorId in bucket\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${connectorId} present` }\n : {\n status: \"FAIL\",\n detail: `no ${MCP_ROOT_KEY}.${connectorId} in ${mcpPath}`,\n };\n },\n },\n ];\n }\n}\n\nexport const adapter = new ClineAdapter();\nexport default adapter;\n"],"mappings":"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","names":["entry"]}
|