@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
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { createRequire as __kodeCreateRequire } from "node:module";
|
|
2
|
-
const require = __kodeCreateRequire(import.meta.url);
|
|
3
1
|
import {
|
|
4
2
|
getSessionState,
|
|
5
3
|
setSessionState
|
|
6
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZCLTZIVP.js";
|
|
7
5
|
import {
|
|
8
6
|
debug
|
|
9
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-YIO5EBMQ.js";
|
|
10
8
|
import {
|
|
11
9
|
logError
|
|
12
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3OEJVB5A.js";
|
|
13
11
|
|
|
14
|
-
// src/utils/
|
|
12
|
+
// packages/core/src/utils/agentStorage.ts
|
|
15
13
|
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
16
14
|
import { join } from "path";
|
|
17
15
|
import { homedir } from "os";
|
|
@@ -71,7 +69,7 @@ function generateAgentId() {
|
|
|
71
69
|
return randomUUID();
|
|
72
70
|
}
|
|
73
71
|
|
|
74
|
-
// src/
|
|
72
|
+
// packages/core/src/todo/storage.ts
|
|
75
73
|
var TODO_STORAGE_KEY = "todos";
|
|
76
74
|
var TODO_CONFIG_KEY = "todoConfig";
|
|
77
75
|
var DEFAULT_CONFIG = {
|
|
@@ -83,56 +81,50 @@ var DEFAULT_CONFIG = {
|
|
|
83
81
|
var todoCache = null;
|
|
84
82
|
var cacheTimestamp = 0;
|
|
85
83
|
var CACHE_TTL = 5e3;
|
|
84
|
+
var metrics = {
|
|
85
|
+
totalOperations: 0,
|
|
86
|
+
cacheHits: 0,
|
|
87
|
+
cacheMisses: 0,
|
|
88
|
+
lastOperation: 0
|
|
89
|
+
};
|
|
86
90
|
function invalidateCache() {
|
|
87
91
|
todoCache = null;
|
|
88
92
|
cacheTimestamp = 0;
|
|
89
93
|
}
|
|
90
|
-
function updateMetrics(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
totalOperations:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
function updateMetrics(cacheHit = false) {
|
|
95
|
+
metrics = {
|
|
96
|
+
...metrics,
|
|
97
|
+
totalOperations: metrics.totalOperations + 1,
|
|
98
|
+
lastOperation: Date.now(),
|
|
99
|
+
cacheHits: metrics.cacheHits + (cacheHit ? 1 : 0),
|
|
100
|
+
cacheMisses: metrics.cacheMisses + (cacheHit ? 0 : 1)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function isTodoArray(value) {
|
|
104
|
+
return Array.isArray(value);
|
|
105
|
+
}
|
|
106
|
+
function normalizeTodo(todo) {
|
|
107
|
+
return {
|
|
108
|
+
...todo,
|
|
109
|
+
activeForm: todo.activeForm || todo.content
|
|
97
110
|
};
|
|
98
|
-
metrics.totalOperations++;
|
|
99
|
-
metrics.lastOperation = Date.now();
|
|
100
|
-
if (cacheHit) {
|
|
101
|
-
metrics.cacheHits++;
|
|
102
|
-
} else {
|
|
103
|
-
metrics.cacheMisses++;
|
|
104
|
-
}
|
|
105
|
-
setSessionState({
|
|
106
|
-
...sessionState,
|
|
107
|
-
todoMetrics: metrics
|
|
108
|
-
});
|
|
109
111
|
}
|
|
110
112
|
function getTodos(agentId) {
|
|
111
113
|
const resolvedAgentId = resolveAgentId(agentId);
|
|
112
114
|
const now = Date.now();
|
|
113
115
|
if (agentId) {
|
|
114
|
-
updateMetrics(
|
|
116
|
+
updateMetrics(false);
|
|
115
117
|
const agentTodos = readAgentData(resolvedAgentId) || [];
|
|
116
|
-
|
|
117
|
-
return agentTodos.map((todo) => ({
|
|
118
|
-
...todo,
|
|
119
|
-
activeForm: todo.activeForm || todo.content
|
|
120
|
-
}));
|
|
118
|
+
return agentTodos.map(normalizeTodo);
|
|
121
119
|
}
|
|
122
120
|
if (todoCache && now - cacheTimestamp < CACHE_TTL) {
|
|
123
|
-
updateMetrics(
|
|
124
|
-
return todoCache.map(
|
|
125
|
-
...todo,
|
|
126
|
-
activeForm: todo.activeForm || todo.content
|
|
127
|
-
}));
|
|
121
|
+
updateMetrics(true);
|
|
122
|
+
return todoCache.map(normalizeTodo);
|
|
128
123
|
}
|
|
129
|
-
updateMetrics(
|
|
130
|
-
const
|
|
131
|
-
const todos =
|
|
132
|
-
todoCache = [...todos].map(
|
|
133
|
-
...todo,
|
|
134
|
-
activeForm: todo.activeForm || todo.content
|
|
135
|
-
}));
|
|
124
|
+
updateMetrics(false);
|
|
125
|
+
const sessionTodos = getSessionState(TODO_STORAGE_KEY);
|
|
126
|
+
const todos = isTodoArray(sessionTodos) ? sessionTodos : [];
|
|
127
|
+
todoCache = [...todos].map(normalizeTodo);
|
|
136
128
|
cacheTimestamp = now;
|
|
137
129
|
return todoCache;
|
|
138
130
|
}
|
|
@@ -140,32 +132,6 @@ function setTodos(todos, agentId) {
|
|
|
140
132
|
const resolvedAgentId = resolveAgentId(agentId);
|
|
141
133
|
const config = getTodoConfig();
|
|
142
134
|
const existingTodos = getTodos(agentId);
|
|
143
|
-
if (agentId) {
|
|
144
|
-
if (todos.length > config.maxTodos) {
|
|
145
|
-
throw new Error(
|
|
146
|
-
`Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
let processedTodos2 = todos;
|
|
150
|
-
if (config.autoArchiveCompleted) {
|
|
151
|
-
processedTodos2 = todos.filter((todo) => todo.status !== "completed");
|
|
152
|
-
}
|
|
153
|
-
const updatedTodos2 = processedTodos2.map((todo) => {
|
|
154
|
-
const existingTodo = existingTodos.find(
|
|
155
|
-
(existing) => existing.id === todo.id
|
|
156
|
-
);
|
|
157
|
-
return {
|
|
158
|
-
...todo,
|
|
159
|
-
activeForm: todo.activeForm || todo.content,
|
|
160
|
-
updatedAt: Date.now(),
|
|
161
|
-
createdAt: todo.createdAt || Date.now(),
|
|
162
|
-
previousStatus: existingTodo?.status !== todo.status ? existingTodo?.status : todo.previousStatus
|
|
163
|
-
};
|
|
164
|
-
});
|
|
165
|
-
writeAgentData(resolvedAgentId, updatedTodos2);
|
|
166
|
-
updateMetrics("setTodos");
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
135
|
if (todos.length > config.maxTodos) {
|
|
170
136
|
throw new Error(
|
|
171
137
|
`Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`
|
|
@@ -185,19 +151,139 @@ function setTodos(todos, agentId) {
|
|
|
185
151
|
previousStatus: existingTodo?.status !== todo.status ? existingTodo?.status : todo.previousStatus
|
|
186
152
|
};
|
|
187
153
|
});
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
154
|
+
if (agentId) {
|
|
155
|
+
writeAgentData(resolvedAgentId, updatedTodos);
|
|
156
|
+
updateMetrics(false);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
setSessionState(TODO_STORAGE_KEY, updatedTodos);
|
|
192
160
|
invalidateCache();
|
|
193
|
-
updateMetrics(
|
|
161
|
+
updateMetrics(false);
|
|
162
|
+
}
|
|
163
|
+
function isRecord(value) {
|
|
164
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
194
165
|
}
|
|
195
166
|
function getTodoConfig() {
|
|
196
|
-
const
|
|
197
|
-
|
|
167
|
+
const raw = getSessionState(TODO_CONFIG_KEY);
|
|
168
|
+
const stored = isRecord(raw) ? raw : {};
|
|
169
|
+
return { ...DEFAULT_CONFIG, ...stored };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// packages/core/src/services/systemReminder/events.ts
|
|
173
|
+
function registerSystemReminderEvents(service) {
|
|
174
|
+
service.addEventListener("session:startup", (context) => {
|
|
175
|
+
service.resetSession();
|
|
176
|
+
service.sessionState.sessionStartTime = Date.now();
|
|
177
|
+
const ctx = context;
|
|
178
|
+
service.sessionState.contextPresent = Object.keys(ctx?.context ?? {}).length > 0;
|
|
179
|
+
});
|
|
180
|
+
service.addEventListener("todo:changed", (context) => {
|
|
181
|
+
const ctx = context;
|
|
182
|
+
service.sessionState.lastTodoUpdate = Date.now();
|
|
183
|
+
service.clearTodoReminders(ctx?.agentId);
|
|
184
|
+
});
|
|
185
|
+
service.addEventListener("todo:file_changed", (context) => {
|
|
186
|
+
const ctx = context;
|
|
187
|
+
const agentId = ctx?.agentId || "default";
|
|
188
|
+
service.clearTodoReminders(agentId);
|
|
189
|
+
service.sessionState.lastTodoUpdate = Date.now();
|
|
190
|
+
const reminder = service.generateFileChangeReminder(context);
|
|
191
|
+
if (reminder) {
|
|
192
|
+
service.emitEvent("reminder:inject", {
|
|
193
|
+
reminder: reminder.content,
|
|
194
|
+
agentId,
|
|
195
|
+
type: "file_changed",
|
|
196
|
+
timestamp: Date.now()
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
service.addEventListener("file:read", () => {
|
|
201
|
+
service.sessionState.lastFileAccess = Date.now();
|
|
202
|
+
});
|
|
203
|
+
service.addEventListener("file:edited", () => {
|
|
204
|
+
});
|
|
205
|
+
service.addEventListener("agent:mentioned", (context) => {
|
|
206
|
+
const ctx = context;
|
|
207
|
+
service.createMentionReminder({
|
|
208
|
+
type: "agent_mention",
|
|
209
|
+
key: `agent_mention_${ctx.agentType}_${ctx.timestamp}`,
|
|
210
|
+
category: "task",
|
|
211
|
+
priority: "high",
|
|
212
|
+
content: `The user mentioned @${ctx.originalMention}. You MUST use the Task tool with subagent_type="${ctx.agentType}" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${ctx.agentType} agent to execute.`,
|
|
213
|
+
timestamp: ctx.timestamp
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
service.addEventListener("file:mentioned", (context) => {
|
|
217
|
+
const ctx = context;
|
|
218
|
+
service.createMentionReminder({
|
|
219
|
+
type: "file_mention",
|
|
220
|
+
key: `file_mention_${ctx.filePath}_${ctx.timestamp}`,
|
|
221
|
+
category: "general",
|
|
222
|
+
priority: "high",
|
|
223
|
+
content: `The user mentioned @${ctx.originalMention}. You MUST read the entire content of the file at path: ${ctx.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,
|
|
224
|
+
timestamp: ctx.timestamp
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
service.addEventListener("ask-model:mentioned", (context) => {
|
|
228
|
+
const ctx = context;
|
|
229
|
+
service.createMentionReminder({
|
|
230
|
+
type: "ask_model_mention",
|
|
231
|
+
key: `ask_model_mention_${ctx.modelName}_${ctx.timestamp}`,
|
|
232
|
+
category: "task",
|
|
233
|
+
priority: "high",
|
|
234
|
+
content: `The user mentioned @${ctx.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${ctx.modelName}.`,
|
|
235
|
+
timestamp: ctx.timestamp
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// packages/core/src/services/systemReminder/mentions.ts
|
|
241
|
+
var MENTION_TYPES = /* @__PURE__ */ new Set([
|
|
242
|
+
"agent_mention",
|
|
243
|
+
"file_mention",
|
|
244
|
+
"ask_model_mention"
|
|
245
|
+
]);
|
|
246
|
+
function isMentionReminder(reminder) {
|
|
247
|
+
return MENTION_TYPES.has(reminder.type);
|
|
248
|
+
}
|
|
249
|
+
function collectMentionReminders(args) {
|
|
250
|
+
const currentTime = args.now ?? Date.now();
|
|
251
|
+
const MENTION_FRESHNESS_WINDOW = 5e3;
|
|
252
|
+
const reminders = [];
|
|
253
|
+
const expiredKeys = [];
|
|
254
|
+
for (const [key, reminder] of args.reminderCache.entries()) {
|
|
255
|
+
if (!isMentionReminder(reminder)) continue;
|
|
256
|
+
const age = currentTime - reminder.timestamp;
|
|
257
|
+
if (age <= MENTION_FRESHNESS_WINDOW) {
|
|
258
|
+
reminders.push(reminder);
|
|
259
|
+
} else {
|
|
260
|
+
expiredKeys.push(key);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const key of expiredKeys) {
|
|
264
|
+
args.reminderCache.delete(key);
|
|
265
|
+
}
|
|
266
|
+
return reminders;
|
|
267
|
+
}
|
|
268
|
+
function cacheMentionReminder(args) {
|
|
269
|
+
if (args.sessionState.remindersSent.has(args.params.key)) return;
|
|
270
|
+
args.sessionState.remindersSent.add(args.params.key);
|
|
271
|
+
const reminder = args.createReminderMessage(
|
|
272
|
+
args.params.type,
|
|
273
|
+
args.params.category,
|
|
274
|
+
args.params.priority,
|
|
275
|
+
args.params.content,
|
|
276
|
+
args.params.timestamp
|
|
277
|
+
);
|
|
278
|
+
args.reminderCache.set(args.params.key, reminder);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// packages/core/src/services/systemReminder/types.ts
|
|
282
|
+
function getTodoStateHash(todos) {
|
|
283
|
+
return todos.map((t) => `${t.content}:${t.status}:${t.activeForm || t.content}`).sort().join("|");
|
|
198
284
|
}
|
|
199
285
|
|
|
200
|
-
// src/services/
|
|
286
|
+
// packages/core/src/services/systemReminder/service.ts
|
|
201
287
|
var SystemReminderService = class {
|
|
202
288
|
sessionState = {
|
|
203
289
|
lastTodoUpdate: 0,
|
|
@@ -216,32 +302,36 @@ var SystemReminderService = class {
|
|
|
216
302
|
eventDispatcher = /* @__PURE__ */ new Map();
|
|
217
303
|
reminderCache = /* @__PURE__ */ new Map();
|
|
218
304
|
constructor() {
|
|
219
|
-
|
|
305
|
+
registerSystemReminderEvents({
|
|
306
|
+
sessionState: this.sessionState,
|
|
307
|
+
resetSession: () => this.resetSession(),
|
|
308
|
+
clearTodoReminders: (agentId) => this.clearTodoReminders(agentId),
|
|
309
|
+
generateFileChangeReminder: (context) => this.generateFileChangeReminder(context),
|
|
310
|
+
emitEvent: (event, context) => this.emitEvent(event, context),
|
|
311
|
+
addEventListener: (event, cb) => this.addEventListener(event, cb),
|
|
312
|
+
createMentionReminder: (params) => this.createMentionReminder(params)
|
|
313
|
+
});
|
|
220
314
|
}
|
|
221
315
|
generateReminders(hasContext = false, agentId) {
|
|
222
316
|
this.sessionState.contextPresent = hasContext;
|
|
223
|
-
if (!hasContext)
|
|
224
|
-
return [];
|
|
225
|
-
}
|
|
317
|
+
if (!hasContext) return [];
|
|
226
318
|
if (this.sessionState.reminderCount >= this.sessionState.config.maxRemindersPerSession) {
|
|
227
319
|
return [];
|
|
228
320
|
}
|
|
229
321
|
const reminders = [];
|
|
230
|
-
const currentTime = Date.now();
|
|
231
322
|
const reminderGenerators = [
|
|
232
323
|
() => this.dispatchTodoEvent(agentId),
|
|
233
324
|
() => this.dispatchSecurityEvent(),
|
|
234
325
|
() => this.dispatchPerformanceEvent(),
|
|
235
|
-
() => this.
|
|
326
|
+
() => collectMentionReminders({ reminderCache: this.reminderCache })
|
|
236
327
|
];
|
|
237
328
|
for (const generator of reminderGenerators) {
|
|
238
329
|
if (reminders.length >= 5) break;
|
|
239
330
|
const result = generator();
|
|
240
|
-
if (result)
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
}
|
|
331
|
+
if (!result) continue;
|
|
332
|
+
const next = Array.isArray(result) ? result : [result];
|
|
333
|
+
reminders.push(...next);
|
|
334
|
+
this.sessionState.reminderCount += next.length;
|
|
245
335
|
}
|
|
246
336
|
return reminders;
|
|
247
337
|
}
|
|
@@ -261,18 +351,17 @@ var SystemReminderService = class {
|
|
|
261
351
|
);
|
|
262
352
|
}
|
|
263
353
|
if (todos.length > 0) {
|
|
264
|
-
const reminderKey = `todo_updated_${agentKey}_${todos.length}_${
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
354
|
+
const reminderKey = `todo_updated_${agentKey}_${todos.length}_${getTodoStateHash(todos)}`;
|
|
355
|
+
const cached = this.reminderCache.get(reminderKey);
|
|
356
|
+
if (cached) return cached;
|
|
268
357
|
if (!this.sessionState.remindersSent.has(reminderKey)) {
|
|
269
358
|
this.sessionState.remindersSent.add(reminderKey);
|
|
270
359
|
this.clearTodoReminders(agentKey);
|
|
271
360
|
const todoContent = JSON.stringify(
|
|
272
361
|
todos.map((todo) => ({
|
|
273
|
-
content: todo.content.length > 100 ? todo.content.substring(0, 100)
|
|
362
|
+
content: todo.content.length > 100 ? `${todo.content.substring(0, 100)}...` : todo.content,
|
|
274
363
|
status: todo.status,
|
|
275
|
-
activeForm: todo.activeForm && todo.activeForm.length > 100 ? todo.activeForm.substring(0, 100)
|
|
364
|
+
activeForm: todo.activeForm && todo.activeForm.length > 100 ? `${todo.activeForm.substring(0, 100)}...` : todo.activeForm || todo.content
|
|
276
365
|
}))
|
|
277
366
|
);
|
|
278
367
|
const reminder = this.createReminderMessage(
|
|
@@ -321,38 +410,15 @@ ${todoContent}. Continue on with the tasks at hand if applicable.`,
|
|
|
321
410
|
}
|
|
322
411
|
return null;
|
|
323
412
|
}
|
|
324
|
-
getMentionReminders() {
|
|
325
|
-
const currentTime = Date.now();
|
|
326
|
-
const MENTION_FRESHNESS_WINDOW = 5e3;
|
|
327
|
-
const reminders = [];
|
|
328
|
-
const expiredKeys = [];
|
|
329
|
-
for (const [key, reminder] of this.reminderCache.entries()) {
|
|
330
|
-
if (this.isMentionReminder(reminder)) {
|
|
331
|
-
const age = currentTime - reminder.timestamp;
|
|
332
|
-
if (age <= MENTION_FRESHNESS_WINDOW) {
|
|
333
|
-
reminders.push(reminder);
|
|
334
|
-
} else {
|
|
335
|
-
expiredKeys.push(key);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
expiredKeys.forEach((key) => this.reminderCache.delete(key));
|
|
340
|
-
return reminders;
|
|
341
|
-
}
|
|
342
|
-
isMentionReminder(reminder) {
|
|
343
|
-
const mentionTypes = ["agent_mention", "file_mention", "ask_model_mention"];
|
|
344
|
-
return mentionTypes.includes(reminder.type);
|
|
345
|
-
}
|
|
346
413
|
generateFileChangeReminder(context) {
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
414
|
+
const ctx = context;
|
|
415
|
+
const agentId = ctx?.agentId;
|
|
416
|
+
const filePath = ctx?.filePath;
|
|
417
|
+
const reminder = ctx?.reminder;
|
|
418
|
+
if (!reminder) return null;
|
|
351
419
|
const currentTime = Date.now();
|
|
352
420
|
const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`;
|
|
353
|
-
if (this.sessionState.remindersSent.has(reminderKey))
|
|
354
|
-
return null;
|
|
355
|
-
}
|
|
421
|
+
if (this.sessionState.remindersSent.has(reminderKey)) return null;
|
|
356
422
|
this.sessionState.remindersSent.add(reminderKey);
|
|
357
423
|
return this.createReminderMessage(
|
|
358
424
|
"file_changed",
|
|
@@ -375,9 +441,6 @@ ${content}
|
|
|
375
441
|
category
|
|
376
442
|
};
|
|
377
443
|
}
|
|
378
|
-
getTodoStateHash(todos) {
|
|
379
|
-
return todos.map((t) => `${t.content}:${t.status}:${t.activeForm || t.content}`).sort().join("|");
|
|
380
|
-
}
|
|
381
444
|
clearTodoReminders(agentId) {
|
|
382
445
|
const agentKey = agentId || "default";
|
|
383
446
|
for (const key of this.sessionState.remindersSent) {
|
|
@@ -386,66 +449,6 @@ ${content}
|
|
|
386
449
|
}
|
|
387
450
|
}
|
|
388
451
|
}
|
|
389
|
-
setupEventDispatcher() {
|
|
390
|
-
this.addEventListener("session:startup", (context) => {
|
|
391
|
-
this.resetSession();
|
|
392
|
-
this.sessionState.sessionStartTime = Date.now();
|
|
393
|
-
this.sessionState.contextPresent = Object.keys(context.context || {}).length > 0;
|
|
394
|
-
});
|
|
395
|
-
this.addEventListener("todo:changed", (context) => {
|
|
396
|
-
this.sessionState.lastTodoUpdate = Date.now();
|
|
397
|
-
this.clearTodoReminders(context.agentId);
|
|
398
|
-
});
|
|
399
|
-
this.addEventListener("todo:file_changed", (context) => {
|
|
400
|
-
const agentId = context.agentId || "default";
|
|
401
|
-
this.clearTodoReminders(agentId);
|
|
402
|
-
this.sessionState.lastTodoUpdate = Date.now();
|
|
403
|
-
const reminder = this.generateFileChangeReminder(context);
|
|
404
|
-
if (reminder) {
|
|
405
|
-
this.emitEvent("reminder:inject", {
|
|
406
|
-
reminder: reminder.content,
|
|
407
|
-
agentId,
|
|
408
|
-
type: "file_changed",
|
|
409
|
-
timestamp: Date.now()
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
});
|
|
413
|
-
this.addEventListener("file:read", (context) => {
|
|
414
|
-
this.sessionState.lastFileAccess = Date.now();
|
|
415
|
-
});
|
|
416
|
-
this.addEventListener("file:edited", (context) => {
|
|
417
|
-
});
|
|
418
|
-
this.addEventListener("agent:mentioned", (context) => {
|
|
419
|
-
this.createMentionReminder({
|
|
420
|
-
type: "agent_mention",
|
|
421
|
-
key: `agent_mention_${context.agentType}_${context.timestamp}`,
|
|
422
|
-
category: "task",
|
|
423
|
-
priority: "high",
|
|
424
|
-
content: `The user mentioned @${context.originalMention}. You MUST use the Task tool with subagent_type="${context.agentType}" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${context.agentType} agent to execute.`,
|
|
425
|
-
timestamp: context.timestamp
|
|
426
|
-
});
|
|
427
|
-
});
|
|
428
|
-
this.addEventListener("file:mentioned", (context) => {
|
|
429
|
-
this.createMentionReminder({
|
|
430
|
-
type: "file_mention",
|
|
431
|
-
key: `file_mention_${context.filePath}_${context.timestamp}`,
|
|
432
|
-
category: "general",
|
|
433
|
-
priority: "high",
|
|
434
|
-
content: `The user mentioned @${context.originalMention}. You MUST read the entire content of the file at path: ${context.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,
|
|
435
|
-
timestamp: context.timestamp
|
|
436
|
-
});
|
|
437
|
-
});
|
|
438
|
-
this.addEventListener("ask-model:mentioned", (context) => {
|
|
439
|
-
this.createMentionReminder({
|
|
440
|
-
type: "ask_model_mention",
|
|
441
|
-
key: `ask_model_mention_${context.modelName}_${context.timestamp}`,
|
|
442
|
-
category: "task",
|
|
443
|
-
priority: "high",
|
|
444
|
-
content: `The user mentioned @${context.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${context.modelName}.`,
|
|
445
|
-
timestamp: context.timestamp
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
452
|
addEventListener(event, callback) {
|
|
450
453
|
if (!this.eventDispatcher.has(event)) {
|
|
451
454
|
this.eventDispatcher.set(event, []);
|
|
@@ -454,7 +457,7 @@ ${content}
|
|
|
454
457
|
}
|
|
455
458
|
emitEvent(event, context) {
|
|
456
459
|
const listeners = this.eventDispatcher.get(event) || [];
|
|
457
|
-
|
|
460
|
+
for (const callback of listeners) {
|
|
458
461
|
try {
|
|
459
462
|
callback(context);
|
|
460
463
|
} catch (error) {
|
|
@@ -464,31 +467,31 @@ ${content}
|
|
|
464
467
|
error: error instanceof Error ? error.message : String(error)
|
|
465
468
|
});
|
|
466
469
|
}
|
|
467
|
-
}
|
|
470
|
+
}
|
|
468
471
|
}
|
|
469
472
|
createMentionReminder(params) {
|
|
470
|
-
|
|
471
|
-
this.sessionState
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
473
|
+
cacheMentionReminder({
|
|
474
|
+
sessionState: this.sessionState,
|
|
475
|
+
reminderCache: this.reminderCache,
|
|
476
|
+
params,
|
|
477
|
+
createReminderMessage: (type, category, priority, content, timestamp) => this.createReminderMessage(
|
|
478
|
+
type,
|
|
479
|
+
category,
|
|
480
|
+
priority,
|
|
481
|
+
content,
|
|
482
|
+
timestamp
|
|
483
|
+
)
|
|
484
|
+
});
|
|
481
485
|
}
|
|
482
486
|
resetSession() {
|
|
483
|
-
this.sessionState
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
};
|
|
487
|
+
const preservedConfig = { ...this.sessionState.config };
|
|
488
|
+
this.sessionState.lastTodoUpdate = 0;
|
|
489
|
+
this.sessionState.lastFileAccess = 0;
|
|
490
|
+
this.sessionState.sessionStartTime = Date.now();
|
|
491
|
+
this.sessionState.remindersSent = /* @__PURE__ */ new Set();
|
|
492
|
+
this.sessionState.contextPresent = false;
|
|
493
|
+
this.sessionState.reminderCount = 0;
|
|
494
|
+
this.sessionState.config = preservedConfig;
|
|
492
495
|
this.reminderCache.clear();
|
|
493
496
|
}
|
|
494
497
|
updateConfig(config) {
|
|
@@ -498,6 +501,8 @@ ${content}
|
|
|
498
501
|
return { ...this.sessionState };
|
|
499
502
|
}
|
|
500
503
|
};
|
|
504
|
+
|
|
505
|
+
// packages/core/src/services/systemReminder/index.ts
|
|
501
506
|
var systemReminderService = new SystemReminderService();
|
|
502
507
|
var generateSystemReminders = (hasContext = false, agentId) => systemReminderService.generateReminders(hasContext, agentId);
|
|
503
508
|
var emitReminderEvent = (event, context) => systemReminderService.emitEvent(event, context);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../packages/core/src/utils/agentStorage.ts", "../../packages/core/src/todo/storage.ts", "../../packages/core/src/services/systemReminder/events.ts", "../../packages/core/src/services/systemReminder/mentions.ts", "../../packages/core/src/services/systemReminder/types.ts", "../../packages/core/src/services/systemReminder/service.ts", "../../packages/core/src/services/systemReminder/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * Agent Storage Utilities\n * Provides file-based state isolation for different agents\n * Based on Kode's Agent ID architecture\n */\n\n/**\n * Get the kode config directory\n */\nfunction getConfigDirectory(): string {\n return (\n process.env.KODE_CONFIG_DIR ??\n process.env.ANYKODE_CONFIG_DIR ??\n join(homedir(), '.kode')\n )\n}\n\n/**\n * Get the current session ID\n */\nfunction getSessionId(): string {\n // This should be set when the session starts\n return process.env.ANYKODE_SESSION_ID ?? 'default-session'\n}\n\n/**\n * Generate agent-specific file path\n * Pattern: ${sessionId}-agent-${agentId}.json\n * Stored in ~/.kode/ directory\n */\nexport function getAgentFilePath(agentId: string): string {\n const sessionId = getSessionId()\n const filename = `${sessionId}-agent-${agentId}.json`\n const configDir = getConfigDirectory()\n\n // Ensure kode config directory exists\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n\n return join(configDir, filename)\n}\n\n/**\n * Read agent-specific data from storage\n */\nexport function readAgentData<T = any>(agentId: string): T | null {\n const filePath = getAgentFilePath(agentId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as T\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_READ_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\n/**\n * Write agent-specific data to storage\n */\nexport function writeAgentData<T = any>(agentId: string, data: T): void {\n const filePath = getAgentFilePath(agentId)\n\n try {\n writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('AGENT_STORAGE_WRITE_FAILED', {\n agentId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\n/**\n * Get default agent ID if none is provided\n */\nexport function getDefaultAgentId(): string {\n return 'default'\n}\n\n/**\n * Resolve agent ID from context\n */\nexport function resolveAgentId(agentId?: string): string {\n return agentId || getDefaultAgentId()\n}\n\n/**\n * Generate a new unique Agent ID\n */\nexport function generateAgentId(): string {\n return randomUUID()\n}\n", "import { getSessionState, setSessionState } from '#core/utils/sessionState'\nimport {\n readAgentData,\n resolveAgentId,\n writeAgentData,\n} from '#core/utils/agentStorage'\nimport type {\n TodoItem,\n TodoQuery,\n TodoStorageConfig,\n TodoMetrics,\n} from './types'\n\nconst TODO_STORAGE_KEY = 'todos'\nconst TODO_CONFIG_KEY = 'todoConfig'\n\nconst DEFAULT_CONFIG: TodoStorageConfig = {\n maxTodos: 100,\n autoArchiveCompleted: false,\n sortBy: 'status',\n sortOrder: 'desc',\n}\n\nlet todoCache: TodoItem[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL = 5000\n\nlet metrics: TodoMetrics = {\n totalOperations: 0,\n cacheHits: 0,\n cacheMisses: 0,\n lastOperation: 0,\n}\n\nfunction invalidateCache(): void {\n todoCache = null\n cacheTimestamp = 0\n}\n\nfunction updateMetrics(cacheHit: boolean = false): void {\n metrics = {\n ...metrics,\n totalOperations: metrics.totalOperations + 1,\n lastOperation: Date.now(),\n cacheHits: metrics.cacheHits + (cacheHit ? 1 : 0),\n cacheMisses: metrics.cacheMisses + (cacheHit ? 0 : 1),\n }\n}\n\nfunction isTodoArray(value: unknown): value is TodoItem[] {\n return Array.isArray(value)\n}\n\nfunction normalizeTodo(todo: TodoItem): TodoItem {\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n }\n}\n\nexport function getTodoMetrics(): TodoMetrics {\n return { ...metrics }\n}\n\nexport function getTodos(agentId?: string): TodoItem[] {\n const resolvedAgentId = resolveAgentId(agentId)\n const now = Date.now()\n\n if (agentId) {\n updateMetrics(false)\n const agentTodos = readAgentData<TodoItem[]>(resolvedAgentId) || []\n return agentTodos.map(normalizeTodo)\n }\n\n if (todoCache && now - cacheTimestamp < CACHE_TTL) {\n updateMetrics(true)\n return todoCache.map(normalizeTodo)\n }\n\n updateMetrics(false)\n const sessionTodos = getSessionState(TODO_STORAGE_KEY)\n const todos = isTodoArray(sessionTodos) ? sessionTodos : []\n\n todoCache = [...todos].map(normalizeTodo)\n cacheTimestamp = now\n\n return todoCache\n}\n\nexport function setTodos(todos: TodoItem[], agentId?: string): void {\n const resolvedAgentId = resolveAgentId(agentId)\n const config = getTodoConfig()\n const existingTodos = getTodos(agentId)\n\n if (todos.length > config.maxTodos) {\n throw new Error(\n `Todo limit exceeded. Maximum ${config.maxTodos} todos allowed.`,\n )\n }\n\n let processedTodos = todos\n if (config.autoArchiveCompleted) {\n processedTodos = todos.filter(todo => todo.status !== 'completed')\n }\n\n const updatedTodos = processedTodos.map(todo => {\n const existingTodo = existingTodos.find(existing => existing.id === todo.id)\n\n return {\n ...todo,\n activeForm: todo.activeForm || todo.content,\n updatedAt: Date.now(),\n createdAt: todo.createdAt || Date.now(),\n previousStatus:\n existingTodo?.status !== todo.status\n ? existingTodo?.status\n : todo.previousStatus,\n }\n })\n\n if (agentId) {\n writeAgentData(resolvedAgentId, updatedTodos)\n updateMetrics(false)\n return\n }\n\n setSessionState(TODO_STORAGE_KEY, updatedTodos)\n invalidateCache()\n updateMetrics(false)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function getTodoConfig(): TodoStorageConfig {\n const raw = getSessionState(TODO_CONFIG_KEY)\n const stored = isRecord(raw) ? raw : {}\n return { ...DEFAULT_CONFIG, ...(stored as Partial<TodoStorageConfig>) }\n}\n\nexport function setTodoConfig(config: Partial<TodoStorageConfig>): void {\n const currentConfig = getTodoConfig()\n const newConfig = { ...currentConfig, ...config }\n\n setSessionState(TODO_CONFIG_KEY, newConfig)\n\n if (config.sortBy || config.sortOrder) {\n const todos = getTodos()\n setTodos(todos)\n }\n}\n\nexport function addTodo(\n todo: Omit<TodoItem, 'createdAt' | 'updatedAt'>,\n): TodoItem[] {\n const todos = getTodos()\n if (todos.some(existing => existing.id === todo.id)) {\n throw new Error(`Todo with ID '${todo.id}' already exists`)\n }\n\n const newTodo: TodoItem = {\n ...todo,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n }\n\n const updatedTodos = [...todos, newTodo]\n setTodos(updatedTodos)\n return updatedTodos\n}\n\nexport function updateTodo(id: string, updates: Partial<TodoItem>): TodoItem[] {\n const todos = getTodos()\n const existingTodo = todos.find(todo => todo.id === id)\n if (!existingTodo) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.map(todo =>\n todo.id === id ? { ...todo, ...updates, updatedAt: Date.now() } : todo,\n )\n\n setTodos(updatedTodos)\n return updatedTodos\n}\n\nexport function deleteTodo(id: string): TodoItem[] {\n const todos = getTodos()\n const todoExists = todos.some(todo => todo.id === id)\n if (!todoExists) {\n throw new Error(`Todo with ID '${id}' not found`)\n }\n\n const updatedTodos = todos.filter(todo => todo.id !== id)\n setTodos(updatedTodos)\n return updatedTodos\n}\n\nexport function clearTodos(): void {\n setTodos([])\n}\n\nexport function getTodoById(id: string): TodoItem | undefined {\n const todos = getTodos()\n return todos.find(todo => todo.id === id)\n}\n\nexport function getTodosByStatus(status: TodoItem['status']): TodoItem[] {\n const todos = getTodos()\n return todos.filter(todo => todo.status === status)\n}\n\nexport function getTodosByPriority(priority: TodoItem['priority']): TodoItem[] {\n const todos = getTodos()\n return todos.filter(todo => todo.priority === priority)\n}\n\nexport function queryTodos(query: TodoQuery): TodoItem[] {\n const todos = getTodos()\n\n return todos.filter(todo => {\n if (query.status && !query.status.includes(todo.status)) {\n return false\n }\n\n if (query.priority && !query.priority.includes(todo.priority)) {\n return false\n }\n\n if (\n query.contentMatch &&\n !todo.content.toLowerCase().includes(query.contentMatch.toLowerCase())\n ) {\n return false\n }\n\n if (query.tags && todo.tags) {\n const hasMatchingTag = query.tags.some(tag => todo.tags!.includes(tag))\n if (!hasMatchingTag) return false\n }\n\n if (query.dateRange) {\n const todoDate = new Date(todo.createdAt || 0)\n if (query.dateRange.from && todoDate < query.dateRange.from) return false\n if (query.dateRange.to && todoDate > query.dateRange.to) return false\n }\n\n return true\n })\n}\n\nexport function getTodoStatistics() {\n const todos = getTodos()\n const currentMetrics = getTodoMetrics()\n\n return {\n total: todos.length,\n byStatus: {\n pending: todos.filter(t => t.status === 'pending').length,\n in_progress: todos.filter(t => t.status === 'in_progress').length,\n completed: todos.filter(t => t.status === 'completed').length,\n },\n byPriority: {\n high: todos.filter(t => t.priority === 'high').length,\n medium: todos.filter(t => t.priority === 'medium').length,\n low: todos.filter(t => t.priority === 'low').length,\n },\n metrics: currentMetrics,\n cacheEfficiency:\n currentMetrics.totalOperations > 0\n ? Math.round(\n (currentMetrics.cacheHits / currentMetrics.totalOperations) * 100,\n )\n : 0,\n }\n}\n\nexport function optimizeTodoStorage(): void {\n invalidateCache()\n\n const todos = getTodos()\n const validTodos = todos.filter(\n todo =>\n todo.id &&\n todo.content &&\n todo.activeForm &&\n ['pending', 'in_progress', 'completed'].includes(todo.status) &&\n ['high', 'medium', 'low'].includes(todo.priority),\n )\n\n if (validTodos.length !== todos.length) {\n setTodos(validTodos)\n }\n}\n", "import type { ReminderMessage, SessionReminderState } from './types'\nimport type { MentionReminderParams } from './mentions'\n\nexport type SystemReminderEventBindings = {\n sessionState: SessionReminderState\n resetSession: () => void\n clearTodoReminders: (agentId?: string) => void\n generateFileChangeReminder: (context: unknown) => ReminderMessage | null\n emitEvent: (event: string, context: unknown) => void\n addEventListener: (\n event: string,\n callback: (context: unknown) => void,\n ) => void\n createMentionReminder: (params: MentionReminderParams) => void\n}\n\nexport function registerSystemReminderEvents(\n service: SystemReminderEventBindings,\n): void {\n service.addEventListener('session:startup', context => {\n service.resetSession()\n service.sessionState.sessionStartTime = Date.now()\n const ctx = context as { context?: Record<string, unknown> } | null\n service.sessionState.contextPresent =\n Object.keys(ctx?.context ?? {}).length > 0\n })\n\n service.addEventListener('todo:changed', context => {\n const ctx = context as { agentId?: string } | null\n service.sessionState.lastTodoUpdate = Date.now()\n service.clearTodoReminders(ctx?.agentId)\n })\n\n service.addEventListener('todo:file_changed', context => {\n const ctx = context as { agentId?: string; filePath?: string } | null\n const agentId = ctx?.agentId || 'default'\n service.clearTodoReminders(agentId)\n service.sessionState.lastTodoUpdate = Date.now()\n\n const reminder = service.generateFileChangeReminder(context)\n if (reminder) {\n service.emitEvent('reminder:inject', {\n reminder: reminder.content,\n agentId,\n type: 'file_changed',\n timestamp: Date.now(),\n })\n }\n })\n\n service.addEventListener('file:read', () => {\n service.sessionState.lastFileAccess = Date.now()\n })\n\n service.addEventListener('file:edited', () => {\n // intentionally left blank (reserved for freshness detection)\n })\n\n service.addEventListener('agent:mentioned', context => {\n const ctx = context as {\n agentType: string\n originalMention: string\n timestamp: number\n }\n service.createMentionReminder({\n type: 'agent_mention',\n key: `agent_mention_${ctx.agentType}_${ctx.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${ctx.originalMention}. You MUST use the Task tool with subagent_type=\"${ctx.agentType}\" to delegate this task to the specified agent. Provide a detailed, self-contained task description that fully captures the user's intent for the ${ctx.agentType} agent to execute.`,\n timestamp: ctx.timestamp,\n })\n })\n\n service.addEventListener('file:mentioned', context => {\n const ctx = context as {\n filePath: string\n originalMention: string\n timestamp: number\n }\n service.createMentionReminder({\n type: 'file_mention',\n key: `file_mention_${ctx.filePath}_${ctx.timestamp}`,\n category: 'general',\n priority: 'high',\n content: `The user mentioned @${ctx.originalMention}. You MUST read the entire content of the file at path: ${ctx.filePath} using the Read tool to understand the full context before proceeding with the user's request.`,\n timestamp: ctx.timestamp,\n })\n })\n\n service.addEventListener('ask-model:mentioned', context => {\n const ctx = context as { modelName: string; timestamp: number }\n service.createMentionReminder({\n type: 'ask_model_mention',\n key: `ask_model_mention_${ctx.modelName}_${ctx.timestamp}`,\n category: 'task',\n priority: 'high',\n content: `The user mentioned @${ctx.modelName}. You MUST use the AskExpertModelTool to consult this specific model for expert opinions and analysis. Provide the user's question or context clearly to get the most relevant response from ${ctx.modelName}.`,\n timestamp: ctx.timestamp,\n })\n })\n}\n", "import type { ReminderMessage, SessionReminderState } from './types'\n\nexport type MentionReminderParams = {\n type: string\n key: string\n category: ReminderMessage['category']\n priority: ReminderMessage['priority']\n content: string\n timestamp: number\n}\n\nconst MENTION_TYPES = new Set([\n 'agent_mention',\n 'file_mention',\n 'ask_model_mention',\n])\n\nfunction isMentionReminder(reminder: ReminderMessage): boolean {\n return MENTION_TYPES.has(reminder.type)\n}\n\nexport function collectMentionReminders(args: {\n reminderCache: Map<string, ReminderMessage>\n now?: number\n}): ReminderMessage[] {\n const currentTime = args.now ?? Date.now()\n const MENTION_FRESHNESS_WINDOW = 5000\n const reminders: ReminderMessage[] = []\n const expiredKeys: string[] = []\n\n for (const [key, reminder] of args.reminderCache.entries()) {\n if (!isMentionReminder(reminder)) continue\n const age = currentTime - reminder.timestamp\n if (age <= MENTION_FRESHNESS_WINDOW) {\n reminders.push(reminder)\n } else {\n expiredKeys.push(key)\n }\n }\n\n for (const key of expiredKeys) {\n args.reminderCache.delete(key)\n }\n\n return reminders\n}\n\nexport function cacheMentionReminder(args: {\n sessionState: SessionReminderState\n reminderCache: Map<string, ReminderMessage>\n params: MentionReminderParams\n createReminderMessage: (\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ) => ReminderMessage\n}): void {\n if (args.sessionState.remindersSent.has(args.params.key)) return\n args.sessionState.remindersSent.add(args.params.key)\n\n const reminder = args.createReminderMessage(\n args.params.type,\n args.params.category,\n args.params.priority,\n args.params.content,\n args.params.timestamp,\n )\n args.reminderCache.set(args.params.key, reminder)\n}\n", "import type { TodoItem } from '#core/utils/todoStorage'\n\nexport interface ReminderMessage {\n role: 'system'\n content: string\n isMeta: boolean\n timestamp: number\n type: string\n priority: 'low' | 'medium' | 'high'\n category: 'task' | 'security' | 'performance' | 'general'\n}\n\nexport interface ReminderConfig {\n todoEmptyReminder: boolean\n securityReminder: boolean\n performanceReminder: boolean\n maxRemindersPerSession: number\n}\n\nexport interface SessionReminderState {\n lastTodoUpdate: number\n lastFileAccess: number\n sessionStartTime: number\n remindersSent: Set<string>\n contextPresent: boolean\n reminderCount: number\n config: ReminderConfig\n}\n\nexport type TodoStateHash = string\n\nexport function getTodoStateHash(todos: TodoItem[]): TodoStateHash {\n return todos\n .map(t => `${t.content}:${t.status}:${t.activeForm || t.content}`)\n .sort()\n .join('|')\n}\n", "import { getTodos } from '#core/utils/todoStorage'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\nimport { registerSystemReminderEvents } from './events'\nimport { collectMentionReminders, cacheMentionReminder } from './mentions'\nimport type { MentionReminderParams } from './mentions'\nimport type {\n ReminderConfig,\n ReminderMessage,\n SessionReminderState,\n} from './types'\nimport { getTodoStateHash } from './types'\n\nexport class SystemReminderService {\n public sessionState: SessionReminderState = {\n lastTodoUpdate: 0,\n lastFileAccess: 0,\n sessionStartTime: Date.now(),\n remindersSent: new Set(),\n contextPresent: false,\n reminderCount: 0,\n config: {\n todoEmptyReminder: true,\n securityReminder: true,\n performanceReminder: true,\n maxRemindersPerSession: 10,\n },\n }\n\n private readonly eventDispatcher = new Map<\n string,\n Array<(context: unknown) => void>\n >()\n private readonly reminderCache = new Map<string, ReminderMessage>()\n\n constructor() {\n registerSystemReminderEvents({\n sessionState: this.sessionState,\n resetSession: () => this.resetSession(),\n clearTodoReminders: agentId => this.clearTodoReminders(agentId),\n generateFileChangeReminder: context =>\n this.generateFileChangeReminder(context),\n emitEvent: (event, context) => this.emitEvent(event, context),\n addEventListener: (event, cb) => this.addEventListener(event, cb),\n createMentionReminder: params => this.createMentionReminder(params),\n })\n }\n\n public generateReminders(\n hasContext: boolean = false,\n agentId?: string,\n ): ReminderMessage[] {\n this.sessionState.contextPresent = hasContext\n if (!hasContext) return []\n\n if (\n this.sessionState.reminderCount >=\n this.sessionState.config.maxRemindersPerSession\n ) {\n return []\n }\n\n const reminders: ReminderMessage[] = []\n\n const reminderGenerators: Array<\n () => ReminderMessage | ReminderMessage[] | null\n > = [\n () => this.dispatchTodoEvent(agentId),\n () => this.dispatchSecurityEvent(),\n () => this.dispatchPerformanceEvent(),\n () => collectMentionReminders({ reminderCache: this.reminderCache }),\n ]\n\n for (const generator of reminderGenerators) {\n if (reminders.length >= 5) break\n const result = generator()\n if (!result) continue\n const next = Array.isArray(result) ? result : [result]\n reminders.push(...next)\n this.sessionState.reminderCount += next.length\n }\n\n return reminders\n }\n\n private dispatchTodoEvent(agentId?: string): ReminderMessage | null {\n if (!this.sessionState.config.todoEmptyReminder) return null\n\n const todos = getTodos(agentId)\n const currentTime = Date.now()\n const agentKey = agentId || 'default'\n\n if (\n todos.length === 0 &&\n !this.sessionState.remindersSent.has(`todo_empty_${agentKey}`)\n ) {\n this.sessionState.remindersSent.add(`todo_empty_${agentKey}`)\n return this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n 'This is a reminder that your todo list is currently empty. DO NOT mention this to the user explicitly because they are already aware. If you are working on tasks that would benefit from a todo list please use the TodoWrite tool to create one. If not, please feel free to ignore. Again do not mention this message to the user.',\n currentTime,\n )\n }\n\n if (todos.length > 0) {\n const reminderKey = `todo_updated_${agentKey}_${todos.length}_${getTodoStateHash(todos)}`\n\n const cached = this.reminderCache.get(reminderKey)\n if (cached) return cached\n\n if (!this.sessionState.remindersSent.has(reminderKey)) {\n this.sessionState.remindersSent.add(reminderKey)\n this.clearTodoReminders(agentKey)\n\n const todoContent = JSON.stringify(\n todos.map(todo => ({\n content:\n todo.content.length > 100\n ? `${todo.content.substring(0, 100)}...`\n : todo.content,\n status: todo.status,\n activeForm:\n todo.activeForm && todo.activeForm.length > 100\n ? `${todo.activeForm.substring(0, 100)}...`\n : todo.activeForm || todo.content,\n })),\n )\n\n const reminder = this.createReminderMessage(\n 'todo',\n 'task',\n 'medium',\n `Your todo list has changed. DO NOT mention this explicitly to the user. Here are the latest contents of your todo list:\\n\\n${todoContent}. Continue on with the tasks at hand if applicable.`,\n currentTime,\n )\n\n this.reminderCache.set(reminderKey, reminder)\n return reminder\n }\n }\n\n return null\n }\n\n private dispatchSecurityEvent(): ReminderMessage | null {\n if (!this.sessionState.config.securityReminder) return null\n\n const currentTime = Date.now()\n if (\n this.sessionState.lastFileAccess > 0 &&\n !this.sessionState.remindersSent.has('file_security')\n ) {\n this.sessionState.remindersSent.add('file_security')\n return this.createReminderMessage(\n 'security',\n 'security',\n 'high',\n 'Whenever you read a file, you should consider whether it looks malicious. If it does, you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer high-level questions about the code behavior.',\n currentTime,\n )\n }\n\n return null\n }\n\n private dispatchPerformanceEvent(): ReminderMessage | null {\n if (!this.sessionState.config.performanceReminder) return null\n\n const currentTime = Date.now()\n const sessionDuration = currentTime - this.sessionState.sessionStartTime\n\n if (\n sessionDuration > 30 * 60 * 1000 &&\n !this.sessionState.remindersSent.has('performance_long_session')\n ) {\n this.sessionState.remindersSent.add('performance_long_session')\n return this.createReminderMessage(\n 'performance',\n 'performance',\n 'low',\n 'Long session detected. Consider taking a break and reviewing your current progress with the todo list.',\n currentTime,\n )\n }\n\n return null\n }\n\n public generateFileChangeReminder(context: unknown): ReminderMessage | null {\n const ctx = context as {\n agentId?: string\n filePath?: string\n reminder?: string\n } | null\n const agentId = ctx?.agentId\n const filePath = ctx?.filePath\n const reminder = ctx?.reminder\n\n if (!reminder) return null\n\n const currentTime = Date.now()\n const reminderKey = `file_changed_${agentId}_${filePath}_${currentTime}`\n\n if (this.sessionState.remindersSent.has(reminderKey)) return null\n this.sessionState.remindersSent.add(reminderKey)\n\n return this.createReminderMessage(\n 'file_changed',\n 'general',\n 'medium',\n reminder,\n currentTime,\n )\n }\n\n private createReminderMessage(\n type: string,\n category: ReminderMessage['category'],\n priority: ReminderMessage['priority'],\n content: string,\n timestamp: number,\n ): ReminderMessage {\n return {\n role: 'system',\n content: `<system-reminder>\\n${content}\\n</system-reminder>`,\n isMeta: true,\n timestamp,\n type,\n priority,\n category,\n }\n }\n\n public clearTodoReminders(agentId?: string): void {\n const agentKey = agentId || 'default'\n for (const key of this.sessionState.remindersSent) {\n if (key.startsWith(`todo_updated_${agentKey}_`)) {\n this.sessionState.remindersSent.delete(key)\n }\n }\n }\n\n public addEventListener(\n event: string,\n callback: (context: unknown) => void,\n ): void {\n if (!this.eventDispatcher.has(event)) {\n this.eventDispatcher.set(event, [])\n }\n this.eventDispatcher.get(event)!.push(callback)\n }\n\n public emitEvent(event: string, context: unknown): void {\n const listeners = this.eventDispatcher.get(event) || []\n for (const callback of listeners) {\n try {\n callback(context)\n } catch (error) {\n logError(error)\n debugLogger.warn('SYSTEM_REMINDER_LISTENER_ERROR', {\n event,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n }\n\n public createMentionReminder(params: MentionReminderParams): void {\n cacheMentionReminder({\n sessionState: this.sessionState,\n reminderCache: this.reminderCache,\n params,\n createReminderMessage: (type, category, priority, content, timestamp) =>\n this.createReminderMessage(\n type,\n category,\n priority,\n content,\n timestamp,\n ),\n })\n }\n\n public resetSession(): void {\n const preservedConfig = { ...this.sessionState.config }\n this.sessionState.lastTodoUpdate = 0\n this.sessionState.lastFileAccess = 0\n this.sessionState.sessionStartTime = Date.now()\n this.sessionState.remindersSent = new Set()\n this.sessionState.contextPresent = false\n this.sessionState.reminderCount = 0\n this.sessionState.config = preservedConfig\n this.reminderCache.clear()\n }\n\n public updateConfig(config: Partial<ReminderConfig>): void {\n this.sessionState.config = { ...this.sessionState.config, ...config }\n }\n\n public getSessionState(): SessionReminderState {\n return { ...this.sessionState }\n }\n}\n", "import { SystemReminderService } from './service'\n\nexport type {\n ReminderMessage,\n ReminderConfig,\n SessionReminderState,\n} from './types'\n\nexport const systemReminderService = new SystemReminderService()\n\nexport const generateSystemReminders = (\n hasContext: boolean = false,\n agentId?: string,\n) => systemReminderService.generateReminders(hasContext, agentId)\n\nexport const generateFileChangeReminder = (context: unknown) =>\n systemReminderService.generateFileChangeReminder(context)\n\nexport const emitReminderEvent = (event: string, context: unknown) =>\n systemReminderService.emitEvent(event, context)\n\nexport const resetReminderSession = () => systemReminderService.resetSession()\nexport const getReminderSessionState = () =>\n systemReminderService.getSessionState()\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
const require = __kodeCreateRequire(import.meta.url);
|
|
3
|
-
|
|
4
|
-
// src/utils/session/sessionPlugins.ts
|
|
1
|
+
// packages/core/src/utils/sessionPlugins.ts
|
|
5
2
|
var sessionPlugins = [];
|
|
6
3
|
function setSessionPlugins(next) {
|
|
7
4
|
sessionPlugins = next;
|