@shareai-lab/kode 2.1.0 → 2.1.2
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/dist/chunks/{Doctor-AES5ON33.js → Doctor-TWRIVOVW.js} +13 -13
- package/dist/chunks/{LogList-PQJEJHHE.js → LogList-PUTPM24L.js} +10 -10
- package/dist/chunks/REPL-YGIR5VXC.js +78 -0
- package/dist/chunks/{ResumeConversation-OWQ3DB4M.js → ResumeConversation-IJMKQXBU.js} +44 -44
- package/dist/chunks/{ScreenFrame-AGLR6B4D.js → ScreenFrame-PQJRZ5DQ.js} +2 -2
- package/dist/chunks/{agentLoader-BMWB4UKI.js → agentLoader-GOYNJTAO.js} +5 -5
- package/dist/chunks/{agentsValidate-LSMJSFYW.js → agentsValidate-R26AKPAA.js} +6 -6
- package/dist/chunks/{ask-3TSZR6AJ.js → ask-6SYVJONJ.js} +18 -18
- package/dist/chunks/{autoUpdater-MEPC7LJF.js → autoUpdater-SDLJ5QSH.js} +4 -4
- package/dist/chunks/{chunk-NC3RX5AB.js → chunk-2B2TR2S3.js} +4 -4
- package/dist/chunks/{chunk-HDEYMVIJ.js → chunk-437YGKVA.js} +2 -2
- package/dist/chunks/{chunk-WGMKKKS2.js → chunk-4BBWDSDC.js} +1 -1
- package/dist/chunks/{chunk-KKOES3YK.js → chunk-4T5LR4P5.js} +55 -116
- package/dist/chunks/chunk-4T5LR4P5.js.map +7 -0
- package/dist/chunks/{chunk-PMC3BZ3M.js → chunk-5HZWM4JB.js} +1 -1
- package/dist/chunks/{chunk-REQTXUXO.js → chunk-5LBRVQT5.js} +1 -1
- package/dist/chunks/{chunk-BEDQTC44.js → chunk-5LL33G6X.js} +2 -2
- package/dist/chunks/{chunk-YUXYJB45.js → chunk-5RCVEFJS.js} +19 -8
- package/dist/chunks/chunk-5RCVEFJS.js.map +7 -0
- package/dist/chunks/{chunk-MDCOIZVX.js → chunk-6C6VNA2D.js} +2 -2
- package/dist/chunks/{chunk-P77NF36M.js → chunk-6CAQXUDY.js} +1 -1
- package/dist/chunks/{chunk-DPQE5NA4.js → chunk-7SRIFZDJ.js} +1 -1
- package/dist/chunks/{chunk-TI2CTTMA.js → chunk-7ZC22R33.js} +1 -1
- package/dist/chunks/{chunk-EV56PDOI.js → chunk-AX3VXMUS.js} +1 -1
- package/dist/chunks/{chunk-5MVUCX6O.js → chunk-AZHJLRRP.js} +1 -1
- package/dist/chunks/{chunk-LIBZWJEW.js → chunk-BNSPVA24.js} +11 -10
- package/dist/chunks/chunk-BNSPVA24.js.map +7 -0
- package/dist/chunks/{chunk-Z3J3WJ2K.js → chunk-BPMYW5DT.js} +415 -414
- package/dist/chunks/chunk-BPMYW5DT.js.map +7 -0
- package/dist/chunks/{chunk-QBW7VU7C.js → chunk-DWKF6SQH.js} +3 -3
- package/dist/chunks/{chunk-4RVYYLN7.js → chunk-E4C4N7OV.js} +1 -1
- package/dist/chunks/{chunk-4RVYYLN7.js.map → chunk-E4C4N7OV.js.map} +1 -1
- package/dist/chunks/chunk-ESRGV7DC.js +34 -0
- package/dist/chunks/chunk-ESRGV7DC.js.map +7 -0
- package/dist/chunks/{chunk-VSKGDU73.js → chunk-FKWFR23G.js} +2 -2
- package/dist/chunks/{chunk-E6BU32L2.js → chunk-H5F7M5D3.js} +2 -2
- package/dist/chunks/{chunk-DZPD6H7A.js → chunk-JXYXMP2Q.js} +2 -2
- package/dist/chunks/{chunk-65FLXXMH.js → chunk-KA543BHH.js} +8 -8
- package/dist/chunks/{chunk-MEQ7TAT7.js → chunk-KHMXPPO7.js} +4 -4
- package/dist/chunks/{chunk-G5ET7GFB.js → chunk-KQV5FGSS.js} +5 -5
- package/dist/chunks/{chunk-DPVCHIF7.js → chunk-KRBZO255.js} +1 -1
- package/dist/chunks/{chunk-Y33AS3MY.js → chunk-L2LWCVUF.js} +21 -7
- package/dist/chunks/chunk-L2LWCVUF.js.map +7 -0
- package/dist/chunks/{chunk-EKXQ7ZWV.js → chunk-L5ZJIOEF.js} +4 -4
- package/dist/chunks/{chunk-UUJN5ZCN.js → chunk-LBHVWSUP.js} +2 -2
- package/dist/chunks/{chunk-GL6HUBBX.js → chunk-LKDMUCWA.js} +6 -6
- package/dist/chunks/{chunk-HJCYE2AS.js → chunk-LUZMHHQF.js} +10 -10
- package/dist/chunks/{chunk-MXFN7OSL.js → chunk-MOGUUWKG.js} +1 -1
- package/dist/chunks/{chunk-4UDKRYWZ.js → chunk-N4772IDQ.js} +3 -3
- package/dist/chunks/{chunk-TJMA65RL.js → chunk-N5AH66UG.js} +168 -23
- package/dist/chunks/chunk-N5AH66UG.js.map +7 -0
- package/dist/chunks/{chunk-JJ67KF6A.js → chunk-PTIAF6KF.js} +4 -4
- package/dist/chunks/{chunk-YUJB4WDK.js → chunk-PVMCLI36.js} +1 -1
- package/dist/chunks/{chunk-3TLVYEGW.js → chunk-RTGKCKD3.js} +1 -1
- package/dist/chunks/{chunk-AKC4BUW5.js → chunk-SOBWNYOW.js} +7 -6
- package/dist/chunks/chunk-SOBWNYOW.js.map +7 -0
- package/dist/chunks/{chunk-3DBNJOZI.js → chunk-SUNG5KP5.js} +1 -1
- package/dist/chunks/{chunk-VBGSHKHX.js → chunk-SVRXO73D.js} +16 -13
- package/dist/chunks/chunk-SVRXO73D.js.map +7 -0
- package/dist/chunks/{chunk-Q55CB4Y4.js → chunk-WE7CQGRG.js} +2 -2
- package/dist/chunks/{chunk-V3IXG64X.js → chunk-WOMV4RCI.js} +404 -446
- package/dist/chunks/chunk-WOMV4RCI.js.map +7 -0
- package/dist/chunks/{chunk-ZAT5BSQI.js → chunk-WVJMXIKQ.js} +12 -12
- package/dist/chunks/{chunk-ZAT5BSQI.js.map → chunk-WVJMXIKQ.js.map} +1 -1
- package/dist/chunks/{chunk-DELUVYKS.js → chunk-XVNEJVZC.js} +2 -2
- package/dist/chunks/{chunk-KDY7XYYS.js → chunk-YQ3YJSMI.js} +1 -1
- package/dist/chunks/{chunk-6CNJ3CYQ.js → chunk-YUZBVKVH.js} +3 -3
- package/dist/chunks/{chunk-VJ2QSQ3E.js → chunk-ZXOTOID7.js} +2 -2
- package/dist/chunks/{client-OWTJ7TPE.js → client-QUCHWMEW.js} +5 -5
- package/dist/chunks/{customCommands-FA6HRXXV.js → customCommands-S6YGRUED.js} +5 -5
- package/dist/chunks/{engine-UBCAVO7E.js → engine-FRDEQVDF.js} +17 -17
- package/dist/chunks/{env-JIMGBRE2.js → env-YH77MILU.js} +3 -3
- package/dist/chunks/{kodeAgentSessionLoad-BZRTCPMB.js → kodeAgentSessionLoad-TBPU4TWU.js} +3 -3
- package/dist/chunks/{kodeAgentSessionResume-V3WB3OWQ.js → kodeAgentSessionResume-3CNE5T6N.js} +3 -3
- package/dist/chunks/{kodeHooks-R3YHG4ZI.js → kodeHooks-6SWQE5W7.js} +4 -4
- package/dist/chunks/{llm-C4F2Q7I2.js → llm-PONI6QWH.js} +47 -20
- package/dist/chunks/llm-PONI6QWH.js.map +7 -0
- package/dist/chunks/{llmLazy-IBED5LIH.js → llmLazy-O4T62IIT.js} +1 -1
- package/dist/chunks/{mcpCli-A744Z3FL.js → mcpCli-HIA4I4GG.js} +5 -5
- package/dist/chunks/{mentionProcessor-VV6DN2LJ.js → mentionProcessor-HH4EF7BE.js} +6 -6
- package/dist/chunks/{messages-ZR64JVON.js → messages-WKWCZBGM.js} +1 -1
- package/dist/chunks/{model-NPMMYL2U.js → model-4EIFU5QN.js} +5 -5
- package/dist/chunks/{openai-FEBNBOGM.js → openai-KTBJ2KNZ.js} +5 -5
- package/dist/chunks/{permissions-34CRWMCH.js → permissions-C3N4DKS2.js} +7 -7
- package/dist/chunks/{pluginRuntime-7YBUMVFI.js → pluginRuntime-2FKZLVA5.js} +3 -3
- package/dist/chunks/{pluginValidation-NZ4LOT3Q.js → pluginValidation-X5NZZCFA.js} +7 -7
- package/dist/chunks/registry-3UVW32YF.js +68 -0
- package/dist/chunks/{responsesStreaming-JNGE2P3D.js → responsesStreaming-LB4THIUM.js} +2 -2
- package/dist/chunks/{ripgrep-KGHLK4RO.js → ripgrep-N7O6M4IE.js} +4 -4
- package/dist/chunks/{runNonTextPrintMode-U3TKEYYN.js → runNonTextPrintMode-YFWCUTWZ.js} +12 -12
- package/dist/chunks/server-3CICV7EL.js +59 -0
- package/dist/chunks/server-FRP7OT4H.js +61 -0
- package/dist/chunks/{skillMarketplace-PPPUBC4N.js → skillMarketplace-4Y2H4JFK.js} +4 -4
- package/dist/chunks/{src-TVS6YABL.js → src-IETAWKYR.js} +30 -30
- package/dist/chunks/{src-QST7UD2A.js → src-OB2HE3RX.js} +27 -27
- package/dist/chunks/{src-DB7GKD4L.js → src-Y2IM2VKU.js} +78 -78
- package/dist/chunks/{thinking-O7LIIMFW.js → thinking-XG3FB4HO.js} +6 -6
- package/dist/chunks/{toolPermissionContext-UWGATCUZ.js → toolPermissionContext-RFYFDINH.js} +1 -1
- package/dist/chunks/{toolPermissionSettings-WD7CB37T.js → toolPermissionSettings-EEFURGBO.js} +5 -5
- package/dist/chunks/{useScreenLayout-PKLCMNZD.js → useScreenLayout-OUGQRR4I.js} +2 -2
- package/dist/chunks/{webOnlyMode-GJ6PQCPU.js → webOnlyMode-FRQBIAXG.js} +1 -1
- package/dist/entrypoints/cli.js +1 -1
- package/dist/entrypoints/daemon.js +1 -1
- package/dist/entrypoints/mcp.js +28 -28
- package/dist/index.js +5 -5
- package/dist/sdk/core.cjs +93 -34
- package/dist/sdk/core.cjs.map +3 -3
- package/dist/sdk/core.js +96 -37
- package/dist/sdk/core.js.map +4 -4
- package/dist/sdk/tools.cjs +1787 -1748
- package/dist/sdk/tools.cjs.map +4 -4
- package/dist/sdk/tools.js +1611 -1572
- package/dist/sdk/tools.js.map +4 -4
- package/package.json +1 -1
- package/dist/chunks/REPL-KD7YOSI5.js +0 -78
- package/dist/chunks/chunk-AKC4BUW5.js.map +0 -7
- package/dist/chunks/chunk-KKOES3YK.js.map +0 -7
- package/dist/chunks/chunk-LIBZWJEW.js.map +0 -7
- package/dist/chunks/chunk-LOCXPQNJ.js +0 -20
- package/dist/chunks/chunk-LOCXPQNJ.js.map +0 -7
- package/dist/chunks/chunk-TJMA65RL.js.map +0 -7
- package/dist/chunks/chunk-V3IXG64X.js.map +0 -7
- package/dist/chunks/chunk-VBGSHKHX.js.map +0 -7
- package/dist/chunks/chunk-Y33AS3MY.js.map +0 -7
- package/dist/chunks/chunk-YUXYJB45.js.map +0 -7
- package/dist/chunks/chunk-Z3J3WJ2K.js.map +0 -7
- package/dist/chunks/llm-C4F2Q7I2.js.map +0 -7
- package/dist/chunks/registry-FHPZ36EO.js +0 -68
- package/dist/chunks/server-Y42VR6YJ.js +0 -59
- package/dist/chunks/server-ZSC5G3TU.js +0 -61
- /package/dist/chunks/{Doctor-AES5ON33.js.map → Doctor-TWRIVOVW.js.map} +0 -0
- /package/dist/chunks/{LogList-PQJEJHHE.js.map → LogList-PUTPM24L.js.map} +0 -0
- /package/dist/chunks/{REPL-KD7YOSI5.js.map → REPL-YGIR5VXC.js.map} +0 -0
- /package/dist/chunks/{ResumeConversation-OWQ3DB4M.js.map → ResumeConversation-IJMKQXBU.js.map} +0 -0
- /package/dist/chunks/{ScreenFrame-AGLR6B4D.js.map → ScreenFrame-PQJRZ5DQ.js.map} +0 -0
- /package/dist/chunks/{agentLoader-BMWB4UKI.js.map → agentLoader-GOYNJTAO.js.map} +0 -0
- /package/dist/chunks/{agentsValidate-LSMJSFYW.js.map → agentsValidate-R26AKPAA.js.map} +0 -0
- /package/dist/chunks/{ask-3TSZR6AJ.js.map → ask-6SYVJONJ.js.map} +0 -0
- /package/dist/chunks/{autoUpdater-MEPC7LJF.js.map → autoUpdater-SDLJ5QSH.js.map} +0 -0
- /package/dist/chunks/{chunk-NC3RX5AB.js.map → chunk-2B2TR2S3.js.map} +0 -0
- /package/dist/chunks/{chunk-HDEYMVIJ.js.map → chunk-437YGKVA.js.map} +0 -0
- /package/dist/chunks/{chunk-WGMKKKS2.js.map → chunk-4BBWDSDC.js.map} +0 -0
- /package/dist/chunks/{chunk-PMC3BZ3M.js.map → chunk-5HZWM4JB.js.map} +0 -0
- /package/dist/chunks/{chunk-REQTXUXO.js.map → chunk-5LBRVQT5.js.map} +0 -0
- /package/dist/chunks/{chunk-BEDQTC44.js.map → chunk-5LL33G6X.js.map} +0 -0
- /package/dist/chunks/{chunk-MDCOIZVX.js.map → chunk-6C6VNA2D.js.map} +0 -0
- /package/dist/chunks/{chunk-P77NF36M.js.map → chunk-6CAQXUDY.js.map} +0 -0
- /package/dist/chunks/{chunk-DPQE5NA4.js.map → chunk-7SRIFZDJ.js.map} +0 -0
- /package/dist/chunks/{chunk-TI2CTTMA.js.map → chunk-7ZC22R33.js.map} +0 -0
- /package/dist/chunks/{chunk-EV56PDOI.js.map → chunk-AX3VXMUS.js.map} +0 -0
- /package/dist/chunks/{chunk-5MVUCX6O.js.map → chunk-AZHJLRRP.js.map} +0 -0
- /package/dist/chunks/{chunk-QBW7VU7C.js.map → chunk-DWKF6SQH.js.map} +0 -0
- /package/dist/chunks/{chunk-VSKGDU73.js.map → chunk-FKWFR23G.js.map} +0 -0
- /package/dist/chunks/{chunk-E6BU32L2.js.map → chunk-H5F7M5D3.js.map} +0 -0
- /package/dist/chunks/{chunk-DZPD6H7A.js.map → chunk-JXYXMP2Q.js.map} +0 -0
- /package/dist/chunks/{chunk-65FLXXMH.js.map → chunk-KA543BHH.js.map} +0 -0
- /package/dist/chunks/{chunk-MEQ7TAT7.js.map → chunk-KHMXPPO7.js.map} +0 -0
- /package/dist/chunks/{chunk-G5ET7GFB.js.map → chunk-KQV5FGSS.js.map} +0 -0
- /package/dist/chunks/{chunk-DPVCHIF7.js.map → chunk-KRBZO255.js.map} +0 -0
- /package/dist/chunks/{chunk-EKXQ7ZWV.js.map → chunk-L5ZJIOEF.js.map} +0 -0
- /package/dist/chunks/{chunk-UUJN5ZCN.js.map → chunk-LBHVWSUP.js.map} +0 -0
- /package/dist/chunks/{chunk-GL6HUBBX.js.map → chunk-LKDMUCWA.js.map} +0 -0
- /package/dist/chunks/{chunk-HJCYE2AS.js.map → chunk-LUZMHHQF.js.map} +0 -0
- /package/dist/chunks/{chunk-MXFN7OSL.js.map → chunk-MOGUUWKG.js.map} +0 -0
- /package/dist/chunks/{chunk-4UDKRYWZ.js.map → chunk-N4772IDQ.js.map} +0 -0
- /package/dist/chunks/{chunk-JJ67KF6A.js.map → chunk-PTIAF6KF.js.map} +0 -0
- /package/dist/chunks/{chunk-YUJB4WDK.js.map → chunk-PVMCLI36.js.map} +0 -0
- /package/dist/chunks/{chunk-3TLVYEGW.js.map → chunk-RTGKCKD3.js.map} +0 -0
- /package/dist/chunks/{chunk-3DBNJOZI.js.map → chunk-SUNG5KP5.js.map} +0 -0
- /package/dist/chunks/{chunk-Q55CB4Y4.js.map → chunk-WE7CQGRG.js.map} +0 -0
- /package/dist/chunks/{chunk-DELUVYKS.js.map → chunk-XVNEJVZC.js.map} +0 -0
- /package/dist/chunks/{chunk-KDY7XYYS.js.map → chunk-YQ3YJSMI.js.map} +0 -0
- /package/dist/chunks/{chunk-6CNJ3CYQ.js.map → chunk-YUZBVKVH.js.map} +0 -0
- /package/dist/chunks/{chunk-VJ2QSQ3E.js.map → chunk-ZXOTOID7.js.map} +0 -0
- /package/dist/chunks/{client-OWTJ7TPE.js.map → client-QUCHWMEW.js.map} +0 -0
- /package/dist/chunks/{customCommands-FA6HRXXV.js.map → customCommands-S6YGRUED.js.map} +0 -0
- /package/dist/chunks/{engine-UBCAVO7E.js.map → engine-FRDEQVDF.js.map} +0 -0
- /package/dist/chunks/{env-JIMGBRE2.js.map → env-YH77MILU.js.map} +0 -0
- /package/dist/chunks/{kodeAgentSessionLoad-BZRTCPMB.js.map → kodeAgentSessionLoad-TBPU4TWU.js.map} +0 -0
- /package/dist/chunks/{kodeAgentSessionResume-V3WB3OWQ.js.map → kodeAgentSessionResume-3CNE5T6N.js.map} +0 -0
- /package/dist/chunks/{kodeHooks-R3YHG4ZI.js.map → kodeHooks-6SWQE5W7.js.map} +0 -0
- /package/dist/chunks/{llmLazy-IBED5LIH.js.map → llmLazy-O4T62IIT.js.map} +0 -0
- /package/dist/chunks/{mcpCli-A744Z3FL.js.map → mcpCli-HIA4I4GG.js.map} +0 -0
- /package/dist/chunks/{mentionProcessor-VV6DN2LJ.js.map → mentionProcessor-HH4EF7BE.js.map} +0 -0
- /package/dist/chunks/{messages-ZR64JVON.js.map → messages-WKWCZBGM.js.map} +0 -0
- /package/dist/chunks/{model-NPMMYL2U.js.map → model-4EIFU5QN.js.map} +0 -0
- /package/dist/chunks/{openai-FEBNBOGM.js.map → openai-KTBJ2KNZ.js.map} +0 -0
- /package/dist/chunks/{permissions-34CRWMCH.js.map → permissions-C3N4DKS2.js.map} +0 -0
- /package/dist/chunks/{pluginRuntime-7YBUMVFI.js.map → pluginRuntime-2FKZLVA5.js.map} +0 -0
- /package/dist/chunks/{pluginValidation-NZ4LOT3Q.js.map → pluginValidation-X5NZZCFA.js.map} +0 -0
- /package/dist/chunks/{registry-FHPZ36EO.js.map → registry-3UVW32YF.js.map} +0 -0
- /package/dist/chunks/{responsesStreaming-JNGE2P3D.js.map → responsesStreaming-LB4THIUM.js.map} +0 -0
- /package/dist/chunks/{ripgrep-KGHLK4RO.js.map → ripgrep-N7O6M4IE.js.map} +0 -0
- /package/dist/chunks/{runNonTextPrintMode-U3TKEYYN.js.map → runNonTextPrintMode-YFWCUTWZ.js.map} +0 -0
- /package/dist/chunks/{server-Y42VR6YJ.js.map → server-3CICV7EL.js.map} +0 -0
- /package/dist/chunks/{server-ZSC5G3TU.js.map → server-FRP7OT4H.js.map} +0 -0
- /package/dist/chunks/{skillMarketplace-PPPUBC4N.js.map → skillMarketplace-4Y2H4JFK.js.map} +0 -0
- /package/dist/chunks/{src-TVS6YABL.js.map → src-IETAWKYR.js.map} +0 -0
- /package/dist/chunks/{src-QST7UD2A.js.map → src-OB2HE3RX.js.map} +0 -0
- /package/dist/chunks/{src-DB7GKD4L.js.map → src-Y2IM2VKU.js.map} +0 -0
- /package/dist/chunks/{thinking-O7LIIMFW.js.map → thinking-XG3FB4HO.js.map} +0 -0
- /package/dist/chunks/{toolPermissionContext-UWGATCUZ.js.map → toolPermissionContext-RFYFDINH.js.map} +0 -0
- /package/dist/chunks/{toolPermissionSettings-WD7CB37T.js.map → toolPermissionSettings-EEFURGBO.js.map} +0 -0
- /package/dist/chunks/{useScreenLayout-PKLCMNZD.js.map → useScreenLayout-OUGQRR4I.js.map} +0 -0
- /package/dist/chunks/{webOnlyMode-GJ6PQCPU.js.map → webOnlyMode-FRQBIAXG.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../packages/core/src/utils/tokens.ts", "../../packages/core/src/utils/fileRecoveryCore.ts", "../../packages/core/src/utils/autoCompactThreshold.ts", "../../packages/core/src/utils/autoCompactCore.ts", "../../packages/core/src/feedback/binaryFeedback.ts", "../../packages/core/src/engine/query-executor.ts", "../../packages/core/src/utils/toolNameAliases.ts", "../../packages/core/src/utils/toolResultPersistence.ts", "../../packages/core/src/engine/pipeline/tool-input.ts", "../../packages/core/src/engine/pipeline/tool-call.ts", "../../packages/core/src/engine/pipeline/tool-use.ts", "../../packages/core/src/engine/pipeline/tool-use-queue.ts", "../../packages/core/src/engine/pipeline/types.ts", "../../packages/core/src/query/agentEvents.ts", "../../packages/core/src/engine/message-pipeline.ts", "../../packages/core/src/engine/orchestrator.ts"],
|
|
4
|
-
"sourcesContent": ["import { Message } from '#core/query'\nimport { SYNTHETIC_ASSISTANT_MESSAGES } from './messages'\n\nexport function countTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (\n message?.type === 'assistant' &&\n 'usage' in message.message &&\n !(\n message.message.content[0]?.type === 'text' &&\n SYNTHETIC_ASSISTANT_MESSAGES.has(message.message.content[0].text)\n )\n ) {\n const { usage } = message.message\n return (\n usage.input_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0) +\n usage.output_tokens\n )\n }\n i--\n }\n return 0\n}\n\nexport function countCachedTokens(messages: Message[]): number {\n let i = messages.length - 1\n while (i >= 0) {\n const message = messages[i]\n if (message?.type === 'assistant' && 'usage' in message.message) {\n const { usage } = message.message\n return (\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0)\n )\n }\n i--\n }\n return 0\n}\n", "import { readTextContent } from './file'\nimport { fileFreshnessService } from '#core/services/fileFreshness'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\n\n/**\n * File recovery configuration for auto-compact feature\n * These limits ensure recovered files don't overwhelm the compressed context\n */\nconst MAX_FILES_TO_RECOVER = 5\nconst MAX_TOKENS_PER_FILE = 10_000\nconst MAX_TOTAL_FILE_TOKENS = 50_000\n\n/**\n * Selects and reads recently accessed files for context recovery\n *\n * During auto-compact, this function preserves development context by:\n * - Selecting files based on recent access patterns\n * - Enforcing token budgets to prevent context bloat\n * - Truncating large files while preserving essential content\n *\n * @returns Array of file data with content, token counts, and truncation flags\n */\nexport async function selectAndReadFiles(): Promise<\n Array<{\n path: string\n content: string\n tokens: number\n truncated: boolean\n }>\n> {\n const importantFiles =\n fileFreshnessService.getImportantFiles(MAX_FILES_TO_RECOVER)\n const results = []\n let totalTokens = 0\n\n for (const fileInfo of importantFiles) {\n try {\n const { content } = readTextContent(fileInfo.path)\n const estimatedTokens = Math.ceil(content.length * 0.25)\n\n // Apply per-file token limit to prevent any single file from dominating context\n let finalContent = content\n let truncated = false\n\n if (estimatedTokens > MAX_TOKENS_PER_FILE) {\n const maxChars = Math.floor(MAX_TOKENS_PER_FILE / 0.25)\n finalContent = content.substring(0, maxChars)\n truncated = true\n }\n\n const finalTokens = Math.min(estimatedTokens, MAX_TOKENS_PER_FILE)\n\n // Enforce total token budget to maintain auto-compact effectiveness\n if (totalTokens + finalTokens > MAX_TOTAL_FILE_TOKENS) {\n break\n }\n\n totalTokens += finalTokens\n results.push({\n path: fileInfo.path,\n content: finalContent,\n tokens: finalTokens,\n truncated,\n })\n } catch (error) {\n // Skip files that cannot be read, don't let one failure stop the process\n logError(error)\n debugLogger.warn('FILE_RECOVERY_READ_FAILED', {\n path: fileInfo.path,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n return results\n}\n", "/**\n * Auto-compact triggers when token usage reaches this ratio of the context window.\n * Default: 90% of the context window.\n */\nexport const AUTO_COMPACT_THRESHOLD_RATIO = 0.9\n\nexport function calculateAutoCompactThresholds(\n tokenCount: number,\n contextLimit: number,\n ratio: number = AUTO_COMPACT_THRESHOLD_RATIO,\n): {\n isAboveAutoCompactThreshold: boolean\n percentUsed: number\n tokensRemaining: number\n contextLimit: number\n autoCompactThreshold: number\n ratio: number\n} {\n const safeContextLimit =\n Number.isFinite(contextLimit) && contextLimit > 0 ? contextLimit : 1\n const autoCompactThreshold = safeContextLimit * ratio\n\n return {\n isAboveAutoCompactThreshold: tokenCount >= autoCompactThreshold,\n percentUsed: Math.round((tokenCount / safeContextLimit) * 100),\n tokensRemaining: Math.max(0, autoCompactThreshold - tokenCount),\n contextLimit: safeContextLimit,\n autoCompactThreshold,\n ratio,\n }\n}\n", "import { Message } from '#core/query'\nimport { countTokens } from './tokens'\nimport { getMessagesSetter } from '#core/messages'\nimport { getContext } from '#core/context'\nimport { getCodeStyle } from '#core/utils/style'\nimport { resetFileFreshnessSession } from '#core/services/fileFreshness'\nimport {\n createUserMessage,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { selectAndReadFiles } from './fileRecoveryCore'\nimport { addLineNumbers } from './file'\nimport { getModelManager } from './model'\nimport { debug as debugLogger } from '#core/utils/debugLogger'\nimport { logError } from '#core/utils/log'\nimport {\n AUTO_COMPACT_THRESHOLD_RATIO,\n calculateAutoCompactThresholds,\n} from './autoCompactThreshold'\nimport {\n appendSessionJsonlFromMessage,\n appendSessionSummaryRecord,\n} from '#protocol/utils/kodeAgentSessionLog'\nimport { getCwd } from '#core/utils/state'\n\n/**\n * Retrieves the context length for the current main conversation model.\n */\nasync function getMainConversationContextLimit(): Promise<number> {\n try {\n const modelManager = getModelManager()\n const resolution = modelManager.resolveModelWithInfo('main')\n const modelProfile = resolution.success ? resolution.profile : null\n\n if (modelProfile?.contextLength) {\n return modelProfile.contextLength\n }\n\n // Fallback to a reasonable default\n return 200_000\n } catch (error) {\n return 200_000\n }\n}\n\nconst COMPRESSION_PROMPT = `Please provide a comprehensive summary of our conversation structured as follows:\n\n## Technical Context\nDevelopment environment, tools, frameworks, and configurations in use. Programming languages, libraries, and technical constraints. File structure, directory organization, and project architecture.\n\n## Project Overview \nMain project goals, features, and scope. Key components, modules, and their relationships. Data models, APIs, and integration patterns.\n\n## Code Changes\nFiles created, modified, or analyzed during our conversation. Specific code implementations, functions, and algorithms added. Configuration changes and structural modifications.\n\n## Debugging & Issues\nProblems encountered and their root causes. Solutions implemented and their effectiveness. Error messages, logs, and diagnostic information.\n\n## Current Status\nWhat we just completed successfully. Current state of the codebase and any ongoing work. Test results, validation steps, and verification performed.\n\n## Pending Tasks\nImmediate next steps and priorities. Planned features, improvements, and refactoring. Known issues, technical debt, and areas needing attention.\n\n## User Preferences\nCoding style, formatting, and organizational preferences. Communication patterns and feedback style. Tool choices and workflow preferences.\n\n## Key Decisions\nImportant technical decisions made and their rationale. Alternative approaches considered and why they were rejected. Trade-offs accepted and their implications.\n\nFocus on information essential for continuing the conversation effectively, including specific details about code, files, errors, and plans.`\n\n/**\n * Calculates context usage thresholds based on the main model's capabilities\n * Uses the main model context length since compression tasks require a capable model\n */\nasync function calculateThresholds(tokenCount: number) {\n const contextLimit = await getMainConversationContextLimit()\n return calculateAutoCompactThresholds(\n tokenCount,\n contextLimit,\n AUTO_COMPACT_THRESHOLD_RATIO,\n )\n}\n\n/**\n * Determines if auto-compact should trigger based on token usage\n * Uses the main model context limit since compression requires a capable model\n */\nasync function shouldAutoCompact(messages: Message[]): Promise<boolean> {\n if (messages.length < 3) return false\n\n const tokenCount = countTokens(messages)\n const { isAboveAutoCompactThreshold } = await calculateThresholds(tokenCount)\n\n return isAboveAutoCompactThreshold\n}\n\n/**\n * Main entry point for automatic context compression\n *\n * This function is called before each query to check if the conversation\n * has grown too large and needs compression. When triggered, it:\n * - Generates a structured summary of the conversation using the main model\n * - Recovers recently accessed files to maintain development context\n * - Resets conversation state while preserving essential information\n *\n * Uses the main model for compression tasks to ensure high-quality summaries\n *\n * @param messages Current conversation messages\n * @param toolUseContext Execution context with model and tool configuration\n * @returns Updated messages (compressed if needed) and compression status\n */\nexport async function checkAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<{ messages: Message[]; wasCompacted: boolean }> {\n if (!(await shouldAutoCompact(messages))) {\n return { messages, wasCompacted: false }\n }\n\n try {\n const pendingUserMessage =\n messages.length > 0 && messages[messages.length - 1]?.type === 'user'\n ? (messages[messages.length - 1] ?? null)\n : null\n const history = pendingUserMessage ? messages.slice(0, -1) : messages\n\n const compactedHistory = await executeAutoCompact(history, toolUseContext)\n const compactedMessages = pendingUserMessage\n ? [...compactedHistory, pendingUserMessage]\n : compactedHistory\n\n // Replace the visible transcript in interactive mode so the user sees the\n // new compressed context (and we keep the pending prompt intact).\n getMessagesSetter()?.(compactedMessages)\n\n return {\n messages: compactedMessages,\n wasCompacted: true,\n }\n } catch (error) {\n // Graceful degradation: if auto-compact fails, continue with original messages\n // This ensures system remains functional even if compression encounters issues\n logError(error)\n debugLogger.warn('AUTO_COMPACT_FAILED', {\n error: error instanceof Error ? error.message : String(error),\n })\n return { messages, wasCompacted: false }\n }\n}\n\n/**\n * Executes the conversation compression process using the main model\n *\n * This function generates a comprehensive summary using the main model\n * which is better suited for complex summarization tasks. It also\n * automatically recovers important files to maintain development context.\n */\nasync function executeAutoCompact(\n messages: Message[],\n toolUseContext: any,\n): Promise<Message[]> {\n const summaryRequest = createUserMessage(COMPRESSION_PROMPT)\n\n const tokenCount = countTokens(messages)\n const modelManager = getModelManager()\n const compactResolution = modelManager.resolveModelWithInfo('compact')\n const mainResolution = modelManager.resolveModelWithInfo('main')\n\n let compressionModelPointer: 'compact' | 'main' = 'compact'\n let compressionNotice: string | null = null\n\n if (!compactResolution.success || !compactResolution.profile) {\n compressionModelPointer = 'main'\n compressionNotice =\n compactResolution.error ||\n \"Compression model pointer 'compact' is not configured.\"\n } else {\n const compactBudget = Math.floor(\n compactResolution.profile.contextLength * 0.9,\n )\n if (compactBudget > 0 && tokenCount > compactBudget) {\n compressionModelPointer = 'main'\n compressionNotice = `Compression model '${compactResolution.profile.name}' does not fit current context (~${Math.round(tokenCount / 1000)}k tokens).`\n }\n }\n\n if (\n compressionModelPointer === 'main' &&\n (!mainResolution.success || !mainResolution.profile)\n ) {\n throw new Error(\n mainResolution.error ||\n \"Compression fallback failed: model pointer 'main' is not configured.\",\n )\n }\n\n const summaryResponse = await queryLLM(\n normalizeMessagesForAPI([...messages, summaryRequest]),\n [\n 'You are a helpful AI assistant tasked with creating comprehensive conversation summaries that preserve all essential context for continuing development work.',\n ],\n 0,\n [],\n toolUseContext.abortController.signal,\n {\n safeMode: false,\n model: compressionModelPointer,\n prependCLISysprompt: true,\n },\n )\n\n const content = summaryResponse.message.content\n const summary =\n typeof content === 'string'\n ? content\n : content.length > 0 && content[0]?.type === 'text'\n ? content[0].text\n : null\n\n if (!summary) {\n throw new Error(\n 'Failed to generate conversation summary - response did not contain valid text content',\n )\n }\n\n summaryResponse.message.usage = {\n input_tokens: 0,\n output_tokens: summaryResponse.message.usage.output_tokens,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n }\n\n // Automatic file recovery: preserve recently accessed development files\n // This maintains coding context even after conversation compression\n const recoveredFiles = await selectAndReadFiles()\n\n const compactedMessages = [\n createUserMessage(\n compressionNotice\n ? `Context automatically compressed due to token limit. ${compressionNotice} Using '${compressionModelPointer}' for compression.`\n : `Context automatically compressed due to token limit. Using '${compressionModelPointer}' for compression.`,\n ),\n summaryResponse,\n ]\n\n // Append recovered files to maintain development workflow continuity\n // Files are prioritized by recency and importance, with strict token limits\n if (recoveredFiles.length > 0) {\n for (const file of recoveredFiles) {\n const contentWithLines = addLineNumbers({\n content: file.content,\n startLine: 1,\n })\n const recoveryMessage = createUserMessage(\n `**Recovered File: ${file.path}**\\n\\n\\`\\`\\`\\n${contentWithLines}\\n\\`\\`\\`\\n\\n` +\n `*Automatically recovered (${file.tokens} tokens)${file.truncated ? ' [truncated]' : ''}*`,\n )\n compactedMessages.push(recoveryMessage)\n }\n }\n\n // Persist the compaction boundary (best-effort) so resume screens can show a stable summary\n // and long sessions don't require loading the entire pre-compaction transcript.\n if (\n process.env.NODE_ENV !== 'test' &&\n toolUseContext?.options?.persistSession !== false\n ) {\n try {\n const cwd = getCwd()\n for (const msg of compactedMessages) {\n appendSessionJsonlFromMessage({ cwd, message: msg, toolUseContext })\n }\n appendSessionSummaryRecord({\n cwd,\n summary,\n leafUuid: summaryResponse.uuid,\n })\n } catch {\n // best-effort only\n }\n }\n\n // State cleanup to ensure fresh context after compression\n // Mirrors the cleanup sequence from manual /compact command\n getContext.cache.clear?.()\n getCodeStyle.cache.clear?.()\n resetFileFreshnessSession()\n\n return compactedMessages\n}\n", "import type {\n TextBlock,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport type { AssistantMessage, BinaryFeedbackResult } from '#core/query'\nimport { MAIN_QUERY_TEMPERATURE } from '#core/ai/constants'\n\nimport { isEqual, zip } from 'lodash-es'\nimport { getGitState } from '#core/utils/git'\n\nexport type BinaryFeedbackChoice =\n | 'prefer-left'\n | 'prefer-right'\n | 'neither'\n | 'no-preference'\n\nexport type BinaryFeedbackChoose = (choice: BinaryFeedbackChoice) => void\n\ntype BinaryFeedbackConfig = {\n sampleFrequency: number\n}\n\nasync function getBinaryFeedbackConfig(): Promise<BinaryFeedbackConfig> {\n return { sampleFrequency: 0 }\n}\n\nfunction getMessageBlockSequence(m: AssistantMessage) {\n return m.message.content.map(cb => {\n if (cb.type === 'text') return 'text'\n if (cb.type === 'tool_use') return cb.name\n return cb.type // Handle other block types like 'thinking' or 'redacted_thinking'\n })\n}\n\n// Logging removed to minimize runtime surface area; behavior unaffected\n\nfunction textContentBlocksEqual(cb1: TextBlock, cb2: TextBlock): boolean {\n return cb1.text === cb2.text\n}\n\nfunction contentBlocksEqual(\n cb1: TextBlock | ToolUseBlock,\n cb2: TextBlock | ToolUseBlock,\n): boolean {\n if (cb1.type !== cb2.type) {\n return false\n }\n if (cb1.type === 'text') {\n return textContentBlocksEqual(cb1, cb2 as TextBlock)\n }\n cb2 = cb2 as ToolUseBlock\n return cb1.name === cb2.name && isEqual(cb1.input, cb2.input)\n}\n\nfunction allContentBlocksEqual(\n content1: (TextBlock | ToolUseBlock)[],\n content2: (TextBlock | ToolUseBlock)[],\n): boolean {\n if (content1.length !== content2.length) {\n return false\n }\n return zip(content1, content2).every(([cb1, cb2]) =>\n contentBlocksEqual(cb1!, cb2!),\n )\n}\n\nexport async function shouldUseBinaryFeedback(): Promise<boolean> {\n if (process.env.DISABLE_BINARY_FEEDBACK) {\n return false\n }\n if (process.env.FORCE_BINARY_FEEDBACK) {\n return true\n }\n if (process.env.USER_TYPE !== 'ant') {\n return false\n }\n if (process.env.NODE_ENV === 'test') {\n // Binary feedback breaks a couple tests related to checking for permission,\n // so we have to disable it in tests at the risk of hiding bugs\n return false\n }\n\n const config = await getBinaryFeedbackConfig()\n if (config.sampleFrequency === 0) {\n return false\n }\n if (Math.random() > config.sampleFrequency) {\n return false\n }\n return true\n}\n\nexport function messagePairValidForBinaryFeedback(\n m1: AssistantMessage,\n m2: AssistantMessage,\n): boolean {\n const logPass = () => {}\n const logFail = (_reason: string) => {}\n\n // Ignore thinking blocks, on the assumption that users don't find them very relevant\n // compared to other content types\n const nonThinkingBlocks1 = m1.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const nonThinkingBlocks2 = m2.message.content.filter(\n b => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n )\n const hasToolUse =\n nonThinkingBlocks1.some(b => b.type === 'tool_use') ||\n nonThinkingBlocks2.some(b => b.type === 'tool_use')\n\n // If they're all text blocks, compare those\n if (!hasToolUse) {\n if (allContentBlocksEqual(nonThinkingBlocks1, nonThinkingBlocks2)) {\n logFail('contents_identical')\n return false\n }\n logPass()\n return true\n }\n\n // If there are tools, they're the most material difference between the messages.\n // Only show binary feedback if there's a tool use difference, ignoring text.\n if (\n allContentBlocksEqual(\n nonThinkingBlocks1.filter(b => b.type === 'tool_use'),\n nonThinkingBlocks2.filter(b => b.type === 'tool_use'),\n )\n ) {\n logFail('contents_identical')\n return false\n }\n\n logPass()\n return true\n}\n\nexport function getBinaryFeedbackResultForChoice(\n m1: AssistantMessage,\n m2: AssistantMessage,\n choice: BinaryFeedbackChoice,\n): BinaryFeedbackResult {\n switch (choice) {\n case 'prefer-left':\n return { message: m1, shouldSkipPermissionCheck: true }\n case 'prefer-right':\n return { message: m2, shouldSkipPermissionCheck: true }\n case 'no-preference':\n return {\n message: Math.random() < 0.5 ? m1 : m2,\n shouldSkipPermissionCheck: false,\n }\n case 'neither':\n return { message: null, shouldSkipPermissionCheck: false }\n }\n}\n// Keep a minimal exported stub to satisfy imports without side effects\nexport async function logBinaryFeedbackEvent(\n _m1: AssistantMessage,\n _m2: AssistantMessage,\n _choice: BinaryFeedbackChoice,\n): Promise<void> {}\n", "import {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '#core/feedback/binaryFeedback'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n} from './message-pipeline'\n\n// Returns a message if we got one, or `null` if the user cancelled.\nexport async function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n\n return await getBinaryFeedbackResponse(m1, m2)\n}\n", "export type ToolNameAliasResolution = {\n originalName: string\n resolvedName: string\n wasAliased: boolean\n}\n\ntype ToolNameAliasGroups = Record<string, readonly string[]>\n\nfunction buildToolNameAliasMap(\n groups: ToolNameAliasGroups,\n): Record<string, string> {\n const aliasToCanonical: Record<string, string> = {}\n\n for (const [canonicalName, aliases] of Object.entries(groups)) {\n for (const alias of aliases) {\n const existing = aliasToCanonical[alias]\n if (existing && existing !== canonicalName) {\n throw new Error(\n `Tool name alias conflict for \"${alias}\": \"${existing}\" vs \"${canonicalName}\"`,\n )\n }\n aliasToCanonical[alias] = canonicalName\n }\n }\n\n return aliasToCanonical\n}\n\nconst CANONICAL_TOOL_ALIASES: ToolNameAliasGroups = {\n // Some upstream clients unify AgentOutputTool and BashOutputTool into TaskOutput (with aliases).\n TaskOutput: [\n 'AgentOutputTool',\n 'BashOutputTool',\n 'BashOutput',\n 'TaskOutputTool',\n ],\n\n // Legacy client tool surfaces use lowerCamelCase for these MCP helpers.\n // Kode keeps canonical ids but accepts legacy names as aliases.\n ListMcpResourcesTool: ['listMcpResources'],\n ReadMcpResourceTool: ['readMcpResource'],\n}\n\nconst TOOL_NAME_ALIAS_MAP = buildToolNameAliasMap(CANONICAL_TOOL_ALIASES)\n\nexport function __buildToolNameAliasMapForTests(\n groups: ToolNameAliasGroups,\n): Record<string, string> {\n return buildToolNameAliasMap(groups)\n}\n\n/**\n * Resolve legacy tool aliases to their canonical tool names.\n *\n * Some upstream clients unify AgentOutputTool and BashOutputTool into TaskOutput.\n * (with aliases). Kode keeps backward compatibility by resolving the alias names.\n */\nexport function resolveToolNameAlias(name: string): ToolNameAliasResolution {\n const originalName = name\n const resolvedName = TOOL_NAME_ALIAS_MAP[name] ?? name\n\n return {\n originalName,\n resolvedName,\n wasAliased: resolvedName !== originalName,\n }\n}\n", "import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport { getKodeBaseDir } from '#core/utils/env'\nimport { getKodeAgentSessionId } from '#protocol/utils/kodeAgentSessionId'\nimport { sanitizeProjectNameForSessionStore } from '#protocol/utils/kodeAgentSessionLog'\n\nexport const PERSISTED_OUTPUT_OPEN_TAG = '<persisted-output>'\nexport const PERSISTED_OUTPUT_CLOSE_TAG = '</persisted-output>'\n\nexport const OLD_TOOL_RESULT_CONTENT_CLEARED_MARKER =\n '[Old tool result content cleared]'\n\nconst DEFAULT_MAX_RESULT_SIZE_CHARS = 400_000\nconst PREVIEW_CHARS = 2_000\n\ntype ToolResultContent = string | any[]\n\ntype PersistedToolResult = {\n filepath: string\n originalSize: number\n isJson: boolean\n preview: string\n hasMore: boolean\n}\n\nfunction toLocaleNumber(value: number): string {\n try {\n return value.toLocaleString()\n } catch {\n return String(value)\n }\n}\n\nfunction buildSessionToolResultsDir(cwd: string): string {\n const baseDir = getKodeBaseDir()\n const projectKey = sanitizeProjectNameForSessionStore(cwd)\n const sessionId = getKodeAgentSessionId()\n return join(baseDir, 'projects', projectKey, sessionId, 'tool-results')\n}\n\nfunction hasImageBlock(content: any[]): boolean {\n return content.some(\n block =>\n block &&\n typeof block === 'object' &&\n 'type' in block &&\n (block as any).type === 'image',\n )\n}\n\nfunction buildPreview(args: { content: string; maxChars: number }): {\n preview: string\n hasMore: boolean\n} {\n if (args.content.length <= args.maxChars) {\n return { preview: args.content, hasMore: false }\n }\n\n const slice = args.content.slice(0, args.maxChars)\n const lastNewline = slice.lastIndexOf('\\n')\n const cutAt = lastNewline > args.maxChars * 0.5 ? lastNewline : args.maxChars\n return { preview: args.content.slice(0, cutAt), hasMore: true }\n}\n\nfunction formatPersistedOutput(meta: PersistedToolResult): string {\n const originalSize = toLocaleNumber(meta.originalSize)\n const previewChars = toLocaleNumber(PREVIEW_CHARS)\n\n let out = `${PERSISTED_OUTPUT_OPEN_TAG}\\n`\n out += `Output too large (${originalSize}). Full output saved to: ${meta.filepath}\\n\\n`\n out += `Preview (first ${previewChars}):\\n`\n out += meta.preview\n out += meta.hasMore ? '\\n...\\n' : '\\n'\n out += PERSISTED_OUTPUT_CLOSE_TAG\n return out\n}\n\nfunction persistToolResultContent(args: {\n cwd: string\n toolUseId: string\n content: ToolResultContent\n}): PersistedToolResult | null {\n let isJson = false\n let serialized: string\n if (Array.isArray(args.content)) {\n isJson = true\n serialized = JSON.stringify(args.content, null, 2)\n } else {\n serialized = args.content\n }\n\n const dir = buildSessionToolResultsDir(args.cwd)\n try {\n mkdirSync(dir, { recursive: true })\n } catch {\n return null\n }\n\n const ext = isJson ? 'json' : 'txt'\n const filepath = join(dir, `${args.toolUseId}.${ext}`)\n\n try {\n if (!existsSync(filepath)) {\n writeFileSync(filepath, serialized, 'utf8')\n }\n } catch {\n return null\n }\n\n const { preview, hasMore } = buildPreview({\n content: serialized,\n maxChars: PREVIEW_CHARS,\n })\n\n return {\n filepath,\n originalSize: serialized.length,\n isJson,\n preview,\n hasMore,\n }\n}\n\nexport function maybePersistOversizedToolResult(args: {\n cwd: string\n toolUseId: string\n content: ToolResultContent\n maxResultSizeChars?: number\n}): ToolResultContent {\n const contentValue = args.content\n if (!contentValue) return contentValue\n\n if (Array.isArray(contentValue) && hasImageBlock(contentValue)) {\n return contentValue\n }\n\n const maxSize = args.maxResultSizeChars ?? DEFAULT_MAX_RESULT_SIZE_CHARS\n const estimatedSize =\n typeof contentValue === 'string'\n ? contentValue.length\n : JSON.stringify(contentValue).length\n if (estimatedSize <= maxSize) return contentValue\n\n const persisted = persistToolResultContent({\n cwd: args.cwd,\n toolUseId: args.toolUseId,\n content: contentValue,\n })\n if (!persisted) return contentValue\n\n return formatPersistedOutput(persisted)\n}\n", "import type { Tool } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\n\nexport function normalizeToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n if (tool.name === 'Bash') {\n const parsed = tool.inputSchema.parse(input) as {\n command: unknown\n timeout?: unknown\n description?: unknown\n run_in_background?: unknown\n dangerouslyDisableSandbox?: unknown\n } // already validated upstream, won't throw\n const command = parsed.command\n const timeout = parsed.timeout\n const description = parsed.description\n const run_in_background = parsed.run_in_background\n const dangerouslyDisableSandbox = parsed.dangerouslyDisableSandbox\n return {\n command: String(command)\n .replace(`cd ${getCwd()} && `, '')\n .replace(/\\\\\\\\;/g, '\\\\;'),\n ...(typeof timeout === 'number' ? { timeout } : {}),\n ...(typeof description === 'string' && description\n ? { description }\n : {}),\n ...(typeof run_in_background === 'boolean' && run_in_background\n ? { run_in_background }\n : {}),\n ...(typeof dangerouslyDisableSandbox === 'boolean' &&\n dangerouslyDisableSandbox\n ? { dangerouslyDisableSandbox }\n : {}),\n }\n }\n\n return input\n}\n\nexport function preprocessToolInput(\n tool: Tool,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n return input\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport { getCwd } from '#core/utils/state'\nimport { logError } from '#core/utils/log'\nimport type { ToolResultBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n} from '#core/utils/messages'\nimport { maybePersistOversizedToolResult } from '#core/utils/toolResultPersistence'\nimport {\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runPostToolUseHooks,\n runPreToolUseHooks,\n} from '#core/utils/kodeHooks'\n\nimport type { AssistantMessage, Message } from './types'\nimport { normalizeToolInput, preprocessToolInput } from './tool-input'\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object') return null\n return value as Record<string, unknown>\n}\n\nfunction isPipelineMessage(value: unknown): value is Message {\n const record = asRecord(value)\n if (!record) return false\n return (\n record.type === 'user' ||\n record.type === 'assistant' ||\n record.type === 'progress'\n )\n}\n\nfunction toToolResultContent(value: unknown): ToolResultBlockParam['content'] {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value as ToolResultBlockParam['content']\n return String(value)\n}\n\nexport async function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: Record<string, unknown>,\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const preprocessedInput = preprocessToolInput(tool, input)\n const isValidInput = tool.inputSchema.safeParse(preprocessedInput)\n if (!isValidInput.success) {\n let errorMessage = `InputValidationError: ${isValidInput.error.message}`\n\n if (tool.name === 'Read' && Object.keys(preprocessedInput).length === 0) {\n errorMessage =\n 'Error: The Read tool requires a \\'file_path\\' parameter to specify which file to read. Please provide the absolute path to the file you want to read. For example: {\"file_path\": \"/path/to/file.txt\"}'\n }\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n let normalizedInput = normalizeToolInput(tool, isValidInput.data)\n\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const hookOutcome = await runPreToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n if (hookOutcome.kind === 'block') {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: hookOutcome.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n if (hookOutcome.warnings.length > 0) {\n const warningText = hookOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n if (hookOutcome.systemMessages && hookOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, hookOutcome.systemMessages)\n }\n if (\n hookOutcome.additionalContexts &&\n hookOutcome.additionalContexts.length > 0\n ) {\n queueHookAdditionalContexts(context, hookOutcome.additionalContexts)\n }\n\n if (hookOutcome.updatedInput) {\n const merged = { ...normalizedInput, ...hookOutcome.updatedInput }\n const parsed = tool.inputSchema.safeParse(merged)\n if (!parsed.success) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Hook updatedInput failed validation: ${parsed.error.message}`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n normalizedInput = normalizeToolInput(tool, parsed.data)\n const isValidUpdate = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidUpdate?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidUpdate.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n\n const hookPermissionDecision =\n hookOutcome.kind === 'allow' ? hookOutcome.permissionDecision : undefined\n\n const effectiveShouldSkipPermissionCheck =\n hookPermissionDecision === 'allow'\n ? true\n : hookPermissionDecision === 'ask'\n ? false\n : shouldSkipPermissionCheck\n\n const permissionContextForCall =\n hookPermissionDecision === 'ask' &&\n context.options?.toolPermissionContext &&\n context.options.toolPermissionContext.mode !== 'default'\n ? ({\n ...context,\n options: {\n ...context.options,\n toolPermissionContext: {\n ...context.options.toolPermissionContext,\n mode: 'default',\n },\n },\n } as const)\n : context\n\n const permissionResult = effectiveShouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(\n tool,\n normalizedInput,\n { ...permissionContextForCall, toolUseId: toolUseID },\n assistantMessage,\n )\n\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n try {\n const generator = tool.call(normalizedInput as never, {\n ...context,\n toolUseId: toolUseID,\n })\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result': {\n const rawContent =\n result.resultForAssistant ??\n tool.renderResultForAssistant(result.data as never)\n const content = maybePersistOversizedToolResult({\n cwd: getCwd(),\n toolUseId: toolUseID,\n content: toToolResultContent(rawContent),\n maxResultSizeChars: tool.maxResultSizeChars,\n })\n const newMessages = Array.isArray(result.newMessages)\n ? result.newMessages.filter(isPipelineMessage)\n : []\n\n const postOutcome = await runPostToolUseHooks({\n toolName: tool.name,\n toolInput: normalizedInput,\n toolResult: result.data,\n toolUseId: toolUseID,\n permissionMode: context.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(context),\n safeMode: context.options?.safeMode ?? false,\n signal: context.abortController.signal,\n })\n\n if (postOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(context, postOutcome.systemMessages)\n }\n if (postOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(context, postOutcome.additionalContexts)\n }\n if (postOutcome.warnings.length > 0) {\n const warningText = postOutcome.warnings.join('\\n')\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n createAssistantMessage(warningText),\n [],\n context.options?.tools ?? [],\n )\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content,\n tool_use_id: toolUseID,\n },\n ],\n {\n data: result.data,\n resultForAssistant: content,\n ...(newMessages.length > 0 ? { newMessages } : {}),\n ...(result.contextModifier\n ? { contextModifier: result.contextModifier }\n : {}),\n },\n )\n\n for (const message of newMessages) {\n yield message\n }\n\n return\n }\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) return fullMessage\n\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { ToolUseContext } from '#core/tooling/Tool'\nimport { logError } from '#core/utils/log'\nimport { createUserMessage } from '#core/utils/messages'\nimport {\n debug as debugLogger,\n getCurrentRequest,\n logUserFriendly,\n} from '#core/utils/debugLogger'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport { setRequestStatus } from '#core/utils/requestStatus'\n\nimport type { AssistantMessage, ExtendedToolUseContext, Message } from './types'\nimport { checkPermissionsAndCallTool } from './tool-call'\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n const aliasResolution = resolveToolNameAlias(toolUse.name)\n setRequestStatus({ kind: 'tool', detail: aliasResolution.resolvedName })\n\n debugLogger.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: Boolean(shouldSkipPermissionCheck),\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = aliasResolution.resolvedName\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n if (!tool) {\n debugLogger.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n const notFoundMessage = aliasResolution.wasAliased\n ? `Error: No such tool available: ${aliasResolution.originalName} (resolved to ${toolName})`\n : `Error: No such tool available: ${toolName}`\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: notFoundMessage,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as Record<string, unknown>\n\n debugLogger.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext as ToolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n yield message\n }\n } catch (e) {\n logError(e)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n }\n}\n", "import type { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport type { Tool } from '#core/tooling/Tool'\nimport { resolveToolNameAlias } from '#core/utils/toolNameAliases'\nimport {\n createAssistantMessage,\n createProgressMessage,\n createUserMessage,\n REJECT_MESSAGE,\n} from '#core/utils/messages'\n\nimport type {\n AssistantMessage,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n UserMessage,\n} from './types'\nimport { runToolUse } from './tool-use'\n\ntype ToolQueueEntry = {\n id: string\n block: ToolUseBlock\n assistantMessage: AssistantMessage\n status: 'queued' | 'executing' | 'completed' | 'yielded'\n isConcurrencySafe: boolean\n pendingProgress: ProgressMessage[]\n queuedProgressEmitted?: boolean\n results?: (UserMessage | AssistantMessage)[]\n contextModifiers?: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n >\n promise?: Promise<void>\n}\n\nfunction createSyntheticToolUseErrorMessage(\n toolUseId: string,\n reason: 'user_interrupted' | 'sibling_error',\n): UserMessage {\n if (reason === 'user_interrupted') {\n return createUserMessage([\n {\n type: 'tool_result',\n content: REJECT_MESSAGE,\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n }\n\n return createUserMessage([\n {\n type: 'tool_result',\n content: '<tool_use_error>Sibling tool call errored</tool_use_error>',\n is_error: true,\n tool_use_id: toolUseId,\n },\n ])\n}\n\nexport class ToolUseQueue {\n private readonly toolDefinitions: Tool[]\n private readonly canUseTool: CanUseToolFn\n private readonly tools: ToolQueueEntry[] = []\n private toolUseContext: ExtendedToolUseContext\n private hasErrored = false\n private progressAvailableResolve: (() => void) | undefined\n private readonly siblingToolUseIDs: Set<string>\n private readonly shouldSkipPermissionCheck?: boolean\n\n constructor(options: {\n toolDefinitions: Tool[]\n canUseTool: CanUseToolFn\n toolUseContext: ExtendedToolUseContext\n siblingToolUseIDs: Set<string>\n shouldSkipPermissionCheck?: boolean\n }) {\n this.toolDefinitions = options.toolDefinitions\n this.canUseTool = options.canUseTool\n this.toolUseContext = options.toolUseContext\n this.siblingToolUseIDs = options.siblingToolUseIDs\n this.shouldSkipPermissionCheck = options.shouldSkipPermissionCheck\n }\n\n addTool(toolUse: ToolUseBlock, assistantMessage: AssistantMessage) {\n const resolvedToolName = resolveToolNameAlias(toolUse.name).resolvedName\n const toolDefinition = this.toolDefinitions.find(\n t => t.name === resolvedToolName,\n )\n const parsedInput = toolDefinition?.inputSchema.safeParse(toolUse.input)\n const isConcurrencySafe =\n toolDefinition && parsedInput?.success\n ? toolDefinition.isConcurrencySafe(parsedInput.data)\n : false\n\n this.tools.push({\n id: toolUse.id,\n block: toolUse,\n assistantMessage,\n status: 'queued',\n isConcurrencySafe,\n pendingProgress: [],\n queuedProgressEmitted: false,\n })\n\n void this.processQueue()\n }\n\n private canExecuteTool(isConcurrencySafe: boolean) {\n const executing = this.tools.filter(t => t.status === 'executing')\n return (\n executing.length === 0 ||\n (isConcurrencySafe && executing.every(t => t.isConcurrencySafe))\n )\n }\n\n private async processQueue() {\n for (const entry of this.tools) {\n if (entry.status !== 'queued') continue\n\n if (this.canExecuteTool(entry.isConcurrencySafe)) {\n await this.executeTool(entry)\n } else {\n // Compatibility: show a queued \"Waiting\u2026\" line for blocked tool calls.\n if (!entry.queuedProgressEmitted) {\n entry.queuedProgressEmitted = true\n entry.pendingProgress.push(\n createProgressMessage(\n entry.id,\n this.siblingToolUseIDs,\n createAssistantMessage('<tool-progress>Waiting\u2026</tool-progress>'),\n [],\n this.toolUseContext.options.tools,\n ),\n )\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n }\n\n if (!entry.isConcurrencySafe) {\n break\n }\n }\n }\n }\n\n private getAbortReason(): 'sibling_error' | 'user_interrupted' | null {\n if (this.hasErrored) return 'sibling_error'\n if (this.toolUseContext.abortController.signal.aborted)\n return 'user_interrupted'\n return null\n }\n\n private async executeTool(entry: ToolQueueEntry) {\n entry.status = 'executing'\n\n const results: (UserMessage | AssistantMessage)[] = []\n const contextModifiers: Array<\n (ctx: ExtendedToolUseContext) => ExtendedToolUseContext\n > = []\n\n const promise = (async () => {\n const abortReason = this.getAbortReason()\n if (abortReason) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, abortReason))\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n return\n }\n\n const generator = runToolUse(\n entry.block,\n this.siblingToolUseIDs,\n entry.assistantMessage,\n this.canUseTool,\n this.toolUseContext,\n this.shouldSkipPermissionCheck,\n )\n\n let toolErrored = false\n\n for await (const message of generator) {\n const reason = this.getAbortReason()\n if (reason && !toolErrored) {\n results.push(createSyntheticToolUseErrorMessage(entry.id, reason))\n break\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content.some(\n block => block.type === 'tool_result' && block.is_error === true,\n )\n ) {\n this.hasErrored = true\n toolErrored = true\n }\n\n if (message.type === 'progress') {\n entry.pendingProgress.push(message)\n if (this.progressAvailableResolve) {\n this.progressAvailableResolve()\n this.progressAvailableResolve = undefined\n }\n } else {\n results.push(message)\n\n if (\n message.type === 'user' &&\n message.toolUseResult?.contextModifier\n ) {\n contextModifiers.push(\n message.toolUseResult.contextModifier.modifyContext,\n )\n }\n }\n }\n\n entry.results = results\n entry.contextModifiers = contextModifiers\n entry.status = 'completed'\n\n if (!entry.isConcurrencySafe && contextModifiers.length > 0) {\n for (const modifyContext of contextModifiers) {\n this.toolUseContext = modifyContext(this.toolUseContext)\n }\n }\n })()\n\n entry.promise = promise\n promise.finally(() => {\n void this.processQueue()\n })\n }\n\n private *getCompletedResults(): Generator<Message, void> {\n let barrierExecuting = false\n for (const entry of this.tools) {\n while (entry.pendingProgress.length > 0) {\n yield entry.pendingProgress.shift()!\n }\n\n if (entry.status === 'yielded') continue\n\n // Compatibility: non-concurrency-safe tools act as an ordering barrier.\n // Still allow queued progress lines (e.g. \"Waiting\u2026\") to render for later tools.\n if (barrierExecuting) continue\n\n if (entry.status === 'completed' && entry.results) {\n entry.status = 'yielded'\n for (const message of entry.results) {\n yield message\n }\n } else if (entry.status === 'executing' && !entry.isConcurrencySafe) {\n barrierExecuting = true\n }\n }\n }\n\n private hasPendingProgress() {\n return this.tools.some(t => t.pendingProgress.length > 0)\n }\n\n private hasCompletedResults() {\n return this.tools.some(t => t.status === 'completed')\n }\n\n private hasExecutingTools() {\n return this.tools.some(t => t.status === 'executing')\n }\n\n private hasUnfinishedTools() {\n return this.tools.some(t => t.status !== 'yielded')\n }\n\n async *getRemainingResults(): AsyncGenerator<Message, void> {\n while (this.hasUnfinishedTools()) {\n await this.processQueue()\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n\n if (\n this.hasExecutingTools() &&\n !this.hasCompletedResults() &&\n !this.hasPendingProgress()\n ) {\n const promises = this.tools\n .filter(t => t.status === 'executing' && t.promise)\n .map(t => t.promise!)\n\n const progressPromise = new Promise<void>(resolve => {\n this.progressAvailableResolve = resolve\n })\n\n if (promises.length > 0) {\n await Promise.race([...promises, progressPromise])\n }\n }\n }\n\n for (const message of this.getCompletedResults()) {\n yield message\n }\n }\n\n getUpdatedContext() {\n return this.toolUseContext\n }\n}\n\nexport const __ToolUseQueueForTests = ToolUseQueue\n", "import type {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { UUID } from '#core/types/common'\nimport type { Tool, ToolUseContext } from '#core/tooling/Tool'\nimport type { ToolPermissionContext } from '#core/types/toolPermissionContext'\nimport type { FullToolUseResult, NormalizedMessage } from '#core/utils/messages'\n\n// Extended ToolUseContext for query functions.\nexport interface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n /**\n * Internal counter for the number of model calls (\"turns\") executed in the current run.\n * Used for non-interactive `--max-turns` enforcement and SDK `num_turns` reporting.\n */\n turnCount?: number\n options: {\n commands: any[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n mcpClients?: any[]\n verbose: boolean\n safeMode: boolean\n onStreamEvent?: (event: unknown) => void\n maxBudgetUsd?: number\n maxTurns?: number\n maxThinkingTokens: number\n thinkingMode?: 'auto' | 'enabled' | 'disabled'\n isKodingRequest?: boolean\n commandAllowedTools?: string[]\n lastUserPrompt?: string\n model?: string | import('#config').ModelPointerType\n toolPermissionContext?: ToolPermissionContext\n /**\n * When true, the current execution context cannot show interactive permission prompts.\n * Any permission decision that would normally prompt should be auto-denied.\n */\n shouldAvoidPermissionPrompts?: boolean\n /**\n * When false, suppress legacy-compatible session persistence (.jsonl under config/projects).\n */\n persistSession?: boolean\n /**\n * Optional callback to get custom system prompt additions (e.g., output style).\n * Only called for the main agent.\n */\n getCustomSystemPromptAdditions?: () => string[]\n requestToolUsePermission?: NonNullable<\n ToolUseContext['options']\n >['requestToolUsePermission']\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: (jsx: any) => void\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\n\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n requestId?: string\n responseId?: string // For GPT-5 Responses API state management\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\nexport type ProgressMessage = {\n content: AssistantMessage\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\ntype ToolUseLikeBlock = ToolUseBlock & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nexport function isToolUseLikeBlock(block: any): block is ToolUseLikeBlock {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use')\n )\n}\n\nexport const __isToolUseLikeBlockForTests = isToolUseLikeBlock\n", "import type { AgentEvent } from '#protocol/agentEvent'\nimport { kodeMessageToSdkMessage } from '#protocol/utils/kodeAgentStreamJson'\n\nimport type { Message } from './index'\n\nexport function messageToAgentEvent(\n message: Message,\n sessionId: string,\n): AgentEvent | null {\n return kodeMessageToSdkMessage(\n message as Parameters<typeof kodeMessageToSdkMessage>[0],\n sessionId,\n )\n}\n\nexport async function* messagesToAgentEvents(args: {\n source: AsyncIterable<Message>\n sessionId: string\n}): AsyncGenerator<AgentEvent, void> {\n for await (const message of args.source) {\n const event = messageToAgentEvent(message, args.sessionId)\n if (event) yield event\n }\n}\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { queryLLM } from '#core/ai/llmLazy'\nimport { getTotalCost } from '#core/cost-tracker'\nimport { MaxBudgetUsdExceededError } from '#core/errors/maxBudgetUsd'\nimport { MaxTurnsExceededError } from '#core/errors/maxTurns'\nimport { formatSystemPromptWithContext } from '#core/services/systemPrompt'\nimport { emitReminderEvent } from '#core/services/systemReminder'\nimport { addNotification } from '#core/services/notificationCenter'\nimport { markPhase } from '#core/utils/debugLogger'\nimport {\n createAssistantMessage,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n normalizeMessagesForAPI,\n} from '#core/utils/messages'\nimport {\n getPlanModeSystemPromptAdditions,\n hydratePlanSlugFromMessages,\n} from '#core/utils/planMode'\nimport { setRequestStatus } from '#core/utils/requestStatus'\nimport {\n BunShell,\n renderBackgroundShellStatusAttachment,\n renderBashNotification,\n} from '#runtime/shell'\nimport { getCwd } from '#core/utils/state'\nimport { checkAutoCompact } from '#core/utils/autoCompactCore'\nimport { asRecord } from '#core/hooks/types'\nimport {\n drainHookSystemPromptAdditions,\n getHookTranscriptPath,\n queueHookAdditionalContexts,\n queueHookSystemMessages,\n runStopHooks,\n runUserPromptSubmitHooks,\n updateHookTranscriptForMessages,\n} from '#core/utils/kodeHooks'\nimport { queryWithBinaryFeedback } from './query-executor'\nimport { ToolUseQueue } from './pipeline/tool-use-queue'\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n UserMessage,\n} from './pipeline/types'\nimport { isToolUseLikeBlock } from './pipeline/types'\nexport type {\n AssistantMessage,\n BinaryFeedbackResult,\n ExtendedToolUseContext,\n Message,\n ProgressMessage,\n Response,\n UserMessage,\n} from './pipeline/types'\nexport { __isToolUseLikeBlockForTests } from './pipeline/types'\nexport { __ToolUseQueueForTests } from './pipeline/tool-use-queue'\nexport { runToolUse } from './pipeline/tool-use'\nexport { normalizeToolInput } from './pipeline/tool-input'\n\nexport async function* messagePipeline(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n yield* messagePipelineCore(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )\n}\nasync function* messagePipelineCore(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n hookState?: { stopHookActive?: boolean; stopHookAttempts?: number },\n): AsyncGenerator<Message, void> {\n setRequestStatus({ kind: 'thinking' })\n\n try {\n markPhase('QUERY_INIT')\n const stopHookActive = hookState?.stopHookActive === true\n const stopHookAttempts = hookState?.stopHookAttempts ?? 0\n\n const maxTurns = toolUseContext.options.maxTurns\n const normalizedMaxTurns =\n typeof maxTurns === 'number' && Number.isFinite(maxTurns) && maxTurns > 0\n ? Math.trunc(maxTurns)\n : undefined\n\n const turnsUsed = (() => {\n const raw = toolUseContext.turnCount\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw < 0) {\n return 0\n }\n return Math.trunc(raw)\n })()\n toolUseContext.turnCount = turnsUsed\n\n if (normalizedMaxTurns !== undefined && turnsUsed >= normalizedMaxTurns) {\n throw new MaxTurnsExceededError({\n maxTurns: normalizedMaxTurns,\n turnCount: turnsUsed,\n })\n }\n\n const maxBudgetUsd = toolUseContext.options.maxBudgetUsd\n if (\n typeof maxBudgetUsd === 'number' &&\n Number.isFinite(maxBudgetUsd) &&\n maxBudgetUsd > 0\n ) {\n const totalCostUsd = getTotalCost()\n if (totalCostUsd >= maxBudgetUsd) {\n throw new MaxBudgetUsdExceededError({ maxBudgetUsd, totalCostUsd })\n }\n }\n\n // Auto-compact check\n const { messages: processedMessages, wasCompacted } =\n await checkAutoCompact(messages, toolUseContext)\n if (wasCompacted) {\n messages = processedMessages\n }\n\n // Compatibility: task-notification + background_shell_status attachments.\n // We inject these as synthetic assistant messages so the model can decide when to call TaskOutput.\n if (toolUseContext.agentId === 'main') {\n const shell = BunShell.getInstance()\n\n const notifications = shell.flushBashNotifications()\n for (const notification of notifications) {\n const status = notification.status\n const exitCode = notification.exitCode\n const summarySuffix =\n status === 'completed'\n ? `completed${exitCode !== undefined ? ` (exit ${exitCode})` : ''}`\n : status === 'failed'\n ? `failed${exitCode !== undefined ? ` (exit ${exitCode})` : ''}`\n : 'was killed'\n\n addNotification({\n title: 'Background bash',\n message: `${notification.description} \u2014 ${summarySuffix}. Output: ${notification.outputFile}`,\n source: 'system',\n kind: status === 'failed' ? 'error' : 'info',\n })\n\n const text = renderBashNotification(notification)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(text)\n messages = [...messages, msg]\n yield msg\n }\n\n const attachments = shell.flushBackgroundShellStatusAttachments()\n for (const attachment of attachments) {\n const text = renderBackgroundShellStatusAttachment(attachment)\n if (text.trim().length === 0) continue\n const msg = createAssistantMessage(\n `<tool-progress>${text}</tool-progress>`,\n )\n messages = [...messages, msg]\n yield msg\n }\n }\n\n // Hooks: keep an up-to-date transcript for hook scripts.\n updateHookTranscriptForMessages(toolUseContext, messages)\n\n // Hooks: UserPromptSubmit\n {\n const last = messages[messages.length - 1]\n let userPromptText: string | null = null\n if (last?.type === 'user') {\n const content = last.message.content\n if (typeof content === 'string') {\n userPromptText = content\n } else if (Array.isArray(content)) {\n const hasToolResult = content.some(\n (b: any) => b && typeof b === 'object' && b.type === 'tool_result',\n )\n if (!hasToolResult) {\n userPromptText = content\n .filter(\n (b: any) => b && typeof b === 'object' && b.type === 'text',\n )\n .map((b: any) => String(b.text ?? ''))\n .join('')\n }\n }\n }\n\n if (userPromptText !== null) {\n // Keep a stable copy of the user's last prompt (pre-reminder injection) so\n // tools can do intent-alignment checks against the actual user request.\n toolUseContext.options.lastUserPrompt = userPromptText\n\n const promptOutcome = await runUserPromptSubmitHooks({\n prompt: userPromptText,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n signal: toolUseContext.abortController.signal,\n })\n\n queueHookSystemMessages(toolUseContext, promptOutcome.systemMessages)\n queueHookAdditionalContexts(\n toolUseContext,\n promptOutcome.additionalContexts,\n )\n\n if (promptOutcome.decision === 'block') {\n yield createAssistantMessage(promptOutcome.message)\n return\n }\n }\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n // Best-effort: recover plan slug from previous tool results (for resume flows).\n hydratePlanSlugFromMessages(messages, toolUseContext)\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(\n systemPrompt,\n context,\n toolUseContext.agentId,\n )\n\n // Default behavior: plan mode reminders are injected as system-level guidance.\n const planModeAdditions = getPlanModeSystemPromptAdditions(\n messages,\n toolUseContext,\n )\n if (planModeAdditions.length > 0) {\n fullSystemPrompt.push(...planModeAdditions)\n }\n\n const hookAdditions = drainHookSystemPromptAdditions(toolUseContext)\n if (hookAdditions.length > 0) {\n fullSystemPrompt.push(...hookAdditions)\n }\n\n // Inject custom system prompt additions (e.g., output style) for main agent\n if (toolUseContext.agentId === 'main') {\n const customAdditions =\n toolUseContext.options.getCustomSystemPromptAdditions?.() ?? []\n if (customAdditions.length > 0) {\n fullSystemPrompt.push(...customAdditions)\n }\n }\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\n }\n\n markPhase('LLM_PREPARATION')\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n toolUseContext.turnCount = turnsUsed + 1\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages =\n assistantMessage.message.content.filter(isToolUseLikeBlock)\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n const stopHookEvent =\n toolUseContext.agentId && toolUseContext.agentId !== 'main'\n ? ('SubagentStop' as const)\n : ('Stop' as const)\n const record = asRecord(assistantMessage.message)\n const stopReason =\n (record && typeof record.stop_reason === 'string'\n ? record.stop_reason\n : '') ||\n (record && typeof record.stopReason === 'string'\n ? record.stopReason\n : '') ||\n 'end_turn'\n\n const stopOutcome = await runStopHooks({\n hookEvent: stopHookEvent,\n reason: String(stopReason ?? ''),\n agentId: toolUseContext.agentId,\n permissionMode: toolUseContext.options?.toolPermissionContext?.mode,\n cwd: getCwd(),\n transcriptPath: getHookTranscriptPath(toolUseContext),\n safeMode: toolUseContext.options?.safeMode ?? false,\n stopHookActive,\n signal: toolUseContext.abortController.signal,\n })\n\n if (stopOutcome.systemMessages.length > 0) {\n queueHookSystemMessages(toolUseContext, stopOutcome.systemMessages)\n }\n if (stopOutcome.additionalContexts.length > 0) {\n queueHookAdditionalContexts(\n toolUseContext,\n stopOutcome.additionalContexts,\n )\n }\n\n if (stopOutcome.decision === 'block') {\n queueHookSystemMessages(toolUseContext, [stopOutcome.message])\n const MAX_STOP_HOOK_ATTEMPTS = 5\n if (stopHookAttempts < MAX_STOP_HOOK_ATTEMPTS) {\n yield* await messagePipelineCore(\n [...messages, assistantMessage],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n {\n stopHookActive: true,\n stopHookAttempts: stopHookAttempts + 1,\n },\n )\n return\n }\n }\n\n yield assistantMessage\n return\n }\n\n yield assistantMessage\n const siblingToolUseIDs = new Set<string>(toolUseMessages.map(_ => _.id))\n const toolQueue = new ToolUseQueue({\n toolDefinitions: toolUseContext.options.tools,\n canUseTool,\n toolUseContext,\n siblingToolUseIDs,\n shouldSkipPermissionCheck,\n })\n\n for (const toolUse of toolUseMessages) {\n toolQueue.addTool(toolUse, assistantMessage)\n }\n\n const toolMessagesForNextTurn: (UserMessage | AssistantMessage)[] = []\n for await (const message of toolQueue.getRemainingResults()) {\n yield message\n if (message.type !== 'progress') {\n toolMessagesForNextTurn.push(message as UserMessage | AssistantMessage)\n }\n }\n\n toolUseContext = toolQueue.getUpdatedContext()\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Recursive query\n\n try {\n yield* await messagePipelineCore(\n [...messages, assistantMessage, ...toolMessagesForNextTurn],\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n hookState,\n )\n } catch (error) {\n // Re-throw the error to maintain the original behavior\n throw error\n }\n } finally {\n setRequestStatus({ kind: 'idle' })\n }\n}\n\nexport * from '../query/agentEvents'\n", "import type { CanUseToolFn } from '#core/permissions/canUseTool'\nimport { getCwd } from '#core/utils/state'\nimport { appendSessionJsonlFromMessage } from '#protocol/utils/kodeAgentSessionLog'\n\nimport type {\n AssistantMessage,\n BinaryFeedbackResult,\n Message,\n ExtendedToolUseContext,\n} from './message-pipeline'\nimport { messagePipeline } from './message-pipeline'\n\n/**\n * Core query orchestrator.\n *\n * Streams `Message` objects (user/assistant/progress) for a single user turn, including tool use.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): AsyncGenerator<Message, void> {\n const shouldPersistSession =\n toolUseContext.options?.persistSession !== false &&\n process.env.NODE_ENV !== 'test'\n const cwd = shouldPersistSession ? getCwd() : null\n\n if (shouldPersistSession) {\n const last = messages[messages.length - 1]\n if (last?.type === 'user') {\n appendSessionJsonlFromMessage({\n cwd: cwd ?? getCwd(),\n message: last,\n toolUseContext,\n })\n }\n }\n\n for await (const message of messagePipeline(\n messages,\n systemPrompt,\n context,\n canUseTool,\n toolUseContext,\n getBinaryFeedbackResponse,\n )) {\n if (shouldPersistSession) {\n appendSessionJsonlFromMessage({\n cwd: cwd ?? getCwd(),\n message,\n toolUseContext,\n })\n }\n yield message\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["asRecord"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../packages/core/src/engine/messages/constants.ts", "../../packages/core/src/engine/messages/create.ts", "../../packages/core/src/ai/llm/constants.ts", "../../packages/core/src/engine/messages/tags.ts", "../../packages/core/src/engine/messages/normalize.ts", "../../packages/core/src/engine/messages/toolUse.ts", "../../packages/core/src/engine/messages/api.ts"],
|
|
4
|
-
"sourcesContent": ["export const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:\\n`\nexport const REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.\\n\\nRejected plan:\\n`\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n", "import { randomUUID } from 'crypto'\n\nimport type {\n ContentBlock,\n ContentBlockParam,\n ToolResultBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport { NO_CONTENT_MESSAGE } from '#core/ai/constants'\nimport type { Tool } from '#core/tooling/Tool'\nimport type {\n AssistantMessage,\n Message,\n ProgressMessage,\n UserMessage,\n} from '#core/query'\n\nimport { CANCEL_MESSAGE } from './constants'\nimport type { NormalizedMessage } from './normalize'\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown\n resultForAssistant: ToolResultBlockParam['content']\n newMessages?: Message[]\n contextModifier?: { modifyContext: (ctx: any) => any }\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n", "export const API_ERROR_MESSAGE_PREFIX = 'API Error'\nexport const PROMPT_TOO_LONG_ERROR_MESSAGE = 'Prompt is too long'\nexport const CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = 'Credit balance is too low'\nexport const INVALID_API_KEY_ERROR_MESSAGE =\n 'Invalid API key \u00B7 Please run /login'\nexport const NO_CONTENT_MESSAGE = '(no content)'\n\n// Keep at 1 for more variation in binary feedback sampling (matches existing behavior).\nexport const MAIN_QUERY_TEMPERATURE = 1\n", "import type { Message } from '#core/query'\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + '([\\\\s\\\\S]*?)' + `<\\\\/${escapedTag}>`,\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n depth = 0\n\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n", "import { createHash, randomUUID } from 'crypto'\nimport type { UUID } from 'crypto'\n\nimport type {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport { NO_CONTENT_MESSAGE } from '#core/ai/constants'\nimport type { AssistantMessage, Message, ProgressMessage } from '#core/query'\n\nimport { INTERRUPT_MESSAGE_FOR_TOOL_USE } from './constants'\n\nfunction stableUuidFromSeed(seed: string): UUID {\n const hex = createHash('sha256').update(seed).digest('hex').slice(0, 32)\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}` as UUID\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap(message => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n\n // User messages should not be split by content blocks - return as single message\n if (message.type === 'user') {\n return [message] as NormalizedMessage[]\n }\n\n // Only assistant messages need to be split by content blocks\n const contentBlocks = message.message.content.filter(\n block =>\n !(\n block.type === 'thinking' &&\n !(\n typeof (block as { thinking?: unknown }).thinking === 'string' &&\n (block as { thinking: string }).thinking.trim().length > 0\n )\n ),\n )\n\n return contentBlocks.map((block, blockIndex) => {\n const msgRecord = message as {\n uuid?: unknown\n message?: { id?: unknown }\n }\n const baseSeed =\n typeof msgRecord.uuid === 'string'\n ? msgRecord.uuid\n : String(msgRecord.message?.id ?? randomUUID())\n return {\n type: 'assistant',\n uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),\n message: {\n ...message.message,\n content: [block],\n },\n costUSD:\n (message as AssistantMessage).costUSD / contentBlocks.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n })\n })\n}\n", "import { memoize } from 'lodash-es'\n\nimport type {\n ToolResultBlockParam,\n ToolUseBlockParam,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport type { AssistantMessage, Message, ProgressMessage } from '#core/query'\n\nimport type { NormalizedMessage } from './normalize'\nimport { extractTag } from './tags'\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: any[] }\n}\n\ntype ToolUseLikeBlockParam = ToolUseBlockParam & {\n type: 'tool_use' | 'server_tool_use' | 'mcp_tool_use'\n}\n\nfunction isToolUseLikeBlockParam(block: any): block is ToolUseLikeBlockParam {\n return (\n block &&\n typeof block === 'object' &&\n (block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use') &&\n typeof block.id === 'string'\n )\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n message.message.content.some(isToolUseLikeBlockParam)\n )\n}\n\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n if (message.type === 'progress') {\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n } else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\nconst getToolResultIDs = memoize(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseLikeBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n !(_.message.content[0].id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n\n function isQueuedWaitingProgressMessage(message: NormalizedMessage): boolean {\n if (message.type !== 'progress') return false\n const firstBlock = message.content.message.content[0]\n if (!firstBlock || firstBlock.type !== 'text') return false\n const rawText = String(firstBlock.text ?? '')\n const text = rawText.startsWith('<tool-progress>')\n ? (extractTag(rawText, 'tool-progress') ?? rawText)\n : rawText\n return text.trim() === 'Waiting\u2026'\n }\n\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages\n .filter(\n (_): _ is ProgressMessage =>\n _.type === 'progress' && !isQueuedWaitingProgressMessage(_),\n )\n .map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n const firstBlock = _.message.content[0]\n if (!isToolUseLikeBlockParam(firstBlock)) return false\n const toolUseID = firstBlock.id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n isToolUseLikeBlockParam(_.message.content[0]) &&\n _.message.content[0].id in toolResults &&\n toolResults[_.message.content[0].id],\n ) as AssistantMessage[]\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n return isToolUseLikeBlockParam(message.message.content[0])\n ? message.message.content[0].id\n : null\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n", "import { last } from 'lodash-es'\n\nimport type {\n ContentBlockParam,\n Message as APIMessage,\n} from '@anthropic-ai/sdk/resources/index.mjs'\n\nimport { NO_CONTENT_MESSAGE } from '#core/ai/constants'\nimport type { AssistantMessage, Message, UserMessage } from '#core/query'\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n function isSyntheticApiErrorMessage(message: Message): boolean {\n return (\n message.type === 'assistant' &&\n message.isApiErrorMessage === true &&\n message.message.model === '<synthetic>'\n )\n }\n\n function normalizeUserContent(\n content: UserMessage['message']['content'],\n ): ContentBlockParam[] {\n if (typeof content === 'string') {\n return [{ type: 'text', text: content }]\n }\n return content\n }\n\n function toolResultsFirst(content: ContentBlockParam[]): ContentBlockParam[] {\n const toolResults: ContentBlockParam[] = []\n const rest: ContentBlockParam[] = []\n for (const block of content) {\n if (block.type === 'tool_result') {\n toolResults.push(block)\n } else {\n rest.push(block)\n }\n }\n return [...toolResults, ...rest]\n }\n\n function mergeUserMessages(\n base: UserMessage,\n next: UserMessage,\n ): UserMessage {\n const baseBlocks = normalizeUserContent(base.message.content)\n const nextBlocks = normalizeUserContent(next.message.content)\n return {\n ...base,\n message: {\n ...base.message,\n content: toolResultsFirst([...baseBlocks, ...nextBlocks]),\n },\n }\n }\n\n function isUserToolResultMessage(message: Message): message is UserMessage {\n if (message.type !== 'user') return false\n if (!Array.isArray(message.message.content)) return false\n return message.message.content.some(block => block.type === 'tool_result')\n }\n\n const result: (UserMessage | AssistantMessage)[] = []\n for (const message of messages) {\n if (message.type === 'progress') continue\n if (isSyntheticApiErrorMessage(message)) continue\n\n switch (message.type) {\n case 'user': {\n const prev = last(result)\n if (prev?.type === 'user') {\n result[result.indexOf(prev)] = mergeUserMessages(prev, message)\n } else {\n result.push(message)\n }\n break\n }\n case 'assistant': {\n let merged = false\n for (let i = result.length - 1; i >= 0; i--) {\n const prev = result[i]\n if (prev.type !== 'assistant' && !isUserToolResultMessage(prev)) {\n break\n }\n if (prev.type === 'assistant') {\n if (prev.message.id === message.message.id) {\n result[i] = {\n ...prev,\n message: {\n ...prev.message,\n content: [\n ...(Array.isArray(prev.message.content)\n ? prev.message.content\n : []),\n ...(Array.isArray(message.message.content)\n ? message.message.content\n : []),\n ],\n },\n }\n merged = true\n }\n break\n }\n }\n if (!merged) {\n result.push(message)\n }\n break\n }\n }\n }\n\n return result\n}\n\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\n\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(\n `<(${STRIPPED_TAGS.join('|')})>.*?</\\\\\\\\1>\\\\n?`,\n 'gs',\n )\n return content.replace(regex, '').trim()\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["randomUUID", "randomUUID"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../apps/cli/src/ui/hooks/useTerminalSize.ts"],
|
|
4
|
-
"sourcesContent": ["import { useStdout } from 'ink'\nimport { useEffect, useMemo, useState } from 'react'\nimport type { Writable } from 'node:stream'\n\ntype TerminalSize = { columns: number; rows: number }\n\ntype StreamState = {\n size: TerminalSize\n listeners: Set<(size: TerminalSize) => void>\n onResize: () => void\n attached: boolean\n}\n\nconst streamStates = new WeakMap<Writable, StreamState>()\n\nfunction readSize(stream: { columns?: number; rows?: number }): TerminalSize {\n return {\n columns: stream.columns || 80,\n rows: stream.rows || 24,\n }\n}\n\nfunction getStreamState(stream: Writable): StreamState {\n const existing = streamStates.get(stream)\n if (existing) return existing\n\n const state: StreamState = {\n size: readSize(stream as { columns?: number; rows?: number }),\n listeners: new Set(),\n onResize: () => {\n const next = readSize(stream as { columns?: number; rows?: number })\n state.size = next\n state.listeners.forEach(listener => listener(next))\n },\n attached: false,\n }\n\n streamStates.set(stream, state)\n return state\n}\n\nexport function useTerminalSize(): TerminalSize {\n const { stdout } = useStdout()\n const stream = useMemo(\n () => (stdout ?? process.stdout) as unknown as Writable,\n [stdout],\n )\n const state = getStreamState(stream)\n\n const [size, setSize] = useState<TerminalSize>(() => state.size)\n\n useEffect(() => {\n const streamState = getStreamState(stream)\n const listener = (next: TerminalSize) => {\n setSize(previous => {\n if (previous.columns === next.columns && previous.rows === next.rows) {\n return previous\n }\n return next\n })\n }\n\n streamState.listeners.add(listener)\n // Force-sync in case size changed between render and effect.\n listener(streamState.size)\n\n if (!streamState.attached) {\n streamState.attached = true\n stream.setMaxListeners?.(20)\n stream.on?.('resize', streamState.onResize)\n }\n\n return () => {\n streamState.listeners.delete(listener)\n if (streamState.listeners.size === 0 && streamState.attached) {\n streamState.attached = false\n stream.off?.('resize', streamState.onResize)\n }\n }\n }, [stream])\n\n return size\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,iBAAiB;AAC1B,SAAS,WAAW,SAAS,gBAAgB;AAY7C,IAAM,eAAe,oBAAI,QAA+B;AAExD,SAAS,SAAS,QAA2D;AAC3E,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,eAAe,QAA+B;AACrD,QAAM,WAAW,aAAa,IAAI,MAAM;AACxC,MAAI,SAAU,QAAO;AAErB,QAAM,QAAqB;AAAA,IACzB,MAAM,SAAS,MAA6C;AAAA,IAC5D,WAAW,oBAAI,IAAI;AAAA,IACnB,UAAU,MAAM;AACd,YAAM,OAAO,SAAS,MAA6C;AACnE,YAAM,OAAO;AACb,YAAM,UAAU,QAAQ,cAAY,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,UAAU;AAAA,EACZ;AAEA,eAAa,IAAI,QAAQ,KAAK;AAC9B,SAAO;AACT;AAEO,SAAS,kBAAgC;AAC9C,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,SAAS;AAAA,IACb,MAAO,UAAU,QAAQ;AAAA,IACzB,CAAC,MAAM;AAAA,EACT;AACA,QAAM,QAAQ,eAAe,MAAM;AAEnC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAuB,MAAM,MAAM,IAAI;AAE/D,YAAU,MAAM;AACd,UAAM,cAAc,eAAe,MAAM;AACzC,UAAM,WAAW,CAAC,SAAuB;AACvC,cAAQ,cAAY;AAClB,YAAI,SAAS,YAAY,KAAK,WAAW,SAAS,SAAS,KAAK,MAAM;AACpE,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,gBAAY,UAAU,IAAI,QAAQ;AAElC,aAAS,YAAY,IAAI;AAEzB,QAAI,CAAC,YAAY,UAAU;AACzB,kBAAY,WAAW;AACvB,aAAO,kBAAkB,EAAE;AAC3B,aAAO,KAAK,UAAU,YAAY,QAAQ;AAAA,IAC5C;AAEA,WAAO,MAAM;AACX,kBAAY,UAAU,OAAO,QAAQ;AACrC,UAAI,YAAY,UAAU,SAAS,KAAK,YAAY,UAAU;AAC5D,oBAAY,WAAW;AACvB,eAAO,MAAM,UAAU,YAAY,QAAQ;AAAA,MAC7C;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|