@shareai-lab/kode 2.0.2 → 2.0.3
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 +201 -0
- package/README.md +649 -25
- package/README.zh-CN.md +579 -0
- package/cli-acp.js +3 -17
- package/cli.js +5 -7
- package/dist/chunks/Doctor-M3J7GRTJ.js +12 -0
- package/dist/chunks/LogList-ISWZ6DDD.js +121 -0
- package/dist/chunks/LogList-ISWZ6DDD.js.map +7 -0
- package/dist/chunks/REPL-RQ6LO6S7.js +56 -0
- package/dist/chunks/ResumeConversation-6DMVBEGH.js +56 -0
- package/dist/chunks/agentLoader-FCRG3TFJ.js +31 -0
- package/dist/{agentsValidate-XP3CFN6F.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
- package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
- package/dist/{ask-3G5H5KD5.js → chunks/ask-D7SOHJ6Z.js} +36 -44
- package/dist/chunks/ask-D7SOHJ6Z.js.map +7 -0
- package/dist/chunks/autoUpdater-CNESBOKO.js +19 -0
- package/dist/{chunk-EH34V7CY.js → chunks/chunk-2JN5MY67.js} +12 -14
- package/dist/chunks/chunk-2JN5MY67.js.map +7 -0
- package/dist/chunks/chunk-2QONJ5MG.js +14 -0
- package/dist/chunks/chunk-2QONJ5MG.js.map +7 -0
- package/dist/chunks/chunk-2WEXPKHH.js +903 -0
- package/dist/chunks/chunk-2WEXPKHH.js.map +7 -0
- package/dist/{chunk-K2MI4TPB.js → chunks/chunk-3BYE3ME6.js} +717 -792
- package/dist/chunks/chunk-3BYE3ME6.js.map +7 -0
- package/dist/chunks/chunk-3JDNWX7W.js +1264 -0
- package/dist/chunks/chunk-3JDNWX7W.js.map +7 -0
- package/dist/chunks/chunk-3OEJVB5A.js +906 -0
- package/dist/chunks/chunk-3OEJVB5A.js.map +7 -0
- package/dist/chunks/chunk-3TNIOEBO.js +369 -0
- package/dist/chunks/chunk-3TNIOEBO.js.map +7 -0
- package/dist/chunks/chunk-4A46ZXMJ.js +67 -0
- package/dist/chunks/chunk-4A46ZXMJ.js.map +7 -0
- package/dist/{chunk-4GAIJGRH.js → chunks/chunk-4ATBQOFO.js} +107 -55
- package/dist/chunks/chunk-4ATBQOFO.js.map +7 -0
- package/dist/chunks/chunk-4CRUCZR4.js +0 -0
- package/dist/{chunk-54DNHKOD.js → chunks/chunk-4EO6SIQY.js} +32 -75
- package/dist/chunks/chunk-4EO6SIQY.js.map +7 -0
- package/dist/chunks/chunk-53M46S5I.js +64 -0
- package/dist/chunks/chunk-53M46S5I.js.map +7 -0
- package/dist/{chunk-JC6NCUG5.js → chunks/chunk-54KOYG5C.js} +0 -2
- package/dist/{chunk-EZXMVTDU.js → chunks/chunk-6BAS4WY6.js} +29 -45
- package/dist/chunks/chunk-6BAS4WY6.js.map +7 -0
- package/dist/{chunk-BHGTA6JQ.js → chunks/chunk-6KRRFSDN.js} +4 -6
- package/dist/chunks/chunk-6KRRFSDN.js.map +7 -0
- package/dist/chunks/chunk-6LJNZK4K.js +39 -0
- package/dist/chunks/chunk-6LJNZK4K.js.map +7 -0
- package/dist/chunks/chunk-6ZWEOSEI.js +666 -0
- package/dist/chunks/chunk-6ZWEOSEI.js.map +7 -0
- package/dist/chunks/chunk-77XDJMBP.js +3326 -0
- package/dist/chunks/chunk-77XDJMBP.js.map +7 -0
- package/dist/chunks/chunk-7RRW4NTB.js +6454 -0
- package/dist/chunks/chunk-7RRW4NTB.js.map +7 -0
- package/dist/chunks/chunk-7X3TW4JB.js +4520 -0
- package/dist/chunks/chunk-7X3TW4JB.js.map +7 -0
- package/dist/chunks/chunk-B3MW3YGY.js +1409 -0
- package/dist/chunks/chunk-B3MW3YGY.js.map +7 -0
- package/dist/chunks/chunk-BBJFHTBC.js +28 -0
- package/dist/chunks/chunk-BBJFHTBC.js.map +7 -0
- package/dist/chunks/chunk-BHDHXOXB.js +24 -0
- package/dist/chunks/chunk-BHDHXOXB.js.map +7 -0
- package/dist/{chunk-OZNRLY3E.js → chunks/chunk-BTA7SZ26.js} +152 -223
- package/dist/chunks/chunk-BTA7SZ26.js.map +7 -0
- package/dist/chunks/chunk-CDGRYGPZ.js +103 -0
- package/dist/chunks/chunk-CDGRYGPZ.js.map +7 -0
- package/dist/{chunk-S6HRABTA.js → chunks/chunk-CP6E5UG6.js} +1 -4
- package/dist/chunks/chunk-CP6E5UG6.js.map +7 -0
- package/dist/{chunk-2PMO2FS2.js → chunks/chunk-DQ4JHXMT.js} +462 -424
- package/dist/chunks/chunk-DQ4JHXMT.js.map +7 -0
- package/dist/chunks/chunk-DXD76CMV.js +208 -0
- package/dist/chunks/chunk-DXD76CMV.js.map +7 -0
- package/dist/chunks/chunk-GCQCAXJZ.js +0 -0
- package/dist/chunks/chunk-GELCZWMB.js +42 -0
- package/dist/chunks/chunk-GELCZWMB.js.map +7 -0
- package/dist/{chunk-NQLEUHMS.js → chunks/chunk-HJYOH4HC.js} +23 -18
- package/dist/chunks/chunk-HJYOH4HC.js.map +7 -0
- package/dist/chunks/chunk-HPYNW6TT.js +744 -0
- package/dist/chunks/chunk-HPYNW6TT.js.map +7 -0
- package/dist/{chunk-2KWKUXLT.js → chunks/chunk-HRJ3ICQK.js} +59 -55
- package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
- package/dist/{chunk-ZQU3TXLC.js → chunks/chunk-IFCIADS3.js} +571 -573
- package/dist/chunks/chunk-IFCIADS3.js.map +7 -0
- package/dist/chunks/chunk-IN7XZ7BC.js +27 -0
- package/dist/chunks/chunk-IN7XZ7BC.js.map +7 -0
- package/dist/chunks/chunk-L7P4M4KW.js +193 -0
- package/dist/chunks/chunk-L7P4M4KW.js.map +7 -0
- package/dist/chunks/chunk-LB6TCPDI.js +0 -0
- package/dist/{chunk-3RUXVV4S.js → chunks/chunk-LOCXPQNJ.js} +1 -4
- package/dist/{chunk-3RUXVV4S.js.map → chunks/chunk-LOCXPQNJ.js.map} +2 -2
- package/dist/{chunk-IE2CG2TV.js → chunks/chunk-LOD5ZHCI.js} +213 -208
- package/dist/chunks/chunk-LOD5ZHCI.js.map +7 -0
- package/dist/{chunk-S3J2TLV6.js → chunks/chunk-M7P3QNRU.js} +1 -4
- package/dist/{chunk-S3J2TLV6.js.map → chunks/chunk-M7P3QNRU.js.map} +2 -2
- package/dist/chunks/chunk-PPHLQVL7.js +4234 -0
- package/dist/chunks/chunk-PPHLQVL7.js.map +7 -0
- package/dist/{chunk-ABLVTESJ.js → chunks/chunk-QAXE37B5.js} +1 -4
- package/dist/chunks/chunk-QAXE37B5.js.map +7 -0
- package/dist/chunks/chunk-QHQOBUF6.js +60 -0
- package/dist/chunks/chunk-QHQOBUF6.js.map +7 -0
- package/dist/{chunk-SRZZFAS7.js → chunks/chunk-RPJXO7GG.js} +241 -214
- package/dist/chunks/chunk-RPJXO7GG.js.map +7 -0
- package/dist/{chunk-NPFOMITO.js → chunks/chunk-SWQV4KSY.js} +1 -4
- package/dist/{chunk-NPFOMITO.js.map → chunks/chunk-SWQV4KSY.js.map} +2 -2
- package/dist/chunks/chunk-SZLAPULP.js +28 -0
- package/dist/chunks/chunk-SZLAPULP.js.map +7 -0
- package/dist/{chunk-SDGKPKDK.js → chunks/chunk-T7RB5V5J.js} +23 -25
- package/dist/chunks/chunk-T7RB5V5J.js.map +7 -0
- package/dist/{chunk-HN4E4UUQ.js → chunks/chunk-TI2CTTMA.js} +25 -17
- package/dist/chunks/chunk-TI2CTTMA.js.map +7 -0
- package/dist/{chunk-G6I7XROM.js → chunks/chunk-TNGVRTO5.js} +45 -20
- package/dist/chunks/chunk-TNGVRTO5.js.map +7 -0
- package/dist/chunks/chunk-TNWB3U5Y.js +2077 -0
- package/dist/chunks/chunk-TNWB3U5Y.js.map +7 -0
- package/dist/chunks/chunk-U2IHWPCU.js +12 -0
- package/dist/chunks/chunk-U2IHWPCU.js.map +7 -0
- package/dist/{chunk-KAA5BGMQ.js → chunks/chunk-UNOY3VJ2.js} +1 -4
- package/dist/{chunk-KAA5BGMQ.js.map → chunks/chunk-UNOY3VJ2.js.map} +2 -2
- package/dist/{chunk-3TXNP6HH.js → chunks/chunk-UVDJL6ZZ.js} +97 -58
- package/dist/chunks/chunk-UVDJL6ZZ.js.map +7 -0
- package/dist/chunks/chunk-VNCW4C2Z.js +13452 -0
- package/dist/chunks/chunk-VNCW4C2Z.js.map +7 -0
- package/dist/chunks/chunk-W5EGGA44.js +15 -0
- package/dist/chunks/chunk-W5EGGA44.js.map +7 -0
- package/dist/chunks/chunk-XR2W3MAM.js +1533 -0
- package/dist/chunks/chunk-XR2W3MAM.js.map +7 -0
- package/dist/{chunk-QYFKRZQC.js → chunks/chunk-YIO5EBMQ.js} +423 -377
- package/dist/chunks/chunk-YIO5EBMQ.js.map +7 -0
- package/dist/chunks/chunk-ZBVLKZ5V.js +1062 -0
- package/dist/chunks/chunk-ZBVLKZ5V.js.map +7 -0
- package/dist/{chunk-E6YNABER.js → chunks/chunk-ZCLTZIVP.js} +1 -4
- package/dist/chunks/chunk-ZCLTZIVP.js.map +7 -0
- package/dist/chunks/client-SILZNM5N.js +42 -0
- package/dist/{config-6ZMBCL23.js → chunks/config-25HRTPSP.js} +48 -10
- package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
- package/dist/{customCommands-DNEJS3ZU.js → chunks/customCommands-TYMYZRG5.js} +11 -8
- package/dist/chunks/engine-MRVF6FK6.js +39 -0
- package/dist/{env-OFAXZ3XG.js → chunks/env-TJ5NOBEB.js} +7 -5
- package/dist/{kodeAgentSessionId-X6XWQW7B.js → chunks/kodeAgentSessionId-VTNISJ2L.js} +2 -4
- package/dist/chunks/kodeAgentSessionLoad-YB2RKBGJ.js +15 -0
- package/dist/chunks/kodeAgentSessionResume-DZSIVKVA.js +13 -0
- package/dist/chunks/kodeAgentStreamJson-X5PLS2S6.js +11 -0
- package/dist/{kodeAgentStreamJsonSession-GRWG3SPE.js → chunks/kodeAgentStreamJsonSession-RDXM4XYF.js} +38 -24
- package/dist/chunks/kodeAgentStreamJsonSession-RDXM4XYF.js.map +7 -0
- package/dist/{chunk-4RTX4AG4.js → chunks/kodeAgentStructuredStdio-SVGDSB4P.js} +14 -9
- package/dist/chunks/kodeAgentStructuredStdio-SVGDSB4P.js.map +7 -0
- package/dist/{kodeHooks-TDMXFWSO.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
- package/dist/{llm-XVXWYOHK.js → chunks/llm-62N6T5ZT.js} +1734 -1526
- package/dist/chunks/llm-62N6T5ZT.js.map +7 -0
- package/dist/chunks/llmLazy-ZUSSE3ZA.js +13 -0
- package/dist/{mentionProcessor-YD7YXYGF.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
- package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
- package/dist/{messages-OFUJSPRV.js → chunks/messages-EEWWLPHN.js} +2 -6
- package/dist/chunks/model-5TIEKQPD.js +37 -0
- package/dist/{openai-5G5D5Q4B.js → chunks/openai-XXK3YZG4.js} +13 -10
- package/dist/{outputStyles-HLDXFQK3.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
- package/dist/chunks/permissions-HO7INPWM.js +27 -0
- package/dist/{pluginRuntime-FPTKK6NY.js → chunks/pluginRuntime-C7K5ULK2.js} +31 -48
- package/dist/chunks/pluginRuntime-C7K5ULK2.js.map +7 -0
- package/dist/chunks/pluginValidation-DAM7WRTC.js +20 -0
- package/dist/chunks/registry-XYJXMOA5.js +60 -0
- package/dist/chunks/responsesStreaming-JNGE2P3D.js +8 -0
- package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js +577 -0
- package/dist/chunks/runNonTextPrintMode-SVBLCZQX.js.map +7 -0
- package/dist/chunks/server-REXXF5IK.js +46 -0
- package/dist/{skillMarketplace-PSNKDINM.js → chunks/skillMarketplace-N4HVHNST.js} +8 -6
- package/dist/chunks/src-OROQIWP3.js +44 -0
- package/dist/chunks/src-QXLGGMUW.js +1647 -0
- package/dist/chunks/src-QXLGGMUW.js.map +7 -0
- package/dist/{cli-SRV2INSL.js → chunks/src-SSDT6MVP.js} +2659 -3384
- package/dist/chunks/src-SSDT6MVP.js.map +7 -0
- package/dist/chunks/theme-YBJUIMWK.js +10 -0
- package/dist/{toolPermissionContext-65L65VEZ.js → chunks/toolPermissionContext-MOCTRR7N.js} +2 -4
- package/dist/chunks/toolPermissionSettings-EV2EJAXL.js +18 -0
- package/dist/chunks/toolPermissionSettings-EV2EJAXL.js.map +7 -0
- package/dist/chunks/uuid-6577SO6X.js +7 -0
- package/dist/chunks/uuid-6577SO6X.js.map +7 -0
- package/dist/chunks/webOnlyMode-ALXX7UQY.js +66 -0
- package/dist/chunks/webOnlyMode-ALXX7UQY.js.map +7 -0
- package/dist/entrypoints/cli.js +10 -0
- package/dist/entrypoints/cli.js.map +7 -0
- package/dist/entrypoints/daemon.js +10 -0
- package/dist/entrypoints/daemon.js.map +7 -0
- package/dist/entrypoints/mcp.js +71 -0
- package/dist/entrypoints/mcp.js.map +7 -0
- package/dist/index.js +6 -7
- package/dist/index.js.map +3 -3
- package/dist/sdk/client.cjs +391 -0
- package/dist/sdk/client.cjs.map +7 -0
- package/dist/sdk/client.js +364 -0
- package/dist/sdk/client.js.map +7 -0
- package/dist/sdk/core.cjs +19932 -0
- package/dist/sdk/core.cjs.map +7 -0
- package/dist/sdk/core.js +19893 -0
- package/dist/sdk/core.js.map +7 -0
- package/dist/sdk/daemon-client.cjs +257 -0
- package/dist/sdk/daemon-client.cjs.map +7 -0
- package/dist/sdk/daemon-client.js +221 -0
- package/dist/sdk/daemon-client.js.map +7 -0
- package/dist/sdk/protocol.cjs +170 -0
- package/dist/sdk/protocol.cjs.map +7 -0
- package/dist/sdk/protocol.js +140 -0
- package/dist/sdk/protocol.js.map +7 -0
- package/dist/sdk/runtime-node.cjs +236 -0
- package/dist/sdk/runtime-node.cjs.map +7 -0
- package/dist/sdk/runtime-node.js +222 -0
- package/dist/sdk/runtime-node.js.map +7 -0
- package/dist/sdk/runtime.cjs +17 -0
- package/dist/sdk/runtime.cjs.map +7 -0
- package/dist/sdk/runtime.js +0 -0
- package/dist/sdk/runtime.js.map +7 -0
- package/dist/sdk/tools.cjs +30300 -0
- package/dist/sdk/tools.cjs.map +7 -0
- package/dist/sdk/tools.js +30282 -0
- package/dist/sdk/tools.js.map +7 -0
- package/dist/webui/assets/index-5hlfByVS.css +1 -0
- package/dist/webui/assets/index-BR9lm1lA.js +82 -0
- package/dist/webui/index.html +28 -0
- package/package.json +93 -22
- package/scripts/binary-utils.cjs +12 -4
- package/scripts/cli-acp-wrapper.cjs +3 -17
- package/scripts/cli-wrapper.cjs +5 -7
- package/scripts/postinstall.js +8 -4
- package/dist/REPL-GIU4ZIXM.js +0 -42
- package/dist/acp-H3VJ77YG.js +0 -1357
- package/dist/acp-H3VJ77YG.js.map +0 -7
- package/dist/agentsValidate-XP3CFN6F.js.map +0 -7
- package/dist/ask-3G5H5KD5.js.map +0 -7
- package/dist/autoUpdater-DNRMJWFQ.js +0 -17
- package/dist/chunk-2KWKUXLT.js.map +0 -7
- package/dist/chunk-2PMO2FS2.js.map +0 -7
- package/dist/chunk-3TXNP6HH.js.map +0 -7
- package/dist/chunk-4GAIJGRH.js.map +0 -7
- package/dist/chunk-4RTX4AG4.js.map +0 -7
- package/dist/chunk-54DNHKOD.js.map +0 -7
- package/dist/chunk-67PY5IX6.js +0 -34
- package/dist/chunk-67PY5IX6.js.map +0 -7
- package/dist/chunk-6DRDLOLP.js +0 -2613
- package/dist/chunk-6DRDLOLP.js.map +0 -7
- package/dist/chunk-7CQVZNQV.js +0 -1609
- package/dist/chunk-7CQVZNQV.js.map +0 -7
- package/dist/chunk-ABLVTESJ.js.map +0 -7
- package/dist/chunk-AIMIPK4B.js +0 -835
- package/dist/chunk-AIMIPK4B.js.map +0 -7
- package/dist/chunk-BHGTA6JQ.js.map +0 -7
- package/dist/chunk-CIG63V4E.js +0 -72
- package/dist/chunk-CIG63V4E.js.map +0 -7
- package/dist/chunk-E6YNABER.js.map +0 -7
- package/dist/chunk-EH34V7CY.js.map +0 -7
- package/dist/chunk-EZXMVTDU.js.map +0 -7
- package/dist/chunk-FH5CHM6L.js +0 -148
- package/dist/chunk-FH5CHM6L.js.map +0 -7
- package/dist/chunk-G6I7XROM.js.map +0 -7
- package/dist/chunk-HN4E4UUQ.js.map +0 -7
- package/dist/chunk-HSPVVDIW.js +0 -30198
- package/dist/chunk-HSPVVDIW.js.map +0 -7
- package/dist/chunk-IE2CG2TV.js.map +0 -7
- package/dist/chunk-K2MI4TPB.js.map +0 -7
- package/dist/chunk-MN77D2F7.js +0 -2931
- package/dist/chunk-MN77D2F7.js.map +0 -7
- package/dist/chunk-NQLEUHMS.js.map +0 -7
- package/dist/chunk-OIFQB3S4.js +0 -515
- package/dist/chunk-OIFQB3S4.js.map +0 -7
- package/dist/chunk-OWTG2W3A.js +0 -164
- package/dist/chunk-OWTG2W3A.js.map +0 -7
- package/dist/chunk-OZNRLY3E.js.map +0 -7
- package/dist/chunk-QYFKRZQC.js.map +0 -7
- package/dist/chunk-S6HRABTA.js.map +0 -7
- package/dist/chunk-SDGKPKDK.js.map +0 -7
- package/dist/chunk-SRZZFAS7.js.map +0 -7
- package/dist/chunk-UKHTVRJM.js +0 -47
- package/dist/chunk-UKHTVRJM.js.map +0 -7
- package/dist/chunk-UYXEDKOZ.js +0 -24
- package/dist/chunk-UYXEDKOZ.js.map +0 -7
- package/dist/chunk-VBXVYQYY.js +0 -145
- package/dist/chunk-VBXVYQYY.js.map +0 -7
- package/dist/chunk-WVHORZQ5.js +0 -17
- package/dist/chunk-WVHORZQ5.js.map +0 -7
- package/dist/chunk-WWUWDNWW.js +0 -49
- package/dist/chunk-WWUWDNWW.js.map +0 -7
- package/dist/chunk-Z33T5YN5.js +0 -654
- package/dist/chunk-Z33T5YN5.js.map +0 -7
- package/dist/chunk-ZQU3TXLC.js.map +0 -7
- package/dist/cli-SRV2INSL.js.map +0 -7
- package/dist/commands-TWH6PGVG.js +0 -46
- package/dist/context-JQIOOI4W.js +0 -30
- package/dist/costTracker-6SL26FDB.js +0 -19
- package/dist/kodeAgentSessionLoad-6N27AC5K.js +0 -18
- package/dist/kodeAgentSessionResume-HUSAEO24.js +0 -16
- package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
- package/dist/kodeAgentStreamJsonSession-GRWG3SPE.js.map +0 -7
- package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
- package/dist/llm-XVXWYOHK.js.map +0 -7
- package/dist/llmLazy-7TD5N7XP.js +0 -15
- package/dist/loader-AUXIJTY6.js +0 -28
- package/dist/mcp-BXJ3K7NZ.js +0 -49
- package/dist/mentionProcessor-YD7YXYGF.js.map +0 -7
- package/dist/model-KPYCXWBK.js +0 -30
- package/dist/pluginRuntime-FPTKK6NY.js.map +0 -7
- package/dist/pluginValidation-DSFXZ4GF.js +0 -17
- package/dist/prompts-LWLAJRS2.js +0 -48
- package/dist/query-HVPWL27C.js +0 -50
- package/dist/responsesStreaming-AW344PQO.js +0 -10
- package/dist/ripgrep-YOPCY2GO.js +0 -17
- package/dist/state-KNRWP3FO.js +0 -16
- package/dist/theme-7S2QN2FO.js +0 -14
- package/dist/toolPermissionSettings-GPOBH4IV.js +0 -18
- package/dist/tools-FZU2FZBD.js +0 -47
- package/dist/userInput-VHNBN2MW.js +0 -311
- package/dist/userInput-VHNBN2MW.js.map +0 -7
- package/dist/uuid-QN2CNKKN.js +0 -9
- /package/dist/{REPL-GIU4ZIXM.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
- /package/dist/{autoUpdater-DNRMJWFQ.js.map → chunks/REPL-RQ6LO6S7.js.map} +0 -0
- /package/dist/{chunk-JC6NCUG5.js.map → chunks/ResumeConversation-6DMVBEGH.js.map} +0 -0
- /package/dist/{commands-TWH6PGVG.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
- /package/dist/{config-6ZMBCL23.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
- /package/dist/{context-JQIOOI4W.js.map → chunks/chunk-4CRUCZR4.js.map} +0 -0
- /package/dist/{costTracker-6SL26FDB.js.map → chunks/chunk-54KOYG5C.js.map} +0 -0
- /package/dist/{customCommands-DNEJS3ZU.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
- /package/dist/{env-OFAXZ3XG.js.map → chunks/chunk-LB6TCPDI.js.map} +0 -0
- /package/dist/{kodeAgentSessionId-X6XWQW7B.js.map → chunks/client-SILZNM5N.js.map} +0 -0
- /package/dist/{kodeAgentSessionLoad-6N27AC5K.js.map → chunks/config-25HRTPSP.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-HUSAEO24.js.map → chunks/cost-tracker-Z2UZT2J5.js.map} +0 -0
- /package/dist/{kodeAgentStreamJson-NXFN7TXH.js.map → chunks/customCommands-TYMYZRG5.js.map} +0 -0
- /package/dist/{kodeAgentStructuredStdio-HGWJT7CU.js.map → chunks/engine-MRVF6FK6.js.map} +0 -0
- /package/dist/{kodeHooks-TDMXFWSO.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
- /package/dist/{llmLazy-7TD5N7XP.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
- /package/dist/{loader-AUXIJTY6.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
- /package/dist/{mcp-BXJ3K7NZ.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
- /package/dist/{messages-OFUJSPRV.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
- /package/dist/{model-KPYCXWBK.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
- /package/dist/{openai-5G5D5Q4B.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
- /package/dist/{outputStyles-HLDXFQK3.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
- /package/dist/{pluginValidation-DSFXZ4GF.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
- /package/dist/{prompts-LWLAJRS2.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
- /package/dist/{query-HVPWL27C.js.map → chunks/outputStyles-FAJTXN2A.js.map} +0 -0
- /package/dist/{responsesStreaming-AW344PQO.js.map → chunks/permissions-HO7INPWM.js.map} +0 -0
- /package/dist/{ripgrep-YOPCY2GO.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
- /package/dist/{skillMarketplace-PSNKDINM.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
- /package/dist/{state-KNRWP3FO.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
- /package/dist/{theme-7S2QN2FO.js.map → chunks/server-REXXF5IK.js.map} +0 -0
- /package/dist/{toolPermissionContext-65L65VEZ.js.map → chunks/skillMarketplace-N4HVHNST.js.map} +0 -0
- /package/dist/{toolPermissionSettings-GPOBH4IV.js.map → chunks/src-OROQIWP3.js.map} +0 -0
- /package/dist/{tools-FZU2FZBD.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
- /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
package/dist/acp-H3VJ77YG.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/acp/jsonrpc.ts", "../src/acp/stdioTransport.ts", "../src/acp/stdoutGuard.ts", "../src/acp/kodeAcpAgent.ts", "../src/acp/protocol.ts", "../src/entrypoints/acp.ts"],
|
|
4
|
-
"sourcesContent": ["import { format } from 'node:util'\n\nexport type JsonRpcId = string | number | null\n\nexport type JsonRpcRequest = {\n jsonrpc: '2.0'\n id: string | number\n method: string\n params?: unknown\n}\n\nexport type JsonRpcNotification = {\n jsonrpc: '2.0'\n method: string\n params?: unknown\n}\n\nexport type JsonRpcResponse = {\n jsonrpc: '2.0'\n id: JsonRpcId\n result?: unknown\n error?: { code: number; message: string; data?: unknown }\n}\n\ntype JsonRpcIncoming = JsonRpcRequest | JsonRpcNotification | JsonRpcResponse\n\nexport class JsonRpcError extends Error {\n readonly code: number\n readonly data?: unknown\n\n constructor(code: number, message: string, data?: unknown) {\n super(message)\n this.code = code\n this.data = data\n }\n}\n\nexport type JsonRpcHandler = (params: unknown) => Promise<unknown> | unknown\n\nconst JSONRPC_VERSION = '2.0'\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return format(value)\n }\n}\n\nfunction makeErrorResponse(\n id: JsonRpcId,\n code: number,\n message: string,\n data?: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n error: data === undefined ? { code, message } : { code, message, data },\n }\n}\n\nfunction normalizeId(id: unknown): JsonRpcId {\n return typeof id === 'string' || typeof id === 'number' ? id : null\n}\n\nexport class JsonRpcPeer {\n private readonly handlers = new Map<string, JsonRpcHandler>()\n private readonly pending = new Map<\n string | number,\n {\n resolve: (value: unknown) => void\n reject: (err: unknown) => void\n abort?: AbortSignal\n timeoutId?: NodeJS.Timeout\n }\n >()\n private nextId = 1\n private sendLine: ((line: string) => void) | null = null\n\n setSend(send: (line: string) => void): void {\n this.sendLine = send\n }\n\n registerMethod(method: string, handler: JsonRpcHandler): void {\n this.handlers.set(method, handler)\n }\n\n async handleIncoming(payload: unknown): Promise<void> {\n if (Array.isArray(payload)) {\n const responses: JsonRpcResponse[] = []\n for (const item of payload) {\n const r = await this.handleIncomingOne(item)\n if (r) responses.push(r)\n }\n if (responses.length > 0) {\n this.sendRaw(responses)\n }\n return\n }\n\n const response = await this.handleIncomingOne(payload)\n if (response) this.sendRaw(response)\n }\n\n private async handleIncomingOne(payload: unknown): Promise<JsonRpcResponse | null> {\n if (!isObject(payload)) {\n return makeErrorResponse(null, -32600, 'Invalid Request')\n }\n\n const jsonrpc = payload.jsonrpc\n if (jsonrpc !== JSONRPC_VERSION) {\n return makeErrorResponse(normalizeId(payload.id), -32600, 'Invalid Request')\n }\n\n const hasMethod = typeof payload.method === 'string' && payload.method.length > 0\n const hasId = typeof payload.id === 'string' || typeof payload.id === 'number'\n\n if (!hasMethod && hasId && ('result' in payload || 'error' in payload)) {\n this.handleResponse(payload as unknown as JsonRpcResponse)\n return null\n }\n\n if (!hasMethod) {\n return makeErrorResponse(normalizeId(payload.id), -32600, 'Invalid Request')\n }\n\n const method = String(payload.method)\n const params = 'params' in payload ? (payload as any).params : undefined\n const id = hasId ? (payload.id as string | number) : null\n\n const handler = this.handlers.get(method)\n if (!handler) {\n if (id === null) return null\n return makeErrorResponse(id, -32601, `Method not found: ${method}`)\n }\n\n if (id === null) {\n try {\n await handler(params)\n } catch {\n }\n return null\n }\n\n try {\n const result = await handler(params)\n return { jsonrpc: JSONRPC_VERSION, id, result: result ?? null }\n } catch (err) {\n if (err instanceof JsonRpcError) {\n return makeErrorResponse(id, err.code, err.message, err.data)\n }\n const message = err instanceof Error ? err.message : safeStringify(err)\n return makeErrorResponse(id, -32603, message)\n }\n }\n\n private handleResponse(msg: JsonRpcResponse): void {\n const id = normalizeId(msg.id)\n if (id === null) return\n const pending = this.pending.get(id)\n if (!pending) return\n this.pending.delete(id)\n\n if (pending.timeoutId) clearTimeout(pending.timeoutId)\n\n if (msg && typeof msg === 'object' && 'error' in msg && (msg as any).error) {\n const e = (msg as any).error\n const code = typeof e.code === 'number' ? e.code : -32603\n const message = typeof e.message === 'string' ? e.message : 'Unknown error'\n pending.reject(new JsonRpcError(code, message, e.data))\n return\n }\n\n pending.resolve((msg as any).result)\n }\n\n sendNotification(method: string, params?: unknown): void {\n this.sendRaw({ jsonrpc: JSONRPC_VERSION, method, ...(params !== undefined ? { params } : {}) })\n }\n\n sendRequest<T = unknown>(args: {\n method: string\n params?: unknown\n signal?: AbortSignal\n timeoutMs?: number\n }): Promise<T> {\n const id = this.nextId++\n const timeoutMs = args.timeoutMs\n\n const p = new Promise<T>((resolve, reject) => {\n const entry: {\n resolve: (value: unknown) => void\n reject: (err: unknown) => void\n abort?: AbortSignal\n timeoutId?: NodeJS.Timeout\n } = { resolve, reject, abort: args.signal }\n\n if (timeoutMs && Number.isFinite(timeoutMs) && timeoutMs > 0) {\n entry.timeoutId = setTimeout(() => {\n this.pending.delete(id)\n reject(new JsonRpcError(-32000, `Request timed out: ${args.method}`))\n }, timeoutMs)\n }\n\n if (args.signal) {\n const onAbort = () => {\n this.pending.delete(id)\n if (entry.timeoutId) clearTimeout(entry.timeoutId)\n reject(new JsonRpcError(-32000, `Request aborted: ${args.method}`))\n }\n if (args.signal.aborted) {\n onAbort()\n return\n }\n args.signal.addEventListener('abort', onAbort, { once: true })\n }\n\n this.pending.set(id, entry)\n })\n\n this.sendRaw({\n jsonrpc: JSONRPC_VERSION,\n id,\n method: args.method,\n ...(args.params !== undefined ? { params: args.params } : {}),\n })\n\n return p\n }\n\n private sendRaw(obj: unknown): void {\n const send = this.sendLine\n if (!send) {\n throw new Error('JsonRpcPeer send() not configured')\n }\n const line = JSON.stringify(obj)\n send(line)\n }\n}\n\n", "import readline from 'node:readline'\n\nimport { JsonRpcPeer } from './jsonrpc'\n\ntype TransportOptions = {\n writeLine: (line: string) => void\n}\n\nexport class StdioTransport {\n private rl: readline.Interface | null = null\n private readonly pending = new Set<Promise<void>>()\n\n constructor(\n private readonly peer: JsonRpcPeer,\n private readonly opts: TransportOptions,\n ) {}\n\n start(): void {\n if (this.rl) return\n\n this.peer.setSend(this.opts.writeLine)\n\n this.rl = readline.createInterface({\n input: process.stdin,\n crlfDelay: Infinity,\n })\n\n this.rl.on('line', line => {\n const trimmed = line.trim()\n if (!trimmed) return\n\n try {\n const payload = JSON.parse(trimmed)\n const p = this.peer.handleIncoming(payload).catch(() => {\n })\n this.pending.add(p)\n void p.finally(() => this.pending.delete(p))\n } catch (err) {\n this.opts.writeLine(\n JSON.stringify({\n jsonrpc: '2.0',\n id: null,\n error: { code: -32700, message: 'Parse error' },\n }),\n )\n }\n })\n\n this.rl.on('close', () => {\n void (async () => {\n const pending = Array.from(this.pending)\n if (pending.length > 0) {\n await Promise.allSettled(pending)\n }\n process.exit(0)\n })()\n })\n }\n\n stop(): void {\n this.rl?.close()\n this.rl = null\n }\n}\n", "import { format } from 'node:util'\n\ntype WriteFn = typeof process.stdout.write\n\ntype GuardHandle = {\n writeAcpLine: (line: string) => void\n restore: () => void\n originalStdoutWrite: WriteFn\n}\n\nfunction writeTo(\n write: WriteFn,\n chunk: unknown,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void,\n): boolean {\n if (typeof encoding === 'function') {\n return write(chunk as any, undefined as any, encoding as any)\n }\n return write(chunk as any, encoding as any, cb as any)\n}\n\nexport function installStdoutGuard(): GuardHandle {\n const originalStdoutWrite = process.stdout.write.bind(process.stdout)\n const originalStderrWrite = process.stderr.write.bind(process.stderr)\n\n const originalConsoleLog = console.log.bind(console)\n const originalConsoleInfo = console.info.bind(console)\n const originalConsoleDebug = console.debug.bind(console)\n const originalConsoleWarn = console.warn.bind(console)\n const originalConsoleError = console.error.bind(console)\n\n const writeAcpLine = (line: string) => {\n writeTo(originalStdoutWrite, `${line}\\n`)\n }\n\n const writeLogToStderr = (...args: unknown[]) => {\n writeTo(originalStderrWrite, `${format(...args)}\\n`)\n }\n\n console.log = writeLogToStderr as any\n console.info = writeLogToStderr as any\n console.debug = writeLogToStderr as any\n console.warn = writeLogToStderr as any\n console.error = writeLogToStderr as any\n\n process.stdout.write = ((chunk: any, encoding?: any, cb?: any) => {\n return writeTo(originalStderrWrite, chunk, encoding, cb)\n }) as any\n\n const restore = () => {\n process.stdout.write = originalStdoutWrite as any\n console.log = originalConsoleLog as any\n console.info = originalConsoleInfo as any\n console.debug = originalConsoleDebug as any\n console.warn = originalConsoleWarn as any\n console.error = originalConsoleError as any\n }\n\n return { writeAcpLine, restore, originalStdoutWrite }\n}\n\n", "import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'\nimport { dirname, isAbsolute, join, resolve } from 'node:path'\n\nimport { nanoid } from 'nanoid'\n\nimport { JsonRpcError, JsonRpcPeer } from './jsonrpc'\nimport * as Protocol from './protocol'\n\nimport { MACRO } from '@constants/macros'\nimport { PRODUCT_COMMAND } from '@constants/product'\nimport { getContext } from '@context'\nimport { getCommands, type Command } from '@commands'\nimport { getTools } from '@tools'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { query, type Message, type UserMessage, type AssistantMessage } from '@query'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { createAssistantMessage, createUserMessage } from '@utils/messages'\nimport { getSystemPrompt } from '@constants/prompts'\nimport { logError } from '@utils/log'\nimport { setCwd, setOriginalCwd } from '@utils/state'\nimport { grantReadPermissionForOriginalDir } from '@utils/permissions/filesystem'\nimport { getKodeBaseDir } from '@utils/config/env'\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'\nimport {\n loadToolPermissionContextFromDisk,\n persistToolPermissionUpdateToDisk,\n} from '@utils/permissions/toolPermissionSettings'\nimport { applyToolPermissionContextUpdates } from '@kode-types/toolPermissionContext'\nimport type { ToolPermissionContext } from '@kode-types/toolPermissionContext'\nimport type { CanUseToolFn } from '@kode-types/canUseTool'\nimport type { WrappedClient } from '@services/mcpClient'\nimport { getClients } from '@services/mcpClient'\n\ntype SessionState = {\n sessionId: string\n cwd: string\n mcpServers: Protocol.McpServer[]\n mcpClients: WrappedClient[]\n\n commands: Command[]\n tools: Tool[]\n\n systemPrompt: string[]\n context: Record<string, string>\n\n messages: Message[]\n toolPermissionContext: ToolPermissionContext\n readFileTimestamps: Record<string, number>\n responseState: ToolUseContext['responseState']\n\n currentModeId: Protocol.SessionModeId\n activeAbortController: AbortController | null\n\n toolCalls: Map<\n string,\n {\n title: string\n kind: Protocol.ToolKind\n status: Protocol.ToolCallStatus\n rawInput?: Protocol.JsonObject\n fileSnapshot?: {\n path: string\n content: string\n }\n }\n >\n}\n\nfunction asJsonObject(value: unknown): Protocol.JsonObject | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined\n try {\n JSON.stringify(value)\n return value as Protocol.JsonObject\n } catch {\n return undefined\n }\n}\n\nfunction toolKindForName(toolName: string): Protocol.ToolKind {\n switch (toolName) {\n case 'Read':\n return 'read'\n case 'Write':\n case 'Edit':\n case 'MultiEdit':\n case 'NotebookEdit':\n return 'edit'\n case 'Grep':\n case 'Glob':\n return 'search'\n case 'Bash':\n case 'TaskOutput':\n case 'KillShell':\n return 'execute'\n case 'SwitchModel':\n return 'switch_mode'\n default:\n return 'other'\n }\n}\n\nfunction titleForToolCall(toolName: string, input: Record<string, unknown>): string {\n if (toolName === 'Read' && typeof input.file_path === 'string') {\n return `Read ${input.file_path}`\n }\n if ((toolName === 'Write' || toolName === 'Edit' || toolName === 'MultiEdit') && typeof input.file_path === 'string') {\n return `${toolName} ${input.file_path}`\n }\n if (toolName === 'Bash' && typeof input.command === 'string') {\n const cmd = input.command.trim().replace(/\\s+/g, ' ')\n const clipped = cmd.length > 120 ? `${cmd.slice(0, 117)}...` : cmd\n return `Run ${clipped}`\n }\n return toolName\n}\n\nfunction blocksToText(blocks: Protocol.ContentBlock[]): string {\n const parts: string[] = []\n\n for (const block of blocks) {\n if (!block || typeof block !== 'object') continue\n\n switch ((block as any).type) {\n case 'text': {\n const text = typeof (block as any).text === 'string' ? (block as any).text : ''\n if (text) parts.push(text)\n break\n }\n case 'resource': {\n const resource = (block as any).resource || {}\n const uri = typeof resource.uri === 'string' ? resource.uri : ''\n const mimeType =\n typeof resource.mimeType === 'string' && resource.mimeType ? resource.mimeType : 'text/plain'\n if (typeof resource.text === 'string') {\n parts.push(\n [\n '',\n `@resource ${uri} (${mimeType})`,\n '```',\n resource.text,\n '```',\n ].join('\\n'),\n )\n } else if (typeof resource.blob === 'string') {\n parts.push(\n [\n '',\n `@resource ${uri} (${mimeType}) [base64]`,\n resource.blob,\n ].join('\\n'),\n )\n } else if (uri) {\n parts.push(`@resource ${uri} (${mimeType})`)\n }\n break\n }\n case 'resource_link': {\n const uri = typeof (block as any).uri === 'string' ? (block as any).uri : ''\n const name = typeof (block as any).name === 'string' ? (block as any).name : ''\n const title = typeof (block as any).title === 'string' ? (block as any).title : ''\n const description =\n typeof (block as any).description === 'string' ? (block as any).description : ''\n\n parts.push(\n [\n '',\n `@resource_link ${name || uri}`,\n ...(title ? [title] : []),\n ...(description ? [description] : []),\n ...(uri ? [uri] : []),\n ].join('\\n'),\n )\n break\n }\n case 'image':\n case 'audio': {\n break\n }\n default:\n break\n }\n }\n\n return parts.join('\\n').trim()\n}\n\nfunction extractAssistantText(msg: AssistantMessage): string {\n const blocks: any[] = Array.isArray((msg as any)?.message?.content) ? ((msg as any).message.content as any[]) : []\n const texts: string[] = []\n for (const b of blocks) {\n if (!b || typeof b !== 'object') continue\n if (b.type === 'text' && typeof b.text === 'string') texts.push(b.text)\n if (b.type === 'thinking' && typeof (b as any).thinking === 'string') texts.push((b as any).thinking)\n }\n return texts.join('').trim()\n}\n\nfunction extractToolUses(msg: AssistantMessage): Array<{ id: string; name: string; input: Record<string, unknown> }> {\n const blocks: any[] = Array.isArray((msg as any)?.message?.content) ? ((msg as any).message.content as any[]) : []\n const out: Array<{ id: string; name: string; input: Record<string, unknown> }> = []\n for (const b of blocks) {\n if (!b || typeof b !== 'object') continue\n if (b.type !== 'tool_use') continue\n const id = typeof b.id === 'string' ? b.id : ''\n const name = typeof b.name === 'string' ? b.name : ''\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\n if (id && name) out.push({ id, name, input })\n }\n return out\n}\n\nfunction extractToolResults(msg: UserMessage): Array<{ toolUseId: string; isError: boolean; content: string }> {\n const content = (msg as any)?.message?.content\n const blocks: any[] = Array.isArray(content) ? content : []\n const out: Array<{ toolUseId: string; isError: boolean; content: string }> = []\n\n for (const b of blocks) {\n if (!b || typeof b !== 'object') continue\n if (b.type !== 'tool_result') continue\n const toolUseId = typeof b.tool_use_id === 'string' ? b.tool_use_id : ''\n const isError = Boolean(b.is_error)\n const raw = b.content\n const text =\n typeof raw === 'string'\n ? raw\n : Array.isArray(raw)\n ? raw\n .filter(x => x && typeof x === 'object' && (x as any).type === 'text')\n .map(x => String((x as any).text ?? ''))\n .join('')\n : ''\n if (toolUseId) out.push({ toolUseId, isError, content: text })\n }\n\n return out\n}\n\nconst ACP_SESSION_STORE_VERSION = 1\nconst MAX_DIFF_FILE_BYTES = 512_000\nconst MAX_DIFF_TEXT_CHARS = 400_000\n\ntype PersistedAcpSession = {\n version: number\n sessionId: string\n cwd: string\n mcpServers: Protocol.McpServer[]\n messages: Message[]\n toolPermissionContext: ToolPermissionContext\n readFileTimestamps: Record<string, number>\n responseState: ToolUseContext['responseState']\n currentModeId: Protocol.SessionModeId\n}\n\nfunction getProjectDirSlug(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nfunction sanitizeSessionId(sessionId: string): string {\n return sessionId.replace(/[^a-zA-Z0-9_-]/g, '_')\n}\n\nfunction getAcpSessionDir(cwd: string): string {\n return join(getKodeBaseDir(), getProjectDirSlug(cwd), 'acp-sessions')\n}\n\nfunction getAcpSessionFilePath(cwd: string, sessionId: string): string {\n return join(getAcpSessionDir(cwd), `${sanitizeSessionId(sessionId)}.json`)\n}\n\nfunction readTextFileForDiff(filePath: string): string | null {\n try {\n const stats = statSync(filePath)\n if (!stats.isFile()) return null\n if (stats.size > MAX_DIFF_FILE_BYTES) return null\n return readFileSync(filePath, 'utf8')\n } catch {\n return null\n }\n}\n\nfunction truncateDiffText(text: string): string {\n if (text.length <= MAX_DIFF_TEXT_CHARS) return text\n return `${text.slice(0, MAX_DIFF_TEXT_CHARS)}\\n\\n[truncated ${text.length - MAX_DIFF_TEXT_CHARS} chars]`\n}\n\nfunction persistAcpSessionToDisk(session: SessionState): void {\n try {\n const dir = getAcpSessionDir(session.cwd)\n mkdirSync(dir, { recursive: true })\n\n const payload: PersistedAcpSession = {\n version: ACP_SESSION_STORE_VERSION,\n sessionId: session.sessionId,\n cwd: session.cwd,\n mcpServers: session.mcpServers,\n messages: session.messages,\n toolPermissionContext: session.toolPermissionContext,\n readFileTimestamps: session.readFileTimestamps,\n responseState: session.responseState,\n currentModeId: session.currentModeId,\n }\n\n const path = getAcpSessionFilePath(session.cwd, session.sessionId)\n writeFileSync(path, JSON.stringify(payload, null, 2), 'utf8')\n } catch (e) {\n logError(e)\n }\n}\n\nfunction loadAcpSessionFromDisk(cwd: string, sessionId: string): PersistedAcpSession | null {\n try {\n const path = getAcpSessionFilePath(cwd, sessionId)\n if (!existsSync(path)) return null\n const raw = readFileSync(path, 'utf8')\n const parsed = JSON.parse(raw) as PersistedAcpSession\n if (!parsed || typeof parsed !== 'object') return null\n if (parsed.sessionId !== sessionId) return null\n if (typeof parsed.cwd !== 'string' || parsed.cwd !== cwd) return null\n if (!Array.isArray(parsed.messages)) return null\n return parsed\n } catch {\n return null\n }\n}\n\nasync function connectAcpMcpServers(mcpServers: Protocol.McpServer[]): Promise<WrappedClient[]> {\n if (!Array.isArray(mcpServers) || mcpServers.length === 0) return []\n\n const rawTimeout = process.env.MCP_CONNECTION_TIMEOUT_MS\n const parsedTimeout = rawTimeout ? Number.parseInt(rawTimeout, 10) : NaN\n const timeoutMs = Number.isFinite(parsedTimeout) ? parsedTimeout : 30_000\n\n const results: WrappedClient[] = []\n\n type Candidate = { kind: 'stdio' | 'http' | 'sse'; transport: unknown }\n\n const connectWithTimeout = async (client: Client, transport: unknown, name: string): Promise<void> => {\n const connectPromise = client.connect(transport as any)\n if (timeoutMs > 0) {\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(`Connection to MCP server \"${name}\" timed out after ${timeoutMs}ms`))\n }, timeoutMs)\n connectPromise.then(\n () => clearTimeout(timeoutId),\n () => clearTimeout(timeoutId),\n )\n })\n await Promise.race([connectPromise, timeoutPromise])\n } else {\n await connectPromise\n }\n }\n\n for (const server of mcpServers) {\n const serverType = typeof (server as any)?.type === 'string' ? String((server as any).type) : 'stdio'\n\n const name = typeof (server as any)?.name === 'string' ? String((server as any).name) : ''\n if (!name) {\n results.push({ name: '<invalid>', type: 'failed' })\n continue\n }\n\n const candidates: Candidate[] = []\n\n\t if (serverType === 'http' || serverType === 'sse') {\n\t const url = typeof (server as any)?.url === 'string' ? String((server as any).url) : ''\n\t if (!url) {\n\t results.push({ name, type: 'failed' })\n\t continue\n\t }\n\t\n\t let parsedUrl: URL\n\t try {\n\t parsedUrl = new URL(url)\n\t } catch (e) {\n\t logError(e)\n\t results.push({ name, type: 'failed' })\n\t continue\n\t }\n\n\t const headerList = Array.isArray((server as any)?.headers) ? ((server as any).headers as unknown[]) : []\n\t const headers: Record<string, string> = {}\n\t for (const h of headerList) {\n\t if (!h || typeof h !== 'object') continue\n const k = typeof (h as any).name === 'string' ? String((h as any).name) : ''\n const val = typeof (h as any).value === 'string' ? String((h as any).value) : ''\n if (k) headers[k] = val\n }\n\n\t const requestInit = Object.keys(headers).length > 0 ? { requestInit: { headers } } : {}\n\n\t if (serverType === 'http') {\n\t candidates.push(\n\t { kind: 'http', transport: new StreamableHTTPClientTransport(parsedUrl, requestInit as any) },\n\t { kind: 'sse', transport: new SSEClientTransport(parsedUrl, requestInit as any) },\n\t )\n\t } else {\n\t candidates.push(\n\t { kind: 'sse', transport: new SSEClientTransport(parsedUrl, requestInit as any) },\n\t { kind: 'http', transport: new StreamableHTTPClientTransport(parsedUrl, requestInit as any) },\n\t )\n\t }\n\t } else {\n const command = typeof (server as any)?.command === 'string' ? String((server as any).command) : ''\n const args = Array.isArray((server as any)?.args) ? ((server as any).args as unknown[]).map(a => String(a)) : []\n const envList = Array.isArray((server as any)?.env) ? ((server as any).env as unknown[]) : []\n\n if (!command) {\n results.push({ name, type: 'failed' })\n continue\n }\n\n const envFromParams: Record<string, string> = {}\n for (const v of envList) {\n if (!v || typeof v !== 'object') continue\n const k = typeof (v as any).name === 'string' ? String((v as any).name) : ''\n const val = typeof (v as any).value === 'string' ? String((v as any).value) : ''\n if (k) envFromParams[k] = val\n }\n\n candidates.push({\n kind: 'stdio',\n transport: new StdioClientTransport({\n command,\n args,\n env: { ...process.env, ...envFromParams } as Record<string, string>,\n stderr: 'pipe',\n }),\n })\n }\n\n let lastError: unknown\n for (const candidate of candidates) {\n const client = new Client(\n { name: PRODUCT_COMMAND, version: MACRO.VERSION || '0.0.0' },\n { capabilities: {} },\n )\n\n try {\n await connectWithTimeout(client, candidate.transport, name)\n\n let capabilities: Record<string, unknown> | null = null\n try {\n capabilities = client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n\n results.push({ name, client, capabilities, type: 'connected' as const })\n lastError = null\n break\n } catch (e) {\n lastError = e\n try {\n await client.close()\n } catch {}\n }\n }\n\n if (lastError) {\n logError(lastError)\n results.push({ name, type: 'failed' as const })\n }\n }\n\n return results\n}\n\nfunction mergeMcpClients(base: WrappedClient[], extra: WrappedClient[]): WrappedClient[] {\n const map = new Map<string, WrappedClient>()\n for (const c of base) map.set(c.name, c)\n for (const c of extra) map.set(c.name, c)\n return Array.from(map.values())\n}\n\nexport class KodeAcpAgent {\n private clientCapabilities: Protocol.ClientCapabilities = {}\n private sessions = new Map<string, SessionState>()\n\n constructor(private readonly peer: JsonRpcPeer) {\n this.registerMethods()\n }\n\n private registerMethods(): void {\n this.peer.registerMethod('initialize', this.handleInitialize.bind(this))\n this.peer.registerMethod('authenticate', this.handleAuthenticate.bind(this))\n this.peer.registerMethod('session/new', this.handleSessionNew.bind(this))\n this.peer.registerMethod('session/load', this.handleSessionLoad.bind(this))\n this.peer.registerMethod('session/prompt', this.handleSessionPrompt.bind(this))\n this.peer.registerMethod('session/set_mode', this.handleSessionSetMode.bind(this))\n this.peer.registerMethod('session/cancel', this.handleSessionCancel.bind(this))\n }\n\n private async handleInitialize(params: unknown): Promise<Protocol.InitializeResponse> {\n const p = (params ?? {}) as Partial<Protocol.InitializeParams>\n const protocolVersion = typeof p.protocolVersion === 'number' ? p.protocolVersion : Protocol.ACP_PROTOCOL_VERSION\n\n this.clientCapabilities =\n p.clientCapabilities && typeof p.clientCapabilities === 'object' ? (p.clientCapabilities as Protocol.ClientCapabilities) : {}\n\n return {\n protocolVersion: Protocol.ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: true,\n promptCapabilities: {\n image: false,\n audio: false,\n embeddedContext: true,\n embeddedContent: true,\n },\n mcpCapabilities: {\n http: true,\n sse: true,\n },\n },\n agentInfo: {\n name: 'kode',\n title: 'Kode',\n version: MACRO.VERSION || '0.0.0',\n },\n authMethods: [],\n }\n }\n\n private async handleAuthenticate(_params: unknown): Promise<Protocol.AuthenticateResponse> {\n return {}\n }\n\n private async handleSessionNew(params: unknown): Promise<Protocol.NewSessionResponse> {\n const p = (params ?? {}) as Partial<Protocol.NewSessionParams>\n const cwd = typeof p.cwd === 'string' ? p.cwd : ''\n if (!cwd) {\n throw new JsonRpcError(-32602, 'Missing required param: cwd')\n }\n if (!isAbsolute(cwd)) {\n throw new JsonRpcError(-32602, `cwd must be an absolute path: ${cwd}`)\n }\n\n setOriginalCwd(cwd)\n await setCwd(cwd)\n grantReadPermissionForOriginalDir()\n\n const mcpServers = Array.isArray(p.mcpServers) ? (p.mcpServers as Protocol.McpServer[]) : []\n\n const [commands, tools, ctx, systemPrompt, configuredMcpClients] = await Promise.all([\n getCommands(),\n getTools(),\n getContext(),\n getSystemPrompt({ disableSlashCommands: false }),\n getClients().catch(() => [] as WrappedClient[]),\n ])\n const acpMcpClients = await connectAcpMcpServers(mcpServers)\n const mcpClients = mergeMcpClients(configuredMcpClients, acpMcpClients)\n\n const toolPermissionContext = loadToolPermissionContextFromDisk({\n projectDir: cwd,\n includeKodeProjectConfig: true,\n isBypassPermissionsModeAvailable: true,\n })\n\n const sessionId = `sess_${nanoid()}`\n\n const session: SessionState = {\n sessionId,\n cwd,\n mcpServers,\n mcpClients,\n commands,\n tools,\n systemPrompt,\n context: ctx,\n messages: [],\n toolPermissionContext,\n readFileTimestamps: {},\n responseState: {},\n currentModeId: toolPermissionContext.mode ?? 'default',\n activeAbortController: null,\n toolCalls: new Map(),\n }\n\n this.sessions.set(sessionId, session)\n\n this.sendAvailableCommands(session)\n this.sendCurrentMode(session)\n persistAcpSessionToDisk(session)\n\n return {\n sessionId,\n modes: this.getModeState(session),\n }\n }\n\n private async handleSessionLoad(params: unknown): Promise<Protocol.LoadSessionResponse> {\n const p = (params ?? {}) as Partial<Protocol.LoadSessionParams>\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\n const cwd = typeof p.cwd === 'string' ? p.cwd : ''\n if (!sessionId) throw new JsonRpcError(-32602, 'Missing required param: sessionId')\n if (!cwd) throw new JsonRpcError(-32602, 'Missing required param: cwd')\n if (!isAbsolute(cwd)) {\n throw new JsonRpcError(-32602, `cwd must be an absolute path: ${cwd}`)\n }\n\n setOriginalCwd(cwd)\n await setCwd(cwd)\n grantReadPermissionForOriginalDir()\n\n const persisted = loadAcpSessionFromDisk(cwd, sessionId)\n if (!persisted) {\n throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\n }\n\n const mcpServers = Array.isArray(p.mcpServers) ? (p.mcpServers as Protocol.McpServer[]) : []\n\n const [commands, tools, ctx, systemPrompt, configuredMcpClients] = await Promise.all([\n getCommands(),\n getTools(),\n getContext(),\n getSystemPrompt({ disableSlashCommands: false }),\n getClients().catch(() => [] as WrappedClient[]),\n ])\n\n const acpMcpClients = await connectAcpMcpServers(mcpServers)\n const mcpClients = mergeMcpClients(configuredMcpClients, acpMcpClients)\n\n const toolPermissionContext = loadToolPermissionContextFromDisk({\n projectDir: cwd,\n includeKodeProjectConfig: true,\n isBypassPermissionsModeAvailable: true,\n })\n\n const currentModeId =\n typeof persisted.currentModeId === 'string' && persisted.currentModeId\n ? persisted.currentModeId\n : toolPermissionContext.mode ?? 'default'\n toolPermissionContext.mode = currentModeId as any\n\n const session: SessionState = {\n sessionId,\n cwd,\n mcpServers,\n mcpClients,\n commands,\n tools,\n systemPrompt,\n context: ctx,\n messages: Array.isArray(persisted.messages) ? persisted.messages : [],\n toolPermissionContext,\n readFileTimestamps:\n persisted.readFileTimestamps && typeof persisted.readFileTimestamps === 'object'\n ? (persisted.readFileTimestamps as Record<string, number>)\n : {},\n responseState:\n persisted.responseState && typeof persisted.responseState === 'object'\n ? (persisted.responseState as ToolUseContext['responseState'])\n : {},\n currentModeId,\n activeAbortController: null,\n toolCalls: new Map(),\n }\n\n this.sessions.set(sessionId, session)\n this.sendAvailableCommands(session)\n this.sendCurrentMode(session)\n this.replayConversation(session)\n\n return { modes: this.getModeState(session) }\n }\n\n private async handleSessionSetMode(params: unknown): Promise<Protocol.SetSessionModeResponse> {\n const p = (params ?? {}) as Partial<Protocol.SetSessionModeParams>\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\n const modeId = typeof p.modeId === 'string' ? p.modeId : ''\n\n const session = this.sessions.get(sessionId)\n if (!session) throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\n\n const allowed = new Set(this.getModeState(session).availableModes.map(m => m.id))\n if (!allowed.has(modeId)) {\n throw new JsonRpcError(-32602, `Unknown modeId: ${modeId}`)\n }\n\n session.currentModeId = modeId\n session.toolPermissionContext.mode = modeId as any\n this.sendCurrentMode(session)\n persistAcpSessionToDisk(session)\n\n return {}\n }\n\n private async handleSessionCancel(params: unknown): Promise<void> {\n const p = (params ?? {}) as Partial<Protocol.SessionCancelParams>\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\n const session = this.sessions.get(sessionId)\n if (!session) return\n session.activeAbortController?.abort()\n }\n\n private async handleSessionPrompt(params: unknown): Promise<Protocol.PromptResponse> {\n const p = (params ?? {}) as any\n const sessionId = typeof p.sessionId === 'string' ? p.sessionId : ''\n const blocks: Protocol.ContentBlock[] = Array.isArray(p.prompt)\n ? (p.prompt as Protocol.ContentBlock[])\n : Array.isArray(p.content)\n ? (p.content as Protocol.ContentBlock[])\n : []\n\n const session = this.sessions.get(sessionId)\n if (!session) throw new JsonRpcError(-32602, `Session not found: ${sessionId}`)\n\n if (session.activeAbortController) {\n throw new JsonRpcError(-32000, `Session already has an active prompt: ${sessionId}`)\n }\n\n setOriginalCwd(session.cwd)\n await setCwd(session.cwd)\n grantReadPermissionForOriginalDir()\n\n const promptText = blocksToText(blocks)\n const userMsg = createUserMessage(promptText)\n\n const baseMessages: Message[] = [...session.messages, userMsg]\n session.messages.push(userMsg)\n\n if (process.env.KODE_ACP_ECHO === '1') {\n await this.handleKodeMessage(session, createAssistantMessage(promptText))\n persistAcpSessionToDisk(session)\n return { stopReason: 'end_turn' }\n }\n\n const abortController = new AbortController()\n session.activeAbortController = abortController\n\n const canUseTool = this.createAcpCanUseTool(session)\n\n const options = {\n commands: session.commands,\n tools: session.tools,\n verbose: false,\n safeMode: false,\n forkNumber: 0,\n messageLogName: session.sessionId,\n maxThinkingTokens: 0,\n persistSession: false,\n toolPermissionContext: session.toolPermissionContext,\n mcpClients: session.mcpClients,\n shouldAvoidPermissionPrompts: false,\n }\n\n let stopReason: Protocol.StopReason = 'end_turn'\n try {\n for await (const m of query(baseMessages, session.systemPrompt, session.context, canUseTool, {\n options,\n abortController,\n messageId: undefined,\n readFileTimestamps: session.readFileTimestamps,\n setToolJSX: () => {},\n agentId: 'main',\n responseState: session.responseState,\n })) {\n if (abortController.signal.aborted) {\n stopReason = 'cancelled'\n }\n await this.handleKodeMessage(session, m)\n }\n if (abortController.signal.aborted) stopReason = 'cancelled'\n } catch (err) {\n if (abortController.signal.aborted) {\n stopReason = 'cancelled'\n } else {\n logError(err)\n const msg = err instanceof Error ? err.message : String(err)\n this.sendAgentMessage(session.sessionId, msg)\n stopReason = 'end_turn'\n }\n } finally {\n session.activeAbortController = null\n persistAcpSessionToDisk(session)\n }\n\n return { stopReason }\n }\n\n private async handleKodeMessage(session: SessionState, m: Message): Promise<void> {\n if (!m || typeof m !== 'object') return\n\n if (m.type === 'assistant') {\n session.messages.push(m)\n\n const blocks: any[] = Array.isArray((m as any).message?.content) ? ((m as any).message.content as any[]) : []\n for (const b of blocks) {\n if (!b || typeof b !== 'object') continue\n if (b.type === 'text' && typeof b.text === 'string') {\n this.sendAgentMessage(session.sessionId, b.text)\n } else if (b.type === 'thinking' && typeof (b as any).thinking === 'string') {\n this.sendAgentThought(session.sessionId, (b as any).thinking)\n } else if (b.type === 'tool_use') {\n const toolUseId = typeof b.id === 'string' ? b.id : ''\n const toolName = typeof b.name === 'string' ? b.name : ''\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\n if (!toolUseId || !toolName) continue\n const kind = toolKindForName(toolName)\n const title = titleForToolCall(toolName, input)\n session.toolCalls.set(toolUseId, {\n title,\n kind,\n status: 'pending',\n rawInput: asJsonObject(input),\n })\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId: toolUseId,\n title,\n kind,\n status: 'pending',\n rawInput: asJsonObject(input),\n } satisfies Protocol.ToolCall,\n } satisfies Protocol.SessionUpdateNotification)\n }\n }\n return\n }\n\n if (m.type === 'progress') {\n const toolCallId = m.toolUseID\n const existing = session.toolCalls.get(toolCallId)\n const title = existing?.title ?? 'Tool'\n const kind = existing?.kind ?? 'other'\n\n if (!existing || existing.status === 'pending') {\n session.toolCalls.set(toolCallId, {\n title,\n kind,\n status: 'in_progress',\n rawInput: existing?.rawInput,\n })\n this.sendToolCallUpdate(session.sessionId, {\n toolCallId,\n status: 'in_progress',\n })\n }\n\n const text = extractAssistantText(m.content)\n if (text) {\n this.sendToolCallUpdate(session.sessionId, {\n toolCallId,\n content: [\n {\n type: 'content',\n content: { type: 'text', text },\n },\n ],\n })\n }\n return\n }\n\n if (m.type === 'user') {\n const toolResults = extractToolResults(m)\n if (toolResults.length === 0) {\n session.messages.push(m)\n return\n }\n\n for (const tr of toolResults) {\n const existing = session.toolCalls.get(tr.toolUseId)\n const title = existing?.title ?? 'Tool'\n const kind = existing?.kind ?? 'other'\n\n if (!existing || existing.status === 'pending') {\n session.toolCalls.set(tr.toolUseId, {\n title,\n kind,\n status: 'in_progress',\n rawInput: existing?.rawInput,\n })\n this.sendToolCallUpdate(session.sessionId, {\n toolCallId: tr.toolUseId,\n status: 'in_progress',\n })\n }\n\n const status: Protocol.ToolCallStatus = tr.isError ? 'failed' : 'completed'\n session.toolCalls.set(tr.toolUseId, {\n title,\n kind,\n status,\n rawInput: existing?.rawInput,\n })\n\n const rawOutput = asJsonObject((m as any).toolUseResult?.data)\n\n const content: Protocol.ToolCallContent[] = []\n const diffContent = status === 'completed' ? this.buildDiffContentForToolResult(session, tr.toolUseId, rawOutput) : null\n if (diffContent) content.push(diffContent)\n if (tr.content) {\n content.push({ type: 'content', content: { type: 'text', text: tr.content } })\n }\n\n this.sendToolCallUpdate(session.sessionId, {\n toolCallId: tr.toolUseId,\n status,\n ...(content.length > 0 ? { content } : {}),\n ...(rawOutput ? { rawOutput } : {}),\n })\n }\n\n session.messages.push(m)\n return\n }\n }\n\n private createAcpCanUseTool(session: SessionState): CanUseToolFn {\n const timeoutMs = (() => {\n const raw = process.env.KODE_ACP_PERMISSION_TIMEOUT_MS\n const parsed = raw ? Number(raw) : NaN\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 30_000\n })()\n\n return async (tool, input, toolUseContext, assistantMessage) => {\n const toolUseId =\n typeof toolUseContext?.toolUseId === 'string' && toolUseContext.toolUseId\n ? toolUseContext.toolUseId\n : `call_${nanoid()}`\n\n const base = await hasPermissionsToUseTool(tool, input, toolUseContext, assistantMessage)\n if (base.result === true) {\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\n return base\n }\n\n const denied = base as Extract<typeof base, { result: false }>\n if (denied.shouldPromptUser === false) {\n return { result: false as const, message: denied.message }\n }\n\n const title = titleForToolCall(tool.name, input as any)\n const kind = toolKindForName(tool.name)\n\n if (!session.toolCalls.has(toolUseId)) {\n session.toolCalls.set(toolUseId, { title, kind, status: 'pending', rawInput: asJsonObject(input) })\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId: toolUseId,\n title,\n kind,\n status: 'pending',\n rawInput: asJsonObject(input),\n } satisfies Protocol.ToolCall,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n const options: Protocol.PermissionOption[] = [\n { optionId: 'allow_once', name: 'Allow once', kind: 'allow_once' },\n { optionId: 'reject_once', name: 'Reject', kind: 'reject_once' },\n ]\n if (Array.isArray((denied as any).suggestions) && (denied as any).suggestions.length > 0) {\n options.splice(1, 0, {\n optionId: 'allow_always',\n name: 'Allow always (remember)',\n kind: 'allow_always',\n })\n }\n\n try {\n const response = await this.peer.sendRequest<Protocol.RequestPermissionResponse>({\n method: 'session/request_permission',\n params: {\n sessionId: session.sessionId,\n toolCall: {\n toolCallId: toolUseId,\n title,\n kind,\n status: 'pending',\n content: [\n {\n type: 'content',\n content: { type: 'text', text: denied.message },\n },\n ],\n rawInput: asJsonObject(input),\n },\n options,\n } satisfies Protocol.RequestPermissionParams,\n signal: toolUseContext.abortController.signal,\n timeoutMs,\n })\n\n const outcome = response?.outcome\n if (!outcome || outcome.outcome === 'cancelled') {\n toolUseContext.abortController.abort()\n return { result: false as const, message: denied.message, shouldPromptUser: false }\n }\n\n if (outcome.outcome === 'selected' && outcome.optionId === 'allow_once') {\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\n return { result: true as const }\n }\n\n if (outcome.outcome === 'selected' && outcome.optionId === 'allow_always') {\n const suggestions = Array.isArray((denied as any).suggestions) ? ((denied as any).suggestions as any[]) : []\n if (suggestions.length > 0) {\n const next = applyToolPermissionContextUpdates(session.toolPermissionContext, suggestions as any)\n session.toolPermissionContext = next\n if (toolUseContext?.options) toolUseContext.options.toolPermissionContext = next\n for (const update of suggestions) {\n try {\n persistToolPermissionUpdateToDisk({ update, projectDir: session.cwd })\n } catch (e) {\n logError(e)\n }\n }\n }\n this.captureFileSnapshotForTool(session, toolUseId, tool.name, input)\n return { result: true as const }\n }\n\n return { result: false as const, message: denied.message }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n return { result: false as const, message: `Permission prompt failed: ${msg}`, shouldPromptUser: false }\n }\n }\n }\n\n private captureFileSnapshotForTool(\n session: SessionState,\n toolUseId: string,\n toolName: string,\n input: unknown,\n ): void {\n if (toolName !== 'Write' && toolName !== 'MultiEdit') return\n\n const filePath = input && typeof input === 'object' ? String((input as any).file_path ?? '') : ''\n if (!filePath) return\n\n const absPath = isAbsolute(filePath) ? filePath : resolve(session.cwd, filePath)\n\n const oldContent = existsSync(absPath) ? readTextFileForDiff(absPath) : ''\n if (oldContent === null) return\n\n const existing = session.toolCalls.get(toolUseId)\n if (existing) {\n existing.fileSnapshot = { path: absPath, content: oldContent }\n session.toolCalls.set(toolUseId, existing)\n return\n }\n\n session.toolCalls.set(toolUseId, {\n title: toolName,\n kind: toolKindForName(toolName),\n status: 'pending',\n rawInput: asJsonObject(input),\n fileSnapshot: { path: absPath, content: oldContent },\n })\n }\n\n private buildDiffContentForToolResult(\n session: SessionState,\n toolUseId: string,\n rawOutput: Protocol.JsonObject | undefined,\n ): Protocol.ToolCallContent | null {\n const existing = session.toolCalls.get(toolUseId)\n if (!existing || existing.kind !== 'edit') return null\n\n const inputFilePath =\n typeof existing.rawInput?.file_path === 'string'\n ? existing.rawInput.file_path\n : rawOutput && typeof (rawOutput as any).filePath === 'string'\n ? String((rawOutput as any).filePath)\n : ''\n\n if (!inputFilePath) return null\n\n const absPath = isAbsolute(inputFilePath) ? inputFilePath : resolve(session.cwd, inputFilePath)\n\n const oldText =\n rawOutput && typeof (rawOutput as any).originalFile === 'string'\n ? String((rawOutput as any).originalFile)\n : existing.fileSnapshot && existing.fileSnapshot.path === absPath\n ? existing.fileSnapshot.content\n : undefined\n\n if (oldText === undefined) return null\n\n const newTextFromDisk = readTextFileForDiff(absPath)\n const newTextFromOutput = rawOutput && typeof (rawOutput as any).content === 'string' ? String((rawOutput as any).content) : null\n const newText = newTextFromDisk ?? newTextFromOutput\n if (newText === null) return null\n\n return {\n type: 'diff',\n path: absPath,\n oldText: truncateDiffText(oldText),\n newText: truncateDiffText(newText),\n }\n }\n\n private replayConversation(session: SessionState): void {\n session.toolCalls.clear()\n\n for (const m of session.messages) {\n if (!m || typeof m !== 'object') continue\n\n if (m.type === 'assistant') {\n const blocks: any[] = Array.isArray((m as any).message?.content) ? ((m as any).message.content as any[]) : []\n for (const b of blocks) {\n if (!b || typeof b !== 'object') continue\n if (b.type === 'text' && typeof b.text === 'string') {\n this.sendAgentMessage(session.sessionId, b.text)\n } else if (b.type === 'thinking' && typeof (b as any).thinking === 'string') {\n this.sendAgentThought(session.sessionId, (b as any).thinking)\n } else if (b.type === 'tool_use') {\n const toolUseId = typeof b.id === 'string' ? b.id : ''\n const toolName = typeof b.name === 'string' ? b.name : ''\n const input = b.input && typeof b.input === 'object' && !Array.isArray(b.input) ? (b.input as Record<string, unknown>) : {}\n if (!toolUseId || !toolName) continue\n\n if (!session.toolCalls.has(toolUseId)) {\n const kind = toolKindForName(toolName)\n const title = titleForToolCall(toolName, input)\n session.toolCalls.set(toolUseId, {\n title,\n kind,\n status: 'pending',\n rawInput: asJsonObject(input),\n })\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId: toolUseId,\n title,\n kind,\n status: 'pending',\n rawInput: asJsonObject(input),\n } satisfies Protocol.ToolCall,\n } satisfies Protocol.SessionUpdateNotification)\n }\n }\n }\n continue\n }\n\n if (m.type === 'user') {\n const content = (m as any)?.message?.content\n if (typeof content === 'string' && content.trim()) {\n this.sendUserMessage(session.sessionId, content)\n }\n\n const toolResults = extractToolResults(m)\n if (toolResults.length === 0) continue\n\n for (const tr of toolResults) {\n const existing = session.toolCalls.get(tr.toolUseId)\n const title = existing?.title ?? 'Tool'\n const kind = existing?.kind ?? 'other'\n\n if (!existing) {\n session.toolCalls.set(tr.toolUseId, { title, kind, status: 'pending' })\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'tool_call',\n toolCallId: tr.toolUseId,\n title,\n kind,\n status: 'pending',\n } satisfies Protocol.ToolCall,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n const status: Protocol.ToolCallStatus = tr.isError ? 'failed' : 'completed'\n const contentBlocks: Protocol.ToolCallContent[] = []\n if (tr.content) {\n contentBlocks.push({ type: 'content', content: { type: 'text', text: tr.content } })\n }\n\n const rawOutput = asJsonObject((m as any).toolUseResult?.data)\n\n this.sendToolCallUpdate(session.sessionId, {\n toolCallId: tr.toolUseId,\n status,\n ...(contentBlocks.length > 0 ? { content: contentBlocks } : {}),\n ...(rawOutput ? { rawOutput } : {}),\n })\n\n session.toolCalls.set(tr.toolUseId, {\n title,\n kind,\n status,\n rawInput: existing?.rawInput,\n })\n }\n }\n }\n }\n\n private getModeState(session: SessionState): Protocol.SessionModeState {\n const availableModes: Protocol.SessionMode[] = [\n { id: 'default', name: 'Default', description: 'Normal permissions (prompt when needed)' },\n { id: 'acceptEdits', name: 'Accept Edits', description: 'Auto-approve safe file edits' },\n { id: 'plan', name: 'Plan', description: 'Read-only planning mode' },\n { id: 'dontAsk', name: \"Don't Ask\", description: 'Auto-deny permission prompts' },\n { id: 'bypassPermissions', name: 'Bypass', description: 'Bypass permission prompts (dangerous)' },\n ]\n\n const currentModeId = availableModes.some(m => m.id === session.currentModeId) ? session.currentModeId : 'default'\n return { currentModeId, availableModes }\n }\n\n private sendAvailableCommands(session: SessionState): void {\n const availableCommands: Protocol.AvailableCommand[] = session.commands\n .filter(c => !c.isHidden)\n .map(c => ({\n name: c.userFacingName(),\n description: c.description,\n ...(c.argumentHint ? { input: { hint: c.argumentHint } } : {}),\n }))\n\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'available_commands_update',\n availableCommands,\n } satisfies Protocol.AvailableCommandsUpdate,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n private sendCurrentMode(session: SessionState): void {\n this.peer.sendNotification('session/update', {\n sessionId: session.sessionId,\n update: {\n sessionUpdate: 'current_mode_update',\n currentModeId: session.currentModeId,\n } satisfies Protocol.CurrentModeUpdate,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n private sendUserMessage(sessionId: string, text: string): void {\n if (!text) return\n this.peer.sendNotification('session/update', {\n sessionId,\n update: {\n sessionUpdate: 'user_message_chunk',\n content: { type: 'text', text },\n } satisfies Protocol.UserMessageChunk,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n private sendAgentMessage(sessionId: string, text: string): void {\n if (!text) return\n this.peer.sendNotification('session/update', {\n sessionId,\n update: {\n sessionUpdate: 'agent_message_chunk',\n content: { type: 'text', text },\n } satisfies Protocol.AgentMessageChunk,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n private sendAgentThought(sessionId: string, text: string): void {\n if (!text) return\n this.peer.sendNotification('session/update', {\n sessionId,\n update: {\n sessionUpdate: 'agent_thought_chunk',\n content: { type: 'text', text },\n } satisfies Protocol.AgentThoughtChunk,\n } satisfies Protocol.SessionUpdateNotification)\n }\n\n private sendToolCallUpdate(sessionId: string, update: Omit<Protocol.ToolCallUpdate, 'sessionUpdate'>): void {\n this.peer.sendNotification('session/update', {\n sessionId,\n update: {\n sessionUpdate: 'tool_call_update',\n ...update,\n } satisfies Protocol.ToolCallUpdate,\n } satisfies Protocol.SessionUpdateNotification)\n }\n}\n", "export const ACP_PROTOCOL_VERSION = 1\n\nexport type JsonObject = Record<string, unknown>\n\nexport type Implementation = {\n name: string\n title?: string | null\n version: string\n _meta?: JsonObject | null\n}\n\nexport type FileSystemCapability = {\n readTextFile?: boolean\n writeTextFile?: boolean\n _meta?: JsonObject | null\n}\n\nexport type ClientCapabilities = {\n fs?: FileSystemCapability\n terminal?: boolean\n _meta?: JsonObject | null\n}\n\nexport type PromptCapabilities = {\n audio?: boolean\n image?: boolean\n embeddedContext?: boolean\n embeddedContent?: boolean\n _meta?: JsonObject | null\n}\n\nexport type McpCapabilities = {\n http?: boolean\n sse?: boolean\n _meta?: JsonObject | null\n}\n\nexport type AgentCapabilities = {\n loadSession?: boolean\n promptCapabilities?: PromptCapabilities\n mcpCapabilities?: McpCapabilities\n sessionCapabilities?: JsonObject\n _meta?: JsonObject | null\n}\n\nexport type AuthMethod = {\n id: string\n name: string\n description?: string | null\n _meta?: JsonObject | null\n}\n\nexport type InitializeParams = {\n protocolVersion: number\n clientCapabilities?: ClientCapabilities\n clientInfo?: Implementation | null\n _meta?: JsonObject | null\n}\n\nexport type InitializeResponse = {\n protocolVersion: number\n agentCapabilities: AgentCapabilities\n agentInfo?: Implementation | null\n authMethods?: AuthMethod[]\n _meta?: JsonObject | null\n}\n\nexport type AuthenticateParams = {\n methodId: string\n _meta?: JsonObject | null\n}\n\nexport type AuthenticateResponse = JsonObject\n\nexport type EnvVariable = {\n name: string\n value: string\n _meta?: JsonObject | null\n}\n\nexport type HttpHeader = {\n name: string\n value: string\n _meta?: JsonObject | null\n}\n\nexport type McpServerStdio = {\n type?: 'stdio'\n name: string\n command: string\n args: string[]\n env: EnvVariable[]\n _meta?: JsonObject | null\n}\n\nexport type McpServerHttp = {\n type: 'http'\n name: string\n url: string\n headers: HttpHeader[]\n _meta?: JsonObject | null\n}\n\nexport type McpServerSse = {\n type: 'sse'\n name: string\n url: string\n headers: HttpHeader[]\n _meta?: JsonObject | null\n}\n\nexport type McpServer = McpServerStdio | McpServerHttp | McpServerSse\n\nexport type SessionModeId = string\n\nexport type SessionMode = {\n id: SessionModeId\n name: string\n description?: string | null\n _meta?: JsonObject | null\n}\n\nexport type SessionModeState = {\n currentModeId: SessionModeId\n availableModes: SessionMode[]\n _meta?: JsonObject | null\n}\n\nexport type NewSessionParams = {\n cwd: string\n mcpServers: McpServer[]\n _meta?: JsonObject | null\n}\n\nexport type NewSessionResponse = {\n sessionId: string\n modes?: SessionModeState | null\n _meta?: JsonObject | null\n}\n\nexport type LoadSessionParams = {\n sessionId: string\n cwd: string\n mcpServers: McpServer[]\n _meta?: JsonObject | null\n}\n\nexport type LoadSessionResponse = {\n modes?: SessionModeState | null\n _meta?: JsonObject | null\n}\n\nexport type StopReason =\n | 'end_turn'\n | 'max_tokens'\n | 'max_turn_requests'\n | 'refusal'\n | 'cancelled'\n\nexport type PromptResponse = {\n stopReason: StopReason\n _meta?: JsonObject | null\n}\n\nexport type SessionCancelParams = {\n sessionId: string\n _meta?: JsonObject | null\n}\n\nexport type SetSessionModeParams = {\n sessionId: string\n modeId: SessionModeId\n _meta?: JsonObject | null\n}\n\nexport type SetSessionModeResponse = JsonObject\n\nexport type TextContent = {\n type: 'text'\n text: string\n annotations?: JsonObject | null\n _meta?: JsonObject | null\n}\n\nexport type ImageContent = {\n type: 'image'\n data?: string\n mimeType?: string\n url?: string\n annotations?: JsonObject | null\n _meta?: JsonObject | null\n}\n\nexport type AudioContent = {\n type: 'audio'\n data: string\n mimeType: string\n annotations?: JsonObject | null\n _meta?: JsonObject | null\n}\n\nexport type EmbeddedResource = {\n uri: string\n mimeType?: string | null\n text?: string\n blob?: string\n _meta?: JsonObject | null\n}\n\nexport type EmbeddedResourceContent = {\n type: 'resource'\n resource: EmbeddedResource\n annotations?: JsonObject | null\n _meta?: JsonObject | null\n}\n\nexport type ResourceLinkContent = {\n type: 'resource_link'\n uri: string\n name: string\n title?: string | null\n description?: string | null\n mimeType?: string | null\n size?: number | null\n annotations?: JsonObject | null\n _meta?: JsonObject | null\n}\n\nexport type ContentBlock =\n | TextContent\n | ImageContent\n | AudioContent\n | EmbeddedResourceContent\n | ResourceLinkContent\n\nexport type PromptParams = {\n sessionId: string\n prompt: ContentBlock[]\n _meta?: JsonObject | null\n}\n\nexport type SessionUpdateKind =\n | 'user_message_chunk'\n | 'agent_message_chunk'\n | 'agent_thought_chunk'\n | 'tool_call'\n | 'tool_call_update'\n | 'plan'\n | 'available_commands_update'\n | 'current_mode_update'\n\nexport type PlanEntryPriority = 'high' | 'medium' | 'low'\n\nexport type PlanEntryStatus = 'pending' | 'in_progress' | 'completed'\n\nexport type PlanEntry = {\n content: string\n priority: PlanEntryPriority\n status: PlanEntryStatus\n _meta?: JsonObject | null\n}\n\nexport type PlanUpdate = {\n sessionUpdate: 'plan'\n entries: PlanEntry[]\n _meta?: JsonObject | null\n}\n\nexport type ToolKind =\n | 'read'\n | 'edit'\n | 'delete'\n | 'move'\n | 'search'\n | 'execute'\n | 'think'\n | 'fetch'\n | 'switch_mode'\n | 'other'\n\nexport type ToolCallStatus = 'pending' | 'in_progress' | 'completed' | 'failed'\n\nexport type ToolCallLocation = {\n path: string\n line?: number | null\n _meta?: JsonObject | null\n}\n\nexport type ToolCallContent =\n | { type: 'content'; content: ContentBlock; _meta?: JsonObject | null }\n | {\n type: 'diff'\n path: string\n newText: string\n oldText?: string | null\n _meta?: JsonObject | null\n }\n | { type: 'terminal'; terminalId: string; _meta?: JsonObject | null }\n\nexport type ToolCall = {\n sessionUpdate: 'tool_call'\n toolCallId: string\n title: string\n kind?: ToolKind\n status?: ToolCallStatus\n content?: ToolCallContent[]\n locations?: ToolCallLocation[]\n rawInput?: JsonObject\n rawOutput?: JsonObject\n _meta?: JsonObject | null\n}\n\nexport type ToolCallUpdate = {\n sessionUpdate: 'tool_call_update'\n toolCallId: string\n title?: string | null\n kind?: ToolKind | null\n status?: ToolCallStatus | null\n content?: ToolCallContent[] | null\n locations?: ToolCallLocation[] | null\n rawInput?: JsonObject\n rawOutput?: JsonObject\n _meta?: JsonObject | null\n}\n\nexport type ToolCallUpdatePermissionRequest = Omit<ToolCallUpdate, 'sessionUpdate'>\n\nexport type PermissionOptionKind =\n | 'allow_once'\n | 'allow_always'\n | 'reject_once'\n | 'reject_always'\n\nexport type PermissionOption = {\n optionId: string\n name: string\n kind: PermissionOptionKind\n _meta?: JsonObject | null\n}\n\nexport type OutcomeCancelled = { outcome: 'cancelled'; _meta?: JsonObject | null }\nexport type OutcomeSelected = {\n outcome: 'selected'\n optionId: string\n _meta?: JsonObject | null\n}\nexport type RequestPermissionOutcome = OutcomeCancelled | OutcomeSelected\n\nexport type RequestPermissionParams = {\n sessionId: string\n toolCall: ToolCallUpdatePermissionRequest\n options: PermissionOption[]\n _meta?: JsonObject | null\n}\n\nexport type RequestPermissionResponse = {\n outcome: RequestPermissionOutcome\n _meta?: JsonObject | null\n}\n\nexport type AvailableCommandInput = { hint: string; _meta?: JsonObject | null }\nexport type AvailableCommand = {\n name: string\n description: string\n input?: AvailableCommandInput | null\n _meta?: JsonObject | null\n}\n\nexport type AvailableCommandsUpdate = {\n sessionUpdate: 'available_commands_update'\n availableCommands: AvailableCommand[]\n _meta?: JsonObject | null\n}\n\nexport type CurrentModeUpdate = {\n sessionUpdate: 'current_mode_update'\n currentModeId: SessionModeId\n _meta?: JsonObject | null\n}\n\nexport type UserMessageChunk = {\n sessionUpdate: 'user_message_chunk'\n content: ContentBlock\n _meta?: JsonObject | null\n}\n\nexport type AgentMessageChunk = {\n sessionUpdate: 'agent_message_chunk'\n content: ContentBlock\n _meta?: JsonObject | null\n}\n\nexport type AgentThoughtChunk = {\n sessionUpdate: 'agent_thought_chunk'\n content: ContentBlock\n _meta?: JsonObject | null\n}\n\nexport type SessionUpdate =\n | UserMessageChunk\n | AgentMessageChunk\n | AgentThoughtChunk\n | ToolCall\n | ToolCallUpdate\n | PlanUpdate\n | AvailableCommandsUpdate\n | CurrentModeUpdate\n\nexport type SessionUpdateNotification = {\n sessionId: string\n update: SessionUpdate\n _meta?: JsonObject | null\n}\n", "#!/usr/bin/env bun\nimport '@utils/config/sanitizeAnthropicEnv'\nimport { initSentry } from '@services/sentry'\nimport { ensurePackagedRuntimeEnv } from './cli/bootstrapEnv'\nimport { initDebugLogger } from '@utils/log/debugLogger'\nimport { enableConfigs } from '@utils/config'\nimport { logError } from '@utils/log'\n\nimport { JsonRpcPeer } from '../acp/jsonrpc'\nimport { StdioTransport } from '../acp/stdioTransport'\nimport { installStdoutGuard } from '../acp/stdoutGuard'\nimport { KodeAcpAgent } from '../acp/kodeAcpAgent'\n\ninitSentry()\nensurePackagedRuntimeEnv()\n\nconst { writeAcpLine } = installStdoutGuard()\n\ninitDebugLogger()\ntry {\n enableConfigs()\n} catch (e) {\n logError(e)\n}\n\nconst peer = new JsonRpcPeer()\nnew KodeAcpAgent(peer)\n\nconst transport = new StdioTransport(peer, { writeLine: writeAcpLine })\ntransport.start()\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["resolve", "peer", "format", "writeAcpLine", "transport", "peer"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/entrypoints/cli/agentsValidate.ts"],
|
|
4
|
-
"sourcesContent": ["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join, resolve } from 'node:path'\nimport matter from 'gray-matter'\nimport yaml from 'js-yaml'\nimport { getModelManager } from '@utils/model'\n\nexport type AgentValidateIssue = {\n level: 'error' | 'warning'\n message: string\n}\n\nexport type AgentValidateFileResult = {\n filePath: string\n agentType: string | null\n issues: AgentValidateIssue[]\n model?: string\n normalizedModel?: string\n}\n\nconst VALID_PERMISSION_MODES = new Set([\n 'default',\n 'acceptEdits',\n 'plan',\n 'bypassPermissions',\n 'dontAsk',\n 'delegate',\n])\n\nconst SUBAGENT_HARD_BLOCKED_TOOLS = new Set([\n 'Task',\n 'TaskOutput',\n 'KillShell',\n 'EnterPlanMode',\n 'ExitPlanMode',\n 'AskUserQuestion',\n])\n\nfunction normalizeString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed ? trimmed : null\n}\n\nfunction getClaudePolicyBaseDir(): string {\n switch (process.platform) {\n case 'darwin':\n return '/Library/Application Support/ClaudeCode'\n case 'win32':\n return existsSync('C:\\\\Program Files\\\\ClaudeCode')\n ? 'C:\\\\Program Files\\\\ClaudeCode'\n : 'C:\\\\ProgramData\\\\ClaudeCode'\n default:\n return '/etc/claude-code'\n }\n}\n\nfunction normalizeOverride(value: unknown): string | null {\n const normalized = normalizeString(value)\n return normalized ? resolve(normalized) : null\n}\n\nfunction getUserConfigRoots(): string[] {\n const claudeOverride = normalizeOverride(process.env.CLAUDE_CONFIG_DIR)\n const kodeOverride = normalizeOverride(process.env.KODE_CONFIG_DIR)\n const hasAnyOverride = Boolean(claudeOverride || kodeOverride)\n if (hasAnyOverride) {\n return Array.from(new Set([claudeOverride, kodeOverride].filter(Boolean))) as string[]\n }\n return [join(homedir(), '.claude'), join(homedir(), '.kode')]\n}\n\nfunction findProjectAgentDirs(cwd: string): string[] {\n const result: string[] = []\n const home = resolve(homedir())\n let current = resolve(cwd)\n\n while (current !== home) {\n const claudeDir = join(current, '.claude', 'agents')\n if (existsSync(claudeDir)) result.push(claudeDir)\n\n const kodeDir = join(current, '.kode', 'agents')\n if (existsSync(kodeDir)) result.push(kodeDir)\n\n const parent = dirname(current)\n if (parent === current) break\n current = parent\n }\n\n return result\n}\n\nfunction listMarkdownFilesRecursively(rootDir: string): string[] {\n const files: string[] = []\n const visitedDirs = new Set<string>()\n\n const walk = (dirPath: string) => {\n let dirStat: ReturnType<typeof statSync>\n try {\n dirStat = statSync(dirPath)\n } catch {\n return\n }\n if (!dirStat.isDirectory()) return\n\n const dirKey = `${(dirStat as any).dev}:${(dirStat as any).ino}`\n if (visitedDirs.has(dirKey)) return\n visitedDirs.add(dirKey)\n\n let entries: Array<{\n name: string\n isDirectory(): boolean\n isFile(): boolean\n isSymbolicLink(): boolean\n }>\n try {\n entries = readdirSync(dirPath, { withFileTypes: true }) as any\n } catch {\n return\n }\n\n for (const entry of entries) {\n const name = String(entry.name ?? '')\n const fullPath = join(dirPath, name)\n\n if (entry.isDirectory()) {\n walk(fullPath)\n continue\n }\n\n if (entry.isFile()) {\n if (name.toLowerCase().endsWith('.md')) files.push(fullPath)\n continue\n }\n\n if (entry.isSymbolicLink()) {\n try {\n const st = statSync(fullPath)\n if (st.isDirectory()) {\n walk(fullPath)\n } else if (st.isFile() && name.toLowerCase().endsWith('.md')) {\n files.push(fullPath)\n }\n } catch {\n continue\n }\n }\n }\n }\n\n if (!existsSync(rootDir)) return []\n walk(rootDir)\n return files\n}\n\nfunction readMarkdownFile(filePath: string):\n | { frontmatter: any; content: string }\n | { error: string } {\n try {\n const raw = readFileSync(filePath, 'utf8')\n const yamlSchema = (yaml as any).JSON_SCHEMA\n const parsed = matter(raw, {\n engines: {\n yaml: {\n parse: (input: string) =>\n yaml.load(input, yamlSchema ? { schema: yamlSchema } : undefined) ??\n {},\n },\n },\n })\n return { frontmatter: (parsed.data as any) ?? {}, content: String(parsed.content ?? '') }\n } catch (err) {\n return { error: err instanceof Error ? err.message : String(err) }\n }\n}\n\nfunction splitCliList(values: string[]): string[] {\n if (values.length === 0) return []\n const out: string[] = []\n\n for (const value of values) {\n if (!value) continue\n let current = ''\n let inParens = false\n\n for (const ch of value) {\n switch (ch) {\n case '(':\n inParens = true\n current += ch\n break\n case ')':\n inParens = false\n current += ch\n break\n case ',':\n case ' ': {\n if (inParens) {\n current += ch\n break\n }\n const trimmed = current.trim()\n if (trimmed) out.push(trimmed)\n current = ''\n break\n }\n default:\n current += ch\n }\n }\n\n const trimmed = current.trim()\n if (trimmed) out.push(trimmed)\n }\n\n return out\n}\n\nfunction normalizeToolList(value: unknown): string[] | null {\n if (value === undefined || value === null) return null\n if (!value) return []\n\n let raw: string[] = []\n if (typeof value === 'string') raw = [value]\n else if (Array.isArray(value))\n raw = value.filter((v): v is string => typeof v === 'string')\n\n if (raw.length === 0) return []\n const parsed = splitCliList(raw)\n if (parsed.includes('*')) return ['*']\n return parsed\n}\n\nfunction z2A(value: unknown): string[] | undefined {\n const normalized = normalizeToolList(value)\n if (normalized === null) return value === undefined ? undefined : []\n if (normalized.includes('*')) return undefined\n return normalized\n}\n\nfunction toolNameFromSpec(spec: string): string {\n const trimmed = spec.trim()\n if (!trimmed) return trimmed\n const match = trimmed.match(/^([^(]+)\\(([^)]+)\\)$/)\n if (!match) return trimmed\n const toolName = match[1]?.trim()\n return toolName || trimmed\n}\n\nfunction mapClaudeModelToKode(model: string): string | 'inherit' {\n if (model === 'inherit') return 'inherit'\n if (model === 'opus') return 'main'\n if (model === 'sonnet') return 'task'\n if (model === 'haiku') return 'quick'\n return model\n}\n\nfunction validateOneAgentFile(args: {\n filePath: string\n knownToolNames?: Set<string>\n}): AgentValidateFileResult {\n const issues: AgentValidateIssue[] = []\n const read = readMarkdownFile(args.filePath)\n if ('error' in read) {\n issues.push({ level: 'error', message: `Failed to parse file: ${read.error}` })\n return { filePath: args.filePath, agentType: null, issues }\n }\n\n const fm = read.frontmatter ?? {}\n const agentType = normalizeString(fm.name)\n const description = normalizeString(fm.description)\n\n if (!agentType) {\n issues.push({ level: 'error', message: `Missing required frontmatter field 'name'` })\n }\n if (!description) {\n issues.push({ level: 'error', message: `Missing required frontmatter field 'description'` })\n }\n\n const toolsList = z2A(fm.tools)\n const tools = toolsList === undefined ? '*' : toolsList\n if (Array.isArray(tools) && tools.length === 0) {\n issues.push({ level: 'warning', message: `No tools selected (tools: [])` })\n }\n\n const disallowedRaw = fm.disallowedTools ?? fm['disallowed-tools'] ?? fm['disallowed_tools']\n const disallowed = disallowedRaw !== undefined ? z2A(disallowedRaw) : undefined\n if (disallowedRaw !== undefined && disallowed === undefined) {\n issues.push({\n level: 'warning',\n message: `disallowedTools contains '*' and will be ignored (compatibility behavior)`,\n })\n }\n\n if (Array.isArray(tools)) {\n for (const spec of tools) {\n const toolName = toolNameFromSpec(spec)\n if (SUBAGENT_HARD_BLOCKED_TOOLS.has(toolName)) {\n issues.push({\n level: 'warning',\n message: `Tool '${toolName}' is not available to subagents and will be ignored`,\n })\n }\n if (args.knownToolNames && toolName && !args.knownToolNames.has(toolName)) {\n issues.push({\n level: 'warning',\n message: `Unknown tool '${toolName}' (from '${spec}')`,\n })\n }\n }\n }\n\n const permissionMode = normalizeString(fm.permissionMode)\n if (permissionMode && !VALID_PERMISSION_MODES.has(permissionMode)) {\n issues.push({\n level: 'error',\n message: `Invalid permissionMode '${permissionMode}' (expected: ${Array.from(VALID_PERMISSION_MODES).join(', ')})`,\n })\n }\n\n const forkContextValue: unknown = fm.forkContext\n if (\n forkContextValue !== undefined &&\n forkContextValue !== 'true' &&\n forkContextValue !== 'false'\n ) {\n issues.push({\n level: 'error',\n message: `Invalid forkContext value '${String(forkContextValue)}' (must be the string 'true' or 'false')`,\n })\n }\n const forkContext = forkContextValue === 'true'\n\n let modelRaw: unknown = fm.model\n if (typeof modelRaw !== 'string' && typeof fm.model_name === 'string') {\n modelRaw = fm.model_name\n }\n const model = typeof modelRaw === 'string' ? modelRaw.trim() : undefined\n\n if (forkContext && model && model !== 'inherit') {\n issues.push({\n level: 'warning',\n message: `forkContext is true, so model will be forced to 'inherit' (compatibility behavior)`,\n })\n }\n\n const normalizedModel =\n model && model.length > 0 ? mapClaudeModelToKode(model) : undefined\n\n if (normalizedModel && normalizedModel !== 'inherit') {\n const manager = getModelManager()\n const resolved = manager.resolveModelWithInfo(normalizedModel as any)\n if (!resolved.success || !resolved.profile) {\n issues.push({\n level: 'error',\n message:\n resolved.error ??\n `Model '${String(normalizedModel)}' could not be resolved`,\n })\n }\n }\n\n const filename = basename(args.filePath, '.md')\n if (agentType && filename !== agentType) {\n issues.push({\n level: 'warning',\n message: `Filename '${filename}.md' does not match agent name '${agentType}'`,\n })\n }\n\n return {\n filePath: args.filePath,\n agentType: agentType ?? null,\n issues,\n ...(model ? { model } : {}),\n ...(normalizedModel ? { normalizedModel } : {}),\n }\n}\n\nfunction defaultValidationPaths(cwd: string): string[] {\n const out: string[] = []\n\n const policyDir = join(getClaudePolicyBaseDir(), '.claude', 'agents')\n if (existsSync(policyDir)) out.push(policyDir)\n\n for (const root of getUserConfigRoots()) {\n const dirPath = join(root, 'agents')\n if (existsSync(dirPath)) out.push(dirPath)\n }\n\n for (const dirPath of findProjectAgentDirs(cwd)) {\n if (existsSync(dirPath)) out.push(dirPath)\n }\n\n return out\n}\n\nexport async function validateAgentTemplates(args: {\n cwd: string\n paths: string[]\n checkTools: boolean\n}): Promise<{\n ok: boolean\n errorCount: number\n warningCount: number\n results: AgentValidateFileResult[]\n}> {\n const inputPaths = args.paths.length > 0 ? args.paths : defaultValidationPaths(args.cwd)\n const markdownFiles = new Set<string>()\n for (const inputPath of inputPaths) {\n const resolved = resolve(args.cwd, inputPath)\n if (!existsSync(resolved)) continue\n let st: ReturnType<typeof statSync>\n try {\n st = statSync(resolved)\n } catch {\n continue\n }\n if (st.isFile()) {\n if (resolved.toLowerCase().endsWith('.md')) markdownFiles.add(resolved)\n continue\n }\n if (st.isDirectory()) {\n for (const f of listMarkdownFilesRecursively(resolved)) markdownFiles.add(f)\n }\n }\n\n let knownToolNames: Set<string> | undefined\n if (args.checkTools) {\n try {\n const { getTools } = await import('@tools')\n const { getCurrentProjectConfig } = await import('@utils/config')\n const allTools = await getTools(getCurrentProjectConfig().enableArchitectTool)\n knownToolNames = new Set(allTools.map(t => t.name))\n } catch {\n knownToolNames = undefined\n }\n }\n\n const results = Array.from(markdownFiles)\n .sort((a, b) => a.localeCompare(b))\n .map(filePath =>\n validateOneAgentFile({\n filePath,\n knownToolNames,\n }),\n )\n\n const errorCount = results.reduce(\n (sum, r) => sum + r.issues.filter(i => i.level === 'error').length,\n 0,\n )\n const warningCount = results.reduce(\n (sum, r) => sum + r.issues.filter(i => i.level === 'warning').length,\n 0,\n )\n\n return { ok: errorCount === 0, errorCount, warningCount, results }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["trimmed"]
|
|
7
|
-
}
|
package/dist/ask-3G5H5KD5.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/app/ask.ts"],
|
|
4
|
-
"sourcesContent": ["import { last } from 'lodash-es'\nimport { Command } from '@commands'\nimport { getSystemPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { getTotalCost } from '@costTracker'\nimport { Message, query } from '@query'\nimport type { CanUseToolFn } from '@kode-types/canUseTool'\nimport { Tool } from '@tool'\nimport { getModelManager } from '@utils/model'\nimport { setCwd } from '@utils/state'\nimport { getMessagesPath, overwriteLog } from '@utils/log'\nimport { createUserMessage } from '@utils/messages'\n\ntype Props = {\n commands: Command[]\n safeMode?: boolean\n hasPermissionsToUseTool: CanUseToolFn\n messageLogName: string\n prompt: string\n cwd: string\n tools: Tool[]\n verbose?: boolean\n initialMessages?: Message[]\n persistSession?: boolean\n}\n\nexport async function ask({\n commands,\n safeMode,\n hasPermissionsToUseTool,\n messageLogName,\n prompt,\n cwd,\n tools,\n verbose = false,\n initialMessages,\n persistSession = true,\n}: Props): Promise<{\n resultText: string\n totalCost: number\n messageHistoryFile: string\n}> {\n await setCwd(cwd)\n const message = createUserMessage(prompt)\n const messages: Message[] = [...(initialMessages ?? []), message]\n\n const [systemPrompt, context, model] = await Promise.all([\n getSystemPrompt(),\n getContext(),\n getModelManager().getModelName('main'),\n ])\n\n for await (const m of query(\n messages,\n systemPrompt,\n context,\n hasPermissionsToUseTool,\n {\n options: {\n commands,\n tools,\n verbose,\n safeMode,\n forkNumber: 0,\n messageLogName: 'unused',\n maxThinkingTokens: 0,\n persistSession,\n },\n abortController: new AbortController(),\n messageId: undefined,\n readFileTimestamps: {},\n setToolJSX: () => {},\n },\n )) {\n messages.push(m)\n }\n\n const result = last(messages)\n if (!result || result.type !== 'assistant') {\n throw new Error('Expected content to be an assistant message')\n }\n\n const textContent = result.message.content.find(c => c.type === 'text')\n if (!textContent) {\n throw new Error(\n `Expected at least one text content item, but got ${JSON.stringify(\n result.message.content,\n null,\n 2,\n )}`,\n )\n }\n\n const messageHistoryFile = getMessagesPath(messageLogName, 0, 0)\n overwriteLog(messageHistoryFile, messages)\n\n return {\n resultText: textContent.text,\n totalCost: getTotalCost(),\n messageHistoryFile,\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AA0BrB,eAAsB,IAAI;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,iBAAiB;AACnB,GAIG;AACD,QAAM,OAAO,GAAG;AAChB,QAAM,UAAU,kBAAkB,MAAM;AACxC,QAAM,WAAsB,CAAC,GAAI,mBAAmB,CAAC,GAAI,OAAO;AAEhE,QAAM,CAAC,cAAc,SAAS,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,gBAAgB,EAAE,aAAa,MAAM;AAAA,EACvC,CAAC;AAED,mBAAiB,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,mBAAmB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,iBAAiB,IAAI,gBAAgB;AAAA,MACrC,WAAW;AAAA,MACX,oBAAoB,CAAC;AAAA,MACrB,YAAY,MAAM;AAAA,MAAC;AAAA,IACrB;AAAA,EACF,GAAG;AACD,aAAS,KAAK,CAAC;AAAA,EACjB;AAEA,QAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,CAAC,UAAU,OAAO,SAAS,aAAa;AAC1C,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,QAAM,cAAc,OAAO,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACtE,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,oDAAoD,KAAK;AAAA,QACvD,OAAO,QAAQ;AAAA,QACf;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,qBAAqB,gBAAgB,gBAAgB,GAAG,CAAC;AAC/D,eAAa,oBAAoB,QAAQ;AAEzC,SAAO;AAAA,IACL,YAAY,YAAY;AAAA,IACxB,WAAW,aAAa;AAAA,IACxB;AAAA,EACF;AACF;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
-
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
-
import {
|
|
4
|
-
assertMinVersion,
|
|
5
|
-
checkAndNotifyUpdate,
|
|
6
|
-
getLatestVersion,
|
|
7
|
-
getUpdateCommandSuggestions
|
|
8
|
-
} from "./chunk-BHGTA6JQ.js";
|
|
9
|
-
import "./chunk-MN77D2F7.js";
|
|
10
|
-
import "./chunk-FH5CHM6L.js";
|
|
11
|
-
import "./chunk-JC6NCUG5.js";
|
|
12
|
-
export {
|
|
13
|
-
assertMinVersion,
|
|
14
|
-
checkAndNotifyUpdate,
|
|
15
|
-
getLatestVersion,
|
|
16
|
-
getUpdateCommandSuggestions
|
|
17
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/utils/messages/core.ts", "../src/services/ai/llmConstants.ts", "../src/utils/messages/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash, randomUUID, UUID } from 'crypto'\nimport { AssistantMessage, Message, ProgressMessage, UserMessage } from '@query'\nimport { last, memoize } from 'lodash-es'\nimport type { Tool } from '@tool'\nimport { NO_CONTENT_MESSAGE } from '@services/llmConstants'\nimport {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n Message as APIMessage,\n ContentBlockParam,\n ContentBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:\\n`\nexport const REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.\\n\\nRejected plan:\\n`\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n\nfunction stableUuidFromSeed(seed: string): UUID {\n const hex = createHash('sha256').update(seed).digest('hex').slice(0, 32)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}` as UUID\n}\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown\n resultForAssistant: ToolResultBlockParam['content']\n newMessages?: Message[]\n contextModifier?: { modifyContext: (ctx: any) => any }\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + '([\\\\s\\\\S]*?)' + `<\\\\/${escapedTag}>`,\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n depth = 0\n\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap(message => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n const contentBlocks = message.message.content.filter(\n block =>\n !(\n block.type === 'thinking' &&\n (typeof (block as any).thinking !== 'string' ||\n (block as any).thinking.trim().length === 0)\n ),\n )\n\n return contentBlocks.map((block, blockIndex) => {\n switch (message.type) {\n case 'assistant':\n const baseSeed = String(\n (message as any).uuid ??\n (message as any).message?.id ??\n randomUUID(),\n )\n return {\n type: 'assistant',\n uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),\n message: {\n ...message.message,\n content: [block],\n },\n costUSD:\n (message as AssistantMessage).costUSD / contentBlocks.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n case 'user':\n return message as NormalizedUserMessage\n }\n })\n })\n}\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: any[] }\n}\n\ntype ToolUseLikeBlockParam = ToolUseBlockParam & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nfunction isToolUseLikeBlockParam(block: any): block is ToolUseLikeBlockParam {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use') &&\n typeof block.id === 'string'\n )\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n message.message.content.some(isToolUseLikeBlockParam)\n )\n}\n\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n if (message.type === 'progress') {\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\nconst getToolResultIDs = memoize(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseLikeBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n !(_.message.content[0].id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n\n function isQueuedWaitingProgressMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'progress') return false\n const firstBlock = message.content.message.content[0]\n if (!firstBlock || firstBlock.type !== 'text') return false\n const rawText = String(firstBlock.text ?? '')\n const text = rawText.startsWith('<tool-progress>')\n ? (extractTag(rawText, 'tool-progress') ?? rawText)\n : rawText\n return text.trim() === 'Waiting\u2026'\n }\n\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages\n .filter(\n (_): _ is ProgressMessage =>\n _.type === 'progress' && !isQueuedWaitingProgressMessage(_),\n )\n .map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n const firstBlock = _.message.content[0]\n if (!isToolUseLikeBlockParam(firstBlock)) return false\n const toolUseID = firstBlock.id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n _.message.content[0].id in toolResults &&\n toolResults[_.message.content[0].id],\n ) as AssistantMessage[]\n}\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n function isSyntheticApiErrorMessage(message: Message): boolean {\n return (\n message.type === 'assistant' &&\n message.isApiErrorMessage === true &&\n message.message.model === '<synthetic>'\n )\n }\n\n function normalizeUserContent(\n content: UserMessage['message']['content'],\n ): ContentBlockParam[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return content\n }\n\n function toolResultsFirst(content: ContentBlockParam[]): ContentBlockParam[] {\n const toolResults: ContentBlockParam[] = []\n const rest: ContentBlockParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n toolResults.push(block)\n } else {\n rest.push(block)\n }\n }\n return [...toolResults, ...rest]\n }\n\n function mergeUserMessages(\n base: UserMessage,\n next: UserMessage,\n ): UserMessage {\n const baseBlocks = normalizeUserContent(base.message.content)\n const nextBlocks = normalizeUserContent(next.message.content)\n return {\n ...base,\n message: {\n ...base.message,\n content: toolResultsFirst([...baseBlocks, ...nextBlocks]),\n },\n }\n }\n\n function isUserToolResultMessage(message: Message): message is UserMessage {\n if (message.type !== 'user') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content.some(block => block.type === 'tool_result')\n }\n\n const result: (UserMessage | AssistantMessage)[] = []\n for (const message of messages) {\n if (message.type === 'progress') continue\n if (isSyntheticApiErrorMessage(message)) continue\n\n switch (message.type) {\n case 'user': {\n const prev = last(result)\n if (prev?.type === 'user') {\n result[result.indexOf(prev)] = mergeUserMessages(prev, message)\n } else {\n result.push(message)\n }\n break\n }\n case 'assistant': {\n let merged = false\n for (let i = result.length - 1; i >= 0; i--) {\n const prev = result[i]\n if (prev.type !== 'assistant' && !isUserToolResultMessage(prev)) {\n break\n }\n if (prev.type === 'assistant') {\n if (prev.message.id === message.message.id) {\n result[i] = {\n ...prev,\n message: {\n ...prev.message,\n content: [\n ...(Array.isArray(prev.message.content)\n ? prev.message.content\n : []),\n ...(Array.isArray(message.message.content)\n ? message.message.content\n : []),\n ],\n },\n }\n merged = true\n }\n break\n }\n }\n if (!merged) {\n result.push(message)\n }\n break\n }\n }\n }\n\n return result\n}\n\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\n return content.replace(regex, '').trim()\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n return isToolUseLikeBlockParam(message.message.content[0])\n ? message.message.content[0].id\n : null\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n", "export const API_ERROR_MESSAGE_PREFIX = 'API Error'\nexport const PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\nexport const CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = 'Credit balance is too low'\nexport const INVALID_API_KEY_ERROR_MESSAGE =\n 'Invalid API key \u00B7 Please run /login'\nexport const NO_CONTENT_MESSAGE = '(no content)'\n\nexport const MAIN_QUERY_TEMPERATURE = 1\n", "export * from './core'\n\nimport type { SetToolJSXFn, ToolUseContext } from '@tool'\nimport type { Message } from '@query'\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n }\n },\n pastedImages: Array<{\n placeholder: string\n data: string\n mediaType: string\n }> | null,\n): Promise<Message[]> {\n const impl = await import('./userInput')\n return impl.processUserInput(input, mode, setToolJSX, context, pastedImages)\n}\n\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/services/plugins/skillMarketplace.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n copyFileSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { basename, dirname, join, resolve, sep } from 'node:path'\nimport { unzipSync } from 'fflate'\nimport { z } from 'zod'\nimport { CONFIG_BASE_DIR } from '@constants/product'\nimport { getCwd } from '@utils/state'\nimport { getKodeBaseDir } from '@utils/config/env'\n\nconst KNOWN_MARKETPLACES_FILE = 'known_marketplaces.json'\nconst MARKETPLACES_CACHE_DIR = 'marketplaces'\nconst INSTALLED_SKILL_PLUGINS_FILE = 'installed-skill-plugins.json'\n\nconst MarketplaceSourceSchema = z.discriminatedUnion('source', [\n z.strictObject({\n source: z.literal('github'),\n repo: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('git'),\n url: z.string().min(3),\n ref: z.string().optional(),\n path: z.string().optional(),\n }),\n z.strictObject({\n source: z.literal('url'),\n url: z.string().url(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n z.strictObject({\n source: z.literal('npm'),\n package: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('file'),\n path: z.string().min(1),\n }),\n z.strictObject({\n source: z.literal('directory'),\n path: z.string().min(1),\n }),\n])\n\nexport type MarketplaceSource = z.infer<typeof MarketplaceSourceSchema>\n\nconst MarketplacePathListSchema = z.preprocess(value => {\n if (typeof value === 'string') return [value]\n return value\n}, z.array(z.string()))\n\nconst MarketplacePluginSchema = z\n .object({\n name: z.string().min(1),\n description: z.string().optional(),\n source: z.string().optional().default('./'),\n strict: z.boolean().optional(),\n skills: MarketplacePathListSchema.optional(),\n commands: MarketplacePathListSchema.optional(),\n })\n .passthrough()\n\nexport const MarketplaceManifestSchema = z\n .object({\n $schema: z.string().optional(),\n description: z.string().optional(),\n name: z.string().min(1),\n owner: z\n .object({\n name: z.string().optional(),\n email: z.string().optional(),\n })\n .passthrough()\n .optional(),\n metadata: z.record(z.string(), z.unknown()).optional().default({}),\n plugins: z.array(MarketplacePluginSchema).default([]),\n })\n .passthrough()\n\nexport type MarketplaceManifest = z.infer<typeof MarketplaceManifestSchema>\nexport type PluginEntry = MarketplaceManifest['plugins'][number]\n\nconst KnownMarketplacesSchema = z.record(\n z.string(),\n z.strictObject({\n source: MarketplaceSourceSchema,\n installLocation: z.string().min(1),\n lastUpdated: z.string().min(1),\n autoUpdate: z.boolean().optional(),\n }),\n)\n\nexport type KnownMarketplacesConfig = z.infer<typeof KnownMarketplacesSchema>\n\nexport type PluginScope = 'user' | 'project' | 'local'\n\ntype InstalledSkillPlugin = {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n\ntype InstalledSkillPluginsFile = Record<string, InstalledSkillPlugin>\n\nfunction userKodeDir(): string {\n return getKodeBaseDir()\n}\n\nfunction normalizePluginScope(options?: {\n scope?: PluginScope\n project?: boolean\n}): PluginScope {\n if (\n options?.scope === 'user' ||\n options?.scope === 'project' ||\n options?.scope === 'local'\n ) {\n return options.scope\n }\n if (options?.project === true) return 'project'\n return 'user'\n}\n\nfunction scopeBaseDir(scope: PluginScope): string {\n if (scope === 'user') return userKodeDir()\n return join(getCwd(), CONFIG_BASE_DIR)\n}\n\nfunction scopeSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills')\n}\n\nfunction scopeCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands')\n}\n\nfunction scopeDisabledSkillsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'skills.disabled')\n}\n\nfunction scopeDisabledCommandsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'commands.disabled')\n}\n\nfunction scopeInstalledPluginsDir(scope: PluginScope): string {\n return join(scopeBaseDir(scope), 'plugins', 'installed')\n}\n\nfunction scopeInstalledPluginRoot(\n scope: PluginScope,\n plugin: string,\n marketplace: string,\n): string {\n return join(scopeInstalledPluginsDir(scope), plugin, marketplace)\n}\n\nfunction pluginsDir(): string {\n return join(userKodeDir(), 'plugins')\n}\n\nfunction knownMarketplacesConfigPath(): string {\n return join(pluginsDir(), KNOWN_MARKETPLACES_FILE)\n}\n\nfunction marketplaceCacheBaseDir(): string {\n return join(pluginsDir(), MARKETPLACES_CACHE_DIR)\n}\n\nfunction installedSkillPluginsPath(): string {\n return join(userKodeDir(), INSTALLED_SKILL_PLUGINS_FILE)\n}\n\nfunction ensureDir(path: string): void {\n mkdirSync(path, { recursive: true })\n}\n\nfunction readJsonFile<T>(path: string, fallback: T): T {\n try {\n if (!existsSync(path)) return fallback\n const raw = readFileSync(path, 'utf8')\n return JSON.parse(raw) as T\n } catch {\n return fallback\n }\n}\n\nfunction writeJsonFile(path: string, value: unknown): void {\n ensureDir(dirname(path))\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nfunction normalizeMarketplaceSubPath(path: string | undefined): string | null {\n if (!path) return null\n const trimmed = path\n .trim()\n .replace(/^\\.?\\//, '')\n .replace(/^\\/+/, '')\n if (!trimmed) return null\n if (trimmed.includes('..')) {\n throw new Error(`Marketplace path contains '..': ${path}`)\n }\n return trimmed.replace(/\\\\/g, '/').replace(/\\/+$/, '')\n}\n\nfunction safeJoinWithin(baseDir: string, relativePath: string): string {\n const normalized = relativePath.replace(/\\\\/g, '/')\n if (!normalized || normalized.startsWith('/') || normalized.includes('..')) {\n throw new Error(`Unsafe path in archive: ${relativePath}`)\n }\n const joined = resolve(baseDir, normalized.split('/').join(sep))\n const resolvedBase = resolve(baseDir)\n if (!joined.startsWith(resolvedBase + sep) && joined !== resolvedBase) {\n throw new Error(`Path traversal detected: ${relativePath}`)\n }\n return joined\n}\n\nfunction ensureEmptyDir(path: string): void {\n if (existsSync(path)) rmSync(path, { recursive: true, force: true })\n ensureDir(path)\n}\n\nfunction safeCopyDirectory(srcDir: string, destDir: string): void {\n ensureDir(destDir)\n const entries = readdirSync(srcDir, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = join(srcDir, entry.name)\n const destPath = join(destDir, entry.name)\n\n if (entry.isDirectory()) {\n safeCopyDirectory(srcPath, destPath)\n continue\n }\n\n if (entry.isFile()) {\n ensureDir(dirname(destPath))\n copyFileSync(srcPath, destPath)\n continue\n }\n\n }\n}\n\nfunction readMarketplaceFromDirectory(rootDir: string): MarketplaceManifest {\n const primaryMarketplaceFile = resolve(\n rootDir,\n '.kode-plugin',\n 'marketplace.json',\n )\n const legacyMarketplaceFile = resolve(\n rootDir,\n '.claude-plugin',\n 'marketplace.json',\n )\n const marketplaceFile = existsSync(primaryMarketplaceFile)\n ? primaryMarketplaceFile\n : legacyMarketplaceFile\n if (!existsSync(marketplaceFile)) {\n throw new Error(\n `Marketplace file not found (expected .kode-plugin/marketplace.json or .claude-plugin/marketplace.json)`,\n )\n }\n const raw = readFileSync(marketplaceFile, 'utf8')\n const parsed = MarketplaceManifestSchema.safeParse(JSON.parse(raw))\n if (!parsed.success) {\n throw new Error(\n `Invalid marketplace.json: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nexport function parsePluginSpec(spec: string): {\n plugin: string\n marketplace: string\n} {\n const trimmed = spec.trim()\n const parts = trimmed.split('@')\n if (parts.length !== 2) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n const plugin = parts[0]!.trim()\n const marketplace = parts[1]!.trim()\n if (!plugin || !marketplace) {\n throw new Error(\n `Invalid plugin spec: ${spec}. Expected format: <plugin>@<marketplace>`,\n )\n }\n return { plugin, marketplace }\n}\n\nfunction resolvePluginForInstall(pluginInput: string): {\n plugin: string\n marketplace: string\n pluginSpec: string\n} {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n const resolved = parsePluginSpec(trimmed)\n return {\n ...resolved,\n pluginSpec: `${resolved.plugin}@${resolved.marketplace}`,\n }\n }\n\n const config = loadKnownMarketplaces()\n const matches: { marketplace: string; entry: PluginEntry }[] = []\n for (const [marketplace, entry] of Object.entries(config)) {\n try {\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n const found = manifest.plugins.find(p => p.name === trimmed)\n if (found) matches.push({ marketplace, entry: found })\n } catch {\n }\n }\n\n if (matches.length === 0) {\n const availableMarketplaces = Object.keys(config).sort().join(', ')\n throw new Error(\n `Plugin '${trimmed}' not found in any marketplace. Available marketplaces: ${availableMarketplaces || '(none)'}`,\n )\n }\n\n if (matches.length > 1) {\n const options = matches\n .map(m => `${trimmed}@${m.marketplace}`)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is available in multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n\n return {\n plugin: trimmed,\n marketplace: matches[0]!.marketplace,\n pluginSpec: `${trimmed}@${matches[0]!.marketplace}`,\n }\n}\n\nfunction resolveInstalledPluginSpec(\n pluginInput: string,\n state: InstalledSkillPluginsFile,\n): string {\n const trimmed = pluginInput.trim()\n if (!trimmed) throw new Error('Plugin is required')\n\n if (trimmed.includes('@')) {\n parsePluginSpec(trimmed)\n return trimmed\n }\n\n const matches = Object.entries(state).filter(\n ([, record]) => record?.plugin === trimmed,\n )\n if (matches.length === 0) {\n throw new Error(`Plugin '${trimmed}' is not installed`)\n }\n if (matches.length > 1) {\n const options = matches\n .map(([spec]) => spec)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${trimmed}' is installed from multiple marketplaces. Use an explicit spec: ${options}`,\n )\n }\n return matches[0]![0]\n}\n\nfunction baseDirForInstallRecord(record: InstalledSkillPlugin): string {\n if (record.scope === 'user') return userKodeDir()\n const projectPath =\n typeof record.projectPath === 'string' ? record.projectPath.trim() : ''\n if (!projectPath) {\n throw new Error(\n `Installed plugin '${record.plugin}@${record.marketplace}' is missing projectPath for scope=${record.scope}`,\n )\n }\n return join(projectPath, CONFIG_BASE_DIR)\n}\n\nfunction githubRepoFromUrl(input: string): string | null {\n const ssh = input.match(/^git@github\\.com:([^/]+\\/[^/]+?)(?:\\.git)?$/)\n if (ssh?.[1]) return ssh[1]\n const https = input.match(\n /^https?:\\/\\/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?$/,\n )\n if (https?.[1]) return https[1]\n return null\n}\n\nfunction parseRefAndPath(input: string): {\n base: string\n ref?: string\n path?: string\n} {\n const [beforeHash, hashPart] = input.split('#', 2)\n const [base, refPart] = beforeHash.split('@', 2)\n return {\n base,\n ref: refPart?.trim() || undefined,\n path: hashPart?.trim() || undefined,\n }\n}\n\nfunction parseMarketplaceSourceInput(sourceInput: string): MarketplaceSource {\n const raw = sourceInput.trim()\n if (!raw) throw new Error('Marketplace source is required')\n\n for (const prefix of [\n 'github:',\n 'git:',\n 'url:',\n 'npm:',\n 'file:',\n 'dir:',\n ] as const) {\n if (raw.startsWith(prefix)) {\n const rest = raw.slice(prefix.length).trim()\n const parsed = parseRefAndPath(rest)\n if (prefix === 'github:') {\n return {\n source: 'github',\n repo: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'git:') {\n const repo = githubRepoFromUrl(parsed.base.trim())\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n return {\n source: 'git',\n url: parsed.base.trim(),\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n if (prefix === 'url:') {\n return { source: 'url', url: rest }\n }\n if (prefix === 'npm:') {\n return { source: 'npm', package: rest }\n }\n if (prefix === 'file:') {\n return { source: 'file', path: rest }\n }\n if (prefix === 'dir:') {\n return { source: 'directory', path: rest }\n }\n }\n }\n\n const resolved = resolve(raw)\n if (existsSync(resolved)) {\n const stat = lstatSync(resolved)\n if (stat.isDirectory()) return { source: 'directory', path: resolved }\n if (stat.isFile()) return { source: 'file', path: resolved }\n throw new Error(`Marketplace source must be a directory or file: ${raw}`)\n }\n\n const parsed = parseRefAndPath(raw)\n if (/^[^/\\s]+\\/[^/\\s]+$/.test(parsed.base)) {\n return {\n source: 'github',\n repo: parsed.base,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n const repo = githubRepoFromUrl(parsed.base)\n if (repo) {\n return {\n source: 'github',\n repo,\n ...(parsed.ref ? { ref: parsed.ref } : {}),\n ...(parsed.path ? { path: parsed.path } : {}),\n }\n }\n\n if (/^https?:\\/\\//.test(raw)) {\n return { source: 'url', url: raw }\n }\n\n throw new Error(\n `Unsupported marketplace source: ${sourceInput}. Use a local path, \"owner/repo\", or prefixes like github:, git:, url:, file:, dir:.`,\n )\n}\n\nasync function fetchBinary(url: string): Promise<Uint8Array> {\n const resp = await fetch(url, { method: 'GET' })\n if (!resp.ok) {\n throw new Error(\n `Failed to download ${url}: ${resp.status} ${resp.statusText}`,\n )\n }\n const buf = await resp.arrayBuffer()\n return new Uint8Array(buf)\n}\n\nasync function tryDownloadGithubZip(\n repo: string,\n ref: string,\n): Promise<Uint8Array> {\n const [owner, name] = repo.split('/', 2)\n if (!owner || !name) throw new Error(`Invalid GitHub repo: ${repo}`)\n\n const candidates = ref.startsWith('refs/')\n ? [ref]\n : [`refs/heads/${ref}`, `refs/tags/${ref}`]\n\n\t let lastError: Error | null = null\n\t for (const candidate of candidates) {\n\t const url = `https://codeload.github.com/${owner}/${name}/zip/${candidate}`\n\t try {\n\t return await fetchBinary(url)\n\t } catch (err) {\n\t lastError = err instanceof Error ? err : Error(String(err))\n\t }\n }\n throw lastError ?? new Error(`Failed to download GitHub repo ${repo}@${ref}`)\n}\n\nasync function cacheMarketplaceToTempDir(\n source: MarketplaceSource,\n tempDir: string,\n): Promise<void> {\n ensureEmptyDir(tempDir)\n\n if (source.source === 'directory') {\n const root = resolve(source.path)\n if (!existsSync(root) || !lstatSync(root).isDirectory()) {\n throw new Error(`Directory not found: ${source.path}`)\n }\n safeCopyDirectory(root, tempDir)\n return\n }\n\n if (source.source === 'file') {\n const file = resolve(source.path)\n if (!existsSync(file) || !lstatSync(file).isFile()) {\n throw new Error(`File not found: ${source.path}`)\n }\n const out = join(tempDir, '.kode-plugin')\n ensureDir(out)\n copyFileSync(file, join(out, 'marketplace.json'))\n return\n }\n\n if (source.source === 'github') {\n const pathWithin = normalizeMarketplaceSubPath(source.path)\n\n const preferredRef = source.ref?.trim() || ''\n const refsToTry = preferredRef ? [preferredRef] : ['main', 'master']\n\n let zip: Uint8Array | null = null\n let usedRef = preferredRef || 'main'\n let lastError: Error | null = null\n for (const ref of refsToTry) {\n try {\n zip = await tryDownloadGithubZip(source.repo, ref)\n usedRef = ref\n break\n } catch (err) {\n lastError = err instanceof Error ? err : Error(String(err))\n }\n }\n if (!zip)\n throw (\n lastError ?? new Error(`Failed to download GitHub repo ${source.repo}`)\n )\n\n const files = unzipSync(zip)\n const names = Object.keys(files).filter(Boolean)\n const topDir = names.length > 0 ? names[0]!.split('/')[0]! : ''\n const includePrefix = pathWithin\n ? `${topDir}/${pathWithin.replace(/\\/+$/, '')}/`\n : `${topDir}/`\n\n let extractedCount = 0\n for (const [name, data] of Object.entries(files)) {\n if (!name.startsWith(includePrefix)) continue\n const rel = name.slice(includePrefix.length)\n if (!rel) continue\n if (rel.endsWith('/')) {\n ensureDir(safeJoinWithin(tempDir, rel))\n continue\n }\n const dest = safeJoinWithin(tempDir, rel)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n extractedCount++\n }\n\n if (extractedCount === 0) {\n throw new Error(\n `No files extracted from ${source.repo}@${usedRef}${pathWithin ? `#${pathWithin}` : ''}`,\n )\n }\n return\n }\n\n if (source.source === 'url') {\n const url = source.url\n if (url.toLowerCase().endsWith('.json')) {\n const data = await fetchBinary(url)\n const out = join(tempDir, '.kode-plugin')\n ensureDir(out)\n writeFileSync(join(out, 'marketplace.json'), Buffer.from(data))\n return\n }\n if (url.toLowerCase().endsWith('.zip')) {\n const zip = await fetchBinary(url)\n const files = unzipSync(zip)\n for (const [name, data] of Object.entries(files)) {\n if (!name || name.endsWith('/')) continue\n const dest = safeJoinWithin(tempDir, name)\n ensureDir(dirname(dest))\n writeFileSync(dest, data)\n }\n return\n }\n throw new Error(\n `Unsupported url marketplace source. Provide a .json or .zip URL: ${url}`,\n )\n }\n\n if (source.source === 'git') {\n const repo = githubRepoFromUrl(source.url)\n if (repo) {\n await cacheMarketplaceToTempDir(\n {\n source: 'github',\n repo,\n ...(source.ref ? { ref: source.ref } : {}),\n ...(source.path ? { path: source.path } : {}),\n },\n tempDir,\n )\n return\n }\n throw new Error(\n `git sources are not supported without GitHub conversion (url=${source.url})`,\n )\n }\n\n if (source.source === 'npm') {\n throw new Error(\n `npm marketplace sources are not supported yet (package=${source.package}). Install the package and add it as a local dir instead.`,\n )\n }\n}\n\nfunction loadKnownMarketplaces(): KnownMarketplacesConfig {\n const raw = readJsonFile<unknown>(knownMarketplacesConfigPath(), {})\n const parsed = KnownMarketplacesSchema.safeParse(raw)\n if (!parsed.success) {\n throw new Error(\n `Marketplace configuration is corrupted: ${parsed.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n return parsed.data\n}\n\nfunction saveKnownMarketplaces(config: KnownMarketplacesConfig): void {\n const parsed = KnownMarketplacesSchema.safeParse(config)\n if (!parsed.success) {\n throw new Error(`Invalid marketplace config: ${parsed.error.message}`)\n }\n writeJsonFile(knownMarketplacesConfigPath(), parsed.data)\n}\n\nexport function listMarketplaces(): KnownMarketplacesConfig {\n return loadKnownMarketplaces()\n}\n\nexport async function addMarketplace(\n sourceInput: string,\n): Promise<{ name: string }> {\n const source = parseMarketplaceSourceInput(sourceInput)\n const validatedSource = MarketplaceSourceSchema.safeParse(source)\n if (!validatedSource.success) {\n throw new Error(\n `Invalid marketplace source: ${validatedSource.error.issues.map(i => i.message).join('; ')}`,\n )\n }\n\n const config = loadKnownMarketplaces()\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(validatedSource.data, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n const marketplaceName = manifest.name\n\n if (config[marketplaceName]) {\n throw new Error(\n `Marketplace '${marketplaceName}' is already installed. Remove it first to re-add.`,\n )\n }\n\n const installLocation = join(cacheBase, marketplaceName)\n if (existsSync(installLocation)) {\n throw new Error(\n `Marketplace cache directory already exists: ${installLocation}`,\n )\n }\n\n renameSync(tempDir, installLocation)\n config[marketplaceName] = {\n source: validatedSource.data,\n installLocation,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n return { name: marketplaceName }\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport function removeMarketplace(name: string): void {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n delete config[trimmed]\n saveKnownMarketplaces(config)\n\n try {\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n } catch {\n }\n}\n\nexport async function refreshMarketplaceAsync(name: string): Promise<void> {\n const trimmed = name.trim()\n if (!trimmed) throw new Error('Marketplace name is required')\n\n const config = loadKnownMarketplaces()\n const entry = config[trimmed]\n if (!entry) throw new Error(`Marketplace '${trimmed}' not found`)\n\n const cacheBase = marketplaceCacheBaseDir()\n ensureDir(cacheBase)\n\n const tempDir = join(cacheBase, `tmp-${randomUUID()}`)\n try {\n await cacheMarketplaceToTempDir(entry.source, tempDir)\n const manifest = readMarketplaceFromDirectory(tempDir)\n if (manifest.name !== trimmed) {\n throw new Error(\n `Marketplace name mismatch on refresh: expected ${trimmed}, got ${manifest.name}`,\n )\n }\n\n if (existsSync(entry.installLocation)) {\n rmSync(entry.installLocation, { recursive: true, force: true })\n }\n renameSync(tempDir, entry.installLocation)\n config[trimmed] = {\n ...entry,\n lastUpdated: new Date().toISOString(),\n }\n saveKnownMarketplaces(config)\n } catch (error) {\n if (existsSync(tempDir)) rmSync(tempDir, { recursive: true, force: true })\n throw error\n }\n}\n\nexport async function refreshAllMarketplacesAsync(\n onProgress?: (message: string) => void,\n): Promise<{ refreshed: string[]; failed: { name: string; error: string }[] }> {\n const config = loadKnownMarketplaces()\n const names = Object.keys(config).sort()\n\n const refreshed: string[] = []\n const failed: { name: string; error: string }[] = []\n\n for (const name of names) {\n try {\n onProgress?.(`Updating marketplace: ${name}...`)\n await refreshMarketplaceAsync(name)\n refreshed.push(name)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n failed.push({ name, error: message })\n onProgress?.(`Failed to refresh marketplace ${name}: ${message}`)\n }\n }\n\n return { refreshed, failed }\n}\n\nexport function getMarketplaceManifest(marketplaceName: string): {\n manifest: MarketplaceManifest\n rootDir: string\n source: MarketplaceSource\n} {\n const config = loadKnownMarketplaces()\n const entry = config[marketplaceName]\n if (!entry) {\n const available = Object.keys(config).sort().join(', ')\n throw new Error(\n `Marketplace '${marketplaceName}' not found. Available marketplaces: ${available || '(none)'}`,\n )\n }\n const manifest = readMarketplaceFromDirectory(entry.installLocation)\n return { manifest, rootDir: entry.installLocation, source: entry.source }\n}\n\nfunction ensurePluginInstallState(): InstalledSkillPluginsFile {\n ensureDir(userKodeDir())\n const state = readJsonFile<Record<string, any>>(\n installedSkillPluginsPath(),\n {},\n )\n for (const record of Object.values(state)) {\n if (!record || typeof record !== 'object') continue\n if (\n record.scope !== 'user' &&\n record.scope !== 'project' &&\n record.scope !== 'local'\n ) {\n record.scope = 'user'\n }\n if (record.kind !== 'skill-pack' && record.kind !== 'plugin-pack') {\n record.kind =\n typeof record.pluginRoot === 'string' ? 'plugin-pack' : 'skill-pack'\n }\n if (record.isEnabled === undefined) record.isEnabled = true\n }\n return state as InstalledSkillPluginsFile\n}\n\nfunction savePluginInstallState(state: InstalledSkillPluginsFile): void {\n writeJsonFile(installedSkillPluginsPath(), state)\n}\n\nexport function installSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean; force?: boolean },\n): {\n pluginSpec: string\n installedSkills: string[]\n installedCommands: string[]\n} {\n const scope = normalizePluginScope(options)\n const { plugin, marketplace, pluginSpec } =\n resolvePluginForInstall(pluginInput)\n const { manifest, rootDir, source } = getMarketplaceManifest(marketplace)\n\n const entry = manifest.plugins.find(p => p.name === plugin)\n if (!entry) {\n const available = manifest.plugins\n .map(p => p.name)\n .sort()\n .join(', ')\n throw new Error(\n `Plugin '${plugin}' not found in marketplace '${marketplace}'. Available plugins: ${available || '(none)'}`,\n )\n }\n\n const installState = ensurePluginInstallState()\n const existing = installState[pluginSpec]\n if (existing && existing.scope !== scope && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed with scope=${existing.scope}. Uninstall it first to install with scope=${scope}.`,\n )\n }\n if (existing && options?.force !== true) {\n throw new Error(\n `Plugin '${pluginSpec}' is already installed. Re-run with --force to reinstall.`,\n )\n }\n\n const entrySourceBase = resolve(rootDir, entry.source ?? './')\n const primaryManifestPath = join(\n entrySourceBase,\n '.kode-plugin',\n 'plugin.json',\n )\n const legacyManifestPath = join(\n entrySourceBase,\n '.claude-plugin',\n 'plugin.json',\n )\n const pluginManifestPath = existsSync(primaryManifestPath)\n ? primaryManifestPath\n : legacyManifestPath\n\n if (\n existsSync(pluginManifestPath) &&\n lstatSync(pluginManifestPath).isFile()\n ) {\n const pluginRoot = scopeInstalledPluginRoot(scope, plugin, marketplace)\n if (existsSync(pluginRoot) && options?.force !== true) {\n throw new Error(`Destination already exists: ${pluginRoot}`)\n }\n ensureEmptyDir(pluginRoot)\n safeCopyDirectory(entrySourceBase, pluginRoot)\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'plugin-pack',\n pluginRoot,\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: [],\n commands: [],\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills: [], installedCommands: [] }\n }\n\n const skillsDestBase = scopeSkillsDir(scope)\n const commandsDestBase = join(scopeCommandsDir(scope), plugin, marketplace)\n\n ensureDir(skillsDestBase)\n ensureDir(commandsDestBase)\n\n const installedSkills: string[] = []\n const installedCommands: string[] = []\n\n const skillPaths = entry.skills ?? []\n for (const rel of skillPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src) || !lstatSync(src).isDirectory()) {\n throw new Error(`Skill path not found or not a directory: ${src}`)\n }\n const skillName = basename(src)\n const dest = join(skillsDestBase, skillName)\n\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedSkills.push(skillName)\n }\n\n const commandPaths = entry.commands ?? []\n for (const rel of commandPaths) {\n const src = safeJoinWithin(entrySourceBase, rel)\n if (!existsSync(src)) {\n throw new Error(`Command path not found: ${src}`)\n }\n const stat = lstatSync(src)\n if (stat.isDirectory()) {\n const dest = join(commandsDestBase, basename(src))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n ensureEmptyDir(dest)\n safeCopyDirectory(src, dest)\n installedCommands.push(dest)\n continue\n }\n if (stat.isFile()) {\n const dest = join(commandsDestBase, basename(src))\n ensureDir(dirname(dest))\n if (existsSync(dest) && options?.force !== true) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n copyFileSync(src, dest)\n installedCommands.push(dest)\n continue\n }\n }\n\n installState[pluginSpec] = {\n plugin,\n marketplace,\n scope,\n kind: 'skill-pack',\n isEnabled: true,\n projectPath: scope === 'user' ? undefined : getCwd(),\n installedAt: new Date().toISOString(),\n skills: installedSkills,\n commands: installedCommands,\n sourceMarketplacePath:\n source.source === 'file' || source.source === 'directory'\n ? source.path\n : source.source === 'github'\n ? `github:${source.repo}`\n : source.source === 'url'\n ? source.url\n : source.source === 'git'\n ? source.url\n : `npm:${source.package}`,\n }\n savePluginInstallState(installState)\n\n return { pluginSpec, installedSkills, installedCommands }\n}\n\nexport function uninstallSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; removedSkills: string[]; removedCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) {\n throw new Error(`Plugin '${pluginSpec}' is not installed`)\n }\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.kind === 'plugin-pack') {\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n const removedCommands: string[] = []\n if (existsSync(pluginRoot)) {\n rmSync(pluginRoot, { recursive: true, force: true })\n removedCommands.push(pluginRoot)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills: [], removedCommands }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDestBase = join(baseDir, 'skills')\n const commandsDestBase = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsBase = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const removedSkills: string[] = []\n for (const skillName of record.skills) {\n const dest = join(skillsDestBase, skillName)\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n const disabledDest = join(disabledSkillsBase, skillName)\n if (existsSync(disabledDest))\n rmSync(disabledDest, { recursive: true, force: true })\n removedSkills.push(skillName)\n }\n\n const removedCommands: string[] = []\n if (existsSync(commandsDestBase)) {\n rmSync(commandsDestBase, { recursive: true, force: true })\n removedCommands.push(commandsDestBase)\n }\n if (existsSync(disabledCommandsBase)) {\n rmSync(disabledCommandsBase, { recursive: true, force: true })\n removedCommands.push(disabledCommandsBase)\n }\n\n delete state[pluginSpec]\n savePluginInstallState(state)\n\n return { pluginSpec, removedSkills, removedCommands }\n}\n\nexport function disableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): {\n pluginSpec: string\n disabledSkills: string[]\n disabledCommands: string[]\n} {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled === false) {\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, disabledSkills: [], disabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const disabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(skillsDir, skillName)\n if (!existsSync(src)) continue\n const dest = join(disabledSkillsBase, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) rmSync(dest, { recursive: true, force: true })\n renameSync(src, dest)\n disabledSkills.push(skillName)\n }\n\n const disabledCommands: string[] = []\n if (existsSync(commandsDir)) {\n ensureDir(dirname(disabledCommandsDir))\n if (existsSync(disabledCommandsDir)) {\n rmSync(disabledCommandsDir, { recursive: true, force: true })\n }\n renameSync(commandsDir, disabledCommandsDir)\n disabledCommands.push(disabledCommandsDir)\n }\n\n record.isEnabled = false\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, disabledSkills, disabledCommands }\n}\n\nexport function enableSkillPlugin(\n pluginInput: string,\n options?: { scope?: PluginScope; project?: boolean },\n): { pluginSpec: string; enabledSkills: string[]; enabledCommands: string[] } {\n const requestedScope = normalizePluginScope(options)\n const state = ensurePluginInstallState()\n const pluginSpec = resolveInstalledPluginSpec(pluginInput, state)\n const record = state[pluginSpec]\n if (!record) throw new Error(`Plugin '${pluginSpec}' is not installed`)\n\n if (record.scope !== requestedScope) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed with scope=${record.scope}. Re-run with --scope ${record.scope}.`,\n )\n }\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n const cwd = getCwd()\n if (!projectPath || projectPath !== cwd) {\n throw new Error(\n `Plugin '${pluginSpec}' is installed for a different directory. Expected cwd=${projectPath || '(missing)'}, got cwd=${cwd}`,\n )\n }\n }\n\n if (record.isEnabled !== false) {\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n if (record.kind === 'plugin-pack') {\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n return { pluginSpec, enabledSkills: [], enabledCommands: [] }\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const skillsDir = join(baseDir, 'skills')\n const commandsDir = join(\n baseDir,\n 'commands',\n record.plugin,\n record.marketplace,\n )\n const disabledSkillsBase = join(\n baseDir,\n 'skills.disabled',\n record.plugin,\n record.marketplace,\n )\n const disabledCommandsDir = join(\n baseDir,\n 'commands.disabled',\n record.plugin,\n record.marketplace,\n )\n\n const enabledSkills: string[] = []\n for (const skillName of record.skills) {\n const src = join(disabledSkillsBase, skillName)\n if (!existsSync(src)) continue\n const dest = join(skillsDir, skillName)\n ensureDir(dirname(dest))\n if (existsSync(dest)) {\n throw new Error(`Destination already exists: ${dest}`)\n }\n renameSync(src, dest)\n enabledSkills.push(skillName)\n }\n\n const enabledCommands: string[] = []\n if (existsSync(disabledCommandsDir)) {\n ensureDir(dirname(commandsDir))\n if (existsSync(commandsDir)) {\n throw new Error(`Destination already exists: ${commandsDir}`)\n }\n renameSync(disabledCommandsDir, commandsDir)\n enabledCommands.push(commandsDir)\n }\n\n record.isEnabled = true\n state[pluginSpec] = record\n savePluginInstallState(state)\n\n return { pluginSpec, enabledSkills, enabledCommands }\n}\n\nexport function listInstalledSkillPlugins(): InstalledSkillPluginsFile {\n return ensurePluginInstallState()\n}\n\nexport function listEnabledInstalledPluginPackRoots(): string[] {\n const state = ensurePluginInstallState()\n const cwd = getCwd()\n const roots: string[] = []\n\n for (const spec of Object.keys(state).sort()) {\n const record = state[spec]\n if (!record || record.kind !== 'plugin-pack') continue\n if (record.isEnabled === false) continue\n\n if (record.scope !== 'user') {\n const projectPath = record.projectPath?.trim() || ''\n if (!projectPath || projectPath !== cwd) continue\n }\n\n const baseDir = baseDirForInstallRecord(record)\n const pluginRoot =\n typeof record.pluginRoot === 'string' && record.pluginRoot.trim()\n ? record.pluginRoot\n : join(\n baseDir,\n 'plugins',\n 'installed',\n record.plugin,\n record.marketplace,\n )\n\n try {\n if (!existsSync(pluginRoot) || !lstatSync(pluginRoot).isDirectory())\n continue\n roots.push(pluginRoot)\n } catch {\n continue\n }\n }\n\n return roots\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["parsed", "repo", "baseDir", "removedCommands"]
|
|
7
|
-
}
|