@shareai-lab/kode 2.0.1 → 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-7LH4HTNR.js → chunks/agentsValidate-PEWMYN4Q.js} +97 -69
- package/dist/chunks/agentsValidate-PEWMYN4Q.js.map +7 -0
- package/dist/{ask-3NHFFUQG.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-AFFSCMYS.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-ARZSBOAO.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-UHYRLID6.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-YC6LJCDE.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-3IN27HA5.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-73WGVYLQ.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-QVLYOPO5.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-K2CWOTI2.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-RZWOUA25.js → chunks/chunk-HRJ3ICQK.js} +59 -55
- package/dist/chunks/chunk-HRJ3ICQK.js.map +7 -0
- package/dist/{chunk-DZE5YA7L.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-7M2YN6TU.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-W7GRKO7Q.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-7U7L4NMD.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-ZVDRDPII.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-MWRSY4X6.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-STSX7GIX.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-RUSD6G5Y.js → chunks/config-25HRTPSP.js} +48 -10
- package/dist/chunks/cost-tracker-Z2UZT2J5.js +28 -0
- package/dist/{customCommands-TOIJFZAL.js → chunks/customCommands-TYMYZRG5.js} +11 -8
- package/dist/chunks/engine-MRVF6FK6.js +39 -0
- package/dist/{env-XGKBLU3D.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-UGEZJJEB.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-QWM36A3D.js → chunks/kodeHooks-RVKYRJHG.js} +11 -9
- package/dist/{llm-ZUQC4WYM.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-EE3XFHCJ.js → chunks/mentionProcessor-RJW5UPJD.js} +46 -16
- package/dist/chunks/mentionProcessor-RJW5UPJD.js.map +7 -0
- package/dist/{messages-EOYQKPGM.js → chunks/messages-EEWWLPHN.js} +2 -6
- package/dist/chunks/model-5TIEKQPD.js +37 -0
- package/dist/{openai-RRCWW33N.js → chunks/openai-XXK3YZG4.js} +13 -10
- package/dist/{outputStyles-62Q3VH2J.js → chunks/outputStyles-FAJTXN2A.js} +6 -9
- package/dist/chunks/permissions-HO7INPWM.js +27 -0
- package/dist/{pluginRuntime-6ETCZ2LL.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-3RXQBVOL.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-DOPVY2CW.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-CW7AYLVL.js +0 -42
- package/dist/acp-VEPJ74LT.js +0 -1357
- package/dist/acp-VEPJ74LT.js.map +0 -7
- package/dist/agentsValidate-7LH4HTNR.js.map +0 -7
- package/dist/ask-3NHFFUQG.js.map +0 -7
- package/dist/autoUpdater-ITPIHCOI.js +0 -17
- package/dist/chunk-3IN27HA5.js.map +0 -7
- package/dist/chunk-4FX3IVPT.js +0 -164
- package/dist/chunk-4FX3IVPT.js.map +0 -7
- package/dist/chunk-4RTX4AG4.js.map +0 -7
- package/dist/chunk-5PDP7R6N.js +0 -515
- package/dist/chunk-5PDP7R6N.js.map +0 -7
- package/dist/chunk-73WGVYLQ.js.map +0 -7
- package/dist/chunk-7M2YN6TU.js.map +0 -7
- package/dist/chunk-7U7L4NMD.js.map +0 -7
- package/dist/chunk-ABLVTESJ.js.map +0 -7
- package/dist/chunk-AFFSCMYS.js.map +0 -7
- package/dist/chunk-ARZSBOAO.js.map +0 -7
- package/dist/chunk-CIG63V4E.js +0 -72
- package/dist/chunk-CIG63V4E.js.map +0 -7
- package/dist/chunk-CM3EGTG6.js +0 -1609
- package/dist/chunk-CM3EGTG6.js.map +0 -7
- package/dist/chunk-DZE5YA7L.js.map +0 -7
- package/dist/chunk-E6YNABER.js.map +0 -7
- package/dist/chunk-EZXMVTDU.js.map +0 -7
- package/dist/chunk-F2SJXUDI.js +0 -148
- package/dist/chunk-F2SJXUDI.js.map +0 -7
- package/dist/chunk-FC5ZCKBI.js +0 -30167
- package/dist/chunk-FC5ZCKBI.js.map +0 -7
- package/dist/chunk-HCBELH4J.js +0 -145
- package/dist/chunk-HCBELH4J.js.map +0 -7
- package/dist/chunk-HN4E4UUQ.js.map +0 -7
- package/dist/chunk-IZVMU4S2.js +0 -654
- package/dist/chunk-IZVMU4S2.js.map +0 -7
- package/dist/chunk-K2CWOTI2.js.map +0 -7
- package/dist/chunk-LC4TVOCZ.js +0 -835
- package/dist/chunk-LC4TVOCZ.js.map +0 -7
- package/dist/chunk-MIW7N2MY.js +0 -2613
- package/dist/chunk-MIW7N2MY.js.map +0 -7
- package/dist/chunk-MWRSY4X6.js.map +0 -7
- package/dist/chunk-ND3XWFO6.js +0 -34
- package/dist/chunk-ND3XWFO6.js.map +0 -7
- package/dist/chunk-QVLYOPO5.js.map +0 -7
- package/dist/chunk-RZWOUA25.js.map +0 -7
- package/dist/chunk-S6HRABTA.js.map +0 -7
- package/dist/chunk-STSX7GIX.js.map +0 -7
- package/dist/chunk-UHYRLID6.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-W7GRKO7Q.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-YC6LJCDE.js.map +0 -7
- package/dist/chunk-YXYYDIMI.js +0 -2931
- package/dist/chunk-YXYYDIMI.js.map +0 -7
- package/dist/chunk-ZVDRDPII.js.map +0 -7
- package/dist/cli-DOPVY2CW.js.map +0 -7
- package/dist/commands-2BF2CJ3A.js +0 -46
- package/dist/context-6FXPETYH.js +0 -30
- package/dist/costTracker-6SL26FDB.js +0 -19
- package/dist/kodeAgentSessionLoad-MITZADPB.js +0 -18
- package/dist/kodeAgentSessionResume-GVRWB4WO.js +0 -16
- package/dist/kodeAgentStreamJson-NXFN7TXH.js +0 -13
- package/dist/kodeAgentStreamJsonSession-UGEZJJEB.js.map +0 -7
- package/dist/kodeAgentStructuredStdio-HGWJT7CU.js +0 -10
- package/dist/llm-ZUQC4WYM.js.map +0 -7
- package/dist/llmLazy-54QQHA54.js +0 -15
- package/dist/loader-FYHJQES5.js +0 -28
- package/dist/mcp-J332IKT3.js +0 -49
- package/dist/mentionProcessor-EE3XFHCJ.js.map +0 -7
- package/dist/model-FV3JDJKH.js +0 -30
- package/dist/pluginRuntime-6ETCZ2LL.js.map +0 -7
- package/dist/pluginValidation-I4YKUWGS.js +0 -17
- package/dist/prompts-ZLEKDD77.js +0 -48
- package/dist/query-VFRJPBGD.js +0 -50
- package/dist/responsesStreaming-AW344PQO.js +0 -10
- package/dist/ripgrep-3NTIKQYW.js +0 -17
- package/dist/state-P5G6CO5V.js +0 -16
- package/dist/theme-3LWP3BG7.js +0 -14
- package/dist/toolPermissionSettings-3ROBVTUK.js +0 -18
- package/dist/tools-RO7HSSE5.js +0 -47
- package/dist/userInput-JSBJRFSK.js +0 -311
- package/dist/userInput-JSBJRFSK.js.map +0 -7
- package/dist/uuid-QN2CNKKN.js +0 -9
- /package/dist/{REPL-CW7AYLVL.js.map → chunks/Doctor-M3J7GRTJ.js.map} +0 -0
- /package/dist/{autoUpdater-ITPIHCOI.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-2BF2CJ3A.js.map → chunks/agentLoader-FCRG3TFJ.js.map} +0 -0
- /package/dist/{config-RUSD6G5Y.js.map → chunks/autoUpdater-CNESBOKO.js.map} +0 -0
- /package/dist/{context-6FXPETYH.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-TOIJFZAL.js.map → chunks/chunk-GCQCAXJZ.js.map} +0 -0
- /package/dist/{env-XGKBLU3D.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-MITZADPB.js.map → chunks/config-25HRTPSP.js.map} +0 -0
- /package/dist/{kodeAgentSessionResume-GVRWB4WO.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-QWM36A3D.js.map → chunks/env-TJ5NOBEB.js.map} +0 -0
- /package/dist/{llmLazy-54QQHA54.js.map → chunks/kodeAgentSessionId-VTNISJ2L.js.map} +0 -0
- /package/dist/{loader-FYHJQES5.js.map → chunks/kodeAgentSessionLoad-YB2RKBGJ.js.map} +0 -0
- /package/dist/{mcp-J332IKT3.js.map → chunks/kodeAgentSessionResume-DZSIVKVA.js.map} +0 -0
- /package/dist/{messages-EOYQKPGM.js.map → chunks/kodeAgentStreamJson-X5PLS2S6.js.map} +0 -0
- /package/dist/{model-FV3JDJKH.js.map → chunks/kodeHooks-RVKYRJHG.js.map} +0 -0
- /package/dist/{openai-RRCWW33N.js.map → chunks/llmLazy-ZUSSE3ZA.js.map} +0 -0
- /package/dist/{outputStyles-62Q3VH2J.js.map → chunks/messages-EEWWLPHN.js.map} +0 -0
- /package/dist/{pluginValidation-I4YKUWGS.js.map → chunks/model-5TIEKQPD.js.map} +0 -0
- /package/dist/{prompts-ZLEKDD77.js.map → chunks/openai-XXK3YZG4.js.map} +0 -0
- /package/dist/{query-VFRJPBGD.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-3NTIKQYW.js.map → chunks/pluginValidation-DAM7WRTC.js.map} +0 -0
- /package/dist/{skillMarketplace-3RXQBVOL.js.map → chunks/registry-XYJXMOA5.js.map} +0 -0
- /package/dist/{state-P5G6CO5V.js.map → chunks/responsesStreaming-JNGE2P3D.js.map} +0 -0
- /package/dist/{theme-3LWP3BG7.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-3ROBVTUK.js.map → chunks/src-OROQIWP3.js.map} +0 -0
- /package/dist/{tools-RO7HSSE5.js.map → chunks/theme-YBJUIMWK.js.map} +0 -0
- /package/dist/{uuid-QN2CNKKN.js.map → chunks/toolPermissionContext-MOCTRR7N.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../packages/core/src/utils/execFileNoThrow.ts", "../../packages/core/src/logging/log/paths.ts", "../../packages/core/src/constants/product.ts", "../../packages/core/src/logging/log/errors.ts", "../../packages/core/src/logging/log/jsonLog.ts", "../../packages/core/src/logging/log/filesystem.ts", "../../packages/core/src/logging/log/messages.ts", "../../packages/core/src/plan/mode/paths.ts", "../../packages/core/src/plan/mode/slug.ts", "../../packages/core/src/plan/mode/state.ts", "../../packages/core/src/plan/mode/systemPrompt.ts", "../../packages/core/src/plan/mode/reminders.ts", "../../packages/core/src/plan/mode.ts", "../../packages/core/src/logging/log/loadLogList.ts", "../../packages/core/src/logging/log/util.ts", "../../packages/core/src/utils/env.ts"],
|
|
4
|
+
"sourcesContent": ["import { execFile } from 'child_process'\nimport { getCwd } from './state'\nimport { logError } from './log'\n\nconst MS_IN_SECOND = 1000\nconst SECONDS_IN_MINUTE = 60\n\n/**\n * execFile, but always resolves (never throws)\n */\nexport function execFileNoThrow(\n file: string,\n args: string[],\n abortSignal?: AbortSignal,\n timeout = 10 * SECONDS_IN_MINUTE * MS_IN_SECOND,\n preserveOutputOnError = true,\n): Promise<{ stdout: string; stderr: string; code: number }> {\n return new Promise(resolve => {\n try {\n execFile(\n file,\n args,\n {\n maxBuffer: 1_000_000,\n signal: abortSignal,\n timeout,\n cwd: getCwd(),\n },\n (error, stdout, stderr) => {\n if (error) {\n if (preserveOutputOnError) {\n const errorCode = typeof error.code === 'number' ? error.code : 1\n resolve({\n stdout: stdout || '',\n stderr: stderr || '',\n code: errorCode,\n })\n } else {\n resolve({ stdout: '', stderr: '', code: 1 })\n }\n } else {\n resolve({ stdout, stderr, code: 0 })\n }\n },\n )\n } catch (error) {\n logError(error)\n resolve({ stdout: '', stderr: '', code: 1 })\n }\n })\n}\n", "import { existsSync } from 'fs'\nimport { randomUUID } from 'crypto'\nimport { join } from 'path'\nimport envPaths from 'env-paths'\nimport { PRODUCT_COMMAND } from '#core/constants/product'\nimport { getKodeBaseDir } from '#core/utils/env'\n\nexport const SESSION_ID = randomUUID()\n\nconst paths = envPaths(PRODUCT_COMMAND)\n\nfunction getProjectDir(cwd: string): string {\n return cwd.replace(/[^a-zA-Z0-9]/g, '-')\n}\n\nfunction getLegacyCacheRoot(): string {\n return process.env.KODE_LEGACY_CACHE_ROOT ?? paths.cache\n}\n\nfunction getNewLogRoot(): string {\n return process.env.KODE_LOG_ROOT ?? getKodeBaseDir()\n}\n\nexport const CACHE_PATHS = {\n errors: () => join(getNewLogRoot(), getProjectDir(process.cwd()), 'errors'),\n messages: () =>\n join(getNewLogRoot(), getProjectDir(process.cwd()), 'messages'),\n mcpLogs: (serverName: string) =>\n join(\n getLegacyCacheRoot(),\n getProjectDir(process.cwd()),\n `mcp-logs-${serverName}`,\n ),\n}\n\nexport const LEGACY_CACHE_PATHS = {\n errors: () =>\n join(getLegacyCacheRoot(), getProjectDir(process.cwd()), 'errors'),\n messages: () =>\n join(getLegacyCacheRoot(), getProjectDir(process.cwd()), 'messages'),\n mcpLogs: (serverName: string) =>\n join(\n getLegacyCacheRoot(),\n getProjectDir(process.cwd()),\n `mcp-logs-${serverName}`,\n ),\n}\n\nexport function dateToFilename(date: Date): string {\n return date.toISOString().replace(/[:.]/g, '-')\n}\n\nexport const DATE = dateToFilename(new Date())\n\nexport function getErrorsPath(): string {\n return join(CACHE_PATHS.errors(), DATE + '.txt')\n}\n\nexport function getMessagesPath(\n messageLogName: string,\n forkNumber: number,\n sidechainNumber: number,\n): string {\n return join(\n CACHE_PATHS.messages(),\n `${messageLogName}${forkNumber > 0 ? `-${forkNumber}` : ''}${\n sidechainNumber > 0 ? `-sidechain-${sidechainNumber}` : ''\n }.json`,\n )\n}\n\nexport function parseLogFilename(filename: string): {\n date: string\n forkNumber: number | undefined\n sidechainNumber: number | undefined\n} {\n const base = filename.split('.')[0]!\n // Default timestamp format has 6 segments: 2025-01-27T01-31-35-104Z\n const segments = base.split('-')\n const hasSidechain = base.includes('-sidechain-')\n\n let date = base\n let forkNumber: number | undefined = undefined\n let sidechainNumber: number | undefined = undefined\n\n if (hasSidechain) {\n const sidechainIndex = segments.indexOf('sidechain')\n sidechainNumber = Number(segments[sidechainIndex + 1])\n // Fork number is before sidechain if exists\n if (sidechainIndex > 6) {\n forkNumber = Number(segments[sidechainIndex - 1])\n date = segments.slice(0, 6).join('-')\n } else {\n date = segments.slice(0, 6).join('-')\n }\n } else if (segments.length > 6) {\n // Has fork number\n const lastSegment = Number(segments[segments.length - 1])\n forkNumber = lastSegment >= 0 ? lastSegment : undefined\n date = segments.slice(0, 6).join('-')\n } else {\n // Basic timestamp only\n date = base\n }\n\n return { date, forkNumber, sidechainNumber }\n}\n\nexport function getNextAvailableLogForkNumber(\n date: string,\n forkNumber: number,\n // Main chain has sidechainNumber 0\n sidechainNumber: number,\n): number {\n while (existsSync(getMessagesPath(date, forkNumber, sidechainNumber))) {\n forkNumber++\n }\n return forkNumber\n}\n\nexport function getNextAvailableLogSidechainNumber(\n date: string,\n forkNumber: number,\n): number {\n let sidechainNumber = 1\n while (existsSync(getMessagesPath(date, forkNumber, sidechainNumber))) {\n sidechainNumber++\n }\n return sidechainNumber\n}\n\nexport function getForkNumberFromFilename(\n filename: string,\n): number | undefined {\n const base = filename.split('.')[0]!\n const segments = base.split('-')\n const hasSidechain = base.includes('-sidechain-')\n\n if (hasSidechain) {\n const sidechainIndex = segments.indexOf('sidechain')\n if (sidechainIndex > 6) {\n return Number(segments[sidechainIndex - 1])\n }\n return undefined\n }\n\n if (segments.length > 6) {\n const lastNumber = Number(segments[segments.length - 1])\n return lastNumber >= 0 ? lastNumber : undefined\n }\n return undefined\n}\n", "export const PRODUCT_NAME = 'Kode'\nexport const PRODUCT_URL = 'https://github.com/shareAI-lab/Anykode'\nexport const PROJECT_FILE = 'AGENTS.md'\nexport const PRODUCT_COMMAND = 'kode'\nexport const CONFIG_BASE_DIR = '.kode'\nexport const CONFIG_FILE = '.kode.json'\nexport const GITHUB_ISSUES_REPO_URL =\n 'https://github.com/shareAI-lab/Anykode/issues'\n\nexport const ASCII_LOGO = `\n _ __ _ ____ _ ___\n| |/ /___ __| | ___ / ___| | |_ _|\n| ' // _ \\\\ / _\\` |/ _ \\\\| | | | | |\n| . \\\\ (_) | (_| | __/| |___| |___ | |\n|_|\\\\_\\\\___/ \\\\__,_|\\\\___| \\\\____|_____|___|`\n", "import { mkdirSync, writeFileSync, existsSync } from 'fs'\nimport { join } from 'path'\n\nimport { appendToJsonLog, readJsonLog } from './jsonLog'\nimport { CACHE_PATHS, DATE, getErrorsPath, SESSION_ID } from './paths'\n\nconst IN_MEMORY_ERROR_LOG: Array<{ error: string; timestamp: string }> = []\nconst MAX_IN_MEMORY_ERRORS = 100 // Limit to prevent memory issues\n\nexport function logError(error: unknown): void {\n try {\n if (process.env.NODE_ENV === 'test') {\n console.error(error)\n }\n\n const errorStr =\n error instanceof Error ? error.stack || error.message : String(error)\n\n const errorInfo = {\n error: errorStr,\n timestamp: new Date().toISOString(),\n }\n\n if (IN_MEMORY_ERROR_LOG.length >= MAX_IN_MEMORY_ERRORS) {\n IN_MEMORY_ERROR_LOG.shift() // Remove oldest error\n }\n IN_MEMORY_ERROR_LOG.push(errorInfo)\n\n appendToJsonLog(getErrorsPath(), {\n error: errorStr,\n })\n } catch {\n // pass\n }\n}\n\nexport function getErrorsLog(): object[] {\n return readJsonLog(getErrorsPath())\n}\n\nexport function getInMemoryErrors(): object[] {\n return [...IN_MEMORY_ERROR_LOG]\n}\n\nexport function logMCPError(serverName: string, error: unknown): void {\n try {\n const logDir = CACHE_PATHS.mcpLogs(serverName)\n const errorStr =\n error instanceof Error ? error.stack || error.message : String(error)\n const timestamp = new Date().toISOString()\n\n const logFile = join(logDir, DATE + '.txt')\n\n if (!existsSync(logDir)) {\n mkdirSync(logDir, { recursive: true })\n }\n\n if (!existsSync(logFile)) {\n writeFileSync(logFile, '[]', 'utf8')\n }\n\n const errorInfo = {\n error: errorStr,\n timestamp,\n sessionId: SESSION_ID,\n cwd: process.cwd(),\n }\n\n const messages = readJsonLog(logFile)\n messages.push(errorInfo)\n writeFileSync(logFile, JSON.stringify(messages, null, 2), 'utf8')\n } catch {\n // Silently fail\n }\n}\n", "import { existsSync, readFileSync } from 'fs'\nimport { dirname } from 'path'\nimport { MACRO } from '#core/constants/macros'\n\nimport { safeMkdir, safeWriteFile } from './filesystem'\nimport { SESSION_ID } from './paths'\n\nexport function readJsonLog(path: string): object[] {\n if (!existsSync(path)) {\n return []\n }\n try {\n return JSON.parse(readFileSync(path, 'utf8'))\n } catch {\n return []\n }\n}\n\nexport function appendToJsonLog(path: string, message: object): void {\n if (process.env.USER_TYPE === 'external') {\n return\n }\n\n const dir = dirname(path)\n if (!safeMkdir(dir)) {\n return\n }\n\n // Create messages file with empty array if it doesn't exist\n if (!existsSync(path) && !safeWriteFile(path, '[]')) {\n return\n }\n\n const messages = readJsonLog(path)\n const messageWithTimestamp = {\n ...message,\n cwd: process.cwd(),\n userType: process.env.USER_TYPE,\n sessionId: SESSION_ID,\n timestamp: new Date().toISOString(),\n version: MACRO.VERSION,\n }\n messages.push(messageWithTimestamp)\n\n safeWriteFile(path, JSON.stringify(messages, null, 2))\n}\n", "import { existsSync, mkdirSync, writeFileSync } from 'fs'\n\nconst PERMISSION_ERROR_CODES = new Set(['EACCES', 'EPERM', 'EROFS'])\n\nfunction isPermissionError(error: unknown): error is NodeJS.ErrnoException {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n PERMISSION_ERROR_CODES.has((error as NodeJS.ErrnoException).code ?? '')\n )\n}\n\nexport function safeMkdir(dir: string): boolean {\n if (existsSync(dir)) return true\n try {\n mkdirSync(dir, { recursive: true })\n return true\n } catch (error) {\n if (isPermissionError(error)) {\n return false\n }\n throw error\n }\n}\n\nexport function safeWriteFile(\n path: string,\n data: string,\n encoding: BufferEncoding = 'utf8',\n): boolean {\n try {\n writeFileSync(path, data, encoding)\n return true\n } catch (error) {\n if (isPermissionError(error)) {\n return false\n }\n throw error\n }\n}\n", "import { dirname } from 'path'\nimport { MACRO } from '#core/constants/macros'\nimport { getPlanSlugForConversationKey } from '#core/utils/planMode'\n\nimport { safeMkdir, safeWriteFile } from './filesystem'\nimport { SESSION_ID } from './paths'\n\nexport function overwriteLog(\n path: string,\n messages: object[],\n options?: { conversationKey?: string },\n): void {\n if (process.env.USER_TYPE === 'external') {\n return\n }\n\n if (!messages.length) {\n return\n }\n\n const dir = dirname(path)\n if (!safeMkdir(dir)) {\n return\n }\n\n const slug = options?.conversationKey\n ? getPlanSlugForConversationKey(options.conversationKey)\n : null\n\n const messagesWithMetadata = messages.map(message => ({\n ...message,\n ...(slug ? { slug } : {}),\n cwd: process.cwd(),\n userType: process.env.USER_TYPE,\n sessionId: SESSION_ID,\n timestamp: new Date().toISOString(),\n version: MACRO.VERSION,\n }))\n\n safeWriteFile(path, JSON.stringify(messagesWithMetadata, null, 2))\n}\n", "import { existsSync, mkdirSync, readFileSync, realpathSync } from 'fs'\nimport { isAbsolute, join, relative, resolve, parse } from 'path'\nimport {\n generateSlug,\n getPlanSlugForConversationKey,\n setPlanSlug,\n} from './slug'\nimport { getActivePlanConversationKey, DEFAULT_CONVERSATION_KEY } from './state'\nimport { getKodeBaseDir } from '#core/utils/env'\n\nconst MAX_SLUG_ATTEMPTS = 10\n\nexport function getPlanDirectory(): string {\n const dir = join(getKodeBaseDir(), 'plans')\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n return dir\n}\n\nfunction getOrCreatePlanSlug(conversationKey: string): string {\n const existing = getPlanSlugForConversationKey(conversationKey)\n if (existing) return existing\n\n const dir = getPlanDirectory()\n\n let slug: string | null = null\n for (let attempt = 0; attempt < MAX_SLUG_ATTEMPTS; attempt++) {\n slug = generateSlug()\n const path = join(dir, `${slug}.md`)\n if (!existsSync(path)) break\n }\n\n if (!slug) slug = generateSlug()\n\n setPlanSlug(conversationKey, slug)\n return slug\n}\n\nexport function getPlanFilePath(\n agentId?: string,\n conversationKey?: string,\n): string {\n const dir = getPlanDirectory()\n const key = conversationKey ?? DEFAULT_CONVERSATION_KEY\n const slug = getOrCreatePlanSlug(key)\n\n if (!agentId) return join(dir, `${slug}.md`)\n return join(dir, `${slug}-agent-${agentId}.md`)\n}\n\nfunction resolveExistingPath(path: string): string {\n const resolved = resolve(path)\n try {\n return realpathSync(resolved)\n } catch {\n return resolved\n }\n}\n\nexport function isPlanFilePathForActiveConversation(path: string): boolean {\n const key = getActivePlanConversationKey() ?? DEFAULT_CONVERSATION_KEY\n const planDir = resolveExistingPath(getPlanDirectory())\n const expectedMainPlanPath = resolveExistingPath(\n getPlanFilePath(undefined, key),\n )\n const target = resolveExistingPath(path)\n\n const rel = relative(planDir, target)\n if (!rel || rel === '') return false\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n\n const expectedSlug = parse(expectedMainPlanPath).name\n const targetName = parse(target).name\n return (\n targetName === expectedSlug ||\n targetName.startsWith(`${expectedSlug}-agent-`)\n )\n}\n\nexport function isMainPlanFilePathForActiveConversation(path: string): boolean {\n const key = getActivePlanConversationKey() ?? DEFAULT_CONVERSATION_KEY\n const expected = resolveExistingPath(getPlanFilePath(undefined, key))\n const target = resolveExistingPath(path)\n return target === expected\n}\n\nexport function isPathInPlanDirectory(path: string): boolean {\n const dir = resolve(getPlanDirectory())\n const target = resolve(path)\n const rel = relative(dir, target)\n if (!rel || rel === '') return true\n if (rel.startsWith('..')) return false\n if (isAbsolute(rel)) return false\n return true\n}\n\nexport function readPlanFile(\n agentId?: string,\n conversationKey?: string,\n): { content: string; exists: boolean; planFilePath: string } {\n const planFilePath = getPlanFilePath(agentId, conversationKey)\n if (!existsSync(planFilePath)) {\n return { content: '', exists: false, planFilePath }\n }\n return {\n content: readFileSync(planFilePath, 'utf8'),\n exists: true,\n planFilePath,\n }\n}\n", "import { randomBytes } from 'crypto'\nimport { parse } from 'path'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport {\n PLAN_SLUG_ADJECTIVES,\n PLAN_SLUG_NOUNS,\n PLAN_SLUG_VERBS,\n} from '#protocol/utils/planSlugWords'\n\nimport { getConversationKey } from './state'\n\nconst planSlugCache = new Map<string, string>()\n\nfunction pickIndex(length: number): number {\n return randomBytes(4).readUInt32BE(0) % length\n}\n\nfunction pickWord(words: readonly string[]): string {\n return words[pickIndex(words.length)]!\n}\n\nexport function generateSlug(): string {\n const adjective = pickWord(PLAN_SLUG_ADJECTIVES)\n const verb = pickWord(PLAN_SLUG_VERBS)\n const noun = pickWord(PLAN_SLUG_NOUNS)\n return `${adjective}-${verb}-${noun}`\n}\n\nexport function setPlanSlug(conversationKey: string, slug: string): void {\n planSlugCache.set(conversationKey, slug)\n}\n\nexport function getPlanSlugForConversationKey(\n conversationKey: string,\n): string | null {\n return planSlugCache.get(conversationKey) ?? null\n}\n\nexport function extractSlugFromPlanFilePath(\n planFilePath: string,\n): string | null {\n if (!planFilePath) return null\n const baseName = parse(planFilePath).name\n if (!baseName) return null\n\n const agentMarker = '-agent-'\n const idx = baseName.lastIndexOf(agentMarker)\n if (idx === -1) return baseName\n if (idx === 0) return null\n return baseName.slice(0, idx)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction getTrimmedString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nexport function hydratePlanSlugFromMessages(\n messages: unknown[],\n context?: ToolUseContext,\n): boolean {\n const conversationKey = getConversationKey(context)\n if (planSlugCache.has(conversationKey)) return true\n\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (!isRecord(msg)) continue\n\n const directSlug = getTrimmedString(msg.slug)\n if (directSlug) {\n planSlugCache.set(conversationKey, directSlug)\n return true\n }\n\n const toolUseResult = msg.toolUseResult\n if (!isRecord(toolUseResult)) continue\n const data = toolUseResult.data\n if (!isRecord(data)) continue\n\n const planFilePath =\n getTrimmedString(data.planFilePath) || getTrimmedString(data.filePath)\n if (!planFilePath) continue\n\n const slug = extractSlugFromPlanFilePath(planFilePath)\n if (!slug) continue\n\n planSlugCache.set(conversationKey, slug)\n return true\n }\n\n return false\n}\n\nexport function __resetPlanSlugsForTests(): void {\n planSlugCache.clear()\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\n\nexport const DEFAULT_CONVERSATION_KEY = 'default'\n\nexport type PlanModeFlags = {\n hasExitedPlanMode: boolean\n needsPlanModeExitAttachment: boolean\n}\n\nexport type PlanModeAttachmentState = {\n hasInjected: boolean\n lastInjectedAssistantTurn: number\n}\n\nconst planModeEnabledByConversationKey = new Map<string, boolean>()\nconst planModeFlagsByConversationKey = new Map<string, PlanModeFlags>()\nconst planModeAttachmentStateByAgentKey = new Map<\n string,\n PlanModeAttachmentState\n>()\n\nlet activePlanConversationKey: string | null = null\n\nexport function getConversationKey(\n context?: Pick<ToolUseContext, 'options'>,\n): string {\n const messageLogName =\n context?.options?.messageLogName ?? DEFAULT_CONVERSATION_KEY\n const forkNumber = context?.options?.forkNumber ?? 0\n return `${messageLogName}:${forkNumber}`\n}\n\nexport function getPlanConversationKey(\n context?: Pick<ToolUseContext, 'options'>,\n): string {\n return getConversationKey(context)\n}\n\nexport function setActivePlanConversationKey(conversationKey: string): void {\n activePlanConversationKey = conversationKey\n}\n\nexport function getActivePlanConversationKey(): string | null {\n return activePlanConversationKey\n}\n\nexport function getAgentKey(\n context?: Pick<ToolUseContext, 'options' | 'agentId'>,\n): string {\n const conversationKey = getConversationKey(context)\n const agentId = context?.agentId ?? 'main'\n return `${conversationKey}:${agentId}`\n}\n\nexport function isPlanModeEnabled(context?: ToolUseContext): boolean {\n const key = getConversationKey(context)\n return planModeEnabledByConversationKey.get(key) ?? false\n}\n\nexport function setPlanModeEnabledForConversationKey(\n conversationKey: string,\n enabled: boolean,\n): void {\n planModeEnabledByConversationKey.set(conversationKey, enabled)\n}\n\nexport function getPlanModeFlags(conversationKey: string): PlanModeFlags {\n const existing = planModeFlagsByConversationKey.get(conversationKey)\n if (existing) return existing\n const created: PlanModeFlags = {\n hasExitedPlanMode: false,\n needsPlanModeExitAttachment: false,\n }\n planModeFlagsByConversationKey.set(conversationKey, created)\n return created\n}\n\nexport function getPlanModeAttachmentState(\n agentKey: string,\n): PlanModeAttachmentState | undefined {\n return planModeAttachmentStateByAgentKey.get(agentKey)\n}\n\nexport function setPlanModeAttachmentState(\n agentKey: string,\n state: PlanModeAttachmentState,\n): void {\n planModeAttachmentStateByAgentKey.set(agentKey, state)\n}\n\nexport function __resetPlanModeStateForTests(): void {\n planModeEnabledByConversationKey.clear()\n planModeFlagsByConversationKey.clear()\n planModeAttachmentStateByAgentKey.clear()\n activePlanConversationKey = null\n}\n", "import { existsSync } from 'fs'\nimport type { ToolUseContext } from '#core/tooling/Tool'\n\nimport {\n getPlanFilePath,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n isPlanFilePathForActiveConversation,\n} from './paths'\nimport {\n getAgentKey,\n getConversationKey,\n getPlanModeAttachmentState,\n getPlanModeFlags,\n isPlanModeEnabled,\n setPlanModeAttachmentState,\n} from './state'\nimport {\n buildPlanModeExitReminder,\n buildPlanModeMainReminder,\n buildPlanModeReentryReminder,\n buildPlanModeSubAgentReminder,\n wrapSystemReminder,\n} from './reminders'\n\nconst TURNS_BETWEEN_ATTACHMENTS = 5\n\nexport {\n isPlanFilePathForActiveConversation,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n}\n\nexport function getPlanModeSystemPromptAdditions(\n messages: Array<{ type?: string }>,\n context: ToolUseContext,\n): string[] {\n const conversationKey = getConversationKey(context)\n const agentKey = getAgentKey(context)\n const flags = getPlanModeFlags(conversationKey)\n const additions: string[] = []\n\n const assistantTurns = messages.filter(m => m?.type === 'assistant').length\n\n if (isPlanModeEnabled(context)) {\n const previous = getPlanModeAttachmentState(agentKey) ?? {\n hasInjected: false,\n lastInjectedAssistantTurn: -Infinity,\n }\n\n if (\n previous.hasInjected &&\n assistantTurns - previous.lastInjectedAssistantTurn <\n TURNS_BETWEEN_ATTACHMENTS\n ) {\n return []\n }\n\n const planFilePath = getPlanFilePath(context.agentId, conversationKey)\n const planExists = existsSync(planFilePath)\n\n if (flags.hasExitedPlanMode && planExists) {\n additions.push(\n wrapSystemReminder(buildPlanModeReentryReminder(planFilePath)),\n )\n flags.hasExitedPlanMode = false\n }\n\n const isSubAgent = !!context.agentId\n additions.push(\n wrapSystemReminder(\n isSubAgent\n ? buildPlanModeSubAgentReminder({ planExists, planFilePath })\n : buildPlanModeMainReminder({ planExists, planFilePath }),\n ),\n )\n\n setPlanModeAttachmentState(agentKey, {\n hasInjected: true,\n lastInjectedAssistantTurn: assistantTurns,\n })\n\n return additions\n }\n\n if (flags.needsPlanModeExitAttachment) {\n const planFilePath = getPlanFilePath(context.agentId, conversationKey)\n additions.push(wrapSystemReminder(buildPlanModeExitReminder(planFilePath)))\n flags.needsPlanModeExitAttachment = false\n }\n\n return additions\n}\n", "function getMaxParallelExploreAgents(): number {\n const raw =\n process.env.KODE_PLAN_V2_EXPLORE_AGENT_COUNT ??\n process.env.CLAUDE_CODE_PLAN_V2_EXPLORE_AGENT_COUNT\n if (raw) {\n const parsed = Number.parseInt(raw, 10)\n if (Number.isFinite(parsed) && parsed > 0 && parsed <= 10) return parsed\n }\n return 3\n}\n\nfunction getMaxParallelPlanAgents(): number {\n const raw =\n process.env.KODE_PLAN_V2_AGENT_COUNT ??\n process.env.CLAUDE_CODE_PLAN_V2_AGENT_COUNT\n if (raw) {\n const parsed = Number.parseInt(raw, 10)\n if (Number.isFinite(parsed) && parsed > 0 && parsed <= 10) return parsed\n }\n return 1\n}\n\nexport function buildPlanModeMainReminder(args: {\n planExists: boolean\n planFilePath: string\n}): string {\n const { planExists, planFilePath } = args\n\n const writeToolName = 'Write'\n const editToolName = 'Edit'\n const askUserToolName = 'AskUserQuestion'\n const exploreAgentType = 'Explore'\n const planAgentType = 'Plan'\n const exitPlanModeToolName = 'ExitPlanMode'\n\n const maxParallelExploreAgents = getMaxParallelExploreAgents()\n const maxParallelPlanAgents = getMaxParallelPlanAgents()\n\n return `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received.\n\n## Plan File Info:\n${planExists ? `A plan file already exists at ${planFilePath}. You can read it and make incremental edits using the ${editToolName} tool.` : `No plan file exists yet. You should create your plan at ${planFilePath} using the ${writeToolName} tool.`}\nYou should build your plan incrementally by writing to or editing this file. NOTE that this is the only file you are allowed to edit - other than this you are only allowed to take READ-ONLY actions.\n\n## Plan Workflow\n\n### Phase 1: Initial Understanding\nGoal: Gain a comprehensive understanding of the user's request by reading through code and asking them questions. Critical: In this phase you should only use the ${exploreAgentType} subagent type.\n\n1. Focus on understanding the user's request and the code associated with their request\n\n2. **Launch up to ${maxParallelExploreAgents} ${exploreAgentType} agents IN PARALLEL** (single message, multiple tool calls) to efficiently explore the codebase.\n - Use 1 agent when the task is isolated to known files, the user provided specific file paths, or you're making a small targeted change.\n - Use multiple agents when: the scope is uncertain, multiple areas of the codebase are involved, or you need to understand existing patterns before planning.\n - Quality over quantity - ${maxParallelExploreAgents} agents maximum, but you should try to use the minimum number of agents necessary (usually just 1)\n - If using multiple agents: Provide each agent with a specific search focus or area to explore. Example: One agent searches for existing implementations, another explores related components, a third investigates testing patterns\n\n3. After exploring the code, use the ${askUserToolName} tool to clarify ambiguities in the user request up front.\n\n### Phase 2: Design\nGoal: Design an implementation approach.\n\nLaunch ${planAgentType} agent(s) to design the implementation based on the user's intent and your exploration results from Phase 1.\n\nYou can launch up to ${maxParallelPlanAgents} agent(s) in parallel.\n\n**Guidelines:**\n- **Default**: Launch at least 1 Plan agent for most tasks - it helps validate your understanding and consider alternatives\n- **Skip agents**: Only for truly trivial tasks (typo fixes, single-line changes, simple renames)\n${\n maxParallelPlanAgents > 1\n ? `- **Multiple agents**: Use up to ${maxParallelPlanAgents} agents for complex tasks that benefit from different perspectives\n\nExamples of when to use multiple agents:\n- The task touches multiple parts of the codebase\n- It's a large refactor or architectural change\n- There are many edge cases to consider\n- You'd benefit from exploring different approaches\n\nExample perspectives by task type:\n- New feature: simplicity vs performance vs maintainability\n- Bug fix: root cause vs workaround vs prevention\n- Refactoring: minimal change vs clean architecture\n`\n : ''\n}\nIn the agent prompt:\n- Provide comprehensive background context from Phase 1 exploration including filenames and code path traces\n- Describe requirements and constraints\n- Request a detailed implementation plan\n\n### Phase 3: Review\nGoal: Review the plan(s) from Phase 2 and ensure alignment with the user's intentions.\n1. Read the critical files identified by agents to deepen your understanding\n2. Ensure that the plans align with the user's original request\n3. Use ${askUserToolName} to clarify any remaining questions with the user\n\n### Phase 4: Final Plan\nGoal: Write your final plan to the plan file (the only file you can edit).\n- Include only your recommended approach, not all alternatives\n- Ensure that the plan file is concise enough to scan quickly, but detailed enough to execute effectively\n- Include the paths of critical files to be modified\n\n### Phase 5: Call ${exitPlanModeToolName}\nAt the very end of your turn, once you have asked the user questions and are happy with your final plan file - you should always call ${exitPlanModeToolName} to indicate to the user that you are done planning.\nThis is critical - your turn should only end with either asking the user a question or calling ${exitPlanModeToolName}. Do not stop unless it's for these 2 reasons.\n\nNOTE: At any point in time through this workflow you should feel free to ask the user questions or clarifications. Don't make large assumptions about user intent. The goal is to present a well researched plan to the user, and tie any loose ends before implementation begins.`\n}\n\nexport function buildPlanModeSubAgentReminder(args: {\n planExists: boolean\n planFilePath: string\n}): string {\n const { planExists, planFilePath } = args\n\n const writeToolName = 'Write'\n const editToolName = 'Edit'\n const askUserToolName = 'AskUserQuestion'\n\n return `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits, run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. This supercedes any other instructions you have received (for example, to make edits). Instead, you should:\n\n## Plan File Info:\n${planExists ? `A plan file already exists at ${planFilePath}. You can read it and make incremental edits using the ${editToolName} tool if you need to.` : `No plan file exists yet. You should create your plan at ${planFilePath} using the ${writeToolName} tool if you need to.`}\nYou should build your plan incrementally by writing to or editing this file. NOTE that this is the only file you are allowed to edit - other than this you are only allowed to take READ-ONLY actions.\nAnswer the user's query comprehensively, using the ${askUserToolName} tool if you need to ask the user clarifying questions. If you do use the ${askUserToolName}, make sure to ask all clarifying questions you need to fully understand the user's intent before proceeding.`\n}\n\nexport function buildPlanModeReentryReminder(planFilePath: string): string {\n const exitPlanModeToolName = 'ExitPlanMode'\n\n return `## Re-entering Plan Mode\n\nYou are returning to plan mode after having previously exited it. A plan file exists at ${planFilePath} from your previous planning session.\n\n**Before proceeding with any new planning, you should:**\n1. Read the existing plan file to understand what was previously planned\n2. Evaluate the user's current request against that plan\n3. Decide how to proceed:\n - **Different task**: If the user's request is for a different task\u2014even if it's similar or related\u2014start fresh by overwriting the existing plan\n - **Same task, continuing**: If this is explicitly a continuation or refinement of the exact same task, modify the existing plan while cleaning up outdated or irrelevant sections\n4. Continue on with the plan process and most importantly you should always edit the plan file one way or the other before calling ${exitPlanModeToolName}\n\nTreat this as a fresh planning session. Do not assume the existing plan is relevant without evaluating it first.`\n}\n\nexport function buildPlanModeExitReminder(planFilePath: string): string {\n return `## Exited Plan Mode\n\nYou have exited plan mode. You can now make edits, run tools, and take actions. The plan file is located at ${planFilePath} if you need to reference it.`\n}\n\nexport function wrapSystemReminder(text: string): string {\n return `<system-reminder>\\n${text}\\n</system-reminder>`\n}\n", "import type { ToolUseContext } from '#core/tooling/Tool'\n\nimport { getPlanFilePath, getPlanDirectory, readPlanFile } from './mode/paths'\nimport {\n getActivePlanConversationKey,\n getAgentKey,\n getConversationKey,\n getPlanConversationKey,\n getPlanModeAttachmentState,\n getPlanModeFlags,\n isPlanModeEnabled,\n setActivePlanConversationKey,\n setPlanModeAttachmentState,\n setPlanModeEnabledForConversationKey,\n __resetPlanModeStateForTests,\n} from './mode/state'\nimport {\n getPlanModeSystemPromptAdditions,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n isPlanFilePathForActiveConversation,\n} from './mode/systemPrompt'\nimport {\n getPlanSlugForConversationKey,\n hydratePlanSlugFromMessages,\n setPlanSlug,\n __resetPlanSlugsForTests,\n} from './mode/slug'\n\nexport {\n getPlanConversationKey,\n setActivePlanConversationKey,\n getActivePlanConversationKey,\n getPlanModeSystemPromptAdditions,\n isPlanModeEnabled,\n setPlanSlug,\n getPlanSlugForConversationKey,\n hydratePlanSlugFromMessages,\n getPlanDirectory,\n getPlanFilePath,\n isPlanFilePathForActiveConversation,\n isMainPlanFilePathForActiveConversation,\n isPathInPlanDirectory,\n readPlanFile,\n}\n\nexport function enterPlanMode(context?: ToolUseContext): {\n planFilePath: string\n} {\n const key = getConversationKey(context)\n setPlanModeEnabledForConversationKey(key, true)\n return { planFilePath: getPlanFilePath(context?.agentId, key) }\n}\n\nexport function enterPlanModeForConversationKey(conversationKey: string): void {\n setPlanModeEnabledForConversationKey(conversationKey, true)\n}\n\nexport function exitPlanMode(context?: ToolUseContext): {\n planFilePath: string\n} {\n const key = getConversationKey(context)\n setPlanModeEnabledForConversationKey(key, false)\n\n const flags = getPlanModeFlags(key)\n flags.hasExitedPlanMode = true\n flags.needsPlanModeExitAttachment = true\n\n return { planFilePath: getPlanFilePath(context?.agentId, key) }\n}\n\nexport function exitPlanModeForConversationKey(conversationKey: string): void {\n setPlanModeEnabledForConversationKey(conversationKey, false)\n const flags = getPlanModeFlags(conversationKey)\n flags.hasExitedPlanMode = true\n flags.needsPlanModeExitAttachment = true\n}\n\nexport function __resetPlanModeForTests(): void {\n __resetPlanModeStateForTests()\n __resetPlanSlugsForTests()\n}\n", "import {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n statSync,\n copyFileSync,\n promises as fsPromises,\n} from 'fs'\nimport { join } from 'path'\n\nimport type { LogOption, SerializedMessage } from '#core/types/logs'\n\nimport { logError } from './errors'\nimport { CACHE_PATHS, LEGACY_CACHE_PATHS, parseLogFilename } from './paths'\nimport { parseISOString, sortLogs } from './util'\n\nconst MIGRATION_MESSAGE_LOG_LIMIT = 50\nlet didMigrateMessageLogs = false\n\nfunction migrateLegacyMessageLogsIfNeeded() {\n if (didMigrateMessageLogs) return\n didMigrateMessageLogs = true\n\n const legacyDir = LEGACY_CACHE_PATHS.messages()\n const newDir = CACHE_PATHS.messages()\n\n if (!existsSync(legacyDir)) return\n\n const newHasAny =\n existsSync(newDir) &&\n readdirSync(newDir).some(file => file.endsWith('.json'))\n if (newHasAny) return\n\n try {\n mkdirSync(newDir, { recursive: true })\n } catch {\n return\n }\n\n let legacyFiles: string[] = []\n try {\n legacyFiles = readdirSync(legacyDir).filter(file => file.endsWith('.json'))\n } catch {\n return\n }\n\n const sorted = legacyFiles\n .map(file => {\n try {\n const stats = statSync(join(legacyDir, file))\n return { file, mtimeMs: stats.mtimeMs }\n } catch {\n return { file, mtimeMs: 0 }\n }\n })\n .sort((a, b) => b.mtimeMs - a.mtimeMs)\n .slice(0, MIGRATION_MESSAGE_LOG_LIMIT)\n\n for (const { file } of sorted) {\n const src = join(legacyDir, file)\n const dest = join(newDir, file)\n if (existsSync(dest)) continue\n try {\n copyFileSync(src, dest)\n } catch {\n // Best-effort migration; ignore per-file failures.\n }\n }\n}\n\nexport async function loadLogList(\n path = CACHE_PATHS.messages(),\n): Promise<LogOption[]> {\n if (path === CACHE_PATHS.messages()) {\n migrateLegacyMessageLogsIfNeeded()\n }\n\n const searchPaths =\n path === CACHE_PATHS.messages()\n ? [CACHE_PATHS.messages(), LEGACY_CACHE_PATHS.messages()]\n : [path]\n\n const existingPaths = searchPaths.filter(p => existsSync(p))\n if (existingPaths.length === 0) {\n logError(`No logs found at ${path}`)\n return []\n }\n\n const filesWithDir = (\n await Promise.all(\n existingPaths.map(async dirPath => {\n const dirFiles = await fsPromises.readdir(dirPath)\n return dirFiles.map(file => ({ file, dirPath }))\n }),\n )\n ).flat()\n\n const seen = new Set<string>()\n const uniqueFiles = filesWithDir.filter(({ file }) => {\n if (seen.has(file)) return false\n seen.add(file)\n return true\n })\n\n const logData = await Promise.all(\n uniqueFiles.map(async ({ file, dirPath }, i) => {\n const fullPath = join(dirPath, file)\n const content = readFileSync(fullPath, 'utf8')\n const messages = JSON.parse(content) as SerializedMessage[]\n const firstMessage = messages[0]\n const lastMessage = messages[messages.length - 1]\n const firstPrompt =\n firstMessage?.type === 'user' &&\n typeof firstMessage?.message?.content === 'string'\n ? firstMessage?.message?.content\n : 'No prompt'\n\n const { date, forkNumber, sidechainNumber } = parseLogFilename(file)\n return {\n date,\n forkNumber,\n fullPath,\n messages,\n value: i, // overwritten after sorting\n created: parseISOString(firstMessage?.timestamp || date),\n modified: lastMessage?.timestamp\n ? parseISOString(lastMessage.timestamp)\n : parseISOString(date),\n firstPrompt:\n firstPrompt.split('\\n')[0]?.slice(0, 50) +\n (firstPrompt.length > 50 ? '\u2026' : '') || 'No prompt',\n messageCount: messages.length,\n sidechainNumber,\n }\n }),\n )\n\n return sortLogs(logData.filter(_ => _.messages.length)).map((_, i) => ({\n ..._,\n value: i,\n }))\n}\n", "import type { LogOption } from '#core/types/logs'\n\nexport function sortLogs(logs: LogOption[]): LogOption[] {\n return logs.sort((a, b) => {\n // Sort by modified date (newest first)\n const modifiedDiff = b.modified.getTime() - a.modified.getTime()\n if (modifiedDiff !== 0) {\n return modifiedDiff\n }\n\n // If modified dates are equal, sort by created date\n const createdDiff = b.created.getTime() - a.created.getTime()\n if (createdDiff !== 0) {\n return createdDiff\n }\n\n // If both dates are equal, sort by fork number\n return (b.forkNumber ?? 0) - (a.forkNumber ?? 0)\n })\n}\n\nexport function formatDate(date: Date): string {\n const now = new Date()\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n\n const isToday = date.toDateString() === now.toDateString()\n const isYesterday = date.toDateString() === yesterday.toDateString()\n\n const timeStr = date\n .toLocaleTimeString('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n })\n .toLowerCase()\n\n if (isToday) {\n return `Today at ${timeStr}`\n } else if (isYesterday) {\n return `Yesterday at ${timeStr}`\n } else {\n return (\n date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n }) + ` at ${timeStr}`\n )\n }\n}\n\nexport function parseISOString(s: string): Date {\n const b = s.split(/\\D+/)\n return new Date(\n Date.UTC(\n parseInt(b[0]!, 10),\n parseInt(b[1]!, 10) - 1,\n parseInt(b[2]!, 10),\n parseInt(b[3]!, 10),\n parseInt(b[4]!, 10),\n parseInt(b[5]!, 10),\n parseInt(b[6]!, 10),\n ),\n )\n}\n", "import { execFileNoThrow } from './execFileNoThrow'\nimport { memoize } from 'lodash-es'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { CONFIG_BASE_DIR, CONFIG_FILE } from '#core/constants/product'\n// Base directory for local Kode data files.\n// Also respects `CLAUDE_CONFIG_DIR` for compatibility.\n//\n// Note: this must be a function (not a fixed const) because tests (and some host\n// integrations) may set env vars after modules are loaded.\nexport function getKodeBaseDir(): string {\n return (\n process.env.KODE_CONFIG_DIR ??\n process.env.CLAUDE_CONFIG_DIR ??\n join(homedir(), CONFIG_BASE_DIR)\n )\n}\n\n// Config and data paths\n// Also respects `CLAUDE_CONFIG_DIR` for compatibility.\nexport function getGlobalConfigFilePath(): string {\n return process.env.KODE_CONFIG_DIR || process.env.CLAUDE_CONFIG_DIR\n ? join(getKodeBaseDir(), 'config.json')\n : join(homedir(), CONFIG_FILE)\n}\n\nexport function getMemoryDir(): string {\n return join(getKodeBaseDir(), 'memory')\n}\n\n// Back-compat exports (prefer calling the functions above in new code).\nexport const KODE_BASE_DIR = getKodeBaseDir()\nexport const GLOBAL_CONFIG_FILE = getGlobalConfigFilePath()\nexport const MEMORY_DIR = getMemoryDir()\n\nconst getIsDocker = memoize(async (): Promise<boolean> => {\n // Check for .dockerenv file\n const { code } = await execFileNoThrow('test', ['-f', '/.dockerenv'])\n if (code !== 0) {\n return false\n }\n return process.platform === 'linux'\n})\n\nconst hasInternetAccess = memoize(async (): Promise<boolean> => {\n const offline =\n process.env.KODE_OFFLINE ??\n process.env.OFFLINE ??\n process.env.NO_NETWORK ??\n ''\n const normalized = String(offline).trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return false\n return true\n})\n\n// all of these should be immutable\nexport const env = {\n getIsDocker,\n hasInternetAccess,\n isCI: Boolean(process.env.CI),\n platform:\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'macos'\n : 'linux',\n nodeVersion: process.version,\n terminal: process.env.TERM_PROGRAM,\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["mkdirSync", "writeFileSync", "existsSync", "join", "existsSync", "existsSync", "existsSync", "join", "existsSync", "mkdirSync", "writeFileSync", "dirname", "existsSync", "mkdirSync", "readFileSync", "join", "parse", "join", "existsSync", "mkdirSync", "existsSync", "readFileSync", "existsSync", "existsSync", "dirname", "existsSync", "mkdirSync", "readFileSync", "join", "existsSync", "mkdirSync", "join", "readFileSync", "resolve", "join", "join"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getTheme
|
|
3
|
+
} from "./chunk-T7RB5V5J.js";
|
|
4
|
+
|
|
5
|
+
// apps/cli/src/ui/components/CustomSelect/select.tsx
|
|
6
|
+
import { Box as Box2, Text as Text2 } from "ink";
|
|
7
|
+
import React2 from "react";
|
|
8
|
+
|
|
9
|
+
// apps/cli/src/ui/components/CustomSelect/select-option.tsx
|
|
10
|
+
import figures from "figures";
|
|
11
|
+
import { Box, Text } from "ink";
|
|
12
|
+
import React from "react";
|
|
13
|
+
function SelectOption({
|
|
14
|
+
isFocused,
|
|
15
|
+
isSelected,
|
|
16
|
+
smallPointer,
|
|
17
|
+
children,
|
|
18
|
+
...props
|
|
19
|
+
}) {
|
|
20
|
+
const appTheme = getTheme();
|
|
21
|
+
const styles = {
|
|
22
|
+
option: ({ isFocused: isFocused2 }) => ({
|
|
23
|
+
paddingLeft: 2,
|
|
24
|
+
paddingRight: 1
|
|
25
|
+
}),
|
|
26
|
+
focusIndicator: () => ({
|
|
27
|
+
color: appTheme.kode
|
|
28
|
+
}),
|
|
29
|
+
label: ({
|
|
30
|
+
isFocused: isFocused2,
|
|
31
|
+
isSelected: isSelected2
|
|
32
|
+
}) => ({
|
|
33
|
+
color: isSelected2 ? appTheme.success : isFocused2 ? appTheme.kode : appTheme.text,
|
|
34
|
+
bold: isSelected2
|
|
35
|
+
}),
|
|
36
|
+
selectedIndicator: () => ({
|
|
37
|
+
color: appTheme.success
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
return /* @__PURE__ */ React.createElement(Box, { ...styles.option({ isFocused }) }, isFocused && /* @__PURE__ */ React.createElement(Text, { ...styles.focusIndicator() }, smallPointer ? figures.triangleDownSmall : figures.pointer), /* @__PURE__ */ React.createElement(Text, { ...styles.label({ isFocused, isSelected }) }, children), isSelected && /* @__PURE__ */ React.createElement(Text, { ...styles.selectedIndicator() }, figures.tick));
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// apps/cli/src/ui/components/CustomSelect/use-select-state.ts
|
|
44
|
+
import { isDeepStrictEqual } from "node:util";
|
|
45
|
+
import {
|
|
46
|
+
useReducer,
|
|
47
|
+
useCallback,
|
|
48
|
+
useMemo,
|
|
49
|
+
useState,
|
|
50
|
+
useEffect
|
|
51
|
+
} from "react";
|
|
52
|
+
|
|
53
|
+
// apps/cli/src/ui/components/CustomSelect/option-map.ts
|
|
54
|
+
var OptionMap = class extends Map {
|
|
55
|
+
first;
|
|
56
|
+
constructor(options) {
|
|
57
|
+
const items = [];
|
|
58
|
+
let firstItem;
|
|
59
|
+
let previous;
|
|
60
|
+
let index = 0;
|
|
61
|
+
for (const option of options) {
|
|
62
|
+
const item = {
|
|
63
|
+
...option,
|
|
64
|
+
previous,
|
|
65
|
+
next: void 0,
|
|
66
|
+
index
|
|
67
|
+
};
|
|
68
|
+
if (previous) {
|
|
69
|
+
previous.next = item;
|
|
70
|
+
}
|
|
71
|
+
firstItem ||= item;
|
|
72
|
+
const key = "value" in option ? option.value : optionHeaderKey(option);
|
|
73
|
+
items.push([key, item]);
|
|
74
|
+
index++;
|
|
75
|
+
previous = item;
|
|
76
|
+
}
|
|
77
|
+
super(items);
|
|
78
|
+
this.first = firstItem;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// apps/cli/src/ui/components/CustomSelect/select-state.ts
|
|
83
|
+
var flattenOptions = (options) => options.flatMap((option) => {
|
|
84
|
+
if ("options" in option) {
|
|
85
|
+
const flatSubtree = flattenOptions(option.options);
|
|
86
|
+
const optionValues = flatSubtree.flatMap(
|
|
87
|
+
(o) => "value" in o ? o.value : []
|
|
88
|
+
);
|
|
89
|
+
const header = option.header !== void 0 ? [{ header: option.header, optionValues }] : [];
|
|
90
|
+
return [...header, ...flatSubtree];
|
|
91
|
+
}
|
|
92
|
+
return option;
|
|
93
|
+
});
|
|
94
|
+
var createDefaultState = ({
|
|
95
|
+
visibleOptionCount: customVisibleOptionCount,
|
|
96
|
+
defaultValue,
|
|
97
|
+
options
|
|
98
|
+
}) => {
|
|
99
|
+
const flatOptions = flattenOptions(options);
|
|
100
|
+
const visibleOptionCount = typeof customVisibleOptionCount === "number" ? Math.min(customVisibleOptionCount, flatOptions.length) : flatOptions.length;
|
|
101
|
+
const optionMap = new OptionMap(flatOptions);
|
|
102
|
+
const firstOption = optionMap.first;
|
|
103
|
+
let focusedValue;
|
|
104
|
+
if (defaultValue && optionMap.get(defaultValue)) {
|
|
105
|
+
focusedValue = defaultValue;
|
|
106
|
+
} else {
|
|
107
|
+
focusedValue = firstOption && "value" in firstOption ? firstOption.value : void 0;
|
|
108
|
+
}
|
|
109
|
+
let visibleFromIndex = 0;
|
|
110
|
+
let visibleToIndex = visibleOptionCount;
|
|
111
|
+
if (focusedValue && optionMap.get(focusedValue)) {
|
|
112
|
+
const focusedIndex = optionMap.get(focusedValue).index;
|
|
113
|
+
const halfVisible = Math.floor(visibleOptionCount / 2);
|
|
114
|
+
visibleFromIndex = Math.max(0, focusedIndex - halfVisible);
|
|
115
|
+
visibleToIndex = Math.min(
|
|
116
|
+
flatOptions.length,
|
|
117
|
+
visibleFromIndex + visibleOptionCount
|
|
118
|
+
);
|
|
119
|
+
if (visibleToIndex - visibleFromIndex < visibleOptionCount) {
|
|
120
|
+
visibleFromIndex = Math.max(0, visibleToIndex - visibleOptionCount);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
optionMap,
|
|
125
|
+
visibleOptionCount,
|
|
126
|
+
focusedValue,
|
|
127
|
+
visibleFromIndex,
|
|
128
|
+
visibleToIndex,
|
|
129
|
+
previousValue: defaultValue,
|
|
130
|
+
value: defaultValue
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// apps/cli/src/ui/components/CustomSelect/use-select-state.ts
|
|
135
|
+
var reducer = (state, action) => {
|
|
136
|
+
switch (action.type) {
|
|
137
|
+
case "focus-next-option": {
|
|
138
|
+
if (!state.focusedValue) {
|
|
139
|
+
return state;
|
|
140
|
+
}
|
|
141
|
+
const item = state.optionMap.get(state.focusedValue);
|
|
142
|
+
if (!item) {
|
|
143
|
+
return state;
|
|
144
|
+
}
|
|
145
|
+
let next = item.next;
|
|
146
|
+
while (next && !("value" in next)) {
|
|
147
|
+
next = next.next;
|
|
148
|
+
}
|
|
149
|
+
if (!next || !("value" in next)) {
|
|
150
|
+
return state;
|
|
151
|
+
}
|
|
152
|
+
const needsToScroll = next.index >= state.visibleToIndex;
|
|
153
|
+
if (!needsToScroll) {
|
|
154
|
+
return {
|
|
155
|
+
...state,
|
|
156
|
+
focusedValue: next.value
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const nextVisibleToIndex = Math.min(
|
|
160
|
+
state.optionMap.size,
|
|
161
|
+
state.visibleToIndex + 1
|
|
162
|
+
);
|
|
163
|
+
const nextVisibleFromIndex = nextVisibleToIndex - state.visibleOptionCount;
|
|
164
|
+
return {
|
|
165
|
+
...state,
|
|
166
|
+
focusedValue: next.value,
|
|
167
|
+
visibleFromIndex: nextVisibleFromIndex,
|
|
168
|
+
visibleToIndex: nextVisibleToIndex
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
case "focus-previous-option": {
|
|
172
|
+
if (!state.focusedValue) {
|
|
173
|
+
return state;
|
|
174
|
+
}
|
|
175
|
+
const item = state.optionMap.get(state.focusedValue);
|
|
176
|
+
if (!item) {
|
|
177
|
+
return state;
|
|
178
|
+
}
|
|
179
|
+
let previous = item.previous;
|
|
180
|
+
while (previous && !("value" in previous)) {
|
|
181
|
+
previous = previous.previous;
|
|
182
|
+
}
|
|
183
|
+
if (!previous || !("value" in previous)) {
|
|
184
|
+
return state;
|
|
185
|
+
}
|
|
186
|
+
const needsToScroll = previous.index <= state.visibleFromIndex;
|
|
187
|
+
if (!needsToScroll) {
|
|
188
|
+
return {
|
|
189
|
+
...state,
|
|
190
|
+
focusedValue: previous.value
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const nextVisibleFromIndex = Math.max(0, state.visibleFromIndex - 1);
|
|
194
|
+
const nextVisibleToIndex = nextVisibleFromIndex + state.visibleOptionCount;
|
|
195
|
+
return {
|
|
196
|
+
...state,
|
|
197
|
+
focusedValue: previous.value,
|
|
198
|
+
visibleFromIndex: nextVisibleFromIndex,
|
|
199
|
+
visibleToIndex: nextVisibleToIndex
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
case "select-focused-option": {
|
|
203
|
+
return {
|
|
204
|
+
...state,
|
|
205
|
+
previousValue: state.value,
|
|
206
|
+
value: state.focusedValue
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
case "reset": {
|
|
210
|
+
return action.state;
|
|
211
|
+
}
|
|
212
|
+
case "set-focus": {
|
|
213
|
+
return {
|
|
214
|
+
...state,
|
|
215
|
+
focusedValue: action.value
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
var useSelectState = ({
|
|
221
|
+
visibleOptionCount = 5,
|
|
222
|
+
options,
|
|
223
|
+
defaultValue,
|
|
224
|
+
onChange,
|
|
225
|
+
onFocus,
|
|
226
|
+
focusValue
|
|
227
|
+
}) => {
|
|
228
|
+
const flatOptions = flattenOptions(options);
|
|
229
|
+
const [state, dispatch] = useReducer(
|
|
230
|
+
reducer,
|
|
231
|
+
{ visibleOptionCount, defaultValue, options },
|
|
232
|
+
createDefaultState
|
|
233
|
+
);
|
|
234
|
+
const [lastOptions, setLastOptions] = useState(flatOptions);
|
|
235
|
+
if (flatOptions !== lastOptions && !isDeepStrictEqual(flatOptions, lastOptions)) {
|
|
236
|
+
dispatch({
|
|
237
|
+
type: "reset",
|
|
238
|
+
state: createDefaultState({ visibleOptionCount, defaultValue, options })
|
|
239
|
+
});
|
|
240
|
+
setLastOptions(flatOptions);
|
|
241
|
+
}
|
|
242
|
+
const focusNextOption = useCallback(() => {
|
|
243
|
+
dispatch({
|
|
244
|
+
type: "focus-next-option"
|
|
245
|
+
});
|
|
246
|
+
}, []);
|
|
247
|
+
const focusPreviousOption = useCallback(() => {
|
|
248
|
+
dispatch({
|
|
249
|
+
type: "focus-previous-option"
|
|
250
|
+
});
|
|
251
|
+
}, []);
|
|
252
|
+
const selectFocusedOption = useCallback(() => {
|
|
253
|
+
dispatch({
|
|
254
|
+
type: "select-focused-option"
|
|
255
|
+
});
|
|
256
|
+
}, []);
|
|
257
|
+
const visibleOptions = useMemo(() => {
|
|
258
|
+
return flatOptions.map((option, index) => ({
|
|
259
|
+
...option,
|
|
260
|
+
index
|
|
261
|
+
})).slice(state.visibleFromIndex, state.visibleToIndex);
|
|
262
|
+
}, [flatOptions, state.visibleFromIndex, state.visibleToIndex]);
|
|
263
|
+
useEffect(() => {
|
|
264
|
+
if (state.value && state.previousValue !== state.value) {
|
|
265
|
+
onChange?.(state.value);
|
|
266
|
+
}
|
|
267
|
+
}, [state.previousValue, state.value, options, onChange]);
|
|
268
|
+
useEffect(() => {
|
|
269
|
+
if (state.focusedValue) {
|
|
270
|
+
onFocus?.(state.focusedValue);
|
|
271
|
+
}
|
|
272
|
+
}, [state.focusedValue, onFocus]);
|
|
273
|
+
useEffect(() => {
|
|
274
|
+
if (focusValue) {
|
|
275
|
+
dispatch({
|
|
276
|
+
type: "set-focus",
|
|
277
|
+
value: focusValue
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}, [focusValue]);
|
|
281
|
+
return {
|
|
282
|
+
focusedValue: state.focusedValue,
|
|
283
|
+
visibleFromIndex: state.visibleFromIndex,
|
|
284
|
+
visibleToIndex: state.visibleToIndex,
|
|
285
|
+
value: state.value,
|
|
286
|
+
visibleOptions,
|
|
287
|
+
focusNextOption,
|
|
288
|
+
focusPreviousOption,
|
|
289
|
+
selectFocusedOption
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// apps/cli/src/ui/components/CustomSelect/use-select.ts
|
|
294
|
+
import { useInput } from "ink";
|
|
295
|
+
var useSelect = ({ isDisabled = false, state }) => {
|
|
296
|
+
useInput(
|
|
297
|
+
(_input, key) => {
|
|
298
|
+
if (key.downArrow) {
|
|
299
|
+
state.focusNextOption();
|
|
300
|
+
}
|
|
301
|
+
if (key.upArrow) {
|
|
302
|
+
state.focusPreviousOption();
|
|
303
|
+
}
|
|
304
|
+
if (key.return) {
|
|
305
|
+
state.selectFocusedOption();
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
{ isActive: !isDisabled }
|
|
309
|
+
);
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// apps/cli/src/ui/components/CustomSelect/select.tsx
|
|
313
|
+
var optionHeaderKey = (optionHeader) => `HEADER-${optionHeader.optionValues.join(",")}`;
|
|
314
|
+
function Select({
|
|
315
|
+
isDisabled = false,
|
|
316
|
+
visibleOptionCount = 5,
|
|
317
|
+
highlightText,
|
|
318
|
+
options,
|
|
319
|
+
defaultValue,
|
|
320
|
+
onChange,
|
|
321
|
+
onFocus,
|
|
322
|
+
focusValue
|
|
323
|
+
}) {
|
|
324
|
+
const state = useSelectState({
|
|
325
|
+
visibleOptionCount,
|
|
326
|
+
options,
|
|
327
|
+
defaultValue,
|
|
328
|
+
onChange,
|
|
329
|
+
onFocus,
|
|
330
|
+
focusValue
|
|
331
|
+
});
|
|
332
|
+
useSelect({ isDisabled, state });
|
|
333
|
+
const appTheme = getTheme();
|
|
334
|
+
const styles = {
|
|
335
|
+
container: () => ({
|
|
336
|
+
flexDirection: "column"
|
|
337
|
+
}),
|
|
338
|
+
highlightedText: () => ({
|
|
339
|
+
color: appTheme.text,
|
|
340
|
+
backgroundColor: appTheme.warning
|
|
341
|
+
})
|
|
342
|
+
};
|
|
343
|
+
return /* @__PURE__ */ React2.createElement(Box2, { ...styles.container() }, state.visibleOptions.map((option) => {
|
|
344
|
+
const key = "value" in option ? option.value : optionHeaderKey(option);
|
|
345
|
+
const isFocused = !isDisabled && state.focusedValue !== void 0 && ("value" in option ? state.focusedValue === option.value : option.optionValues.includes(state.focusedValue));
|
|
346
|
+
const isSelected = !!state.value && ("value" in option ? state.value === option.value : option.optionValues.includes(state.value));
|
|
347
|
+
const smallPointer = "header" in option;
|
|
348
|
+
const labelText = "label" in option ? option.label : option.header;
|
|
349
|
+
let label = labelText;
|
|
350
|
+
if (highlightText && labelText.includes(highlightText)) {
|
|
351
|
+
const index = labelText.indexOf(highlightText);
|
|
352
|
+
label = /* @__PURE__ */ React2.createElement(React2.Fragment, null, labelText.slice(0, index), /* @__PURE__ */ React2.createElement(Text2, { ...styles.highlightedText() }, highlightText), labelText.slice(index + highlightText.length));
|
|
353
|
+
}
|
|
354
|
+
return /* @__PURE__ */ React2.createElement(
|
|
355
|
+
SelectOption,
|
|
356
|
+
{
|
|
357
|
+
key,
|
|
358
|
+
isFocused,
|
|
359
|
+
isSelected,
|
|
360
|
+
smallPointer,
|
|
361
|
+
children: label
|
|
362
|
+
}
|
|
363
|
+
);
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export {
|
|
368
|
+
Select
|
|
369
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../apps/cli/src/ui/components/CustomSelect/select.tsx", "../../apps/cli/src/ui/components/CustomSelect/select-option.tsx", "../../apps/cli/src/ui/components/CustomSelect/use-select-state.ts", "../../apps/cli/src/ui/components/CustomSelect/option-map.ts", "../../apps/cli/src/ui/components/CustomSelect/select-state.ts", "../../apps/cli/src/ui/components/CustomSelect/use-select.ts"],
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React, { type ReactNode } from 'react'\nimport { SelectOption } from './select-option'\nimport { type Theme } from './theme'\nimport { useSelectState } from './use-select-state'\nimport { useSelect } from './use-select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '#core/utils/theme'\n\nexport type OptionSubtree = {\n /**\n * Header to show above sub-options.\n */\n readonly header?: string\n\n /**\n * Options.\n */\n readonly options: (Option | OptionSubtree)[]\n}\n\nexport type OptionHeader = {\n readonly header: string\n\n readonly optionValues: string[]\n}\n\nexport const optionHeaderKey = (optionHeader: OptionHeader): string =>\n `HEADER-${optionHeader.optionValues.join(',')}`\n\nexport type SelectProps = {\n /**\n * When disabled, user input is ignored.\n *\n * @default false\n */\n readonly isDisabled?: boolean\n\n /**\n * Number of visible options.\n *\n * @default 5\n */\n readonly visibleOptionCount?: number\n\n /**\n * Highlight text in option labels.\n */\n readonly highlightText?: string\n\n /**\n * Options.\n */\n readonly options: (Option | OptionSubtree)[]\n\n /**\n * Default value.\n */\n readonly defaultValue?: string\n\n /**\n * Callback when selected option changes.\n */\n readonly onChange?: (value: string) => void\n\n /**\n * Callback when focused option changes.\n */\n readonly onFocus?: (value: string) => void\n\n /**\n * Value to focus\n */\n readonly focusValue?: string\n}\n\nexport function Select({\n isDisabled = false,\n visibleOptionCount = 5,\n highlightText,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n}: SelectProps) {\n const state = useSelectState({\n visibleOptionCount,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n })\n\n useSelect({ isDisabled, state })\n\n const appTheme = getTheme()\n const styles = {\n container: () => ({\n flexDirection: 'column' as const,\n }),\n highlightedText: () => ({\n color: appTheme.text,\n backgroundColor: appTheme.warning,\n }),\n }\n\n return (\n <Box {...styles.container()}>\n {state.visibleOptions.map(option => {\n const key = 'value' in option ? option.value : optionHeaderKey(option)\n const isFocused =\n !isDisabled &&\n state.focusedValue !== undefined &&\n ('value' in option\n ? state.focusedValue === option.value\n : option.optionValues.includes(state.focusedValue))\n const isSelected =\n !!state.value &&\n ('value' in option\n ? state.value === option.value\n : option.optionValues.includes(state.value))\n const smallPointer = 'header' in option\n const labelText = 'label' in option ? option.label : option.header\n let label: ReactNode = labelText\n\n if (highlightText && labelText.includes(highlightText)) {\n const index = labelText.indexOf(highlightText)\n\n label = (\n <>\n {labelText.slice(0, index)}\n <Text {...styles.highlightedText()}>{highlightText}</Text>\n {labelText.slice(index + highlightText.length)}\n </>\n )\n }\n\n return (\n <SelectOption\n key={key}\n isFocused={isFocused}\n isSelected={isSelected}\n smallPointer={smallPointer}\n children={label}\n />\n )\n })}\n </Box>\n )\n}\n", "import figures from 'figures'\nimport { Box, Text } from 'ink'\nimport React, { type ReactNode } from 'react'\nimport { type Theme } from './theme'\nimport { getTheme } from '#core/utils/theme'\n\nexport type SelectOptionProps = {\n /**\n * Determines if option is focused.\n */\n readonly isFocused: boolean\n\n /**\n * Determines if option is selected.\n */\n readonly isSelected: boolean\n\n /**\n * Determines if pointer is shown when selected\n */\n readonly smallPointer?: boolean\n\n /**\n * Option label.\n */\n readonly children: ReactNode\n\n /**\n * React key prop (handled internally by React)\n */\n readonly key?: React.Key\n}\n\nexport function SelectOption({\n isFocused,\n isSelected,\n smallPointer,\n children,\n ...props\n}: SelectOptionProps) {\n const appTheme = getTheme()\n const styles = {\n option: ({ isFocused }: { isFocused: boolean }) => ({\n paddingLeft: 2,\n paddingRight: 1,\n }),\n focusIndicator: () => ({\n color: appTheme.kode,\n }),\n label: ({\n isFocused,\n isSelected,\n }: {\n isFocused: boolean\n isSelected: boolean\n }) => ({\n color: isSelected\n ? appTheme.success\n : isFocused\n ? appTheme.kode\n : appTheme.text,\n bold: isSelected,\n }),\n selectedIndicator: () => ({\n color: appTheme.success,\n }),\n }\n\n return (\n <Box {...styles.option({ isFocused })}>\n {isFocused && (\n <Text {...styles.focusIndicator()}>\n {smallPointer ? figures.triangleDownSmall : figures.pointer}\n </Text>\n )}\n\n <Text {...styles.label({ isFocused, isSelected })}>{children}</Text>\n\n {isSelected && (\n <Text {...styles.selectedIndicator()}>{figures.tick}</Text>\n )}\n </Box>\n )\n}\n", "import { isDeepStrictEqual } from 'node:util'\nimport {\n useReducer,\n type Reducer,\n useCallback,\n useMemo,\n useState,\n useEffect,\n} from 'react'\nimport OptionMap from './option-map'\nimport { Option } from '@inkjs/ui'\nimport type { OptionHeader, OptionSubtree } from './select'\nimport {\n createDefaultState,\n flattenOptions,\n type DefaultSelectState,\n} from './select-state'\n\ntype State = DefaultSelectState\n\ntype Action =\n | { type: 'focus-next-option' }\n | { type: 'focus-previous-option' }\n | { type: 'select-focused-option' }\n | { type: 'set-focus'; value: string }\n | { type: 'reset'; state: State }\n\nconst reducer: Reducer<State, Action> = (state, action) => {\n switch (action.type) {\n case 'focus-next-option': {\n if (!state.focusedValue) {\n return state\n }\n\n const item = state.optionMap.get(state.focusedValue)\n\n if (!item) {\n return state\n }\n\n let next = item.next\n while (next && !('value' in next)) {\n // Skip headers\n next = next.next\n }\n\n if (!next || !('value' in next)) {\n return state\n }\n\n const needsToScroll = next.index >= state.visibleToIndex\n\n if (!needsToScroll) {\n return {\n ...state,\n focusedValue: next.value,\n }\n }\n\n const nextVisibleToIndex = Math.min(\n state.optionMap.size,\n state.visibleToIndex + 1,\n )\n\n const nextVisibleFromIndex = nextVisibleToIndex - state.visibleOptionCount\n\n return {\n ...state,\n focusedValue: next.value,\n visibleFromIndex: nextVisibleFromIndex,\n visibleToIndex: nextVisibleToIndex,\n }\n }\n\n case 'focus-previous-option': {\n if (!state.focusedValue) {\n return state\n }\n\n const item = state.optionMap.get(state.focusedValue)\n\n if (!item) {\n return state\n }\n\n let previous = item.previous\n while (previous && !('value' in previous)) {\n // Skip headers\n previous = previous.previous\n }\n\n if (!previous || !('value' in previous)) {\n return state\n }\n\n const needsToScroll = previous.index <= state.visibleFromIndex\n\n if (!needsToScroll) {\n return {\n ...state,\n focusedValue: previous.value,\n }\n }\n\n const nextVisibleFromIndex = Math.max(0, state.visibleFromIndex - 1)\n\n const nextVisibleToIndex = nextVisibleFromIndex + state.visibleOptionCount\n\n return {\n ...state,\n focusedValue: previous.value,\n visibleFromIndex: nextVisibleFromIndex,\n visibleToIndex: nextVisibleToIndex,\n }\n }\n\n case 'select-focused-option': {\n return {\n ...state,\n previousValue: state.value,\n value: state.focusedValue,\n }\n }\n\n case 'reset': {\n return action.state\n }\n\n case 'set-focus': {\n return {\n ...state,\n focusedValue: action.value,\n }\n }\n }\n}\n\nexport type UseSelectStateProps = {\n /**\n * Number of items to display.\n *\n * @default 5\n */\n visibleOptionCount?: number\n\n /**\n * Options.\n */\n options: (Option | OptionSubtree)[]\n\n /**\n * Initially selected option's value.\n */\n defaultValue?: string\n\n /**\n * Callback for selecting an option.\n */\n onChange?: (value: string) => void\n\n /**\n * Callback for focusing an option.\n */\n onFocus?: (value: string) => void\n\n /**\n * Value to focus\n */\n focusValue?: string\n}\n\nexport type SelectState = Pick<\n State,\n 'focusedValue' | 'visibleFromIndex' | 'visibleToIndex' | 'value'\n> & {\n /**\n * Visible options.\n */\n visibleOptions: Array<(Option | OptionHeader) & { index: number }>\n\n /**\n * Focus next option and scroll the list down, if needed.\n */\n focusNextOption: () => void\n\n /**\n * Focus previous option and scroll the list up, if needed.\n */\n focusPreviousOption: () => void\n\n /**\n * Select currently focused option.\n */\n selectFocusedOption: () => void\n}\n\nexport const useSelectState = ({\n visibleOptionCount = 5,\n options,\n defaultValue,\n onChange,\n onFocus,\n focusValue,\n}: UseSelectStateProps) => {\n const flatOptions = flattenOptions(options)\n\n const [state, dispatch] = useReducer(\n reducer,\n { visibleOptionCount, defaultValue, options },\n createDefaultState,\n )\n\n const [lastOptions, setLastOptions] = useState(flatOptions)\n\n if (\n flatOptions !== lastOptions &&\n !isDeepStrictEqual(flatOptions, lastOptions)\n ) {\n dispatch({\n type: 'reset',\n state: createDefaultState({ visibleOptionCount, defaultValue, options }),\n })\n\n setLastOptions(flatOptions)\n }\n\n const focusNextOption = useCallback(() => {\n dispatch({\n type: 'focus-next-option',\n })\n }, [])\n\n const focusPreviousOption = useCallback(() => {\n dispatch({\n type: 'focus-previous-option',\n })\n }, [])\n\n const selectFocusedOption = useCallback(() => {\n dispatch({\n type: 'select-focused-option',\n })\n }, [])\n\n const visibleOptions = useMemo(() => {\n return flatOptions\n .map((option, index) => ({\n ...option,\n index,\n }))\n .slice(state.visibleFromIndex, state.visibleToIndex)\n }, [flatOptions, state.visibleFromIndex, state.visibleToIndex])\n\n useEffect(() => {\n if (state.value && state.previousValue !== state.value) {\n onChange?.(state.value)\n }\n }, [state.previousValue, state.value, options, onChange])\n\n useEffect(() => {\n if (state.focusedValue) {\n onFocus?.(state.focusedValue)\n }\n }, [state.focusedValue, onFocus])\n\n useEffect(() => {\n if (focusValue) {\n dispatch({\n type: 'set-focus',\n value: focusValue,\n })\n }\n }, [focusValue])\n\n return {\n focusedValue: state.focusedValue,\n visibleFromIndex: state.visibleFromIndex,\n visibleToIndex: state.visibleToIndex,\n value: state.value,\n visibleOptions,\n focusNextOption,\n focusPreviousOption,\n selectFocusedOption,\n }\n}\n", "import { type Option } from '@inkjs/ui'\nimport { optionHeaderKey, type OptionHeader } from './select'\n\ntype OptionMapItem = (Option | OptionHeader) & {\n previous: OptionMapItem | undefined\n next: OptionMapItem | undefined\n index: number\n}\n\nexport default class OptionMap extends Map<string, OptionMapItem> {\n readonly first: OptionMapItem | undefined\n\n constructor(options: (Option | OptionHeader)[]) {\n const items: Array<[string, OptionMapItem]> = []\n let firstItem: OptionMapItem | undefined\n let previous: OptionMapItem | undefined\n let index = 0\n\n for (const option of options) {\n const item = {\n ...option,\n previous,\n next: undefined,\n index,\n }\n\n if (previous) {\n previous.next = item\n }\n\n firstItem ||= item\n\n const key = 'value' in option ? option.value : optionHeaderKey(option)\n items.push([key, item])\n index++\n previous = item\n }\n\n super(items)\n this.first = firstItem\n }\n}\n", "import { Option } from '@inkjs/ui'\nimport OptionMap from './option-map'\nimport type { OptionHeader, OptionSubtree } from './select'\n\nexport type FlatOption = Option | OptionHeader\n\nexport type DefaultSelectState = {\n /**\n * Map where key is option's value and value is option's index.\n */\n optionMap: OptionMap\n\n /**\n * Number of visible options.\n */\n visibleOptionCount: number\n\n /**\n * Value of the currently focused option.\n */\n focusedValue: string | undefined\n\n /**\n * Index of the first visible option.\n */\n visibleFromIndex: number\n\n /**\n * Index of the last visible option.\n */\n visibleToIndex: number\n\n /**\n * Value of the previously selected option.\n */\n previousValue: string | undefined\n\n /**\n * Value of the selected option.\n */\n value: string | undefined\n}\n\nexport const flattenOptions = (\n options: (Option | OptionSubtree)[],\n): FlatOption[] =>\n options.flatMap(option => {\n if ('options' in option) {\n const flatSubtree = flattenOptions(option.options)\n const optionValues = flatSubtree.flatMap(o =>\n 'value' in o ? o.value : [],\n )\n const header =\n option.header !== undefined\n ? [{ header: option.header, optionValues }]\n : []\n\n return [...header, ...flatSubtree]\n }\n\n return option\n })\n\nexport type CreateDefaultStateInput = {\n visibleOptionCount?: number\n options: (Option | OptionSubtree)[]\n defaultValue?: string\n}\n\nexport const createDefaultState = ({\n visibleOptionCount: customVisibleOptionCount,\n defaultValue,\n options,\n}: CreateDefaultStateInput): DefaultSelectState => {\n const flatOptions = flattenOptions(options)\n\n const visibleOptionCount =\n typeof customVisibleOptionCount === 'number'\n ? Math.min(customVisibleOptionCount, flatOptions.length)\n : flatOptions.length\n\n const optionMap = new OptionMap(flatOptions)\n const firstOption = optionMap.first\n\n // Use defaultValue for focusedValue if it exists and is valid, otherwise use first option\n let focusedValue: string | undefined\n if (defaultValue && optionMap.get(defaultValue)) {\n focusedValue = defaultValue\n } else {\n focusedValue =\n firstOption && 'value' in firstOption ? firstOption.value : undefined\n }\n\n // Calculate visible range based on focused value\n let visibleFromIndex = 0\n let visibleToIndex = visibleOptionCount\n\n if (focusedValue && optionMap.get(focusedValue)) {\n const focusedIndex = optionMap.get(focusedValue)!.index\n // Center the focused option in the visible area if possible\n const halfVisible = Math.floor(visibleOptionCount / 2)\n visibleFromIndex = Math.max(0, focusedIndex - halfVisible)\n visibleToIndex = Math.min(\n flatOptions.length,\n visibleFromIndex + visibleOptionCount,\n )\n\n // Adjust if we can't show enough items at the end\n if (visibleToIndex - visibleFromIndex < visibleOptionCount) {\n visibleFromIndex = Math.max(0, visibleToIndex - visibleOptionCount)\n }\n }\n\n return {\n optionMap,\n visibleOptionCount,\n focusedValue,\n visibleFromIndex,\n visibleToIndex,\n previousValue: defaultValue,\n value: defaultValue,\n }\n}\n", "import { useInput } from 'ink'\nimport { type SelectState } from './use-select-state'\n\nexport type UseSelectProps = {\n /**\n * When disabled, user input is ignored.\n *\n * @default false\n */\n isDisabled?: boolean\n\n /**\n * Select state.\n */\n state: SelectState\n}\n\nexport const useSelect = ({ isDisabled = false, state }: UseSelectProps) => {\n useInput(\n (_input, key) => {\n if (key.downArrow) {\n state.focusNextOption()\n }\n\n if (key.upArrow) {\n state.focusPreviousOption()\n }\n\n if (key.return) {\n state.selectFocusedOption()\n }\n },\n { isActive: !isDisabled },\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Box", "Text", "React", "isFocused", "isSelected", "React", "Box", "Text"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {
|
|
2
|
+
messagesToAgentEvents,
|
|
3
|
+
query
|
|
4
|
+
} from "./chunk-TNWB3U5Y.js";
|
|
5
|
+
import {
|
|
6
|
+
getContext,
|
|
7
|
+
getSystemPrompt
|
|
8
|
+
} from "./chunk-HPYNW6TT.js";
|
|
9
|
+
|
|
10
|
+
// packages/core/src/engine/systemPrompt.ts
|
|
11
|
+
async function buildSystemPromptForSession(args) {
|
|
12
|
+
const baseSystemPrompt = typeof args.systemPromptOverride === "string" && args.systemPromptOverride.trim() ? [args.systemPromptOverride] : await getSystemPrompt({
|
|
13
|
+
disableSlashCommands: args.disableSlashCommands === true,
|
|
14
|
+
outputStyleActive: args.outputStyleActive,
|
|
15
|
+
keepCodingInstructions: args.keepCodingInstructions
|
|
16
|
+
});
|
|
17
|
+
const systemPrompt = typeof args.appendSystemPrompt === "string" && args.appendSystemPrompt.trim() ? [...baseSystemPrompt, args.appendSystemPrompt] : baseSystemPrompt;
|
|
18
|
+
if (args.jsonSchema) {
|
|
19
|
+
systemPrompt.push(
|
|
20
|
+
[
|
|
21
|
+
"You MUST respond with ONLY valid JSON.",
|
|
22
|
+
"The JSON MUST validate against the following JSON Schema.",
|
|
23
|
+
"Do not wrap the JSON in markdown code fences and do not add extra commentary.",
|
|
24
|
+
"",
|
|
25
|
+
`<json_schema>${JSON.stringify(args.jsonSchema)}</json_schema>`
|
|
26
|
+
].join("\n")
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
return systemPrompt;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// packages/core/src/engine/turn.ts
|
|
33
|
+
async function getSessionContext() {
|
|
34
|
+
return getContext();
|
|
35
|
+
}
|
|
36
|
+
async function* runTurn(args) {
|
|
37
|
+
const [systemPrompt, context] = await Promise.all([
|
|
38
|
+
args.systemPrompt ?? buildSystemPromptForSession({
|
|
39
|
+
disableSlashCommands: args.disableSlashCommands,
|
|
40
|
+
systemPromptOverride: args.systemPromptOverride,
|
|
41
|
+
appendSystemPrompt: args.appendSystemPrompt,
|
|
42
|
+
jsonSchema: args.jsonSchema
|
|
43
|
+
}),
|
|
44
|
+
args.context ?? getContext()
|
|
45
|
+
]);
|
|
46
|
+
yield* query(
|
|
47
|
+
args.messages,
|
|
48
|
+
systemPrompt,
|
|
49
|
+
context,
|
|
50
|
+
args.canUseTool,
|
|
51
|
+
args.toolUseContext,
|
|
52
|
+
args.getBinaryFeedbackResponse
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
async function* runTurnEvents(args) {
|
|
56
|
+
yield* messagesToAgentEvents({
|
|
57
|
+
source: runTurn(args),
|
|
58
|
+
sessionId: args.sessionId
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export {
|
|
63
|
+
buildSystemPromptForSession,
|
|
64
|
+
getSessionContext,
|
|
65
|
+
runTurn,
|
|
66
|
+
runTurnEvents
|
|
67
|
+
};
|