pybao-cli 1.4.39 → 1.4.41
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/REPL-X37QFHMY.js +47 -0
- package/dist/{acp-6LBQJVMX.js → acp-YPG3ODYW.js} +29 -29
- package/dist/{agentsValidate-SLBW2ESZ.js → agentsValidate-3UWY6SGZ.js} +7 -7
- package/dist/{ask-DB4F3WJG.js → ask-KPWV37T5.js} +28 -28
- package/dist/{autoUpdater-CYDJVIEC.js → autoUpdater-J45KPDGS.js} +3 -3
- package/dist/{chunk-HD4IO3I5.js → chunk-2L67XJY6.js} +60 -66
- package/dist/{chunk-HD4IO3I5.js.map → chunk-2L67XJY6.js.map} +2 -2
- package/dist/{chunk-3LNPU7WH.js → chunk-3KC257RS.js} +3 -3
- package/dist/{chunk-KWPH7MSB.js → chunk-4663HA7W.js} +1 -1
- package/dist/{chunk-DLBWS3IW.js → chunk-5AQPEKHM.js} +1 -1
- package/dist/{chunk-AI7FJQR4.js → chunk-6K3ESUEV.js} +111 -25
- package/dist/chunk-6K3ESUEV.js.map +7 -0
- package/dist/{chunk-GD43B2GV.js → chunk-6SRKKJNO.js} +1 -1
- package/dist/{chunk-UK4IHZU3.js → chunk-ABCEGXO7.js} +2 -2
- package/dist/{chunk-VHTIDAOJ.js → chunk-AOK6U7U7.js} +2 -2
- package/dist/{chunk-O5OT26P6.js → chunk-BDM7IINE.js} +1 -1
- package/dist/{chunk-TNAAGT3Q.js → chunk-BEP5VFCR.js} +3 -3
- package/dist/{chunk-RS2N2KBH.js → chunk-EADYBO22.js} +37 -45
- package/dist/{chunk-RS2N2KBH.js.map → chunk-EADYBO22.js.map} +2 -2
- package/dist/{chunk-ZGVGFR4C.js → chunk-FJBRBBAE.js} +1 -1
- package/dist/{chunk-E5EB22W4.js → chunk-GS2HTCOK.js} +4 -4
- package/dist/{chunk-7WCSSH3C.js → chunk-GW3QUBEN.js} +3 -3
- package/dist/{chunk-YJ2WXW2J.js → chunk-HC2UA3UA.js} +3 -3
- package/dist/{chunk-SBPVAFBQ.js → chunk-HSV2W6ZE.js} +2 -2
- package/dist/{chunk-VXQMCAPS.js → chunk-IGU3SZC3.js} +1 -1
- package/dist/{chunk-GXHSGPIF.js → chunk-IGYIVSD4.js} +4 -4
- package/dist/{chunk-4LXZDGCO.js → chunk-IZJC66JK.js} +3 -3
- package/dist/{chunk-6KSM5M7T.js → chunk-JF3APTJS.js} +1 -1
- package/dist/{chunk-7TGWBYFN.js → chunk-LQC2XIQ5.js} +4 -4
- package/dist/{chunk-GL3ZM7F3.js → chunk-MAQDSC4C.js} +3 -3
- package/dist/{chunk-DEYAAT6H.js → chunk-MKPXX4RV.js} +3 -3
- package/dist/{chunk-NMJYV37P.js → chunk-MMRONBNC.js} +2 -2
- package/dist/{chunk-VFQU3JSH.js → chunk-OS26ZCWF.js} +4 -4
- package/dist/{chunk-NNE44UHQ.js → chunk-UAFVGOA7.js} +2 -2
- package/dist/{chunk-N4GXGPVA.js → chunk-VCXKB4QH.js} +1 -1
- package/dist/{chunk-UUWI4VWU.js → chunk-Y4R6A5ZF.js} +1 -1
- package/dist/{chunk-UUWI4VWU.js.map → chunk-Y4R6A5ZF.js.map} +1 -1
- package/dist/{chunk-KNLFFHBT.js → chunk-Z7JVH236.js} +2 -2
- package/dist/{chunk-SSKQUKI7.js → chunk-ZQQ56UGL.js} +1 -1
- package/dist/{cli-FMCSS5QE.js → cli-PGYIYYGL.js} +106 -87
- package/dist/cli-PGYIYYGL.js.map +7 -0
- package/dist/commands-3QMEPLJI.js +51 -0
- package/dist/{config-YRHKZJO6.js → config-SRARC4UV.js} +4 -4
- package/dist/{context-ZZO64MRN.js → context-LYZN2WOR.js} +6 -6
- package/dist/{customCommands-2S7LYMG7.js → customCommands-G64J6TJU.js} +4 -4
- package/dist/{env-PQDRZBAW.js → env-NRGZD37J.js} +2 -2
- package/dist/{file-X7BE3MNR.js → file-B7ZHCEOY.js} +4 -4
- package/dist/index.js +3 -3
- package/dist/{llm-3KCTIVOM.js → llm-FB3ZW3AI.js} +29 -29
- package/dist/{llmLazy-HCTXTHRZ.js → llmLazy-DHIZM4VB.js} +1 -1
- package/dist/{loader-DKMJSH4V.js → loader-G4RUXY5F.js} +4 -4
- package/dist/{lsp-IXEAYT4K.js → lsp-G7G7KQ6Z.js} +6 -6
- package/dist/{lspAnchor-FKXOKCQZ.js → lspAnchor-4XUNRJYJ.js} +6 -6
- package/dist/{mcp-ZUJD3E4V.js → mcp-GP2OY5CW.js} +7 -7
- package/dist/{mentionProcessor-7GXI47P3.js → mentionProcessor-5VND2CWI.js} +6 -6
- package/dist/{messages-55HNRTQC.js → messages-DJTPGO5G.js} +1 -1
- package/dist/{model-R5X6XP7I.js → model-FY7P6LPI.js} +5 -5
- package/dist/{openai-FM7DX3GB.js → openai-R5JKUS7L.js} +5 -5
- package/dist/{outputStyles-ZLGIDCCJ.js → outputStyles-XPOEKV5L.js} +4 -4
- package/dist/{pluginRuntime-REF3E5F5.js → pluginRuntime-PLWSOKAW.js} +6 -6
- package/dist/{pluginValidation-E33USDYW.js → pluginValidation-M57BSDWY.js} +6 -6
- package/dist/prompts-V55TE46Y.js +53 -0
- package/dist/{pybAgentSessionLoad-PGTH6SZH.js → pybAgentSessionLoad-IDJQMXK3.js} +4 -4
- package/dist/{pybAgentSessionResume-IVBY65PN.js → pybAgentSessionResume-U2LJH3AF.js} +4 -4
- package/dist/{pybAgentStreamJsonSession-N2Q6LQHX.js → pybAgentStreamJsonSession-F2QIUJBH.js} +1 -1
- package/dist/{pybHooks-WIA5KKVN.js → pybHooks-KYHGMDRK.js} +4 -4
- package/dist/query-7J3FFRIB.js +55 -0
- package/dist/{registry-PT3XVAT6.js → registry-I5LJ4C6T.js} +5 -5
- package/dist/{ripgrep-2VWCSPH4.js → ripgrep-7AN4NOC7.js} +3 -3
- package/dist/{skillMarketplace-NHPAPZTS.js → skillMarketplace-Z7R6YX7F.js} +3 -3
- package/dist/{state-4AIVX6VM.js → state-DEPXOXNL.js} +2 -2
- package/dist/{theme-LKZFY5TU.js → theme-HXJ2OXED.js} +5 -5
- package/dist/{toolPermissionSettings-OVFT6D3R.js → toolPermissionSettings-4LMPOZYV.js} +6 -6
- package/dist/tools-FCGNXBLR.js +52 -0
- package/dist/{userInput-RHGZ225B.js → userInput-BYJMHASU.js} +30 -30
- package/package.json +1 -1
- package/dist/REPL-N62XVC35.js +0 -47
- package/dist/chunk-AI7FJQR4.js.map +0 -7
- package/dist/cli-FMCSS5QE.js.map +0 -7
- package/dist/commands-IJTOU4P3.js +0 -51
- package/dist/prompts-W7TUXY74.js +0 -53
- package/dist/query-BTG2T7NV.js +0 -55
- package/dist/tools-6ONPKOSL.js +0 -52
- /package/dist/{REPL-N62XVC35.js.map → REPL-X37QFHMY.js.map} +0 -0
- /package/dist/{acp-6LBQJVMX.js.map → acp-YPG3ODYW.js.map} +0 -0
- /package/dist/{agentsValidate-SLBW2ESZ.js.map → agentsValidate-3UWY6SGZ.js.map} +0 -0
- /package/dist/{ask-DB4F3WJG.js.map → ask-KPWV37T5.js.map} +0 -0
- /package/dist/{autoUpdater-CYDJVIEC.js.map → autoUpdater-J45KPDGS.js.map} +0 -0
- /package/dist/{chunk-3LNPU7WH.js.map → chunk-3KC257RS.js.map} +0 -0
- /package/dist/{chunk-KWPH7MSB.js.map → chunk-4663HA7W.js.map} +0 -0
- /package/dist/{chunk-DLBWS3IW.js.map → chunk-5AQPEKHM.js.map} +0 -0
- /package/dist/{chunk-GD43B2GV.js.map → chunk-6SRKKJNO.js.map} +0 -0
- /package/dist/{chunk-UK4IHZU3.js.map → chunk-ABCEGXO7.js.map} +0 -0
- /package/dist/{chunk-VHTIDAOJ.js.map → chunk-AOK6U7U7.js.map} +0 -0
- /package/dist/{chunk-O5OT26P6.js.map → chunk-BDM7IINE.js.map} +0 -0
- /package/dist/{chunk-TNAAGT3Q.js.map → chunk-BEP5VFCR.js.map} +0 -0
- /package/dist/{chunk-ZGVGFR4C.js.map → chunk-FJBRBBAE.js.map} +0 -0
- /package/dist/{chunk-E5EB22W4.js.map → chunk-GS2HTCOK.js.map} +0 -0
- /package/dist/{chunk-7WCSSH3C.js.map → chunk-GW3QUBEN.js.map} +0 -0
- /package/dist/{chunk-YJ2WXW2J.js.map → chunk-HC2UA3UA.js.map} +0 -0
- /package/dist/{chunk-SBPVAFBQ.js.map → chunk-HSV2W6ZE.js.map} +0 -0
- /package/dist/{chunk-VXQMCAPS.js.map → chunk-IGU3SZC3.js.map} +0 -0
- /package/dist/{chunk-GXHSGPIF.js.map → chunk-IGYIVSD4.js.map} +0 -0
- /package/dist/{chunk-4LXZDGCO.js.map → chunk-IZJC66JK.js.map} +0 -0
- /package/dist/{chunk-6KSM5M7T.js.map → chunk-JF3APTJS.js.map} +0 -0
- /package/dist/{chunk-7TGWBYFN.js.map → chunk-LQC2XIQ5.js.map} +0 -0
- /package/dist/{chunk-GL3ZM7F3.js.map → chunk-MAQDSC4C.js.map} +0 -0
- /package/dist/{chunk-DEYAAT6H.js.map → chunk-MKPXX4RV.js.map} +0 -0
- /package/dist/{chunk-NMJYV37P.js.map → chunk-MMRONBNC.js.map} +0 -0
- /package/dist/{chunk-VFQU3JSH.js.map → chunk-OS26ZCWF.js.map} +0 -0
- /package/dist/{chunk-NNE44UHQ.js.map → chunk-UAFVGOA7.js.map} +0 -0
- /package/dist/{chunk-N4GXGPVA.js.map → chunk-VCXKB4QH.js.map} +0 -0
- /package/dist/{chunk-KNLFFHBT.js.map → chunk-Z7JVH236.js.map} +0 -0
- /package/dist/{chunk-SSKQUKI7.js.map → chunk-ZQQ56UGL.js.map} +0 -0
- /package/dist/{commands-IJTOU4P3.js.map → commands-3QMEPLJI.js.map} +0 -0
- /package/dist/{config-YRHKZJO6.js.map → config-SRARC4UV.js.map} +0 -0
- /package/dist/{context-ZZO64MRN.js.map → context-LYZN2WOR.js.map} +0 -0
- /package/dist/{customCommands-2S7LYMG7.js.map → customCommands-G64J6TJU.js.map} +0 -0
- /package/dist/{env-PQDRZBAW.js.map → env-NRGZD37J.js.map} +0 -0
- /package/dist/{file-X7BE3MNR.js.map → file-B7ZHCEOY.js.map} +0 -0
- /package/dist/{llm-3KCTIVOM.js.map → llm-FB3ZW3AI.js.map} +0 -0
- /package/dist/{llmLazy-HCTXTHRZ.js.map → llmLazy-DHIZM4VB.js.map} +0 -0
- /package/dist/{loader-DKMJSH4V.js.map → loader-G4RUXY5F.js.map} +0 -0
- /package/dist/{lsp-IXEAYT4K.js.map → lsp-G7G7KQ6Z.js.map} +0 -0
- /package/dist/{lspAnchor-FKXOKCQZ.js.map → lspAnchor-4XUNRJYJ.js.map} +0 -0
- /package/dist/{mcp-ZUJD3E4V.js.map → mcp-GP2OY5CW.js.map} +0 -0
- /package/dist/{mentionProcessor-7GXI47P3.js.map → mentionProcessor-5VND2CWI.js.map} +0 -0
- /package/dist/{messages-55HNRTQC.js.map → messages-DJTPGO5G.js.map} +0 -0
- /package/dist/{model-R5X6XP7I.js.map → model-FY7P6LPI.js.map} +0 -0
- /package/dist/{openai-FM7DX3GB.js.map → openai-R5JKUS7L.js.map} +0 -0
- /package/dist/{outputStyles-ZLGIDCCJ.js.map → outputStyles-XPOEKV5L.js.map} +0 -0
- /package/dist/{pluginRuntime-REF3E5F5.js.map → pluginRuntime-PLWSOKAW.js.map} +0 -0
- /package/dist/{pluginValidation-E33USDYW.js.map → pluginValidation-M57BSDWY.js.map} +0 -0
- /package/dist/{prompts-W7TUXY74.js.map → prompts-V55TE46Y.js.map} +0 -0
- /package/dist/{pybAgentSessionLoad-PGTH6SZH.js.map → pybAgentSessionLoad-IDJQMXK3.js.map} +0 -0
- /package/dist/{pybAgentSessionResume-IVBY65PN.js.map → pybAgentSessionResume-U2LJH3AF.js.map} +0 -0
- /package/dist/{pybAgentStreamJsonSession-N2Q6LQHX.js.map → pybAgentStreamJsonSession-F2QIUJBH.js.map} +0 -0
- /package/dist/{pybHooks-WIA5KKVN.js.map → pybHooks-KYHGMDRK.js.map} +0 -0
- /package/dist/{query-BTG2T7NV.js.map → query-7J3FFRIB.js.map} +0 -0
- /package/dist/{registry-PT3XVAT6.js.map → registry-I5LJ4C6T.js.map} +0 -0
- /package/dist/{ripgrep-2VWCSPH4.js.map → ripgrep-7AN4NOC7.js.map} +0 -0
- /package/dist/{skillMarketplace-NHPAPZTS.js.map → skillMarketplace-Z7R6YX7F.js.map} +0 -0
- /package/dist/{state-4AIVX6VM.js.map → state-DEPXOXNL.js.map} +0 -0
- /package/dist/{theme-LKZFY5TU.js.map → theme-HXJ2OXED.js.map} +0 -0
- /package/dist/{toolPermissionSettings-OVFT6D3R.js.map → toolPermissionSettings-4LMPOZYV.js.map} +0 -0
- /package/dist/{tools-6ONPKOSL.js.map → tools-FCGNXBLR.js.map} +0 -0
- /package/dist/{userInput-RHGZ225B.js.map → userInput-BYJMHASU.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/tools/index.ts", "../src/tools/ai/AskExpertModelTool/AskExpertModelTool.tsx", "../src/utils/session/expertChatStorage.ts", "../src/tools/system/TaskOutputTool/TaskOutputTool.tsx", "../src/utils/session/backgroundTasks.ts", "../src/utils/tooling/toolOutputDisplay.ts", "../src/tools/system/TaskOutputTool/prompt.ts", "../src/tools/filesystem/DeleteTool/DeleteTool.tsx", "../src/tools/filesystem/DeleteTool/prompt.ts", "../src/tools/mcp/ListMcpResourcesTool/ListMcpResourcesTool.tsx", "../src/tools/mcp/ListMcpResourcesTool/prompt.ts", "../src/tools/lsTool/lsTool.tsx", "../src/tools/lsTool/prompt.ts", "../src/tools/search/LspTool/LspTool.tsx", "../src/tools/search/LspTool/prompt.ts", "../src/tools/mcp/ReadMcpResourceTool/ReadMcpResourceTool.tsx", "../src/tools/mcp/ReadMcpResourceTool/prompt.ts", "../src/tools/agent/TaskTool/TaskTool.tsx", "../src/utils/agent/transcripts.ts", "../src/tools/agent/TaskTool/prompt.ts", "../src/tools/agent/TaskTool/constants.ts", "../src/tools/interaction/TaskCreateTool/TaskCreateTool.tsx", "../src/utils/session/taskToolUtils.ts", "../src/tools/interaction/TaskCreateTool/prompt.ts", "../src/tools/interaction/TaskGetTool/TaskGetTool.tsx", "../src/tools/interaction/TaskGetTool/prompt.ts", "../src/tools/interaction/TaskListTool/TaskListTool.tsx", "../src/tools/interaction/TaskListTool/prompt.ts", "../src/tools/interaction/TaskUpdateTool/TaskUpdateTool.tsx", "../src/tools/interaction/TaskUpdateTool/prompt.ts"],
|
|
4
|
-
"sourcesContent": ["import { memoize } from 'lodash-es'\nimport { Tool } from '@tool'\nimport { AskExpertModelTool } from './ai/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './interaction/AskUserQuestionTool/AskUserQuestionTool'\nimport { BashTool } from './system/BashTool/BashTool'\nimport { TaskOutputTool } from './system/TaskOutputTool/TaskOutputTool'\nimport { EnterPlanModeTool } from './agent/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './agent/PlanModeTool/ExitPlanModeTool'\nimport { FileEditTool } from './filesystem/FileEditTool/FileEditTool'\nimport { FileReadTool } from './filesystem/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './filesystem/FileWriteTool/FileWriteTool'\nimport { DeleteTool } from './filesystem/DeleteTool/DeleteTool'\nimport { GlobTool } from './filesystem/GlobTool/GlobTool'\nimport { GrepTool } from './search/GrepTool/GrepTool'\nimport { KillShellTool } from './system/KillShellTool/KillShellTool'\nimport { ListMcpResourcesTool } from './mcp/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { LSTool } from './lsTool/lsTool'\nimport { LspTool } from './search/LspTool/LspTool'\nimport { MCPTool } from './mcp/MCPTool/MCPTool'\nimport { NotebookEditTool } from './filesystem/NotebookEditTool/NotebookEditTool'\nimport { ReadMcpResourceTool } from './mcp/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { SlashCommandTool } from './interaction/SlashCommandTool/SlashCommandTool'\nimport { SkillTool } from './ai/SkillTool/SkillTool'\nimport { TaskTool } from './agent/TaskTool/TaskTool'\nimport { TaskCreateTool } from './interaction/TaskCreateTool/TaskCreateTool'\nimport { TaskGetTool } from './interaction/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './interaction/TaskListTool/TaskListTool'\nimport { TaskUpdateTool } from './interaction/TaskUpdateTool/TaskUpdateTool'\nimport { WebFetchTool } from './network/WebFetchTool/WebFetchTool'\nimport { WebSearchTool } from './network/WebSearchTool/WebSearchTool'\nimport { getMCPTools } from '@services/mcpClient'\n\nexport const getAllTools = (): Tool[] => [\n TaskTool as unknown as Tool,\n AskExpertModelTool as unknown as Tool,\n BashTool as unknown as Tool,\n TaskOutputTool as unknown as Tool,\n KillShellTool as unknown as Tool,\n GlobTool as unknown as Tool,\n GrepTool as unknown as Tool,\n LSTool as unknown as Tool,\n LspTool as unknown as Tool,\n FileReadTool as unknown as Tool,\n FileEditTool as unknown as Tool,\n FileWriteTool as unknown as Tool,\n DeleteTool as unknown as Tool,\n NotebookEditTool as unknown as Tool,\n TaskCreateTool as unknown as Tool,\n TaskGetTool as unknown as Tool,\n TaskUpdateTool as unknown as Tool,\n TaskListTool as unknown as Tool,\n WebFetchTool as unknown as Tool,\n WebSearchTool as unknown as Tool,\n AskUserQuestionTool as unknown as Tool,\n EnterPlanModeTool as unknown as Tool,\n ExitPlanModeTool as unknown as Tool,\n SlashCommandTool as unknown as Tool,\n SkillTool as unknown as Tool,\n ListMcpResourcesTool as unknown as Tool,\n ReadMcpResourceTool as unknown as Tool,\n MCPTool as unknown as Tool,\n]\n\nexport const getTools = memoize(\n async (_includeOptional?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, i) => isEnabled[i])\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport {\n createUserMessage,\n createAssistantMessage,\n INTERRUPT_MESSAGE,\n} from '@utils/messages'\nimport { logError } from '@utils/log'\nimport {\n createExpertChatSession,\n loadExpertChatSession,\n getSessionMessages,\n addMessageToSession,\n} from '@utils/session/expertChatStorage'\nimport { queryLLM } from '@services/llmLazy'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { applyMarkdown } from '@utils/text/markdown'\n\nexport const inputSchema = z.strictObject({\n question: z\n .string()\n .describe(\n 'COMPLETE SELF-CONTAINED QUESTION: Must include full background context, relevant details, and a clear independent question. The expert model will receive ONLY this content with no access to previous conversation or external context. Structure as: 1) Background/Context 2) Specific situation/problem 3) Clear question. Ensure the expert can fully understand and respond without needing additional information.',\n ),\n expert_model: z\n .string()\n .describe(\n 'The expert model to use (e.g., gpt-5, claude-3-5-sonnet-20241022)',\n ),\n chat_session_id: z\n .string()\n .describe(\n 'Chat session ID: use \"new\" for new session or existing session ID',\n ),\n})\n\ntype In = typeof inputSchema\nexport type Out = {\n chatSessionId: string\n expertModelName: string\n expertAnswer: string\n}\n\nexport const AskExpertModelTool = {\n name: 'AskExpertModel',\n async description() {\n return 'Consult external AI models for expert opinions and analysis'\n },\n async prompt() {\n return `Ask a question to a specific external AI model for expert analysis.\n\nThis tool allows you to consult different AI models for their unique perspectives and expertise.\n\nCRITICAL REQUIREMENT FOR QUESTION PARAMETER:\nThe question MUST be completely self-contained and include:\n1. FULL BACKGROUND CONTEXT - All relevant information the expert needs\n2. SPECIFIC SITUATION - Clear description of the current scenario/problem\n3. INDEPENDENT QUESTION - What exactly you want the expert to analyze/answer\n\nThe expert model receives ONLY your question content with NO access to:\n- Previous conversation history (unless using existing session) \n- Current codebase or file context\n- User's current task or project details\n\nIMPORTANT: This tool is for asking questions to models, not for task execution.\n- Use when you need a specific model's opinion or analysis\n- Use when you want to compare different models' responses\n- Use the @ask-[model] format when available\n\nThe expert_model parameter accepts:\n- OpenAI: gpt-4, gpt-5, o1-preview\n- Messages API: claude-3-5-sonnet, claude-3-opus \n- Others: kimi, gemini-pro, mixtral\n\nExample of well-structured question:\n\"Background: I'm working on a React TypeScript application with performance issues. The app renders a large list of 10,000 items using a simple map() function, causing UI freezing.\n\nCurrent situation: Users report 3-5 second delays when scrolling through the list. The component re-renders the entire list on every state change.\n\nQuestion: What are the most effective React optimization techniques for handling large lists, and how should I prioritize implementing virtualization vs memoization vs other approaches?\"`\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n inputSchema,\n userFacingName() {\n return 'AskExpertModel'\n },\n async isEnabled() {\n return true\n },\n needsPermissions(): boolean {\n return false\n },\n async validateInput(\n { question, expert_model, chat_session_id },\n context?: any,\n ): Promise<ValidationResult> {\n if (!question.trim()) {\n return { result: false, message: 'Question cannot be empty' }\n }\n\n if (!expert_model.trim()) {\n return { result: false, message: 'Expert model must be specified' }\n }\n\n if (!chat_session_id.trim()) {\n return {\n result: false,\n message:\n 'Chat session ID must be specified (use \"new\" for new session)',\n }\n }\n\n try {\n const modelManager = getModelManager()\n\n let currentModel: string\n if (context?.agentId && context?.options?.model) {\n currentModel = context.options.model\n } else {\n currentModel = modelManager.getModelName('main') || ''\n }\n\n const normalizedExpert = expert_model\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n const normalizedCurrent = currentModel\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n\n if (normalizedExpert === normalizedCurrent) {\n return {\n result: false,\n message: `You are already running as ${currentModel}. Consulting the same model would be redundant. Please choose a different model or handle the task directly.`,\n }\n }\n } catch (e) {\n debugLogger.error('AskExpertModel', {\n message: 'Could not determine current model',\n error: e,\n })\n }\n\n try {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(expert_model)\n\n if (!modelResolution.success) {\n const availableModels = modelManager.getAllAvailableModelNames()\n if (availableModels.length > 0) {\n return {\n result: false,\n message: `Model '${expert_model}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expert_model}' needs to be configured using /model command.`,\n }\n } else {\n return {\n result: false,\n message: `Model '${expert_model}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\n }\n }\n }\n } catch (error) {\n logError(error)\n return {\n result: false,\n message: `Failed to validate expert model '${expert_model}'. Please check your model configuration.`,\n }\n }\n\n return { result: true }\n },\n\n renderToolUseMessage(\n { question, expert_model, chat_session_id },\n { verbose },\n ) {\n if (!question || !expert_model) return null\n const isNewSession = chat_session_id === 'new'\n const sessionDisplay = isNewSession\n ? 'new session'\n : `session ${chat_session_id.substring(0, 5)}...`\n const theme = getTheme()\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {expert_model}\n </Text>\n <Text color={theme.secondaryText}>{sessionDisplay}</Text>\n <Box marginTop={1}>\n <Text color={theme.text}>\n {question.length > 300\n ? question.substring(0, 300) + '...'\n : question}\n </Text>\n </Box>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {expert_model}{' '}\n </Text>\n <Text color={theme.secondaryText} dimColor>\n ({sessionDisplay})\n </Text>\n </Box>\n )\n },\n\n renderToolResultMessage(content) {\n const verbose = true\n const theme = getTheme()\n\n if (typeof content === 'object' && content && 'expertAnswer' in content) {\n const expertResult = content as Out\n const isError =\n expertResult.expertAnswer.startsWith('Error') ||\n expertResult.expertAnswer.includes('failed')\n const isInterrupted = expertResult.chatSessionId === 'interrupted'\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>Consultation interrupted</Text>\n </Box>\n )\n }\n\n const answerText = verbose\n ? expertResult.expertAnswer.trim()\n : expertResult.expertAnswer.length > 500\n ? expertResult.expertAnswer.substring(0, 500) + '...'\n : expertResult.expertAnswer.trim()\n\n if (isError) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">{answerText}</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={theme.text}>\n Response from {expertResult.expertModelName}:\n </Text>\n <Box marginTop={1}>\n <Text color={theme.text}>{applyMarkdown(answerText)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.secondaryText} dimColor>\n Session: {expertResult.chatSessionId.substring(0, 8)}\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>Consultation completed</Text>\n </Box>\n )\n },\n\n renderResultForAssistant(output: Out): string {\n return `[Expert consultation completed]\nExpert Model: ${output.expertModelName}\nSession ID: ${output.chatSessionId}\nTo continue this conversation with context preservation, use this Session ID in your next AskExpertModel call to maintain the full conversation history and context.\n\n${output.expertAnswer}`\n },\n\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n\n async *call(\n { question, expert_model, chat_session_id },\n { abortController, readFileTimestamps },\n ) {\n const expertModel = expert_model\n\n let sessionId: string\n let isInterrupted = false\n\n const abortListener = () => {\n isInterrupted = true\n }\n abortController.signal.addEventListener('abort', abortListener)\n\n try {\n if (abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n if (chat_session_id === 'new') {\n try {\n const session = createExpertChatSession(expertModel)\n sessionId = session.sessionId\n } catch (error) {\n logError(error)\n throw new Error('Failed to create new chat session')\n }\n } else {\n sessionId = chat_session_id\n try {\n const session = loadExpertChatSession(sessionId)\n if (!session) {\n const newSession = createExpertChatSession(expertModel)\n sessionId = newSession.sessionId\n }\n } catch (error) {\n logError(error)\n try {\n const newSession = createExpertChatSession(expertModel)\n sessionId = newSession.sessionId\n } catch (createError) {\n logError(createError)\n throw new Error('Unable to create or load chat session')\n }\n }\n }\n\n if (isInterrupted || abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n\n let historyMessages: Array<{ role: string; content: string }>\n try {\n historyMessages = getSessionMessages(sessionId)\n } catch (error) {\n logError(error)\n historyMessages = []\n }\n\n const messages = [...historyMessages, { role: 'user', content: question }]\n\n let systemMessages\n try {\n systemMessages = messages.map(msg =>\n msg.role === 'user'\n ? createUserMessage(msg.content)\n : createAssistantMessage(msg.content),\n )\n } catch (error) {\n logError(error)\n throw new Error('Failed to prepare conversation messages')\n }\n\n if (isInterrupted || abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Connecting to ${expertModel}... (timeout: 5 minutes)`,\n ),\n }\n\n let response\n try {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(expertModel)\n\n debugLogger.api('EXPERT_MODEL_RESOLUTION', {\n requestedModel: expertModel,\n success: modelResolution.success,\n profileName: modelResolution.profile?.name,\n profileModelName: modelResolution.profile?.modelName,\n provider: modelResolution.profile?.provider,\n isActive: modelResolution.profile?.isActive,\n error: modelResolution.error,\n })\n\n const timeoutMs = 300000\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(\n new Error(\n `Expert model query timed out after ${timeoutMs / 1000}s`,\n ),\n )\n }, timeoutMs)\n })\n\n response = await Promise.race([\n queryLLM(\n systemMessages,\n [],\n 0,\n [],\n abortController.signal,\n {\n safeMode: false,\n model: expertModel,\n prependCLISysprompt: false,\n },\n ),\n timeoutPromise,\n ])\n } catch (error: any) {\n logError(error)\n\n if (\n error.name === 'AbortError' ||\n abortController.signal?.aborted ||\n isInterrupted\n ) {\n return yield* this.handleInterrupt()\n }\n\n if (error.message?.includes('timed out')) {\n throw new Error(\n `Expert model '${expertModel}' timed out after 5 minutes.\\n\\n` +\n `Suggestions:\\n` +\n ` - The model might be experiencing high load\\n` +\n ` - Try a different model or retry later\\n` +\n ` - Consider breaking down your question into smaller parts`,\n )\n }\n\n if (error.message?.includes('rate limit')) {\n throw new Error(\n `Rate limit exceeded for ${expertModel}.\\n\\n` +\n `Please wait a moment and try again, or use a different model.`,\n )\n }\n\n if (error.message?.includes('invalid api key')) {\n throw new Error(\n `Invalid API key for ${expertModel}.\\n\\n` +\n `Please check your model configuration with /model command.`,\n )\n }\n\n if (\n error.message?.includes('model not found') ||\n error.message?.includes('Failed to resolve model')\n ) {\n try {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n if (availableModels.length > 0) {\n throw new Error(\n `Model '${expertModel}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expertModel}' needs to be configured using /model command.`,\n )\n } else {\n throw new Error(\n `Model '${expertModel}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\n )\n }\n } catch (modelError) {\n throw new Error(\n `Model '${expertModel}' not found. Please check model configuration or inform user about the issue.`,\n )\n }\n }\n\n throw new Error(\n `Expert model query failed: ${error.message || 'Unknown error'}`,\n )\n }\n\n let expertAnswer: string\n try {\n if (!response?.message?.content) {\n throw new Error('No content in expert response')\n }\n\n expertAnswer = response.message.content\n .filter(block => block.type === 'text')\n .map(block => (block as any).text)\n .join('\\n')\n\n if (!expertAnswer.trim()) {\n throw new Error('Expert response was empty')\n }\n } catch (error) {\n logError(error)\n throw new Error('Failed to process expert response')\n }\n\n try {\n addMessageToSession(sessionId, 'user', question)\n addMessageToSession(sessionId, 'assistant', expertAnswer)\n } catch (error) {\n logError(error)\n }\n\n const result: Out = {\n chatSessionId: sessionId,\n expertModelName: expertModel,\n expertAnswer: expertAnswer,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error: any) {\n if (\n error.name === 'AbortError' ||\n abortController.signal?.aborted ||\n isInterrupted\n ) {\n return yield* this.handleInterrupt()\n }\n\n logError(error)\n\n const errorSessionId = sessionId || 'error-session'\n\n const errorMessage =\n error.message || 'Expert consultation failed with unknown error'\n const result: Out = {\n chatSessionId: errorSessionId,\n expertModelName: expertModel,\n expertAnswer: `\u274C ${errorMessage}`,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } finally {\n abortController.signal.removeEventListener('abort', abortListener)\n }\n },\n\n async *handleInterrupt() {\n yield {\n type: 'result',\n data: {\n chatSessionId: 'interrupted',\n expertModelName: 'cancelled',\n expertAnswer: INTERRUPT_MESSAGE,\n },\n resultForAssistant: INTERRUPT_MESSAGE,\n }\n },\n}\n", "import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { resolveXdgDataPath } from '@utils/config/env'\n\n\nexport interface ChatMessage {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport interface ExpertChatSession {\n sessionId: string\n expertModel: string\n messages: ChatMessage[]\n createdAt: number\n lastUpdated: number\n}\n\nfunction getExpertChatDirectory(): string {\n const override = process.env.ANYKODE_CONFIG_DIR?.trim()\n const expertChatDir = override\n ? join(override, 'expert-chats')\n : resolveXdgDataPath('expert-chats')\n\n if (!existsSync(expertChatDir)) {\n mkdirSync(expertChatDir, { recursive: true })\n }\n\n return expertChatDir\n}\n\nfunction getSessionFilePath(sessionId: string): string {\n return join(getExpertChatDirectory(), `${sessionId}.json`)\n}\n\nexport function createExpertChatSession(\n expertModel: string,\n): ExpertChatSession {\n const sessionId = randomUUID().slice(0, 5)\n const session: ExpertChatSession = {\n sessionId,\n expertModel,\n messages: [],\n createdAt: Date.now(),\n lastUpdated: Date.now(),\n }\n\n saveExpertChatSession(session)\n return session\n}\n\nexport function loadExpertChatSession(\n sessionId: string,\n): ExpertChatSession | null {\n const filePath = getSessionFilePath(sessionId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as ExpertChatSession\n } catch (error) {\n logError(error)\n debugLogger.warn('EXPERT_CHAT_SESSION_LOAD_FAILED', {\n sessionId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function saveExpertChatSession(session: ExpertChatSession): void {\n const filePath = getSessionFilePath(session.sessionId)\n\n try {\n session.lastUpdated = Date.now()\n writeFileSync(filePath, JSON.stringify(session, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('EXPERT_CHAT_SESSION_SAVE_FAILED', {\n sessionId: session.sessionId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function addMessageToSession(\n sessionId: string,\n role: 'user' | 'assistant',\n content: string,\n): ExpertChatSession | null {\n const session = loadExpertChatSession(sessionId)\n if (!session) {\n return null\n }\n\n session.messages.push({ role, content })\n saveExpertChatSession(session)\n\n return session\n}\n\nexport function getSessionMessages(sessionId: string): ChatMessage[] {\n const session = loadExpertChatSession(sessionId)\n return session?.messages || []\n}\n\nexport function generateSessionId(): string {\n return randomUUID().slice(0, 5)\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport type { Tool, ToolUseContext, ValidationResult } from '@tool'\nimport { BunShell } from '@utils/bun/shell'\nimport {\n getBackgroundAgentTaskSnapshot,\n waitForBackgroundAgentTask,\n} from '@utils/session/backgroundTasks'\nimport { createAssistantMessage } from '@utils/messages'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\nimport { readTaskOutput } from '@utils/log/taskOutputStore'\nimport { LspFacade } from '../../../lsp/index'\nimport { formatDiagnosticsPretty } from '../../../lsp/formatters'\n\nconst inputSchema = z.strictObject({\n task_id: z.string().describe('The task ID to get output from'),\n block: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to wait for completion'),\n timeout: z\n .number()\n .min(0)\n .max(600000)\n .optional()\n .default(30000)\n .describe('Max wait time in ms'),\n analyze: z\n .boolean()\n .optional()\n .describe('Analyze the output for errors and warnings'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype TaskType = 'local_bash' | 'local_agent' | 'remote_agent'\ntype TaskStatus = 'running' | 'pending' | 'completed' | 'failed' | 'killed'\n\ntype TaskSummary = {\n task_id: string\n task_type: TaskType\n status: TaskStatus\n description: string\n output?: string\n exitCode?: number | null\n prompt?: string\n result?: string\n error?: string\n analysis?: string\n}\n\ntype Output = {\n retrieval_status: 'success' | 'timeout' | 'not_ready'\n task: TaskSummary | null\n}\n\nfunction isTaskOutputLspAnalysisEnabled(): boolean {\n const raw = String(process.env.PYB_TASKOUTPUT_LSP_ANALYSIS ?? '')\n .trim()\n .toLowerCase()\n if (!raw) return false\n if (raw === '1' || raw === 'true' || raw === 'on' || raw === 'yes')\n return true\n if (raw === '0' || raw === 'false' || raw === 'off' || raw === 'no')\n return false\n return false\n}\n\nfunction normalizeTaskOutputInput(input: Record<string, unknown>): Input {\n const task_id =\n (typeof input.task_id === 'string' && input.task_id) ||\n (typeof (input as any).agentId === 'string' &&\n String((input as any).agentId)) ||\n (typeof (input as any).bash_id === 'string' &&\n String((input as any).bash_id)) ||\n ''\n\n const block = typeof input.block === 'boolean' ? input.block : true\n const analyze = typeof input.analyze === 'boolean' ? input.analyze : false\n\n const timeout =\n typeof input.timeout === 'number'\n ? input.timeout\n : typeof (input as any).wait_up_to === 'number'\n ? Number((input as any).wait_up_to) * 1000\n : 30000\n\n return { task_id, block, timeout, analyze }\n}\n\nfunction taskStatusFromBash(\n bg: ReturnType<BunShell['getBackgroundOutput']>,\n): TaskStatus {\n if (!bg) return 'failed'\n if (bg.killed) return 'killed'\n if (bg.code === null) return 'running'\n return bg.code === 0 ? 'completed' : 'failed'\n}\n\nfunction buildTaskSummary(taskId: string): TaskSummary | null {\n const bg = BunShell.getInstance().getBackgroundOutput(taskId)\n if (bg) {\n return {\n task_id: taskId,\n task_type: 'local_bash',\n status: taskStatusFromBash(bg),\n description: bg.command,\n output: readTaskOutput(taskId),\n exitCode: bg.code,\n }\n }\n\n const agent = getBackgroundAgentTaskSnapshot(taskId)\n if (agent) {\n const output = readTaskOutput(taskId) || agent.resultText || ''\n return {\n task_id: taskId,\n task_type: 'local_agent',\n status: agent.status,\n description: agent.description,\n output,\n prompt: agent.prompt,\n result: output,\n error: agent.error,\n }\n }\n\n return null\n}\n\nexport async function analyzeOutputWithLsp(output: string, exitCode?: number | null): Promise<string> {\n const errorCount = (output.match(/Error:/gi) || []).length\n const warningCount = (output.match(/Warning:/gi) || []).length\n \n let summary = ''\n if (exitCode === 0) {\n summary = 'Success'\n } else if (exitCode !== undefined && exitCode !== null) {\n summary = `Failed (Exit Code: ${exitCode})`\n } else {\n summary = 'Completed'\n }\n\n const parts = [summary]\n if (errorCount > 0) parts.push(`${errorCount} Error${errorCount === 1 ? '' : 's'}`)\n if (warningCount > 0) parts.push(`${warningCount} Warning${warningCount === 1 ? '' : 's'}`)\n \n if (!isTaskOutputLspAnalysisEnabled()) {\n parts.push('LSP Analysis: disabled')\n return parts.join(', ')\n }\n if (exitCode === 0 && errorCount === 0 && warningCount === 0) {\n parts.push('LSP Analysis: skipped')\n return parts.join(', ')\n }\n\n if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {\n try {\n const { isAbsolute, resolve } = await import('path')\n const { getSessionRoot } = await import('@utils/state')\n \n const lines = output.split('\\n')\n const uniqueFiles = new Set<string>()\n const lspSuggestions: string[] = []\n\n // Regex to find file paths\n // Matches:\n // /path/to/file.ts:12:34\n // C:\\path\\to\\file.ts(12,34)\n // relative/path/file.ts:12\n // src/main.ts(11,5)\n const pathRegex = /(?:[a-zA-Z]:\\\\|(?:\\/|\\\\))?[\\w\\-\\.]+(?:(?:\\/|\\\\)[\\w\\-\\.]+)+\\.(?:ts|tsx|js|jsx|py|java|cs|cpp|c|rs|go)(?::\\d+|:\\d+:\\d+|\\(\\d+,\\d+\\))/g\n \n for (const line of lines) {\n const matches = line.match(pathRegex)\n if (matches) {\n for (const match of matches) {\n // Extract clean path\n let cleanPath = match\n \n // Remove (line,col) format\n if (cleanPath.includes('(')) {\n cleanPath = cleanPath.split('(')[0]\n } else {\n // Remove :line:col or :line at the end\n // Only match if preceded by .ext or similar, to avoid stripping drive letter?\n // The regex ensures match ends with digits.\n cleanPath = cleanPath.replace(/:\\d+(?::\\d+)?$/, '')\n }\n \n uniqueFiles.add(cleanPath)\n }\n }\n }\n if (uniqueFiles.size === 0) {\n parts.push('LSP Analysis: no files detected')\n return parts.join(', ')\n }\n\n for (const file of uniqueFiles) {\n try {\n // Ensure absolute path\n const absPath = isAbsolute(file) ? file : resolve(getSessionRoot(), file)\n await LspFacade.run({\n operation: 'diagnostics',\n filePath: absPath,\n waitForDiagnostics: true,\n timeoutMs: 2000,\n rootPath: getSessionRoot(),\n })\n\n const diagnostics = await LspFacade.diagnostics(absPath, {\n rootPath: getSessionRoot(),\n })\n if (diagnostics && diagnostics.length > 0) {\n const pretty = formatDiagnosticsPretty(diagnostics, { maxItems: 3 })\n if (pretty) {\n lspSuggestions.push(`LSP Diagnostics for ${file}:`)\n lspSuggestions.push(pretty)\n }\n }\n } catch (e) {\n // ignore\n console.error('LSP Analysis Error:', e)\n }\n }\n\n if (lspSuggestions.length > 0) {\n parts.push('\\nLSP Analysis:\\n' + lspSuggestions.join('\\n'))\n } else {\n parts.push('LSP Analysis: no diagnostics')\n }\n\n } catch (e) {\n // Ignore LSP analysis errors\n console.error('LSP Analysis Setup Error:', e)\n }\n }\n \n return parts.join(', ')\n}\n\nfunction analyzeOutput(output: string, exitCode?: number | null): string {\n // Deprecated sync version, kept for compatibility if needed, but we should use async version\n return 'Use analyzeOutputWithLsp'\n}\n\nasync function waitForBashTaskCompletion(args: {\n taskId: string\n timeoutMs: number\n signal: AbortSignal\n}): Promise<TaskSummary | null> {\n const { taskId, timeoutMs, signal } = args\n const startedAt = Date.now()\n\n while (Date.now() - startedAt < timeoutMs) {\n if (signal.aborted) return null\n const summary = buildTaskSummary(taskId)\n if (!summary) return null\n if (summary.status !== 'running' && summary.status !== 'pending')\n return summary\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return buildTaskSummary(taskId)\n}\n\nexport const TaskOutputTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Task Output'\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return false\n },\n async prompt() {\n return PROMPT\n },\n renderToolUseMessage(input: any) {\n const normalized = normalizeTaskOutputInput(input as any)\n if (!normalized.block) return 'non-blocking'\n return ''\n },\n renderToolUseRejectedMessage() {\n return null\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n const theme = getTheme()\n\n if (\n output.retrieval_status === 'timeout' ||\n output.retrieval_status === 'not_ready'\n ) {\n return (\n <Box>\n <Text color={theme.secondaryText}>Task is still running\u2026</Text>\n </Box>\n )\n }\n\n if (!output.task) {\n return (\n <Box>\n <Text color={theme.secondaryText}>No task output available</Text>\n </Box>\n )\n }\n\n if (output.task.task_type === 'local_agent') {\n const lines = output.task.result\n ? output.task.result.split('\\n').length\n : 0\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n Read output (ctrl+o to expand)\n </Text>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n {output.task.description} ({lines} lines)\n </Text>\n {output.task.prompt ? (\n <Box paddingLeft={2}>\n <Text color={theme.secondaryText}>{output.task.prompt}</Text>\n </Box>\n ) : null}\n {output.task.result ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(output.task.result, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n {output.task.error ? (\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text color={theme.error} bold>\n Error:\n </Text>\n <Text color={theme.error}>{output.task.error}</Text>\n </Box>\n ) : null}\n </Box>\n )\n }\n\n const content = output.task.output?.trimEnd() ?? ''\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n {content.length > 0\n ? 'Read output (ctrl+o to expand)'\n : '(No content)'}\n </Text>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.secondaryText}>{output.task.description}</Text>\n {content ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(content, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n const parts: string[] = []\n parts.push(\n `<retrieval_status>${output.retrieval_status}</retrieval_status>`,\n )\n\n if (output.task) {\n parts.push(`<task_id>${output.task.task_id}</task_id>`)\n parts.push(`<task_type>${output.task.task_type}</task_type>`)\n parts.push(`<status>${output.task.status}</status>`)\n if (output.task.exitCode !== undefined && output.task.exitCode !== null) {\n parts.push(`<exit_code>${output.task.exitCode}</exit_code>`)\n }\n if (output.task.output?.trim()) {\n parts.push(`<output>\\n${output.task.output.trimEnd()}\\n</output>`)\n }\n if (output.task.error) {\n parts.push(`<error>${output.task.error}</error>`)\n }\n if (output.task.analysis) {\n parts.push(`<analysis>${output.task.analysis}</analysis>`)\n }\n }\n\n return parts.join('\\n\\n')\n },\n async validateInput(input: Input): Promise<ValidationResult> {\n if (!input.task_id) {\n return { result: false, message: 'Task ID is required', errorCode: 1 }\n }\n\n const task = buildTaskSummary(input.task_id)\n if (!task) {\n return {\n result: false,\n message: `No task found with ID: ${input.task_id}`,\n errorCode: 2,\n }\n }\n\n return { result: true }\n },\n async *call(input: Input, context: ToolUseContext) {\n const normalized = normalizeTaskOutputInput(input as any)\n const taskId = normalized.task_id\n const block = normalized.block\n const timeoutMs = normalized.timeout\n const analyze = normalized.analyze\n\n const initial = buildTaskSummary(taskId)\n if (!initial) {\n throw new Error(`No task found with ID: ${taskId}`)\n }\n\n if (!block) {\n const isDone =\n initial.status !== 'running' && initial.status !== 'pending'\n \n if (analyze) {\n initial.analysis = await analyzeOutputWithLsp(initial.output || '', initial.exitCode)\n }\n\n const out: Output = {\n retrieval_status: isDone ? 'success' : 'not_ready',\n task: initial,\n }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${initial.description ? ` ${initial.description}\\n` : ''} Waiting for task (esc to give additional instructions)</tool-progress>`,\n ),\n }\n\n let finalTask: TaskSummary | null = null\n\n if (initial.task_type === 'local_agent') {\n try {\n const task = await waitForBackgroundAgentTask(\n taskId,\n timeoutMs,\n context.abortController.signal,\n )\n finalTask = task ? buildTaskSummary(taskId) : null\n } catch {\n finalTask = buildTaskSummary(taskId)\n }\n } else {\n finalTask = await waitForBashTaskCompletion({\n taskId,\n timeoutMs,\n signal: context.abortController.signal,\n })\n }\n\n if (!finalTask) {\n const out: Output = { retrieval_status: 'timeout', task: null }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n if (finalTask.status === 'running' || finalTask.status === 'pending') {\n const out: Output = { retrieval_status: 'timeout', task: finalTask }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n if (analyze) {\n finalTask.analysis = await analyzeOutputWithLsp(finalTask.output || '', finalTask.exitCode)\n }\n\n const out: Output = { retrieval_status: 'success', task: finalTask }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import type { Message as ConversationMessage } from '@query'\n\nexport type BackgroundAgentStatus =\n | 'running'\n | 'completed'\n | 'failed'\n | 'killed'\n\nexport type BackgroundAgentTask = {\n type: 'async_agent'\n agentId: string\n description: string\n prompt: string\n status: BackgroundAgentStatus\n startedAt: number\n completedAt?: number\n error?: string\n resultText?: string\n messages: ConversationMessage[]\n retrieved?: boolean\n}\n\nexport type BackgroundAgentTaskRuntime = BackgroundAgentTask & {\n abortController: AbortController\n done: Promise<void>\n}\n\nconst backgroundTasks = new Map<string, BackgroundAgentTaskRuntime>()\n\nexport function getBackgroundAgentTask(\n agentId: string,\n): BackgroundAgentTaskRuntime | undefined {\n return backgroundTasks.get(agentId)\n}\n\nexport function getBackgroundAgentTaskSnapshot(\n agentId: string,\n): BackgroundAgentTask | undefined {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n const { abortController: _abortController, done: _done, ...snapshot } = task\n return snapshot\n}\n\nexport function upsertBackgroundAgentTask(\n task: BackgroundAgentTaskRuntime,\n): void {\n backgroundTasks.set(task.agentId, task)\n}\n\nexport function markBackgroundAgentTaskRetrieved(agentId: string): void {\n const task = backgroundTasks.get(agentId)\n if (!task) return\n task.retrieved = true\n}\n\nexport async function waitForBackgroundAgentTask(\n agentId: string,\n waitUpToMs: number,\n signal: AbortSignal,\n): Promise<BackgroundAgentTaskRuntime | undefined> {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n if (task.status !== 'running') return task\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Request timed out'))\n }, waitUpToMs)\n timeoutId.unref?.()\n })\n\n const abortPromise = new Promise<never>((_, reject) => {\n if (signal.aborted) {\n reject(new Error('Request aborted'))\n return\n }\n const onAbort = () => reject(new Error('Request aborted'))\n signal.addEventListener('abort', onAbort, { once: true })\n })\n\n await Promise.race([task.done, timeoutPromise, abortPromise])\n return backgroundTasks.get(agentId)\n}\n", "function isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nexport function isPackagedRuntime(): boolean {\n if (isTruthyEnv(process.env.PYB_PACKAGED)) return true\n\n try {\n const exec = (process.execPath || '').split(/[\\\\/]/).pop()?.toLowerCase()\n if (!exec) return false\n if (exec === 'bun' || exec === 'bun.exe') return false\n if (exec === 'node' || exec === 'node.exe') return false\n return true\n } catch {\n return false\n }\n}\n\nexport type TruncateResult = {\n text: string\n truncated: boolean\n omittedLines: number\n omittedChars: number\n}\n\nexport function truncateTextForDisplay(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): TruncateResult {\n const maxLines = options?.maxLines ?? 120\n const maxChars = options?.maxChars ?? 12_000\n\n const normalized = String(text ?? '')\n const lines = normalized.split(/\\r?\\n/)\n\n let workingLines = lines\n let omittedLines = 0\n if (maxLines > 0 && lines.length > maxLines) {\n workingLines = lines.slice(0, maxLines)\n omittedLines = lines.length - maxLines\n }\n\n let workingText = workingLines.join('\\n')\n let omittedChars = 0\n if (maxChars > 0 && workingText.length > maxChars) {\n omittedChars = workingText.length - maxChars\n workingText = workingText.slice(0, maxChars)\n }\n\n const truncated = omittedLines > 0 || omittedChars > 0\n if (!truncated) {\n return {\n text: workingText,\n truncated: false,\n omittedLines: 0,\n omittedChars: 0,\n }\n }\n\n const suffixParts: string[] = []\n if (omittedLines > 0) {\n suffixParts.push(`${omittedLines} lines`)\n }\n if (omittedChars > 0) {\n suffixParts.push(`${omittedChars} chars`)\n }\n\n const suffix = `\\n\\n... [truncated ${suffixParts.join(' \u00B7 ')}] ...`\n return {\n text: workingText + suffix,\n truncated: true,\n omittedLines,\n omittedChars,\n }\n}\n\nexport function maybeTruncateVerboseToolOutput(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): { text: string; truncated: boolean } {\n const maxLinesEnv = Number(process.env.PYB_TOOL_OUTPUT_MAX_LINES ?? '')\n const maxCharsEnv = Number(process.env.PYB_TOOL_OUTPUT_MAX_CHARS ?? '')\n const envOverrides = {\n maxLines:\n Number.isFinite(maxLinesEnv) && maxLinesEnv > 0 ? maxLinesEnv : undefined,\n maxChars:\n Number.isFinite(maxCharsEnv) && maxCharsEnv > 0 ? maxCharsEnv : undefined,\n }\n\n const effective = {\n maxLines: envOverrides.maxLines ?? options?.maxLines,\n maxChars: envOverrides.maxChars ?? options?.maxChars,\n }\n\n const fullAllowed = isTruthyEnv(process.env.PYB_TOOL_OUTPUT_FULL)\n if (!isPackagedRuntime() || fullAllowed) {\n return { text: String(text ?? ''), truncated: false }\n }\n\n const result = truncateTextForDisplay(String(text ?? ''), effective)\n return { text: result.text, truncated: result.truncated }\n}\n", "export const TOOL_NAME_FOR_PROMPT = 'TaskOutput'\n\nexport const DESCRIPTION = 'Retrieves output from a running or completed task'\n\nexport const PROMPT = `- Retrieves output from a running or completed task (background shell, agent, or remote session)\n- Takes a task_id parameter identifying the task\n- Returns the task output along with status information\n- Use block=true (default) to wait for task completion\n- Use block=false for non-blocking check of current status\n- Task IDs can be found using the /tasks command\n- Works with all task types: background shells, async agents, and remote sessions`", "import { rmSync, existsSync, statSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { isAbsolute, relative, resolve, sep } from 'path'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool } from '@tool'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { PROMPT } from './prompt'\nimport { hasWritePermission } from '@utils/permissions/filesystem'\nimport { logError } from '@utils/log'\n\nconst inputSchema = z.strictObject({\n file_paths: z\n .array(z.string())\n .describe(\n 'The list of file paths you want to delete, you MUST set file path to absolute path.',\n ),\n force: z\n .boolean()\n .optional()\n .describe(\n 'Force deletion even if the file is referenced by other files (LSP check).',\n ),\n})\n\nexport const DeleteTool = {\n name: 'Delete',\n async description() {\n return \"Use this tool to delete files or directories. ALWAYS use this tool instead of running shell commands (like 'rm', 'del') to ensure cross-platform compatibility and safety. Supports deleting multiple paths at once.\"\n },\n userFacingName: () => 'Delete',\n async prompt() {\n return PROMPT\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions({ file_paths }) {\n // Check write permission for each file's parent directory or the file itself\n return file_paths.some(path => !hasWritePermission(path))\n },\n renderToolUseMessage(input, { verbose }) {\n const paths = input.file_paths.map(p => \n verbose ? p : relative(getCwd(), p)\n ).join(', ')\n return `Deleting: ${paths}`\n },\n renderToolResultMessage(output: { deleted: string[], failed: string[] }) {\n return (\n <Box flexDirection=\"column\">\n {output.deleted.length > 0 && (\n <Text>Deleted: {output.deleted.join(', ')}</Text>\n )}\n {output.failed.length > 0 && (\n <Text color={getTheme().warning}>Failed to delete: {output.failed.join(', ')}</Text>\n )}\n </Box>\n )\n },\n renderResultForAssistant(output: { deleted: string[], failed: string[] }) {\n const parts = []\n if (output.deleted.length > 0) parts.push(`Deleted files: ${output.deleted.join(', ')}`)\n if (output.failed.length > 0) parts.push(`Failed to delete files: ${output.failed.join(', ')}`)\n return parts.join('\\n')\n },\n renderToolUseRejectedMessage(\n { file_paths }: any = {},\n { columns, verbose }: any = {},\n ) {\n if (!file_paths || file_paths.length === 0) {\n return <FallbackToolUseRejectedMessage />\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF{' '}\n <Text color={getTheme().error}>\n User rejected deletion of {file_paths.length} items\n </Text>\n </Text>\n </Box>\n )\n },\n async *call({ file_paths, force }, context) {\n const verbose = context.options?.verbose || false\n const deletedItems: string[] = []\n const failedItems: string[] = []\n\n for (const rawPath of file_paths) {\n // Ensure absolute path\n const fullPath = isAbsolute(rawPath) ? rawPath : resolve(getCwd(), rawPath)\n \n try {\n if (!existsSync(fullPath)) {\n failedItems.push(`${rawPath} (not found)`)\n continue\n }\n\n // Safety Check: Reference Guard (Phase 2)\n if (!force) {\n try {\n const { LspFacade } = await import('../../../lsp/index')\n const referenceDetail = await LspFacade.checkFileReferences(fullPath)\n if (referenceDetail) {\n failedItems.push(\n `${rawPath} (Safety Check Failed: ${referenceDetail}. Use 'force: true' to override.)`,\n )\n continue\n }\n } catch (e: any) {\n if (!force) {\n failedItems.push(\n `${rawPath} (Safety Check Failed: Internal LSP Error. Use 'force: true' to override.)`,\n )\n continue\n }\n }\n }\n\n // Safety check: Prevent deleting root or critical system paths\n // This is a basic check; OS permissions and sandbox (if enabled) provide the real security\n const root = resolve(fullPath, '/')\n if (fullPath === root) {\n throw new Error('Cannot delete filesystem root')\n }\n\n // Check if it's a directory or file for logging purposes\n const stats = statSync(fullPath)\n const type = stats.isDirectory() ? 'directory' : 'file'\n\n // Perform deletion\n // force: true ignores exceptions if path doesn't exist (handled above, but good for safety)\n // recursive: true allows deleting non-empty directories\n rmSync(fullPath, { recursive: true, force: true })\n \n deletedItems.push(`${rawPath} (${type})`)\n } catch (err: any) {\n logError(err)\n failedItems.push(`${rawPath} (${err.message})`)\n }\n }\n\n const result = {\n deleted: deletedItems,\n failed: failedItems\n }\n\n if (deletedItems.length > 0 || failedItems.length > 0) {\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result)\n }\n }\n\n return\n },\n} satisfies Tool<typeof inputSchema>\n", "export const TOOL_NAME_FOR_PROMPT = 'Delete'\n\nexport const PROMPT = `You can use this tool to delete files (regular file or directory), you can delete multi files in one toolcall, and you MUST make sure the files is exist before deleting.\nWhen you need to delete file, you MUST use this tool to delete file instead of using shell.\n\nUsage:\n- The file_paths parameter must be an array of absolute paths.\n- Supports recursive deletion for directories (be careful!).\n- Safe and cross-platform (works on Windows/Linux/Mac).\n- **Safety Check**: The tool automatically performs a reference check using LSP. If a file is referenced by other files, the deletion will be BLOCKED.\n- **Forcing Deletion**: If you are sure about deleting a referenced file (e.g., refactoring), set \\`force: true\\` to bypass the safety check.\n- If LSP reference checks are unavailable, deletion may be blocked unless \\`force: true\\` is used after manual dependency verification.\n- Do NOT use BashTool/RunCommand with 'rm', 'del', or 'rmdir'.\n\nExamples:\n\n<example_single>\n// Deleting a single file\nDelete({\n file_paths: [\"/absolute/path/to/file.txt\"]\n})\n</example_single>\n\n<example_force>\n// Deleting a file that might be referenced\nDelete({\n file_paths: [\"/absolute/path/to/shared.ts\"],\n force: true\n})\n</example_force>\n\n<example_directory>\n// Deleting a directory recursively\nDelete({\n file_paths: [\"/absolute/path/to/directory\"]\n})\n</example_directory>\n\n<example_batch>\n// Deleting multiple files and directories in one go\nDelete({\n file_paths: [\n \"/absolute/path/to/file1.txt\",\n \"/absolute/path/to/file2.log\",\n \"/absolute/path/to/temp_directory\"\n ]\n})\n</example_batch>\n`\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getClients } from '@services/mcpClient'\nimport { ListResourcesResultSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\n\nconst inputSchema = z.strictObject({\n server: z\n .string()\n .optional()\n .describe('Optional server name to filter resources by'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype OutputItem = {\n uri: string\n name: string\n mimeType?: string\n description?: string\n server: string\n}\n\ntype Output = OutputItem[]\n\nexport const ListMcpResourcesTool = {\n name: TOOL_NAME,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'listMcpResources'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput({ server }: Input, context?: ToolUseContext) {\n if (!server) return { result: true }\n const clients =\n (context?.options?.mcpClients as any[]) ?? (await getClients())\n const found = clients.some(c => c.name === server)\n if (!found) {\n return {\n result: false,\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n errorCode: 1,\n }\n }\n return { result: true }\n },\n renderToolUseMessage({ server }: Input) {\n return server\n ? `List MCP resources from server \"${server}\"`\n : 'List all MCP resources'\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text bold>{output.length}</Text>\n <Text> resources</Text>\n </Box>\n <Cost costUSD={0} durationMs={0} debug={false} />\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output)\n },\n async *call({ server }: Input, context: ToolUseContext) {\n const clients =\n (context.options?.mcpClients as any[]) ?? (await getClients())\n const selected = server ? clients.filter(c => c.name === server) : clients\n if (server && selected.length === 0) {\n throw new Error(\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n )\n }\n\n const resources: OutputItem[] = []\n for (const wrapped of selected) {\n if (wrapped.type !== 'connected') continue\n try {\n let capabilities: Record<string, unknown> | null =\n (wrapped as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = wrapped.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) continue\n const result = await wrapped.client.request(\n { method: 'resources/list' },\n ListResourcesResultSchema,\n )\n if (!result.resources) continue\n resources.push(\n ...result.resources.map(r => ({\n ...r,\n server: wrapped.name,\n })),\n )\n } catch {\n }\n }\n\n yield {\n type: 'result',\n data: resources,\n resultForAssistant: this.renderResultForAssistant(resources),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ListMcpResourcesTool'\n\nexport const DESCRIPTION = `Lists available resources from configured MCP servers.\nEach resource object includes a 'server' field indicating which server it's from.\n\nUsage examples:\n- List all resources from all servers: \\`listMcpResources\\`\n- List resources from a specific server: \\`listMcpResources({ server: \"myserver\" })\\``\n\nexport const PROMPT = `List available resources from configured MCP servers.\nEach returned resource will include all standard MCP resource fields plus a 'server' field \nindicating which server the resource belongs to.\n\nParameters:\n- server (optional): The name of a specific MCP server to get resources from. If not provided,\n resources from all servers will be returned.`\n", "import { Box, Text } from 'ink'\nimport { basename, isAbsolute, relative, resolve, sep } from 'path'\nimport { readdirSync } from 'fs'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { minimatch } from 'minimatch'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { DESCRIPTION } from './prompt'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\nimport { ripGrepWithStatus, filesToTree } from '@utils/system/ripgrep'\n\nconst MAX_FILES_LIMIT = 100\nconst TOP_LEVEL_LIMIT = 2000\nconst DISPLAY_LINE_LIMIT = 15\nconst DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/',\n '__pycache__/',\n '.git/',\n 'dist/',\n 'build/',\n 'target/',\n 'vendor/',\n 'bin/',\n 'obj/',\n '.idea/',\n '.vscode/',\n '.zig-cache/',\n 'zig-out',\n '.coverage',\n 'coverage/',\n 'vendor/',\n 'tmp/',\n 'temp/',\n '.cache/',\n 'cache/',\n 'logs/',\n '.venv/',\n 'venv/',\n 'env/',\n]\n\nconst inputSchema = z.object({\n path: z\n .string()\n .describe(\n 'The absolute path to the directory to list (must be absolute, not relative)',\n ),\n ignore: z\n .array(z.string())\n .optional()\n .describe('List of glob patterns to ignore.'),\n}).passthrough()\n\nexport const LSTool = {\n name: 'LS',\n async description() {\n return DESCRIPTION\n },\n inputSchema,\n userFacingName() {\n return 'LS'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // LSTool is read-only, safe for concurrent execution\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path)\n },\n async prompt() {\n return DESCRIPTION\n },\n async validateInput({\n limit,\n offset,\n partition,\n topLevelOnly,\n forceTopLevel,\n }: z.infer<typeof inputSchema>) {\n if (\n typeof limit === 'number' ||\n typeof offset === 'number' ||\n typeof partition === 'string'\n ) {\n return {\n result: false,\n message:\n 'LS \u5F53\u524D\u4E0D\u652F\u6301 limit/offset/partition \u53C2\u6570\u3002\u8BF7\u6309\u7167\u201C\u8DEF\u5F84\u5206\u7247\u7B56\u7565\u201D\u6309\u6839\u2192\u6838\u5FC3\u76EE\u5F55\u2192\u6A21\u5757\u5206\u591A\u6B21\u8C03\u7528\u4EE5\u8986\u76D6\u5168\u5E93\u3002',\n errorCode: 1,\n }\n }\n if (topLevelOnly === true || forceTopLevel === true) {\n return {\n result: false,\n message:\n 'LS \u4E0D\u518D\u652F\u6301 topLevelOnly/forceTopLevel \u53C2\u6570\u3002\u8BF7\u6539\u7528\u9012\u5F52\u91C7\u96C6 + \u622A\u65AD\u8865\u507F\uFF0C\u5E76\u7ED3\u5408 Glob \u5206\u5C42\u786E\u8BA4\u8DEF\u5F84\u3002',\n errorCode: 2,\n }\n }\n return { result: true }\n },\n renderResultForAssistant(data) {\n return data\n },\n renderToolUseMessage({ path, ignore }, { verbose }) {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath ? relative(getCwd(), absolutePath) : '.'\n const parts = [`path: \"${verbose ? path : relativePath}\"`]\n if (ignore && ignore.length > 0) parts.push(`ignore: ${ignore.length}`)\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content) {\n const verbose = false // Set default value for verbose\n if (typeof content !== 'string') {\n return null\n }\n \n const lines = content.split('\\n')\n \n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box>\n <Text> \u23BF </Text>\n <Box flexDirection=\"column\" paddingLeft={0}>\n {lines\n .slice(0, verbose ? undefined : DISPLAY_LINE_LIMIT)\n .map((line, i) => (\n <React.Fragment key={i}>\n <Text>{line}</Text>\n </React.Fragment>\n ))}\n {!verbose && lines.length > DISPLAY_LINE_LIMIT && (\n <Text color={getTheme().secondaryText}>\n ... (+{lines.length - DISPLAY_LINE_LIMIT} lines)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n },\n async *call({ path, ignore }, { abortController }) {\n const fullFilePath = isAbsolute(path) ? path : resolve(getCwd(), path)\n try {\n const userIgnore = (ignore ?? []).filter(Boolean)\n const ignorePatterns = DEFAULT_IGNORE_PATTERNS.concat(userIgnore).filter(\n Boolean,\n )\n const rgIgnoreGlobs = DEFAULT_IGNORE_PATTERNS.map(\n pattern => `!${pattern}*`,\n )\n .concat(userIgnore.map(pattern => `!${pattern}`))\n .filter(Boolean)\n const rgArgs = [\n '--files',\n ...rgIgnoreGlobs.flatMap(pattern => ['--glob', pattern]),\n ]\n const initialResult = await ripGrepWithStatus(\n rgArgs,\n fullFilePath,\n abortController.signal,\n )\n const files = initialResult.files\n const allEntries = files\n .map(file => {\n const absolutePath = isAbsolute(file)\n ? file\n : resolve(fullFilePath, file)\n const relativePath = relative(fullFilePath, absolutePath)\n const normalized = relativePath.split(sep).join('/')\n return { absolutePath, relativePath, normalized }\n })\n const matchIgnorePatterns = ignorePatterns.map(pattern =>\n pattern.endsWith('/') ? `${pattern}**` : pattern,\n )\n const fileEntries = allEntries\n .filter(entry => {\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(entry.normalized, pattern, { dot: true, nocase: false }),\n )\n })\n .sort((a, b) => a.normalized.localeCompare(b.normalized))\n const totalCount = fileEntries.length\n const truncated = totalCount > MAX_FILES_LIMIT\n const selectedEntries = truncated\n ? fileEntries.slice(0, MAX_FILES_LIMIT)\n : fileEntries\n const excludedEntries = truncated ? fileEntries.slice(MAX_FILES_LIMIT) : []\n const selectedFiles = selectedEntries.map(entry => entry.absolutePath)\n let treeOutput = filesToTree(\n selectedFiles,\n fullFilePath,\n Number.MAX_SAFE_INTEGER,\n )\n const topLevelResult = buildTopLevelTree(fullFilePath)\n const { totalDirectories, maxDepth } = getDirectoryStats(\n fileEntries.map(entry => entry.normalized),\n )\n const selectedDirectories = getDirectorySet(\n selectedEntries.map(entry => entry.normalized),\n )\n const excludedDirectories = getDirectorySet(\n excludedEntries.map(entry => entry.normalized),\n )\n const notShownDirectoryCount = Array.from(excludedDirectories).filter(\n dir => !selectedDirectories.has(dir),\n ).length\n const notShownFileCount =\n truncated ? totalCount - selectedEntries.length : 0\n const ratioText =\n totalCount === 0 ? '0.00' : (totalDirectories / totalCount).toFixed(2)\n const structureInfo = `[\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F]\u9876\u5C42\u76EE\u5F55\u6570\uFF1A${topLevelResult.directoryCount}\u4E2A\uFF0C\u9876\u5C42\u6587\u4EF6\u6570\uFF1A${topLevelResult.fileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55\u6570\uFF1A${totalDirectories}\u4E2A\uFF0C\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\u4E2A\uFF0C\u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B=${ratioText}\uFF0C\u6700\u6DF1\u76EE\u5F55\u5C42\u7EA7=${maxDepth}\u3002\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n const treeLines = treeOutput ? treeOutput.split('\\n') : []\n const omittedLines = Math.max(0, treeLines.length - DISPLAY_LINE_LIMIT)\n const warnings: string[] = []\n if (truncated) {\n warnings.push(\n 'Truncated directory tree: this is a partial view. Use LS on subdirectories or Glob to narrow the scope before further search.',\n )\n warnings.push(\n `[\u76EE\u5F55\u6811\u622A\u65AD\u63D0\u9192]\u5F53\u524D\u76EE\u5F55\u7ED3\u6784\u56E0\u8D85\u8FC7\u5C55\u793A\u9600\u503C\u88AB\u622A\u65AD\uFF0C\u672A\u5C55\u793A\u6587\u4EF6\u6570=${notShownFileCount}\uFF0C\u672A\u663E\u793A\u76EE\u5F55\u6570=${notShownDirectoryCount}\uFF0C\u672A\u663E\u793A\u884C\u6570=${omittedLines} lines\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09\u3002\u8BE5\u8F93\u51FA\u4E3A\u90E8\u5206\u89C6\u56FE\uFF0C\u672A\u51FA\u73B0\u8DEF\u5F84\u4E0D\u5F97\u7528\u4E8E\u5B9A\u4F4D\u3002\u4F9D\u636E\u5F53\u524D\u9879\u76EE\u7ED3\u6784\u7EDF\u8BA1\u6570\u636E\uFF0C\u53EF\u521D\u6B65\u8FDB\u884C\u9879\u76EE\u7ED3\u6784\u590D\u6742\u5EA6\u5206\u6790\uFF1A1 \u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B\u9AD8 \u2192 \u7ED3\u6784\u66F4\u788E\u3001\u5C42\u7EA7\u53EF\u80FD\u66F4\u7EC6\uFF0C\u590D\u6742\u5EA6\u503E\u5411\u66F4\u9AD8\u30022 \u6700\u6DF1\u5C42\u7EA7\u5927 \u2192 \u6DF1\u5C42\u5D4C\u5957\u660E\u663E\uFF0C\u5BFC\u822A\u4E0E\u5B9A\u4F4D\u6210\u672C\u66F4\u9AD8\u30023 \u9876\u5C42\u76EE\u5F55\u6570\u591A \u2192 \u6A21\u5757\u5165\u53E3\u5206\u6563\uFF0C\u9700\u66F4\u4E25\u683C\u5206\u5C42\u786E\u8BA4\u30024 \u6587\u4EF6\u603B\u91CF\u5927 \u2192 \u66F4\u5BB9\u6613\u89E6\u53D1\u8F93\u51FA\u622A\u65AD\u3002\u5904\u7406\u6D41\u7A0B\uFF1A\u590D\u6742\u5EA6\u4F4E \u2192 \u53EF\u76F4\u63A5 LS \u83B7\u53D6\u7ED3\u6784\u7EBF\u7D22\u540E\u8FDB\u5165\u5B9A\u4F4D\uFF1B\u590D\u6742\u5EA6\u9AD8 \u2192 \u5148\u7528 LS \u83B7\u53D6\u9876\u5C42\u7EBF\u7D22\uFF0C\u518D\u7528 Glob \u5206\u5C42\u786E\u8BA4\u8DEF\u5F84\u3002`,\n )\n warnings.push('\u82E5\u9700\u6DF1\u5165\u5206\u6790\u5EFA\u8BAE\u5982\u4E0B\u5206\u6B65\u52A8\u4F5C\uFF08\u5C24\u5176\u76EE\u5F55\u7ED3\u6784\u590D\u6742\u5EA6\u8F83\u9AD8\u65F6\uFF09\uFF1A')\n warnings.push('1) \u5C06\u5F53\u524D\u9876\u5C42\u4F5C\u4E3A\u7EBF\u7D22\uFF0C\u4F18\u5148\u7528 LS \u5BF9\u5019\u9009\u9876\u5C42\u76EE\u5F55\u9010\u5C42\u786E\u8BA4\u7ED3\u6784\u3002')\n warnings.push('2) \u5728\u5DF2\u786E\u8BA4\u7684\u5019\u9009\u76EE\u5F55\u4E0B\uFF0C\u4F7F\u7528 Glob dir/* \u4E0E dir/*/ \u7EC6\u5316\u8DEF\u5F84\u5B58\u5728\u6027\u3002')\n warnings.push('3) \u5982\u9700\u66F4\u5E7F\u5339\u914D\uFF0C\u53EF\u7528 Glob dir/** \u4E0E dir/**/* \u7F29\u5C0F\u5230\u6A21\u5757\u7EA7\u8303\u56F4\u3002')\n warnings.push('4) \u5728\u5DF2\u786E\u8BA4\u76EE\u5F55\u5185\u4F7F\u7528 Grep/\u8BED\u4E49\u641C\u7D22\u5B9A\u4F4D\u6587\u4EF6\u6216\u7B26\u53F7\u3002')\n }\n if (topLevelResult.truncated) {\n warnings.push(\n `TOP-LEVEL TRUNCATED: \u9876\u5C42\u6761\u76EE=${topLevelResult.totalCount}; \u4E0A\u9650=${TOP_LEVEL_LIMIT}\u3002\u5982\u9700\u5B8C\u6574\u7ED3\u679C\uFF0C\u9010\u5C42\u7F29\u5C0F\u8303\u56F4\u5E76\u5206\u6B65\u786E\u8BA4\u3002`,\n )\n }\n const rootLabel = fullFilePath.endsWith(sep)\n ? fullFilePath\n : `${fullFilePath}${sep}`\n const topLevelView = `[\u76EE\u5F55\u9876\u5C42\u7ED3\u6784\u89C6\u56FE]\\n${topLevelResult.treeOutput}`\n const mainTreeHeader = truncated\n ? `[\u76EE\u5F55\u6838\u5FC3\u7ED3\u6784\u6811\u89C6\u56FE]\u6811\u7ED3\u6784\u8D85\u51FA\u9600\u503C\u88AB\u622A\u65AD\uFF0C\u672A\u663E\u793A\u6587\u4EF6\u6570=${notShownFileCount}\uFF0C\u672A\u663E\u793A\u76EE\u5F55\u6570=${notShownDirectoryCount}\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n : ''\n const rootName = basename(fullFilePath) || '.'\n const hasRootLine = treeLines.length > 0 && treeLines[0] === rootName\n const treeBodyLines = hasRootLine ? treeLines.slice(1) : treeLines\n const treeBody = treeBodyLines.join('\\n')\n const mainTreeOutput = treeBody ? `${rootLabel}\\n${treeBody}` : rootLabel\n const separator = '----------------------------------------'\n const outputParts = [\n structureInfo,\n separator,\n topLevelView,\n separator,\n mainTreeHeader,\n mainTreeOutput,\n ].filter(Boolean)\n const outputForData = outputParts.join('\\n')\n const warningsText = warnings.length > 0 ? `\\n${warnings.join('\\n')}` : ''\n const safetyWarning = `\\nNOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`\n const assistantData = `${outputForData}${warningsText}${safetyWarning}`\n\n yield {\n type: 'result',\n data: outputForData,\n resultForAssistant: this.renderResultForAssistant(assistantData),\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error ?? '')\n const errorCode = (error as { code?: string } | null)?.code\n const isNoEntry = errorCode === 'ENOENT' || message.includes('ENOENT')\n const baseMessage = message || 'LS failed.'\n const suggestions = isNoEntry\n ? '\\nSuggestion: 1) \u5148\u5BF9\u4E0A\u4E00\u7EA7\u76EE\u5F55\u6267\u884C LS \u786E\u8BA4\u7236\u8DEF\u5F84\u5B58\u5728\u6027\uFF1B2) \u5728\u5DF2\u786E\u8BA4\u7684\u7236\u76EE\u5F55\u4E0B\u7528 Glob *query* / *queries* \u6536\u655B\u53EF\u7591\u76EE\u5F55\u540D\uFF1B3) \u518D\u5BF9\u786E\u8BA4\u540E\u7684\u76EE\u5F55\u6267\u884C LS\u3002'\n : ''\n const assistantData = `${baseMessage}${suggestions}`\n yield {\n type: 'result',\n data: baseMessage,\n resultForAssistant: this.renderResultForAssistant(assistantData),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, string>\n\nconst renderTopLevelTree = (\n rootLabel: string,\n directories: string[],\n files: string[],\n): string => {\n const items = [\n ...directories.map(name => ({ name: `${name}${sep}`, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const lines: string[] = []\n lines.push(rootLabel)\n for (let i = 0; i < items.length; i++) {\n const connector = i === items.length - 1 ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n lines.push(`${connector}${items[i].name}`)\n }\n return lines.join('\\n')\n}\n\nconst buildTopLevelTree = (fullFilePath: string) => {\n const entries = readdirSync(fullFilePath, { withFileTypes: true })\n const directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const items = [\n ...directories.map(name => ({ name, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const totalCount = items.length\n const truncated = totalCount > TOP_LEVEL_LIMIT\n const limitedItems = truncated ? items.slice(0, TOP_LEVEL_LIMIT) : items\n const limitedDirectories = limitedItems\n .filter(item => item.isDir)\n .map(item => item.name)\n const limitedFiles = limitedItems\n .filter(item => !item.isDir)\n .map(item => item.name)\n const rootLabel = fullFilePath.endsWith(sep)\n ? fullFilePath\n : `${fullFilePath}${sep}`\n const treeOutput = renderTopLevelTree(\n rootLabel,\n limitedDirectories,\n limitedFiles,\n )\n return {\n treeOutput,\n totalCount,\n truncated,\n directoryCount: directories.length,\n fileCount: files.length,\n }\n}\n\nconst getDirectorySet = (paths: string[]) => {\n const directories = new Set<string>()\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n if (parts.length <= 1) continue\n for (let i = 0; i < parts.length - 1; i++) {\n directories.add(parts.slice(0, i + 1).join('/'))\n }\n }\n return directories\n}\n\nconst getDirectoryStats = (paths: string[]) => {\n const directories = getDirectorySet(paths)\n let maxDepth = 0\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n const depth = Math.max(0, parts.length - 1)\n if (depth > maxDepth) maxDepth = depth\n }\n return { totalDirectories: directories.size, maxDepth }\n}\n", "export const DESCRIPTION = `\u5217\u51FA\u6307\u5B9A\u76EE\u5F55\u7684\u4E00\u5C42\u5B8C\u6574\u6811\u5F62\u7ED3\u6784\u89C6\u56FE\u548C\u7EDF\u8BA1\u660E\u7EC6\u4FE1\u606F\u3002\n\n\u7528\u6CD5\uFF1A\n1. **\u5FFD\u7565\u89C4\u5219**\uFF1A\u4F7F\u7528 \\`ignore\\` \u6392\u9664\u566A\u97F3\u8DEF\u5F84\u4EE5\u51CF\u5C11\u8F93\u51FA\u3002\u9ED8\u8BA4\u5FFD\u7565\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\uFF08\u5982 node_modules\u3001dist\uFF09\u3002\n2. **\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F**\uFF1A\u8F93\u51FA\u6307\u5B9A\u76EE\u5F55\u7ED3\u6784\u4E0E\u5305\u542B [\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F] + [\u76EE\u5F55\u9876\u5C42\u7ED3\u6784\u89C6\u56FE] + [\u76EE\u5F55\u6838\u5FC3\u7ED3\u6784\u6811\u89C6\u56FE]\u7684\u4FE1\u606F\u3002\n\n\u8BF4\u660E\uFF1A\n- BFS \u4F1A\u4F18\u5148\u5C55\u793A\u9876\u5C42\uFF08\u6839\u76EE\u5F55\uFF09\u7ED3\u6784\uFF0C\u5373\u4F7F\u8F93\u51FA\u88AB\u622A\u65AD\u3002\n- path \u53C2\u6570\u5FC5\u987B\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u3002\n- \u8DEF\u5F84\u6765\u6E90\u7EA6\u675F\uFF1A\u5F53\u8DEF\u5F84\u975E\u7528\u6237\u63D0\u4F9B\u65F6\uFF0C\u5FC5\u987B\u5148\u7528 LS/Glob \u786E\u8BA4\u7236\u7EA7\u76EE\u5F55\u5B58\u5728\uFF0C\u518D\u5BF9\u4E0B\u7EA7\u8DEF\u5F84\u6267\u884C LS\u3002\n- \u5BF9\u5019\u9009\u5B50\u76EE\u5F55\u7EE7\u7EED LS \u6216\u7528 Glob/Grep \u6536\u655B\u3002\n- \u4E0D\u7528\u4E8E\u6A21\u7CCA\u67E5\u627E\u6587\u4EF6\u540D\u6216\u5185\u5BB9\uFF0C\u76F8\u5173\u573A\u666F\u7528 Glob/Grep\u3002\n- \u5927\u578B\u4ED3\u5E93\u907F\u514D\u5BF9\u5168\u91CF\u8DEF\u5F84\u53CD\u590D LS\uFF0C\u4F18\u5148\u5206\u7247\u6216\u805A\u7126\u76EE\u5F55\u8303\u56F4\u3002\n\n\u9002\u7528\u573A\u666F\uFF1A\n- \u5FEB\u901F\u4E86\u89E3\u9879\u76EE\u6216\u6307\u5B9A\u76EE\u5F55\u7684\u9876\u5C42\uFF08\u6839\u76EE\u5F55\uFF09\u6587\u4EF6\u76EE\u5F55\u4FE1\u606F\u548C\u76EE\u5F55\u6811\u7ED3\u6784\n- \u9700\u8981\u6DF1\u5165\u5206\u6790\u4EE3\u7801\u5E93\u6216\u529F\u80FD\u7B49\u65F6\u4F5C\u4E3A\u91CD\u8981\u7684\u5E7F\u5EA6\u4F18\u5148\u7684\u76EE\u5F55\u7ED3\u6784\u5206\u6790\u5DE5\u5177\u3002\n- \u521D\u6B21\u63A2\u7D22\u65B0\u9879\u76EE\u65F6\u3002\n- \u5728\u6587\u4EF6\u7CFB\u7EDF\u4E2D\u51FA\u73B0\u8FF7\u5931\u65B9\u5411\u6216\u4E0E\u5B9E\u9645\u8981\u6C42\u4E0D\u7B26\u65F6\u3002\n`.trim()\n", "import { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getAbsolutePath } from '@utils/fs/file'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\nimport { getCwd, getSessionRoot } from '@utils/state'\nimport { existsSync, readFileSync, statSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport { dirname, relative, resolve } from 'path'\nimport React from 'react'\nimport { z } from 'zod'\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport { LspFacade } from '../../../lsp/index'\n\ntype Operation =\n | 'goToDefinition'\n | 'findReferences'\n | 'hover'\n | 'documentSymbol'\n | 'workspaceSymbol'\n | 'goToImplementation'\n | 'prepareCallHierarchy'\n | 'incomingCalls'\n | 'outgoingCalls'\n | 'getScope'\n | 'diagnostics'\n\nconst inputSchema = z.strictObject({\n operation: z\n .enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n 'getScope',\n 'diagnostics',\n ])\n .describe('The LSP operation to perform'),\n filePath: z.string().describe('The absolute or relative path to the file'),\n line: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('The line number (1-based, as shown in editors). Required for location-based operations.'),\n character: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('The character offset (1-based, as shown in editors). Required for location-based operations.'),\n query: z\n .string()\n .optional()\n .describe('The query string for workspaceSymbol. Required when operation is \"workspaceSymbol\".'),\n waitForDiagnostics: z\n .boolean()\n .optional()\n .describe('If true, wait for fresh diagnostics from the server (used with \"diagnostics\" operation)'),\n timeout: z\n .number()\n .optional()\n .describe('Timeout in milliseconds for waiting operations (default: 5000)'),\n})\n\nconst outputSchema = z.object({\n operation: z\n .enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n 'getScope',\n 'diagnostics',\n ])\n .describe('The LSP operation that was performed'),\n result: z.string().describe('The formatted result of the LSP operation'),\n filePath: z.string().describe('The file path the operation was performed on'),\n resultCount: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Number of results (definitions, references, symbols)'),\n fileCount: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Number of files containing results'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = z.infer<typeof outputSchema>\n\nconst OPERATION_LABELS: Record<\n Operation,\n { singular: string; plural: string; special?: string }\n> = {\n goToDefinition: { singular: 'definition', plural: 'definitions' },\n findReferences: { singular: 'reference', plural: 'references' },\n documentSymbol: { singular: 'symbol', plural: 'symbols' },\n workspaceSymbol: { singular: 'symbol', plural: 'symbols' },\n hover: { singular: 'hover info', plural: 'hover info', special: 'available' },\n goToImplementation: { singular: 'implementation', plural: 'implementations' },\n prepareCallHierarchy: { singular: 'call item', plural: 'call items' },\n incomingCalls: { singular: 'caller', plural: 'callers' },\n outgoingCalls: { singular: 'callee', plural: 'callees' },\n getScope: { singular: 'scope', plural: 'scopes' },\n diagnostics: { singular: 'diagnostic', plural: 'diagnostics' },\n}\n\nfunction extractSymbolAtPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): string | null {\n try {\n if (zeroBasedLine < 0 || zeroBasedLine >= lines.length) return null\n const line = lines[zeroBasedLine]\n if (zeroBasedCharacter < 0 || zeroBasedCharacter >= line.length) return null\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n const start = match.index\n const end = start + match[0].length\n if (zeroBasedCharacter >= start && zeroBasedCharacter < end) {\n const token = match[0]\n return token.length > 30 ? `${token.slice(0, 27)}...` : token\n }\n }\n return null\n } catch {\n return null\n }\n}\n\ntype TokenPosition = {\n token: string\n start: number\n end: number\n}\n\nfunction getTokensForLine(line: string): TokenPosition[] {\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n const tokens: TokenPosition[] = []\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n tokens.push({\n token: match[0],\n start: match.index,\n end: match.index + match[0].length,\n })\n }\n return tokens\n}\n\nfunction isValidToken(token: string): boolean {\n const lowered = token.toLowerCase()\n if (KEYWORD_TOKENS.has(lowered)) return false\n if (OPERATOR_TOKENS.has(token)) return false\n return true\n}\n\nfunction findNearestValidTokenPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): { line: number; character: number; token: string } | null {\n const offsets = [0, -1, 1]\n let best:\n | { line: number; character: number; token: string; score: number }\n | null = null\n for (const offset of offsets) {\n const lineIndex = zeroBasedLine + offset\n if (lineIndex < 0 || lineIndex >= lines.length) continue\n const lineText = lines[lineIndex]\n if (!lineText || lineText.length === 0) continue\n const clampedChar = Math.min(\n Math.max(zeroBasedCharacter, 0),\n Math.max(lineText.length - 1, 0),\n )\n const tokens = getTokensForLine(lineText).filter(token =>\n isValidToken(token.token),\n )\n for (const token of tokens) {\n const distance =\n clampedChar >= token.start && clampedChar < token.end\n ? 0\n : Math.min(\n Math.abs(clampedChar - token.start),\n Math.abs(clampedChar - (token.end - 1)),\n )\n const score = distance + Math.abs(offset) * 1000\n if (!best || score < best.score) {\n best = {\n line: lineIndex,\n character: token.start,\n token: token.token,\n score,\n }\n }\n }\n }\n if (!best) return null\n return { line: best.line, character: best.character, token: best.token }\n}\n\nconst KEYWORD_TOKENS = new Set([\n 'export',\n 'import',\n 'from',\n 'as',\n 'return',\n 'if',\n 'else',\n 'for',\n 'while',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'function',\n 'class',\n 'interface',\n 'type',\n 'enum',\n 'const',\n 'let',\n 'var',\n 'new',\n 'extends',\n 'implements',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'await',\n 'async',\n 'yield',\n 'default',\n 'in',\n 'of',\n 'do',\n 'this',\n 'super',\n 'private',\n 'public',\n 'protected',\n 'static',\n 'get',\n 'set',\n 'readonly',\n 'abstract',\n 'declare',\n 'namespace',\n 'module',\n 'package',\n 'true',\n 'false',\n 'null',\n 'undefined',\n])\n\nconst OPERATOR_TOKENS = new Set([\n '=',\n '==',\n '===',\n '!=',\n '!==',\n '=>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '&&',\n '||',\n '!',\n '<',\n '>',\n '<=',\n '>=',\n '??',\n '?.',\n '::',\n ':',\n ';',\n ',',\n '.',\n '...',\n])\n\nfunction getPositionGuardMessage(\n token: string | null,\n line: number | undefined,\n character: number | undefined,\n): string | null {\n if (!token) {\n if (line !== undefined && character !== undefined) {\n return `Invalid position: no symbol at ${line}:${character}.`\n }\n return 'Invalid position: no symbol detected.'\n }\n const lowered = token.toLowerCase()\n if (KEYWORD_TOKENS.has(lowered)) {\n return `Invalid position: keyword \"${token}\".`\n }\n if (OPERATOR_TOKENS.has(token)) {\n return `Invalid position: operator \"${token}\".`\n }\n return null\n}\n\nfunction toProjectRelativeIfPossible(filePath: string): string {\n const cwd = getCwd()\n try {\n const rel = relative(cwd, filePath)\n if (!rel || rel === '') return filePath\n if (rel.startsWith('..')) return filePath\n return rel\n } catch {\n return filePath\n }\n}\n\nfunction summarizeToolResult(\n operation: Operation,\n resultCount: number,\n fileCount: number,\n) {\n const label = OPERATION_LABELS[operation] ?? {\n singular: 'result',\n plural: 'results',\n }\n const noun = resultCount === 1 ? label.singular : label.plural\n if (operation === 'hover' && resultCount > 0 && label.special) {\n return <Text>Hover info {label.special}</Text>\n }\n return (\n <Text>\n Found <Text bold>{resultCount}</Text> {noun}\n {fileCount > 1 ? (\n <>\n {' '}\n across <Text bold>{fileCount}</Text> files\n </>\n ) : null}\n </Text>\n )\n}\n\nexport const LspTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'LSP'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions({ filePath }: Input) {\n const abs = getAbsolutePath(filePath) ?? filePath\n return !hasReadPermission(abs || getCwd())\n },\n async validateInput(input: Input) {\n const parsed = inputSchema.safeParse(input)\n if (!parsed.success) {\n return {\n result: false,\n message: `Invalid input: ${parsed.error.message}`,\n errorCode: 3,\n }\n }\n\n const needsLocation =\n input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation' ||\n input.operation === 'prepareCallHierarchy' ||\n input.operation === 'incomingCalls' ||\n input.operation === 'outgoingCalls' ||\n input.operation === 'getScope'\n if (\n needsLocation &&\n (input.line === undefined || input.character === undefined)\n ) {\n return {\n result: false,\n message: `Operation ${input.operation} requires line and character`,\n errorCode: 5,\n }\n }\n\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\n if (input.operation === 'workspaceSymbol') {\n const scopedPath = resolve(absPath)\n const cwd = getCwd()\n if (scopedPath === cwd) {\n return {\n result: false,\n message: 'workspaceSymbol requires a scoped path (module or directory)',\n errorCode: 6,\n }\n }\n }\n if (!existsSync(absPath)) {\n return {\n result: false,\n message: `File does not exist: ${input.filePath}`,\n errorCode: 1,\n }\n }\n try {\n if (input.operation !== 'workspaceSymbol' && !statSync(absPath).isFile()) {\n return {\n result: false,\n message: `Path is not a file: ${input.filePath}`,\n errorCode: 2,\n }\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n return {\n result: false,\n message: `Cannot access file: ${input.filePath}. ${e.message}`,\n errorCode: 4,\n }\n }\n\n return { result: true }\n },\n renderToolUseMessage(input: Input, { verbose }: { verbose: boolean }) {\n const abs = getAbsolutePath(input.filePath) ?? input.filePath\n const filePathForDisplay = verbose ? abs : toProjectRelativeIfPossible(abs)\n const parts: string[] = []\n\n if (\n (input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation') &&\n input.filePath &&\n input.line !== undefined &&\n input.character !== undefined\n ) {\n try {\n const content = readFileSync(abs, 'utf8')\n const symbol = extractSymbolAtPosition(\n content.split('\\n'),\n input.line - 1,\n input.character - 1,\n )\n if (symbol) {\n parts.push(`operation: \"${input.operation}\"`)\n parts.push(`symbol: \"${symbol}\"`)\n parts.push(`in: \"${filePathForDisplay}\"`)\n return parts.join(', ')\n }\n } catch {\n }\n\n parts.push(`operation: \"${input.operation}\"`)\n parts.push(`file: \"${filePathForDisplay}\"`)\n parts.push(`position: ${input.line}:${input.character}`)\n return parts.join(', ')\n }\n\n parts.push(`operation: \"${input.operation}\"`)\n if (input.filePath) parts.push(`file: \"${filePathForDisplay}\"`)\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n if (output.resultCount !== undefined && output.fileCount !== undefined) {\n const display = verbose\n ? maybeTruncateVerboseToolOutput(output.result, {\n maxLines: 120,\n maxChars: 20_000,\n })\n : null\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n {summarizeToolResult(\n output.operation,\n output.resultCount,\n output.fileCount,\n )}\n </Box>\n {display ? (\n <Box marginLeft={5}>\n <Text>{display.text}</Text>\n </Box>\n ) : null}\n </Box>\n )\n }\n\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>{output.result}</Text>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return output.result\n },\n async *call(input: Input, _context: ToolUseContext) {\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\n const needsLocation =\n input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation' ||\n input.operation === 'prepareCallHierarchy' ||\n input.operation === 'incomingCalls' ||\n input.operation === 'outgoingCalls' ||\n input.operation === 'getScope'\n let adjustedLine = input.line\n let adjustedCharacter = input.character\n if (needsLocation && (input.line === undefined || input.character === undefined)) {\n const out: Output = {\n operation: input.operation,\n result:\n 'Missing line/character. Use Read to locate the symbol and provide 1-based line + character.',\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n if (needsLocation && input.line !== undefined && input.character !== undefined) {\n try {\n const content = readFileSync(absPath, 'utf8')\n const lines = content.split('\\n')\n const token = extractSymbolAtPosition(\n lines,\n input.line - 1,\n input.character - 1,\n )\n const guardMessage = getPositionGuardMessage(\n token,\n input.line,\n input.character,\n )\n if (guardMessage) {\n const fallback = findNearestValidTokenPosition(\n lines,\n input.line - 1,\n input.character - 1,\n )\n if (!fallback) {\n const out: Output = {\n operation: input.operation,\n result: guardMessage,\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n adjustedLine = fallback.line + 1\n adjustedCharacter = fallback.character + 1\n }\n } catch {\n }\n }\n if (input.operation === 'workspaceSymbol') {\n if (!input.query || input.query.trim() === '') {\n const out: Output = {\n operation: input.operation,\n result: 'Missing query. Provide a workspaceSymbol query string.',\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n }\n\n const workspaceRoot =\n input.operation === 'workspaceSymbol'\n ? statSync(absPath).isDirectory()\n ? absPath\n : getSessionRoot()\n : undefined\n const targetPath =\n input.operation === 'workspaceSymbol' ? absPath : absPath\n\n const formattedResult = await LspFacade.run({\n operation: input.operation,\n filePath: targetPath,\n line: adjustedLine,\n character: adjustedCharacter,\n waitForDiagnostics: input.waitForDiagnostics,\n timeoutMs: input.timeout,\n query: input.operation === 'workspaceSymbol' ? input.query : undefined,\n rootPath: workspaceRoot,\n })\n\n const out: Output = {\n operation: input.operation,\n result: formattedResult.formatted,\n filePath: input.filePath,\n resultCount: formattedResult.resultCount,\n fileCount: formattedResult.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'LSP'\n\nexport const PROMPT = `Interact with Language Server Protocol (LSP) servers to get code intelligence features.\nSupports 29+ languages including Python, Go, Rust, TypeScript, JavaScript, Bash, Java, C++, PHP, and more.\n\n## Capabilities & Scenarios\nThis tool acts as your \"Code Analyst\". Use it to understand the codebase semantically, rather than just matching text.\n\n### 1. Tracing Logic (Where does this go?)\n- **Scenario**: You see a function call \\`calculateTax(amount)\\` and need to know its formula.\n- **Action**: Use \\`goToDefinition\\` on the function name.\n- **Why**: It jumps directly to the implementation, even if it's imported from another file.\n\n### 2. Impact Analysis (What uses this?)\n- **Scenario**: You are planning to rename or modify the \\`User\\` class.\n- **Action**: Use \\`findReferences\\` at the symbol position (line + character) in the file where \\`User\\` is declared or used.\n- **Why**: It lists every file and line where \\`User\\` is referenced, ensuring you don't break dependents.\n\n### 3. Exploring New Files (What's in here?)\n- **Scenario**: You just opened a large file \\`utils.ts\\` and want a quick overview.\n- **Action**: Use \\`documentSymbol\\`.\n- **Why**: It returns a structured outline (Classes, Functions, Variables) using LspFacade policy: LSP-first for accuracy, Tree-Sitter fallback for speed when needed.\n\n### 4. Interface Implementation (Who implements this?)\n- **Scenario**: You see an interface \\`IStorage\\` and want to find the concrete class (e.g., \\`S3Storage\\`).\n- **Action**: Use \\`goToImplementation\\`.\n- **Why**: Grep might just find the import; LSP finds the actual code that implements the interface.\n\n### 5. Scope Analysis (What is visible here?)\n- **Scenario**: You are debugging a closure or nested function and want to know which variables are captured or locally defined.\n- **Action**: Use \\`getScope\\`.\n- **Why**: It returns the local variables and closure captures at the current position. Essential for debugging Python closures or JavaScript lexical scopes.\n\n### 6. Real-time Diagnostics (Is this correct?)\n- **Scenario**: You just edited a file and want to verify if you introduced any syntax errors.\n- **Action**: Use \\`diagnostics\\` with \\`waitForDiagnostics: true\\`.\n- **Why**: It waits for the language server to re-analyze the file and returns fresh errors/warnings. This is your \"Self-Correction\" mechanism.\n\n## Supported Operations\n- goToDefinition: Find where a symbol is defined\n- findReferences: Find all references to a symbol\n- hover: Get hover information (documentation, type info) for a symbol\n- documentSymbol: Get all symbols (functions, classes, variables) in a document\n- workspaceSymbol: Search for symbols across the entire workspace\n- goToImplementation: Find implementations of an interface or abstract method\n- prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)\n- incomingCalls: Find all functions/methods that call the function at a position\n- outgoingCalls: Find all functions/methods called by the function at a position\n- getScope: Get local variables and closure captures at a position\n- diagnostics: Get validation errors and warnings for a file (supports waiting for fresh results)\n\nAll operations require:\n- filePath: The file or directory to operate on\n\nLocation-based operations require:\n- line: The line number (1-based, as shown in editors)\n- character: The character offset (1-based, as shown in editors)\nDo not pass a symbol name. LSPTool works on positions, not names. Use Read to locate the symbol and derive line + character first.\nworkspaceSymbol requires:\n- query: The symbol name or keyword to search for\n\n## LSP \u540E\u7F6E\u4E0E\u8303\u56F4\u9650\u5236\n- \u4F18\u5148\u987A\u5E8F\uFF1A\u7ED3\u6784\u6811 -> \u70ED\u70B9\u5B9A\u4F4D -> Read -> LSP\uFF08\u786E\u4FDD\u62FF\u5230 line + character\uFF09\n- workspaceSymbol \u9700\u8981 query \u4E14\u4EC5\u901A\u8FC7 filePath \u63A7\u5236\u8303\u56F4\uFF08\u53EF\u4F20\u76EE\u5F55\u8DEF\u5F84\uFF09\uFF0C\u907F\u514D\u5BF9\u5168\u4ED3\u5E93\u65E0\u754C\u67E5\u8BE2\n- documentSymbol \u7684\u4F18\u5148\u7EA7\u7531 LspFacade \u51B3\u5B9A\uFF08\u9ED8\u8BA4 LSP \u4F18\u5148\uFF0CTree-Sitter \u515C\u5E95\uFF09\n\nNote: LSP servers are automatically managed and installed for most languages. For system-level languages (like C++, Java), ensure the corresponding tools (clangd, jdtls) are in your PATH.`\n\nexport const DESCRIPTION = PROMPT\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getClients } from '@services/mcpClient'\nimport { ReadResourceResultSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\n\nconst inputSchema = z.strictObject({\n server: z.string().describe('The MCP server name'),\n uri: z.string().describe('The resource URI to read'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output = {\n contents: Array<{\n uri: string\n mimeType?: string\n text?: string\n }>\n}\n\nexport const ReadMcpResourceTool = {\n name: TOOL_NAME,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'readMcpResource'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput({ server }: Input, context?: ToolUseContext) {\n const clients =\n (context?.options?.mcpClients as any[]) ?? (await getClients())\n const match = clients.find(c => c.name === server)\n if (!match) {\n return {\n result: false,\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n errorCode: 1,\n }\n }\n if (match.type !== 'connected') {\n return {\n result: false,\n message: `Server \"${server}\" is not connected`,\n errorCode: 2,\n }\n }\n let capabilities: Record<string, unknown> | null =\n (match as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = match.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) {\n return {\n result: false,\n message: `Server \"${server}\" does not support resources`,\n errorCode: 3,\n }\n }\n return { result: true }\n },\n renderToolUseMessage({ server, uri }: Input) {\n if (!server || !uri) return null as any\n return `Read resource \"${uri}\" from server \"${server}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n const count = output.contents?.length ?? 0\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text bold>Read MCP resource</Text>\n <Text>\n {count ? ` (${count} part${count === 1 ? '' : 's'})` : ''}\n </Text>\n </Box>\n <Cost costUSD={0} durationMs={0} debug={false} />\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output)\n },\n async *call({ server, uri }: Input, context: ToolUseContext) {\n const clients =\n (context.options?.mcpClients as any[]) ?? (await getClients())\n const match = clients.find(c => c.name === server)\n if (!match) {\n throw new Error(\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n )\n }\n if (match.type !== 'connected') {\n throw new Error(`Server \"${server}\" is not connected`)\n }\n let capabilities: Record<string, unknown> | null =\n (match as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = match.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) {\n throw new Error(`Server \"${server}\" does not support resources`)\n }\n const result = (await match.client.request(\n { method: 'resources/read', params: { uri } },\n ReadResourceResultSchema,\n )) as Output\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ReadMcpResourceTool'\n\nexport const DESCRIPTION = `Reads a specific resource from an MCP server.\n- server: The name of the MCP server to read from\n- uri: The URI of the resource to read\n\nUsage examples:\n- Read a resource from a server: \\`readMcpResource({ server: \"myserver\", uri: \"my-resource-uri\" })\\``\n\nexport const PROMPT = `Reads a specific resource from an MCP server, identified by server name and resource URI.\n\nParameters:\n- server (required): The name of the MCP server from which to read the resource\n- uri (required): The URI of the resource to read`\n", "import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { last, memoize } from 'lodash-es'\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { randomUUID } from 'crypto'\nimport { existsSync, readFileSync } from 'fs'\nimport { Tool } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { Message as MessageType, query } from '@query'\nimport { formatDuration, formatNumber } from '@utils/terminal/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n} from '@utils/log'\nimport {\n createAssistantMessage,\n createUserMessage,\n getLastAssistantMessageId,\n} from '@utils/messages'\nimport { countTokens } from '@utils/model/tokens'\nimport { getMaxThinkingTokens } from '@utils/model/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agent/storage'\nimport { getAgentByType, getAvailableAgentTypes } from '@utils/agent/loader'\nimport { upsertBackgroundAgentTask } from '@utils/session/backgroundTasks'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport {\n getAgentTranscript,\n saveAgentTranscript,\n} from '@utils/agent/transcripts'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport type { PermissionMode } from '@pyb-types/permissionMode'\nimport type { ToolPermissionContext } from '@pyb-types/toolPermissionContext'\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n subagent_type: z\n .string()\n .describe('The type of specialized agent to use for this task'),\n model: z\n .enum(['sonnet', 'opus', 'haiku'])\n .optional()\n .describe(\n 'Optional model to use for this agent. If not specified, inherits from parent. Prefer haiku for quick, straightforward tasks to minimize cost and latency.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n 'Set to true to run this agent in the background. Use TaskOutput to read the output later.',\n ),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype TaskModel = NonNullable<Input['model']>\n\ntype Output =\n | {\n status: 'async_launched'\n agentId: string\n description: string\n prompt: string\n }\n | {\n status: 'completed'\n agentId: string\n prompt: string\n content: TextBlock[]\n totalToolUseCount: number\n totalDurationMs: number\n totalTokens: number\n usage: any\n }\n\nfunction modelEnumToPointer(model?: TaskModel): string | undefined {\n if (!model) return undefined\n switch (model) {\n case 'haiku':\n return 'quick'\n case 'sonnet':\n return 'task'\n case 'opus':\n return 'main'\n }\n}\n\nfunction normalizeAgentModelName(\n model?: string,\n): string | 'inherit' | undefined {\n if (!model) return undefined\n if (model === 'inherit') return 'inherit'\n if (model === 'haiku' || model === 'sonnet' || model === 'opus') {\n return modelEnumToPointer(model as TaskModel)\n }\n return model\n}\n\nfunction getToolNameFromSpec(spec: string): string {\n const trimmed = spec.trim()\n if (!trimmed) return trimmed\n const match = trimmed.match(/^([^(]+)\\(([^)]+)\\)$/)\n if (!match) return trimmed\n const toolName = match[1]?.trim()\n const ruleContent = match[2]?.trim()\n if (!toolName || !ruleContent) return trimmed\n return toolName\n}\n\nfunction asyncLaunchMessage(agentId: string): string {\n const toolName = 'TaskOutput'\n return `Async agent launched successfully.\nagentId: ${agentId} (This is an internal ID for your use, do not mention it to the user. Use this ID to retrieve results with ${toolName} when the agent finishes). \nThe agent is currently working in the background. If you have other tasks you you should continue working on them now. Wait to call ${toolName} until either:\n- If you want to check on the agent's progress - call ${toolName} with block=false to get an immediate update on the agent's status\n- If you run out of things to do and the agent is still running - call ${toolName} with block=true to idle and wait for the agent's result (do not use block=true unless you completely run out of things to do as it will waste time).`\n}\n\nconst FORK_CONTEXT_TOOL_RESULT_TEXT = `### FORKING CONVERSATION CONTEXT ###\n### ENTERING SUB-AGENT ROUTINE ###\nEntered sub-agent context\n\nPLEASE NOTE: \n- The messages above this point are from the main thread prior to sub-agent execution. They are provided as context only.\n- Context messages may include tool_use blocks for tools that are not available in the sub-agent context. You should only use the tools specifically provided to you in the system prompt.\n- Only complete the specific sub-agent task you have been assigned below.`\n\nfunction normalizeAgentPermissionMode(\n mode: unknown,\n): PermissionMode | undefined {\n if (typeof mode !== 'string') return undefined\n const trimmed = mode.trim()\n if (!trimmed) return undefined\n if (trimmed === 'delegate') return 'default'\n if (\n trimmed === 'default' ||\n trimmed === 'acceptEdits' ||\n trimmed === 'plan' ||\n trimmed === 'bypassPermissions' ||\n trimmed === 'dontAsk'\n ) {\n return trimmed\n }\n return undefined\n}\n\nfunction applyAgentPermissionMode(\n base: ToolPermissionContext | undefined,\n options: {\n agentPermissionMode: PermissionMode | undefined\n safeMode: boolean\n },\n): ToolPermissionContext | undefined {\n if (!base) return base\n if (!options.agentPermissionMode) return base\n\n if (\n options.agentPermissionMode === 'bypassPermissions' &&\n (options.safeMode || base.isBypassPermissionsModeAvailable !== true)\n ) {\n return { ...base, mode: 'default' }\n }\n\n return { ...base, mode: options.agentPermissionMode }\n}\n\nfunction readJsonArrayFile(path: string): any[] | null {\n if (!existsSync(path)) return null\n try {\n const raw = readFileSync(path, 'utf8')\n const parsed = JSON.parse(raw)\n return Array.isArray(parsed) ? parsed : null\n } catch {\n return null\n }\n}\n\nfunction buildForkContextForAgent(options: {\n enabled: boolean\n prompt: string\n toolUseId: string | undefined\n messageLogName: string\n forkNumber: number\n}): {\n forkContextMessages: MessageType[]\n promptMessages: MessageType[]\n} {\n const userPromptMessage = createUserMessage(options.prompt)\n\n if (!options.enabled || !options.toolUseId) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n const mainPath = getMessagesPath(options.messageLogName, options.forkNumber, 0)\n const mainMessages = readJsonArrayFile(mainPath) as MessageType[] | null\n if (!mainMessages || mainMessages.length === 0) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n let toolUseMessageIndex = -1\n let toolUseMessage: any = null\n let taskToolUseBlock: any = null\n\n for (let i = 0; i < mainMessages.length; i++) {\n const msg: any = mainMessages[i]\n if (msg?.type !== 'assistant') continue\n const blocks: any[] = Array.isArray(msg?.message?.content)\n ? msg.message.content\n : []\n const match = blocks.find(\n b => b && b.type === 'tool_use' && b.id === options.toolUseId,\n )\n if (!match) continue\n toolUseMessageIndex = i\n toolUseMessage = msg\n taskToolUseBlock = match\n break\n }\n\n if (toolUseMessageIndex === -1 || !toolUseMessage || !taskToolUseBlock) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n const forkContextMessages = (mainMessages.slice(\n 0,\n toolUseMessageIndex,\n ) ?? []) as MessageType[]\n\n const toolUseOnlyAssistant: MessageType = {\n ...toolUseMessage,\n uuid: randomUUID(),\n message: {\n ...toolUseMessage.message,\n content: [taskToolUseBlock],\n },\n }\n\n const forkContextToolResult = createUserMessage(\n [\n {\n type: 'tool_result',\n tool_use_id: taskToolUseBlock.id,\n content: FORK_CONTEXT_TOOL_RESULT_TEXT,\n } as any,\n ],\n {\n data: {\n status: 'sub_agent_entered',\n description: 'Entered sub-agent context',\n message: FORK_CONTEXT_TOOL_RESULT_TEXT,\n },\n resultForAssistant: FORK_CONTEXT_TOOL_RESULT_TEXT,\n } as any,\n )\n\n return {\n forkContextMessages,\n promptMessages: [toolUseOnlyAssistant, forkContextToolResult, userPromptMessage],\n }\n}\n\nexport const TaskTool = {\n name: TOOL_NAME,\n inputSchema,\n async description() {\n return 'Launch a new task'\n },\n async prompt({ safeMode }: { safeMode?: boolean }) {\n return await getPrompt(safeMode)\n },\n userFacingName(input?: Partial<Input>) {\n if (input?.subagent_type && input.subagent_type !== 'general-purpose') {\n return input.subagent_type\n }\n return 'Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput(input: Input) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' not found. Available agents: ${availableTypes.join(', ')}`,\n meta: { subagent_type: input.subagent_type, availableTypes },\n }\n }\n\n if (input.resume) {\n const transcript = getAgentTranscript(input.resume)\n if (!transcript) {\n return {\n result: false,\n message: `No transcript found for agent ID: ${input.resume}`,\n meta: { resume: input.resume },\n }\n }\n }\n\n return { result: true }\n },\n renderToolUseMessage({ description, prompt }: Input) {\n if (!description || !prompt) return '' as any\n return description\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n const theme = getTheme()\n if (output.status === 'async_launched') {\n const hint = output.prompt\n ? ' (down arrow \u2193 to manage \u00B7 ctrl+o to expand)'\n : ' (down arrow \u2193 to manage)'\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>\n Backgrounded agent\n {!verbose && <Text dimColor>{hint}</Text>}\n </Text>\n </Box>\n {verbose && output.prompt && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText} wrap=\"wrap\">\n {output.prompt}\n </Text>\n </Box>\n )}\n </Box>\n )\n }\n\n const summary = [\n output.totalToolUseCount === 1\n ? '1 tool use'\n : `${output.totalToolUseCount} tool uses`,\n `${formatNumber(output.totalTokens)} tokens`,\n formatDuration(output.totalDurationMs),\n ]\n return (\n <Box flexDirection=\"column\">\n {verbose && output.prompt && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText} wrap=\"wrap\">\n {\n maybeTruncateVerboseToolOutput(output.prompt, {\n maxLines: 120,\n maxChars: 20_000,\n }).text\n }\n </Text>\n </Box>\n )}\n {verbose && output.content.length > 0 && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text wrap=\"wrap\">\n {\n maybeTruncateVerboseToolOutput(\n output.content.map(b => b.text).join('\\n'),\n {\n maxLines: 200,\n maxChars: 40_000,\n },\n ).text\n }\n </Text>\n </Box>\n )}\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text dimColor>Done ({summary.join(' \u00B7 ')})</Text>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n if (output.status === 'async_launched')\n return asyncLaunchMessage(output.agentId)\n return output.content.map(b => b.text).join('\\n')\n },\n\n async *call(input: Input, toolUseContext: any) {\n const startTime = Date.now()\n const {\n abortController,\n toolUseId,\n options: {\n safeMode = false,\n forkNumber,\n messageLogName,\n verbose,\n model: parentModel,\n mcpClients,\n },\n readFileTimestamps,\n } = toolUseContext\n\n const queryFn =\n typeof toolUseContext?.__testQuery === 'function'\n ? toolUseContext.__testQuery\n : query\n\n const agentConfig = await getAgentByType(input.subagent_type)\n if (!agentConfig) {\n const available = await getAvailableAgentTypes()\n throw Error(\n `Agent type '${input.subagent_type}' not found. Available agents: ${available.join(', ')}`,\n )\n }\n\n const effectivePrompt = input.prompt\n\n const normalizedAgentModel = normalizeAgentModelName(agentConfig.model)\n const defaultSubagentModel = 'task'\n const envSubagentModel =\n process.env.PYB_SUBAGENT_MODEL ??\n process.env.CLAUDE_CODE_SUBAGENT_MODEL\n const modelToUse: string =\n (typeof envSubagentModel === 'string' && envSubagentModel.trim()\n ? envSubagentModel.trim()\n : undefined) ||\n modelEnumToPointer(input.model) ||\n (normalizedAgentModel === 'inherit'\n ? parentModel || defaultSubagentModel\n : normalizedAgentModel) ||\n defaultSubagentModel\n\n const toolFilter = agentConfig.tools\n let tools = await getTaskTools(safeMode)\n if (toolFilter) {\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n } else if (Array.isArray(toolFilter)) {\n const allowedToolNames = new Set(\n toolFilter.map(getToolNameFromSpec).filter(Boolean),\n )\n tools = tools.filter(t => allowedToolNames.has(t.name))\n }\n }\n\n const disallowedTools = Array.isArray(agentConfig.disallowedTools)\n ? agentConfig.disallowedTools\n : []\n if (disallowedTools.length > 0) {\n const disallowedToolNames = new Set(\n disallowedTools.map(getToolNameFromSpec).filter(Boolean),\n )\n tools = tools.filter(t => !disallowedToolNames.has(t.name))\n }\n\n const agentId = input.resume || generateAgentId()\n const baseTranscript = input.resume\n ? (getAgentTranscript(input.resume)?.filter(m => m.type !== 'progress') ??\n null)\n : []\n if (input.resume && baseTranscript === null) {\n throw Error(`No transcript found for agent ID: ${input.resume}`)\n }\n\n const { forkContextMessages, promptMessages } = buildForkContextForAgent({\n enabled: agentConfig.forkContext === true,\n prompt: effectivePrompt,\n toolUseId,\n messageLogName,\n forkNumber,\n })\n\n const transcriptMessages: MessageType[] = [\n ...(baseTranscript || []),\n ...promptMessages,\n ]\n\n const messagesForQuery: MessageType[] = [\n ...forkContextMessages,\n ...transcriptMessages,\n ]\n\n const [baseSystemPrompt, context, maxThinkingTokens] = await Promise.all([\n getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messagesForQuery),\n ])\n const systemPrompt =\n agentConfig.systemPrompt && agentConfig.systemPrompt.length > 0\n ? [...baseSystemPrompt, agentConfig.systemPrompt]\n : baseSystemPrompt\n\n const agentPermissionMode = normalizeAgentPermissionMode(\n (agentConfig as any).permissionMode,\n )\n const toolPermissionContext = applyAgentPermissionMode(\n toolUseContext.options?.toolPermissionContext,\n { agentPermissionMode, safeMode },\n )\n\n const queryOptions = {\n safeMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [],\n verbose,\n permissionMode: 'dontAsk' as const,\n toolPermissionContext,\n maxThinkingTokens,\n model: modelToUse,\n mcpClients,\n }\n\n if (input.run_in_background) {\n const bgAbortController = new AbortController()\n\n const taskRecord: any = {\n type: 'async_agent',\n agentId,\n description: input.description,\n prompt: effectivePrompt,\n status: 'running',\n startedAt: Date.now(),\n messages: [...transcriptMessages],\n abortController: bgAbortController,\n done: Promise.resolve(),\n }\n\n taskRecord.done = (async () => {\n try {\n const bgMessages: MessageType[] = [...messagesForQuery]\n const bgTranscriptMessages: MessageType[] = [...transcriptMessages]\n\n for await (const msg of queryFn(\n bgMessages,\n systemPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController: bgAbortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(bgMessages),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {},\n },\n )) {\n bgMessages.push(msg)\n bgTranscriptMessages.push(msg)\n taskRecord.messages = [...bgTranscriptMessages]\n upsertBackgroundAgentTask(taskRecord)\n }\n\n const lastAssistant = last(\n bgTranscriptMessages.filter(m => m.type === 'assistant'),\n ) as any\n const content = lastAssistant?.message?.content?.filter(\n (b: any) => b.type === 'text',\n ) as TextBlock[] | undefined\n\n taskRecord.status = 'completed'\n taskRecord.completedAt = Date.now()\n taskRecord.resultText = (content || []).map(b => b.text).join('\\n')\n taskRecord.messages = [...bgTranscriptMessages]\n upsertBackgroundAgentTask(taskRecord)\n saveAgentTranscript(agentId, bgTranscriptMessages)\n } catch (e) {\n taskRecord.status = 'failed'\n taskRecord.completedAt = Date.now()\n taskRecord.error = e instanceof Error ? e.message : String(e)\n upsertBackgroundAgentTask(taskRecord)\n }\n })()\n\n upsertBackgroundAgentTask(taskRecord)\n\n const output: Output = {\n status: 'async_launched',\n agentId,\n description: input.description,\n prompt: effectivePrompt,\n }\n yield {\n type: 'result',\n data: output,\n resultForAssistant: asyncLaunchMessage(agentId),\n }\n return\n }\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n const PROGRESS_THROTTLE_MS = 200\n const MAX_RECENT_ACTIONS = 6\n let lastProgressEmitAt = 0\n let lastEmittedToolUseCount = 0\n const recentActions: string[] = []\n\n const addRecentAction = (action: string) => {\n const trimmed = action.trim()\n if (!trimmed) return\n recentActions.push(trimmed)\n if (recentActions.length > MAX_RECENT_ACTIONS) {\n recentActions.splice(0, recentActions.length - MAX_RECENT_ACTIONS)\n }\n }\n\n const truncate = (text: string, maxLen: number) => {\n const normalized = text.replace(/\\s+/g, ' ').trim()\n if (normalized.length <= maxLen) return normalized\n return `${normalized.slice(0, maxLen - 1)}\u2026`\n }\n\n const summarizeToolUse = (name: string, rawInput: unknown): string => {\n const input = (\n rawInput && typeof rawInput === 'object' ? rawInput : {}\n ) as Record<string, unknown>\n switch (name) {\n case 'Read': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `Read ${filePath}` : 'Read'\n }\n case 'Write': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `Write ${filePath}` : 'Write'\n }\n case 'Edit':\n case 'MultiEdit': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `${name} ${filePath}` : name\n }\n case 'Grep': {\n const pattern = typeof input.pattern === 'string' ? input.pattern : ''\n return pattern ? `Grep ${truncate(pattern, 80)}` : 'Grep'\n }\n case 'Glob': {\n const pattern =\n (typeof input.pattern === 'string' && input.pattern) ||\n (typeof input.glob === 'string' && input.glob) ||\n ''\n return pattern ? `Glob ${truncate(pattern, 80)}` : 'Glob'\n }\n case 'Bash': {\n const command = typeof input.command === 'string' ? input.command : ''\n return command ? `Bash ${truncate(command, 80)}` : 'Bash'\n }\n case 'WebFetch':\n case 'WebSearch': {\n const url = typeof input.url === 'string' ? input.url : ''\n const query = typeof input.query === 'string' ? input.query : ''\n if (url) return `${name} ${truncate(url, 100)}`\n if (query) return `${name} ${truncate(query, 100)}`\n return name\n }\n default:\n return name\n }\n }\n\n const renderProgressText = (toolUseCount: number): string => {\n const header = `${input.description || 'Task'}\u2026 (${toolUseCount} tool${toolUseCount === 1 ? '' : 's'})`\n if (recentActions.length === 0) return header\n const lines = recentActions.map(a => `- ${a}`)\n return [header, ...lines].join('\\n')\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${renderProgressText(0)}</tool-progress>`,\n ),\n }\n lastProgressEmitAt = Date.now()\n\n let toolUseCount = 0\n for await (const message of queryFn(\n messagesForQuery,\n systemPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(messagesForQuery),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {},\n },\n )) {\n messagesForQuery.push(message)\n transcriptMessages.push(message)\n\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\n transcriptMessages.filter(_ => _.type !== 'progress'),\n { conversationKey: `${messageLogName}:${forkNumber}` },\n )\n\n if (message.type === 'assistant') {\n for (const block of message.message.content) {\n if (\n block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use'\n ) {\n toolUseCount += 1\n addRecentAction(summarizeToolUse(block.name, (block as any).input))\n }\n }\n }\n\n const now = Date.now()\n const hasNewToolUses = toolUseCount > lastEmittedToolUseCount\n const shouldEmit =\n hasNewToolUses &&\n (lastEmittedToolUseCount === 0 ||\n now - lastProgressEmitAt >= PROGRESS_THROTTLE_MS)\n if (shouldEmit) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${renderProgressText(toolUseCount)}</tool-progress>`,\n ),\n }\n lastEmittedToolUseCount = toolUseCount\n lastProgressEmitAt = now\n }\n }\n\n const lastAssistant = last(\n transcriptMessages.filter(m => m.type === 'assistant'),\n ) as any\n if (!lastAssistant || lastAssistant.type !== 'assistant') {\n throw Error('No assistant messages found')\n }\n\n const content = lastAssistant.message.content.filter(\n (b: any) => b.type === 'text',\n ) as TextBlock[]\n\n saveAgentTranscript(agentId, transcriptMessages)\n\n const totalDurationMs = Date.now() - startTime\n const totalTokens = countTokens(transcriptMessages)\n const usage = lastAssistant.message.usage\n\n const output: Output = {\n status: 'completed',\n agentId,\n prompt: effectivePrompt,\n content,\n totalToolUseCount: toolUseCount,\n totalDurationMs,\n totalTokens,\n usage,\n }\n const agentIdBlock: TextBlock = {\n type: 'text',\n text: `agentId: ${agentId} (for resuming to continue this agent's work if needed)`,\n citations: [],\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: [...content, agentIdBlock],\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import type { Message as ConversationMessage } from '@query'\n\nconst transcripts = new Map<string, ConversationMessage[]>()\n\nexport function saveAgentTranscript(\n agentId: string,\n messages: ConversationMessage[],\n): void {\n transcripts.set(agentId, messages)\n}\n\nexport function getAgentTranscript(\n agentId: string,\n): ConversationMessage[] | undefined {\n return transcripts.get(agentId)\n}\n", "import { type Tool } from '@tool'\nimport { getTools, getReadOnlyTools } from '@tools'\nimport { TaskTool } from './TaskTool'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { getModelManager } from '@utils/model'\nimport { getActiveAgents } from '@utils/agent/loader'\n\nconst SUBAGENT_DISALLOWED_TOOL_NAMES = new Set<string>([\n 'Task',\n 'TaskOutput',\n 'KillShell',\n 'EnterPlanMode',\n 'ExitPlanMode',\n 'AskUserQuestion',\n])\n\nexport async function getTaskTools(safeMode: boolean): Promise<Tool[]> {\n return (await (!safeMode ? getTools() : getReadOnlyTools())).filter(\n tool => !SUBAGENT_DISALLOWED_TOOL_NAMES.has(tool.name),\n )\n}\n\nexport async function getPrompt(safeMode: boolean): Promise<string> {\n const agents = await getActiveAgents()\n\n const agentDescriptions = agents\n .map(agent => {\n const toolsStr = Array.isArray(agent.tools) ? agent.tools.join(', ') : '*'\n return `- ${agent.agentType}: ${agent.whenToUse} (Tools: ${toolsStr})`\n })\n .join('\\n')\n\n return `Launch a new agent to handle complex, multi-step tasks autonomously. \n\nAvailable agent types and the tools they have access to:\n${agentDescriptions}\n\nWhen using the Task tool, you must specify a subagent_type parameter to select which agent type to use.\n\nWhen to use the Agent tool:\n- When you are instructed to execute custom slash commands. Use the Agent tool with the slash command invocation as the entire prompt. The slash command can take arguments. For example: Task(description=\"Check the file\", prompt=\"/check-file path/to/file.py\")\n\nWhen NOT to use the Agent tool:\n- If you want to read a specific file path, use the ${FileReadTool.name} or ${GlobTool.name} tool instead of the Agent tool, to find the match more quickly\n- If you are searching for a specific class definition like \"class Foo\", use the ${GlobTool.name} tool instead, to find the match more quickly\n- If you are searching for code within a specific file or set of 2-3 files, use the ${FileReadTool.name} tool instead of the Agent tool, to find the match more quickly\n- Other tasks that are not related to the agent descriptions above\n\nUsage notes:\n1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed task description for the agent to perform autonomously and you should specify exactly what information the agent should return back to you in its final and only message to you.\n4. The agent's outputs should generally be trusted\n5. Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent\n6. If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.\n\nExample usage:\n\n<example_agent_descriptions>\n\"code-reviewer\": use this agent after you are done writing a signficant piece of code\n\"greeting-responder\": use this agent when to respond to user greetings with a friendly joke\n</example_agent_description>\n\n<example>\nuser: \"Please write a function that checks if a number is prime\"\nassistant: Sure let me write a function that checks if a number is prime\nassistant: First let me use the ${FileWriteTool.name} tool to write a function that checks if a number is prime\nassistant: I'm going to use the ${FileWriteTool.name} tool to write the following code:\n<code>\nfunction isPrime(n) {\n if (n <= 1) return false\n for (let i = 2; i * i <= n; i++) {\n if (n % i === 0) return false\n }\n return true\n}\n</code>\n<commentary>\nSince a signficant piece of code was written and the task was completed, now use the code-reviewer agent to review the code\n</commentary>\nassistant: Now let me use the code-reviewer agent to review the code\nassistant: Uses the Task tool to launch the with the code-reviewer agent \n</example>\n\n<example>\nuser: \"Hello\"\n<commentary>\nSince the user is greeting, use the greeting-responder agent to respond with a friendly joke\n</commentary>\nassistant: \"I'm going to use the Task tool to launch the with the greeting-responder agent\"\n</example>`\n}\n", "export const TOOL_NAME = 'Task'\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport {\n createTask,\n getTaskListPaths,\n listTasks,\n TaskRecord,\n} from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskSummary,\n toTaskSummary,\n} from '@utils/session/taskToolUtils'\nimport { buildTaskGraph, findTaskCycles } from '@utils/session/taskGraph'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z\n .strictObject({\n listId: z.string().optional(),\n subject: z.string().min(1),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .enum(['open', 'in_progress', 'blocked', 'done', 'archived'])\n .optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n metadata: z.record(z.string()).optional(),\n archived: z.boolean().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n parent: z.string().optional(),\n related: z.array(z.string()).optional(),\n legacyTodoId: z.string().optional(),\n })\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskSummary\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskCreateTool = {\n name: 'TaskCreate',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskCreate'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n try {\n const subject = input.subject\n const title = subject\n const tasks = listTasks({ listId: input.listId })\n const nextId =\n Math.max(\n 0,\n ...tasks\n .map(task => Number(task.id))\n .filter(value => !Number.isNaN(value)),\n ) + 1\n const now = Date.now()\n const candidateTask: TaskRecord = {\n id: String(nextId),\n subject,\n title,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status ?? 'open',\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: input.blocks,\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n createdAt: now,\n updatedAt: now,\n baseVersion: 1,\n version: 1,\n legacyTodoId: input.legacyTodoId,\n }\n const candidateTasks = [...tasks, candidateTask]\n const cycles = findTaskCycles(buildTaskGraph(candidateTasks))\n if (cycles.length > 0) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_CYCLE_DETECTED',\n message: 'Task dependency cycle detected',\n details: { cycles },\n }),\n }\n return\n }\n const task = createTask(\n {\n subject,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status,\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: input.blocks,\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n legacyTodoId: input.legacyTodoId,\n },\n { listId: input.listId },\n )\n const { listId } = getTaskListPaths(input.listId)\n emitReminderEvent('task.created', {\n listId,\n taskId: task.id,\n task,\n timestamp: Date.now(),\n })\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskSummary(task),\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Task create failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import { TaskRecord } from './taskStore'\n\nexport type TaskDependencySummary = {\n blocks: string[]\n blockedBy: string[]\n parent?: string\n related?: string[]\n}\n\nexport type TaskToolError = {\n error: {\n type: 'conflict' | 'not_found' | 'validation' | 'unknown'\n code?: string\n message: string\n details?: unknown\n }\n}\n\nexport type TaskSummary = {\n task: TaskRecord\n deps: TaskDependencySummary\n}\n\nexport function getTaskDependencySummary(\n task: TaskRecord,\n): TaskDependencySummary {\n return {\n blocks: task.blocks ?? [],\n blockedBy: task.blockedBy ?? [],\n parent: task.parent,\n related: task.related ?? [],\n }\n}\n\nexport function toTaskSummary(task: TaskRecord): TaskSummary {\n return {\n task,\n deps: getTaskDependencySummary(task),\n }\n}\n\nexport function createTaskToolError(params: {\n type: TaskToolError['error']['type']\n message: string\n code?: string\n details?: unknown\n}): TaskToolError {\n return {\n error: {\n type: params.type,\n message: params.message,\n code: params.code,\n details: params.details,\n },\n }\n}\n", "export const DESCRIPTION =\n 'Create a new task in the task list with optional status and dependencies.'\n\nexport const PROMPT = `Use this tool to create a new task in the current task list. It is the entry point for planning multi-step work.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n1. You need to add a task with structured fields (subject, status, tags).\n2. You want to seed a plan for multi-step work before implementation starts.\n3. You need to define dependencies (blocks, blockedBy, parent, related) at creation time.\n4. You need to align with a user request to create a task list or plan.\n\n## When NOT to Use This Tool\n- You need to modify an existing task (use TaskUpdate).\nSkip using this tool when:\n1. You only need to read task data (use TaskGet or TaskList).\n2. You need to modify an existing task (use TaskUpdate).\n3. You are only reporting progress without changing any task fields.\n- subject is required.\nNOTE that you should not use this tool if you are only updating status or details of an existing task.\n\n## Input Notes\n- subject is required.\n- listId is optional; omit to use the default list.\n- Dependencies are validated for cycles; invalid cycles will be rejected.\n- baseVersion is set automatically for new tasks.\n- status can be open, in_progress, blocked, done, or archived.\n- activeForm will be generated from subject if omitted.\n- blocks and blockedBy are always stored as arrays (empty when not used).\n- description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.\n- Task ordering relies on task id; do not use priority fields.\n\n## Status Notes\n- Use blocked when dependencies prevent work and fill blockedBy.\n\n## Examples of When to Use TaskCreate\n\n<example>\nUser: I need to implement user registration, product catalog, and checkout.\nAssistant: I will create tasks for each feature.\n*Creates tasks:*\n1. User registration\n2. Product catalog\n3. Checkout flow\n</example>\n\n<example>\nUser: Please add tests and run lint after the refactor.\nAssistant: I'll seed tasks for the refactor and verification steps.\n*Creates tasks:*\n1. Refactor target module\n2. Add tests\n3. Run lint and typecheck\n</example>\n\n<example>\nUser: The API task depends on database schema changes.\nAssistant: I'll create tasks with dependencies.\n*Creates tasks:*\n1. Update database schema\n2. Implement API endpoints (blockedBy: schema task)\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport { getTask, getTaskListPaths } from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskSummary,\n toTaskSummary,\n} from '@utils/session/taskToolUtils'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n taskId: z.string().min(1),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskSummary\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskGetTool = {\n name: 'TaskGet',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskGet'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n const { listId } = getTaskListPaths(input.listId)\n const task = getTask(input.taskId, { listId: input.listId })\n if (!task) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'not_found',\n code: 'TASK_NOT_FOUND',\n message: `Task ${input.taskId} not found`,\n details: { taskId: input.taskId, listId },\n }),\n }\n return\n }\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskSummary(task),\n },\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'Fetch a single task by id from the task list.'\n\nexport const PROMPT = `Use this tool to fetch a single task by id.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need details for one task to confirm its fields, status, or dependencies.\n2. You need the latest version/baseVersion before updating a task.\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need multiple tasks or readiness info (use TaskList).\n2. You need to modify a task (use TaskUpdate) or create one (use TaskCreate).\n\nNOTE that TaskGet returns a single task only; use TaskList for summaries or readiness.\n\n## Input Notes\n- taskId is required.\n- listId is optional; omit to use the default list.\n\n## Examples of When to Use TaskGet\n\n<example>\nUser: Can you check the status of task t-17 before updating it?\nAssistant: I'll fetch the task details first.\n*Fetches task t-17*\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport { getTaskListPaths, listTasks, TaskStatus } from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskSummary,\n toTaskSummary,\n} from '@utils/session/taskToolUtils'\nimport { calculateReadyBlocked } from '@utils/session/taskGraph'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n status: z\n .array(z.enum(['open', 'in_progress', 'blocked', 'done', 'archived']))\n .optional(),\n includeBlocked: z.boolean().optional(),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n items: TaskSummary[]\n ready: TaskSummary[]\n blocked: TaskSummary[]\n }\n | ReturnType<typeof createTaskToolError>\n\nconst filterByStatus = (tasks: TaskSummary[], statuses?: TaskStatus[]) => {\n if (!statuses || statuses.length === 0) {\n return tasks.filter(item => item.task.status !== 'archived')\n }\n const allowed = new Set(statuses)\n return tasks.filter(item => allowed.has(item.task.status))\n}\n\nexport const TaskListTool = {\n name: 'TaskList',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskList'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n try {\n const { listId } = getTaskListPaths(input.listId)\n const tasks = listTasks({ listId: input.listId })\n const summaries = tasks.map(toTaskSummary)\n const filtered = filterByStatus(summaries, input.status)\n const readyBlocked = calculateReadyBlocked(\n filtered.map(item => item.task),\n )\n const ready = readyBlocked.ready.map(toTaskSummary)\n const blocked = readyBlocked.blocked.map(toTaskSummary)\n const includeBlocked = input.includeBlocked !== false\n const items = includeBlocked\n ? filtered\n : filtered.filter(item =>\n ready.some(entry => entry.task.id === item.task.id),\n )\n yield {\n type: 'result',\n data: {\n listId,\n items,\n ready,\n blocked: includeBlocked ? blocked : [],\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Task list failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'List tasks in a task list, optionally filtered by status with ready/blocked breakdown.'\n\nexport const PROMPT = `Use this tool to list tasks and understand readiness. It returns ready and blocked groupings to help prioritize work.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need a list of tasks for a listId (or default list).\n2. You need ready/blocked calculations to prioritize work.\n3. You need to filter by status.\n4. You want a quick summary of what can be started now.\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need a single task by id (use TaskGet).\n2. You need to create or update tasks (use TaskCreate or TaskUpdate).\n\nNOTE that TaskList is for summaries and readiness; use TaskGet for details.\n\n## Input Notes\n- listId is optional; omit to use the default list.\n- status filters the returned items; omit to exclude archived tasks by default.\n- includeBlocked=false returns only ready items.\n\n## Examples of When to Use TaskList\n\n<example>\nUser: What should we work on next?\nAssistant: I'll list tasks and check readiness.\n*Lists tasks with ready/blocked breakdown*\n</example>\n\n<example>\nUser: Show only in-progress items.\nAssistant: I'll list tasks filtered by status.\n*Lists tasks with status filter*\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport {\n getTask,\n getTaskListPaths,\n listTasks,\n TaskStoreConflictError,\n TaskRecord,\n TaskStatus,\n updateTask,\n} from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskSummary,\n toTaskSummary,\n} from '@utils/session/taskToolUtils'\nimport { buildTaskGraph, findTaskCycles } from '@utils/session/taskGraph'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst isCompletedStatus = (status: TaskStatus) =>\n status === 'done' || status === 'archived'\n\nconst normalizeDeps = (items?: string[]) =>\n [...(items ?? [])].filter(Boolean).sort()\n\nconst depsChanged = (prev: TaskRecord, next: TaskRecord) => {\n if (prev.parent !== next.parent) return true\n const prevBlocks = normalizeDeps(prev.blocks)\n const nextBlocks = normalizeDeps(next.blocks)\n if (prevBlocks.length !== nextBlocks.length) return true\n for (let i = 0; i < prevBlocks.length; i += 1) {\n if (prevBlocks[i] !== nextBlocks[i]) return true\n }\n const prevBlockedBy = normalizeDeps(prev.blockedBy)\n const nextBlockedBy = normalizeDeps(next.blockedBy)\n if (prevBlockedBy.length !== nextBlockedBy.length) return true\n for (let i = 0; i < prevBlockedBy.length; i += 1) {\n if (prevBlockedBy[i] !== nextBlockedBy[i]) return true\n }\n const prevRelated = normalizeDeps(prev.related)\n const nextRelated = normalizeDeps(next.related)\n if (prevRelated.length !== nextRelated.length) return true\n for (let i = 0; i < prevRelated.length; i += 1) {\n if (prevRelated[i] !== nextRelated[i]) return true\n }\n return false\n}\n\nconst getDepsSnapshot = (task: TaskRecord) => ({\n blocks: task.blocks ?? [],\n blockedBy: task.blockedBy ?? [],\n parent: task.parent,\n related: task.related ?? [],\n})\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n taskId: z.string().min(1),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .enum(['open', 'in_progress', 'blocked', 'done', 'archived'])\n .optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n metadata: z.record(z.string()).optional(),\n archived: z.boolean().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n parent: z.string().optional(),\n related: z.array(z.string()).optional(),\n baseVersion: z.number().optional(),\n version: z.number().optional(),\n allowMerge: z.boolean().optional(),\n legacyTodoId: z.string().optional(),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskSummary\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskUpdateTool = {\n name: 'TaskUpdate',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskUpdate'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n const { listId } = getTaskListPaths(input.listId)\n const existing = getTask(input.taskId, { listId: input.listId })\n if (!existing) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'not_found',\n code: 'TASK_NOT_FOUND',\n message: `Task ${input.taskId} not found`,\n details: { taskId: input.taskId, listId },\n }),\n }\n return\n }\n\n const tasks = listTasks({ listId: input.listId })\n const subject = input.subject ?? existing.subject\n const title = subject\n const updatedTask = {\n ...existing,\n subject,\n title,\n description: input.description ?? existing.description,\n activeForm: input.activeForm ?? existing.activeForm,\n status: input.status ?? existing.status,\n tags: input.tags ?? existing.tags,\n assignee: input.assignee ?? existing.assignee,\n metadata: input.metadata ?? existing.metadata,\n archived: input.archived ?? existing.archived,\n blocks: input.blocks ?? existing.blocks,\n blockedBy: input.blockedBy ?? existing.blockedBy,\n parent: input.parent ?? existing.parent,\n related: input.related ?? existing.related,\n legacyTodoId: input.legacyTodoId ?? existing.legacyTodoId,\n }\n const candidateTasks = tasks.map(task =>\n task.id === existing.id ? updatedTask : task,\n )\n const cycles = findTaskCycles(buildTaskGraph(candidateTasks))\n if (cycles.length > 0) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_CYCLE_DETECTED',\n message: 'Task dependency cycle detected',\n details: { cycles },\n }),\n }\n return\n }\n\n if (input.status && isCompletedStatus(input.status)) {\n const parentId = updatedTask.parent\n if (parentId) {\n const parentTask = tasks.find(task => task.id === parentId)\n if (!parentTask || !isCompletedStatus(parentTask.status)) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_PARENT_INCOMPLETE',\n message: 'Cannot complete task while parent is incomplete',\n details: {\n taskId: existing.id,\n parentId,\n },\n }),\n }\n return\n }\n }\n }\n\n try {\n const baseVersion = input.baseVersion ?? input.version\n const result = updateTask(\n input.taskId,\n {\n subject: input.subject,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status,\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: input.blocks,\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n baseVersion,\n legacyTodoId: input.legacyTodoId,\n },\n { listId: input.listId, allowMerge: input.allowMerge },\n )\n emitReminderEvent('task.updated', {\n listId,\n taskId: result.task.id,\n task: result.task,\n timestamp: Date.now(),\n })\n if (existing.status !== result.task.status) {\n emitReminderEvent('task.status_changed', {\n listId,\n taskId: result.task.id,\n previousStatus: existing.status,\n status: result.task.status,\n timestamp: Date.now(),\n })\n }\n if (depsChanged(existing, result.task)) {\n emitReminderEvent('task.deps_changed', {\n listId,\n taskId: result.task.id,\n previousDeps: getDepsSnapshot(existing),\n deps: getDepsSnapshot(result.task),\n timestamp: Date.now(),\n })\n }\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskSummary(result.task),\n },\n }\n } catch (error) {\n if (error instanceof TaskStoreConflictError) {\n emitReminderEvent('task:conflict_detected', {\n listId,\n taskId: error.taskId,\n expected: error.expectedBaseVersion,\n actual: error.actualBaseVersion,\n timestamp: Date.now(),\n })\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'conflict',\n code: error.code,\n message: error.message,\n details: {\n taskId: error.taskId,\n expected: error.expectedBaseVersion,\n actual: error.actualBaseVersion,\n },\n }),\n }\n return\n }\n const message = error instanceof Error ? error.message : 'Task update failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'Update an existing task, including status, metadata, and dependencies with conflict checks.'\n\nexport const PROMPT = `Use this tool to update an existing task. It is the primary way to track progress and adjust task details.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need to change task fields (subject/description/status/tags).\n2. You need to adjust dependencies (blocks, blockedBy, parent, related).\n3. You need optimistic concurrency control with baseVersion/version.\n4. You are moving a task across states (open \u2192 in_progress \u2192 done).\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need to create a new task (use TaskCreate).\n2. You only need to read tasks (use TaskGet or TaskList).\n\nNOTE that TaskUpdate requires the correct baseVersion or version when concurrency checks are enabled.\n\n## Input Notes\n- taskId is required.\n- listId is optional; omit to use the default list.\n- If you provide status=done/archived and a parent exists, parent must already be completed.\n- Dependencies are validated for cycles; invalid cycles will be rejected.\n- Use baseVersion or version for concurrency checks; allowMerge can relax conflicts.\n- activeForm will be generated from subject if omitted.\n- blocks and blockedBy are always stored as arrays (empty when not used).\n- description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.\n- Task ordering relies on task id; do not use priority fields.\n\n## Status Notes\n- Use in_progress for the task you are actively working on.\n- Use blocked when dependencies prevent progress and set blockedBy.\n- Use done or archived only when all child/parent constraints are satisfied.\n\n## Examples of When to Use TaskUpdate\n\n<example>\nUser: Mark the API task as in progress.\nAssistant: I'll update the task status.\n*Updates task status to in_progress*\n</example>\n\n<example>\nUser: The UI task depends on the API task now.\nAssistant: I'll update dependencies.\n*Updates blockedBy to include the API task*\n</example>\n\n<example>\nUser: The task update failed due to version conflict.\nAssistant: I'll refetch the task and retry with the latest baseVersion.\n*Fetches task, then updates with baseVersion*\n</example>\n`\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { memoize } from 'lodash-es'\nimport { Tool } from '@tool'\nimport { AskExpertModelTool } from './ai/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './interaction/AskUserQuestionTool/AskUserQuestionTool'\nimport { BashTool } from './system/BashTool/BashTool'\nimport { TaskOutputTool } from './system/TaskOutputTool/TaskOutputTool'\nimport { EnterPlanModeTool } from './agent/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './agent/PlanModeTool/ExitPlanModeTool'\nimport { FileEditTool } from './filesystem/FileEditTool/FileEditTool'\nimport { FileReadTool } from './filesystem/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './filesystem/FileWriteTool/FileWriteTool'\nimport { DeleteTool } from './filesystem/DeleteTool/DeleteTool'\nimport { GlobTool } from './filesystem/GlobTool/GlobTool'\nimport { GrepTool } from './search/GrepTool/GrepTool'\nimport { KillShellTool } from './system/KillShellTool/KillShellTool'\nimport { ListMcpResourcesTool } from './mcp/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { LSTool } from './lsTool/lsTool'\nimport { LspTool } from './search/LspTool/LspTool'\nimport { MCPTool } from './mcp/MCPTool/MCPTool'\nimport { NotebookEditTool } from './filesystem/NotebookEditTool/NotebookEditTool'\nimport { ReadMcpResourceTool } from './mcp/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { SlashCommandTool } from './interaction/SlashCommandTool/SlashCommandTool'\nimport { SkillTool } from './ai/SkillTool/SkillTool'\nimport { TaskTool } from './agent/TaskTool/TaskTool'\nimport { TaskCreateTool } from './interaction/TaskCreateTool/TaskCreateTool'\nimport { TaskGetTool } from './interaction/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './interaction/TaskListTool/TaskListTool'\nimport { TaskUpdateTool } from './interaction/TaskUpdateTool/TaskUpdateTool'\nimport { WebFetchTool } from './network/WebFetchTool/WebFetchTool'\nimport { WebSearchTool } from './network/WebSearchTool/WebSearchTool'\nimport { getMCPTools } from '@services/mcpClient'\n\nexport const getAllTools = (): Tool[] => [\n TaskTool as unknown as Tool,\n AskExpertModelTool as unknown as Tool,\n BashTool as unknown as Tool,\n TaskOutputTool as unknown as Tool,\n KillShellTool as unknown as Tool,\n GlobTool as unknown as Tool,\n GrepTool as unknown as Tool,\n LSTool as unknown as Tool,\n LspTool as unknown as Tool,\n FileReadTool as unknown as Tool,\n FileEditTool as unknown as Tool,\n FileWriteTool as unknown as Tool,\n DeleteTool as unknown as Tool,\n NotebookEditTool as unknown as Tool,\n TaskCreateTool as unknown as Tool,\n TaskGetTool as unknown as Tool,\n TaskUpdateTool as unknown as Tool,\n TaskListTool as unknown as Tool,\n WebFetchTool as unknown as Tool,\n WebSearchTool as unknown as Tool,\n AskUserQuestionTool as unknown as Tool,\n EnterPlanModeTool as unknown as Tool,\n ExitPlanModeTool as unknown as Tool,\n SlashCommandTool as unknown as Tool,\n SkillTool as unknown as Tool,\n ListMcpResourcesTool as unknown as Tool,\n ReadMcpResourceTool as unknown as Tool,\n MCPTool as unknown as Tool,\n]\n\nexport const getTools = memoize(\n async (_includeOptional?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, i) => isEnabled[i])\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n", "import * as React from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport {\n createUserMessage,\n createAssistantMessage,\n INTERRUPT_MESSAGE,\n} from '@utils/messages'\nimport { logError } from '@utils/log'\nimport {\n createExpertChatSession,\n loadExpertChatSession,\n getSessionMessages,\n addMessageToSession,\n} from '@utils/session/expertChatStorage'\nimport { queryLLM } from '@services/llmLazy'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { applyMarkdown } from '@utils/text/markdown'\n\nexport const inputSchema = z.strictObject({\n question: z\n .string()\n .describe(\n 'COMPLETE SELF-CONTAINED QUESTION: Must include full background context, relevant details, and a clear independent question. The expert model will receive ONLY this content with no access to previous conversation or external context. Structure as: 1) Background/Context 2) Specific situation/problem 3) Clear question. Ensure the expert can fully understand and respond without needing additional information.',\n ),\n expert_model: z\n .string()\n .describe(\n 'The expert model to use (e.g., gpt-5, claude-3-5-sonnet-20241022)',\n ),\n chat_session_id: z\n .string()\n .describe(\n 'Chat session ID: use \"new\" for new session or existing session ID',\n ),\n})\n\ntype In = typeof inputSchema\nexport type Out = {\n chatSessionId: string\n expertModelName: string\n expertAnswer: string\n}\n\nexport const AskExpertModelTool = {\n name: 'AskExpertModel',\n async description() {\n return 'Consult external AI models for expert opinions and analysis'\n },\n async prompt() {\n return `Ask a question to a specific external AI model for expert analysis.\n\nThis tool allows you to consult different AI models for their unique perspectives and expertise.\n\nCRITICAL REQUIREMENT FOR QUESTION PARAMETER:\nThe question MUST be completely self-contained and include:\n1. FULL BACKGROUND CONTEXT - All relevant information the expert needs\n2. SPECIFIC SITUATION - Clear description of the current scenario/problem\n3. INDEPENDENT QUESTION - What exactly you want the expert to analyze/answer\n\nThe expert model receives ONLY your question content with NO access to:\n- Previous conversation history (unless using existing session) \n- Current codebase or file context\n- User's current task or project details\n\nIMPORTANT: This tool is for asking questions to models, not for task execution.\n- Use when you need a specific model's opinion or analysis\n- Use when you want to compare different models' responses\n- Use the @ask-[model] format when available\n\nThe expert_model parameter accepts:\n- OpenAI: gpt-4, gpt-5, o1-preview\n- Messages API: claude-3-5-sonnet, claude-3-opus \n- Others: kimi, gemini-pro, mixtral\n\nExample of well-structured question:\n\"Background: I'm working on a React TypeScript application with performance issues. The app renders a large list of 10,000 items using a simple map() function, causing UI freezing.\n\nCurrent situation: Users report 3-5 second delays when scrolling through the list. The component re-renders the entire list on every state change.\n\nQuestion: What are the most effective React optimization techniques for handling large lists, and how should I prioritize implementing virtualization vs memoization vs other approaches?\"`\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n inputSchema,\n userFacingName() {\n return 'AskExpertModel'\n },\n async isEnabled() {\n return true\n },\n needsPermissions(): boolean {\n return false\n },\n async validateInput(\n { question, expert_model, chat_session_id },\n context?: any,\n ): Promise<ValidationResult> {\n if (!question.trim()) {\n return { result: false, message: 'Question cannot be empty' }\n }\n\n if (!expert_model.trim()) {\n return { result: false, message: 'Expert model must be specified' }\n }\n\n if (!chat_session_id.trim()) {\n return {\n result: false,\n message:\n 'Chat session ID must be specified (use \"new\" for new session)',\n }\n }\n\n try {\n const modelManager = getModelManager()\n\n let currentModel: string\n if (context?.agentId && context?.options?.model) {\n currentModel = context.options.model\n } else {\n currentModel = modelManager.getModelName('main') || ''\n }\n\n const normalizedExpert = expert_model\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n const normalizedCurrent = currentModel\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '')\n\n if (normalizedExpert === normalizedCurrent) {\n return {\n result: false,\n message: `You are already running as ${currentModel}. Consulting the same model would be redundant. Please choose a different model or handle the task directly.`,\n }\n }\n } catch (e) {\n debugLogger.error('AskExpertModel', {\n message: 'Could not determine current model',\n error: e,\n })\n }\n\n try {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(expert_model)\n\n if (!modelResolution.success) {\n const availableModels = modelManager.getAllAvailableModelNames()\n if (availableModels.length > 0) {\n return {\n result: false,\n message: `Model '${expert_model}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expert_model}' needs to be configured using /model command.`,\n }\n } else {\n return {\n result: false,\n message: `Model '${expert_model}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\n }\n }\n }\n } catch (error) {\n logError(error)\n return {\n result: false,\n message: `Failed to validate expert model '${expert_model}'. Please check your model configuration.`,\n }\n }\n\n return { result: true }\n },\n\n renderToolUseMessage(\n { question, expert_model, chat_session_id },\n { verbose },\n ) {\n if (!question || !expert_model) return null\n const isNewSession = chat_session_id === 'new'\n const sessionDisplay = isNewSession\n ? 'new session'\n : `session ${chat_session_id.substring(0, 5)}...`\n const theme = getTheme()\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {expert_model}\n </Text>\n <Text color={theme.secondaryText}>{sessionDisplay}</Text>\n <Box marginTop={1}>\n <Text color={theme.text}>\n {question.length > 300\n ? question.substring(0, 300) + '...'\n : question}\n </Text>\n </Box>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text bold color=\"yellow\">\n {expert_model}{' '}\n </Text>\n <Text color={theme.secondaryText} dimColor>\n ({sessionDisplay})\n </Text>\n </Box>\n )\n },\n\n renderToolResultMessage(content) {\n const verbose = true\n const theme = getTheme()\n\n if (typeof content === 'object' && content && 'expertAnswer' in content) {\n const expertResult = content as Out\n const isError =\n expertResult.expertAnswer.startsWith('Error') ||\n expertResult.expertAnswer.includes('failed')\n const isInterrupted = expertResult.chatSessionId === 'interrupted'\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>Consultation interrupted</Text>\n </Box>\n )\n }\n\n const answerText = verbose\n ? expertResult.expertAnswer.trim()\n : expertResult.expertAnswer.length > 500\n ? expertResult.expertAnswer.substring(0, 500) + '...'\n : expertResult.expertAnswer.trim()\n\n if (isError) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"red\">{answerText}</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text bold color={theme.text}>\n Response from {expertResult.expertModelName}:\n </Text>\n <Box marginTop={1}>\n <Text color={theme.text}>{applyMarkdown(answerText)}</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.secondaryText} dimColor>\n Session: {expertResult.chatSessionId.substring(0, 8)}\n </Text>\n </Box>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text color={theme.secondaryText}>Consultation completed</Text>\n </Box>\n )\n },\n\n renderResultForAssistant(output: Out): string {\n return `[Expert consultation completed]\nExpert Model: ${output.expertModelName}\nSession ID: ${output.chatSessionId}\nTo continue this conversation with context preservation, use this Session ID in your next AskExpertModel call to maintain the full conversation history and context.\n\n${output.expertAnswer}`\n },\n\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n\n async *call(\n { question, expert_model, chat_session_id },\n { abortController, readFileTimestamps },\n ) {\n const expertModel = expert_model\n\n let sessionId: string\n let isInterrupted = false\n\n const abortListener = () => {\n isInterrupted = true\n }\n abortController.signal.addEventListener('abort', abortListener)\n\n try {\n if (abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n if (chat_session_id === 'new') {\n try {\n const session = createExpertChatSession(expertModel)\n sessionId = session.sessionId\n } catch (error) {\n logError(error)\n throw new Error('Failed to create new chat session')\n }\n } else {\n sessionId = chat_session_id\n try {\n const session = loadExpertChatSession(sessionId)\n if (!session) {\n const newSession = createExpertChatSession(expertModel)\n sessionId = newSession.sessionId\n }\n } catch (error) {\n logError(error)\n try {\n const newSession = createExpertChatSession(expertModel)\n sessionId = newSession.sessionId\n } catch (createError) {\n logError(createError)\n throw new Error('Unable to create or load chat session')\n }\n }\n }\n\n if (isInterrupted || abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n\n let historyMessages: Array<{ role: string; content: string }>\n try {\n historyMessages = getSessionMessages(sessionId)\n } catch (error) {\n logError(error)\n historyMessages = []\n }\n\n const messages = [...historyMessages, { role: 'user', content: question }]\n\n let systemMessages\n try {\n systemMessages = messages.map(msg =>\n msg.role === 'user'\n ? createUserMessage(msg.content)\n : createAssistantMessage(msg.content),\n )\n } catch (error) {\n logError(error)\n throw new Error('Failed to prepare conversation messages')\n }\n\n if (isInterrupted || abortController.signal.aborted) {\n return yield* this.handleInterrupt()\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Connecting to ${expertModel}... (timeout: 5 minutes)`,\n ),\n }\n\n let response\n try {\n const modelManager = getModelManager()\n const modelResolution = modelManager.resolveModelWithInfo(expertModel)\n\n debugLogger.api('EXPERT_MODEL_RESOLUTION', {\n requestedModel: expertModel,\n success: modelResolution.success,\n profileName: modelResolution.profile?.name,\n profileModelName: modelResolution.profile?.modelName,\n provider: modelResolution.profile?.provider,\n isActive: modelResolution.profile?.isActive,\n error: modelResolution.error,\n })\n\n const timeoutMs = 300000\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject(\n new Error(\n `Expert model query timed out after ${timeoutMs / 1000}s`,\n ),\n )\n }, timeoutMs)\n })\n\n response = await Promise.race([\n queryLLM(\n systemMessages,\n [],\n 0,\n [],\n abortController.signal,\n {\n safeMode: false,\n model: expertModel,\n prependCLISysprompt: false,\n },\n ),\n timeoutPromise,\n ])\n } catch (error: any) {\n logError(error)\n\n if (\n error.name === 'AbortError' ||\n abortController.signal?.aborted ||\n isInterrupted\n ) {\n return yield* this.handleInterrupt()\n }\n\n if (error.message?.includes('timed out')) {\n throw new Error(\n `Expert model '${expertModel}' timed out after 5 minutes.\\n\\n` +\n `Suggestions:\\n` +\n ` - The model might be experiencing high load\\n` +\n ` - Try a different model or retry later\\n` +\n ` - Consider breaking down your question into smaller parts`,\n )\n }\n\n if (error.message?.includes('rate limit')) {\n throw new Error(\n `Rate limit exceeded for ${expertModel}.\\n\\n` +\n `Please wait a moment and try again, or use a different model.`,\n )\n }\n\n if (error.message?.includes('invalid api key')) {\n throw new Error(\n `Invalid API key for ${expertModel}.\\n\\n` +\n `Please check your model configuration with /model command.`,\n )\n }\n\n if (\n error.message?.includes('model not found') ||\n error.message?.includes('Failed to resolve model')\n ) {\n try {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n if (availableModels.length > 0) {\n throw new Error(\n `Model '${expertModel}' is not configured. Available models: ${availableModels.join(', ')}. Check if any available model closely matches the user's request (e.g., 'kimi' matches 'kimi-k2-0711-preview'). If there's a strong match, auto retry using the correct model name. If no close match exists, inform the user that '${expertModel}' needs to be configured using /model command.`,\n )\n } else {\n throw new Error(\n `Model '${expertModel}' not found and no models are currently configured in the system. Inform the user that models need to be configured first using the /model command.`,\n )\n }\n } catch (modelError) {\n throw new Error(\n `Model '${expertModel}' not found. Please check model configuration or inform user about the issue.`,\n )\n }\n }\n\n throw new Error(\n `Expert model query failed: ${error.message || 'Unknown error'}`,\n )\n }\n\n let expertAnswer: string\n try {\n if (!response?.message?.content) {\n throw new Error('No content in expert response')\n }\n\n expertAnswer = response.message.content\n .filter(block => block.type === 'text')\n .map(block => (block as any).text)\n .join('\\n')\n\n if (!expertAnswer.trim()) {\n throw new Error('Expert response was empty')\n }\n } catch (error) {\n logError(error)\n throw new Error('Failed to process expert response')\n }\n\n try {\n addMessageToSession(sessionId, 'user', question)\n addMessageToSession(sessionId, 'assistant', expertAnswer)\n } catch (error) {\n logError(error)\n }\n\n const result: Out = {\n chatSessionId: sessionId,\n expertModelName: expertModel,\n expertAnswer: expertAnswer,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error: any) {\n if (\n error.name === 'AbortError' ||\n abortController.signal?.aborted ||\n isInterrupted\n ) {\n return yield* this.handleInterrupt()\n }\n\n logError(error)\n\n const errorSessionId = sessionId || 'error-session'\n\n const errorMessage =\n error.message || 'Expert consultation failed with unknown error'\n const result: Out = {\n chatSessionId: errorSessionId,\n expertModelName: expertModel,\n expertAnswer: `\u274C ${errorMessage}`,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } finally {\n abortController.signal.removeEventListener('abort', abortListener)\n }\n },\n\n async *handleInterrupt() {\n yield {\n type: 'result',\n data: {\n chatSessionId: 'interrupted',\n expertModelName: 'cancelled',\n expertAnswer: INTERRUPT_MESSAGE,\n },\n resultForAssistant: INTERRUPT_MESSAGE,\n }\n },\n}\n", "import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\nimport { join } from 'path'\nimport { randomUUID } from 'crypto'\nimport { debug as debugLogger } from '@utils/log/debugLogger'\nimport { logError } from '@utils/log'\nimport { resolveXdgDataPath } from '@utils/config/env'\n\n\nexport interface ChatMessage {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport interface ExpertChatSession {\n sessionId: string\n expertModel: string\n messages: ChatMessage[]\n createdAt: number\n lastUpdated: number\n}\n\nfunction getExpertChatDirectory(): string {\n const override = process.env.ANYKODE_CONFIG_DIR?.trim()\n const expertChatDir = override\n ? join(override, 'expert-chats')\n : resolveXdgDataPath('expert-chats')\n\n if (!existsSync(expertChatDir)) {\n mkdirSync(expertChatDir, { recursive: true })\n }\n\n return expertChatDir\n}\n\nfunction getSessionFilePath(sessionId: string): string {\n return join(getExpertChatDirectory(), `${sessionId}.json`)\n}\n\nexport function createExpertChatSession(\n expertModel: string,\n): ExpertChatSession {\n const sessionId = randomUUID().slice(0, 5)\n const session: ExpertChatSession = {\n sessionId,\n expertModel,\n messages: [],\n createdAt: Date.now(),\n lastUpdated: Date.now(),\n }\n\n saveExpertChatSession(session)\n return session\n}\n\nexport function loadExpertChatSession(\n sessionId: string,\n): ExpertChatSession | null {\n const filePath = getSessionFilePath(sessionId)\n\n if (!existsSync(filePath)) {\n return null\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n return JSON.parse(content) as ExpertChatSession\n } catch (error) {\n logError(error)\n debugLogger.warn('EXPERT_CHAT_SESSION_LOAD_FAILED', {\n sessionId,\n error: error instanceof Error ? error.message : String(error),\n })\n return null\n }\n}\n\nexport function saveExpertChatSession(session: ExpertChatSession): void {\n const filePath = getSessionFilePath(session.sessionId)\n\n try {\n session.lastUpdated = Date.now()\n writeFileSync(filePath, JSON.stringify(session, null, 2), 'utf-8')\n } catch (error) {\n logError(error)\n debugLogger.warn('EXPERT_CHAT_SESSION_SAVE_FAILED', {\n sessionId: session.sessionId,\n error: error instanceof Error ? error.message : String(error),\n })\n throw error\n }\n}\n\nexport function addMessageToSession(\n sessionId: string,\n role: 'user' | 'assistant',\n content: string,\n): ExpertChatSession | null {\n const session = loadExpertChatSession(sessionId)\n if (!session) {\n return null\n }\n\n session.messages.push({ role, content })\n saveExpertChatSession(session)\n\n return session\n}\n\nexport function getSessionMessages(sessionId: string): ChatMessage[] {\n const session = loadExpertChatSession(sessionId)\n return session?.messages || []\n}\n\nexport function generateSessionId(): string {\n return randomUUID().slice(0, 5)\n}\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport type { Tool, ToolUseContext, ValidationResult } from '@tool'\nimport { BunShell } from '@utils/bun/shell'\nimport {\n getBackgroundAgentTaskSnapshot,\n waitForBackgroundAgentTask,\n} from '@utils/session/backgroundTasks'\nimport { createAssistantMessage } from '@utils/messages'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\nimport { readTaskOutput } from '@utils/log/taskOutputStore'\nimport { LspFacade } from '../../../lsp/index'\nimport { formatDiagnosticsPretty } from '../../../lsp/formatters'\n\nconst inputSchema = z.strictObject({\n task_id: z.string().describe('The task ID to get output from'),\n block: z\n .boolean()\n .optional()\n .default(true)\n .describe('Whether to wait for completion'),\n timeout: z\n .number()\n .min(0)\n .max(600000)\n .optional()\n .default(30000)\n .describe('Max wait time in ms'),\n analyze: z\n .boolean()\n .optional()\n .describe('Analyze the output for errors and warnings'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype TaskType = 'local_bash' | 'local_agent' | 'remote_agent'\ntype TaskStatus = 'running' | 'pending' | 'completed' | 'failed' | 'killed'\n\ntype TaskSummary = {\n task_id: string\n task_type: TaskType\n status: TaskStatus\n description: string\n output?: string\n exitCode?: number | null\n prompt?: string\n result?: string\n error?: string\n analysis?: string\n}\n\ntype Output = {\n retrieval_status: 'success' | 'timeout' | 'not_ready'\n task: TaskSummary | null\n}\n\nfunction isTaskOutputLspAnalysisEnabled(): boolean {\n const raw = String(process.env.PYB_TASKOUTPUT_LSP_ANALYSIS ?? '')\n .trim()\n .toLowerCase()\n if (!raw) return false\n if (raw === '1' || raw === 'true' || raw === 'on' || raw === 'yes')\n return true\n if (raw === '0' || raw === 'false' || raw === 'off' || raw === 'no')\n return false\n return false\n}\n\nfunction normalizeTaskOutputInput(input: Record<string, unknown>): Input {\n const task_id =\n (typeof input.task_id === 'string' && input.task_id) ||\n (typeof (input as any).agentId === 'string' &&\n String((input as any).agentId)) ||\n (typeof (input as any).bash_id === 'string' &&\n String((input as any).bash_id)) ||\n ''\n\n const block = typeof input.block === 'boolean' ? input.block : true\n const analyze = typeof input.analyze === 'boolean' ? input.analyze : false\n\n const timeout =\n typeof input.timeout === 'number'\n ? input.timeout\n : typeof (input as any).wait_up_to === 'number'\n ? Number((input as any).wait_up_to) * 1000\n : 30000\n\n return { task_id, block, timeout, analyze }\n}\n\nfunction taskStatusFromBash(\n bg: ReturnType<BunShell['getBackgroundOutput']>,\n): TaskStatus {\n if (!bg) return 'failed'\n if (bg.killed) return 'killed'\n if (bg.code === null) return 'running'\n return bg.code === 0 ? 'completed' : 'failed'\n}\n\nfunction buildTaskSummary(taskId: string): TaskSummary | null {\n const bg = BunShell.getInstance().getBackgroundOutput(taskId)\n if (bg) {\n return {\n task_id: taskId,\n task_type: 'local_bash',\n status: taskStatusFromBash(bg),\n description: bg.command,\n output: readTaskOutput(taskId),\n exitCode: bg.code,\n }\n }\n\n const agent = getBackgroundAgentTaskSnapshot(taskId)\n if (agent) {\n const output = readTaskOutput(taskId) || agent.resultText || ''\n return {\n task_id: taskId,\n task_type: 'local_agent',\n status: agent.status,\n description: agent.description,\n output,\n prompt: agent.prompt,\n result: output,\n error: agent.error,\n }\n }\n\n return null\n}\n\nexport async function analyzeOutputWithLsp(output: string, exitCode?: number | null): Promise<string> {\n const errorCount = (output.match(/Error:/gi) || []).length\n const warningCount = (output.match(/Warning:/gi) || []).length\n \n let summary = ''\n if (exitCode === 0) {\n summary = 'Success'\n } else if (exitCode !== undefined && exitCode !== null) {\n summary = `Failed (Exit Code: ${exitCode})`\n } else {\n summary = 'Completed'\n }\n\n const parts = [summary]\n if (errorCount > 0) parts.push(`${errorCount} Error${errorCount === 1 ? '' : 's'}`)\n if (warningCount > 0) parts.push(`${warningCount} Warning${warningCount === 1 ? '' : 's'}`)\n \n if (!isTaskOutputLspAnalysisEnabled()) {\n parts.push('LSP Analysis: disabled')\n return parts.join(', ')\n }\n if (exitCode === 0 && errorCount === 0 && warningCount === 0) {\n parts.push('LSP Analysis: skipped')\n return parts.join(', ')\n }\n\n if (exitCode !== 0 || errorCount > 0 || warningCount > 0) {\n try {\n const { isAbsolute, resolve } = await import('path')\n const { getSessionRoot } = await import('@utils/state')\n \n const lines = output.split('\\n')\n const uniqueFiles = new Set<string>()\n const lspSuggestions: string[] = []\n\n // Regex to find file paths\n // Matches:\n // /path/to/file.ts:12:34\n // C:\\path\\to\\file.ts(12,34)\n // relative/path/file.ts:12\n // src/main.ts(11,5)\n const pathRegex = /(?:[a-zA-Z]:\\\\|(?:\\/|\\\\))?[\\w\\-\\.]+(?:(?:\\/|\\\\)[\\w\\-\\.]+)+\\.(?:ts|tsx|js|jsx|py|java|cs|cpp|c|rs|go)(?::\\d+|:\\d+:\\d+|\\(\\d+,\\d+\\))/g\n \n for (const line of lines) {\n const matches = line.match(pathRegex)\n if (matches) {\n for (const match of matches) {\n // Extract clean path\n let cleanPath = match\n \n // Remove (line,col) format\n if (cleanPath.includes('(')) {\n cleanPath = cleanPath.split('(')[0]\n } else {\n // Remove :line:col or :line at the end\n // Only match if preceded by .ext or similar, to avoid stripping drive letter?\n // The regex ensures match ends with digits.\n cleanPath = cleanPath.replace(/:\\d+(?::\\d+)?$/, '')\n }\n \n uniqueFiles.add(cleanPath)\n }\n }\n }\n if (uniqueFiles.size === 0) {\n parts.push('LSP Analysis: no files detected')\n return parts.join(', ')\n }\n\n for (const file of uniqueFiles) {\n try {\n // Ensure absolute path\n const absPath = isAbsolute(file) ? file : resolve(getSessionRoot(), file)\n await LspFacade.run({\n operation: 'diagnostics',\n filePath: absPath,\n waitForDiagnostics: true,\n timeoutMs: 2000,\n rootPath: getSessionRoot(),\n })\n\n const diagnostics = await LspFacade.diagnostics(absPath, {\n rootPath: getSessionRoot(),\n })\n if (diagnostics && diagnostics.length > 0) {\n const pretty = formatDiagnosticsPretty(diagnostics, { maxItems: 3 })\n if (pretty) {\n lspSuggestions.push(`LSP Diagnostics for ${file}:`)\n lspSuggestions.push(pretty)\n }\n }\n } catch (e) {\n // ignore\n console.error('LSP Analysis Error:', e)\n }\n }\n\n if (lspSuggestions.length > 0) {\n parts.push('\\nLSP Analysis:\\n' + lspSuggestions.join('\\n'))\n } else {\n parts.push('LSP Analysis: no diagnostics')\n }\n\n } catch (e) {\n // Ignore LSP analysis errors\n console.error('LSP Analysis Setup Error:', e)\n }\n }\n \n return parts.join(', ')\n}\n\nfunction analyzeOutput(output: string, exitCode?: number | null): string {\n // Deprecated sync version, kept for compatibility if needed, but we should use async version\n return 'Use analyzeOutputWithLsp'\n}\n\nasync function waitForBashTaskCompletion(args: {\n taskId: string\n timeoutMs: number\n signal: AbortSignal\n}): Promise<TaskSummary | null> {\n const { taskId, timeoutMs, signal } = args\n const startedAt = Date.now()\n\n while (Date.now() - startedAt < timeoutMs) {\n if (signal.aborted) return null\n const summary = buildTaskSummary(taskId)\n if (!summary) return null\n if (summary.status !== 'running' && summary.status !== 'pending')\n return summary\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n\n return buildTaskSummary(taskId)\n}\n\nexport const TaskOutputTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Task Output'\n },\n inputSchema,\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return false\n },\n async prompt() {\n return PROMPT\n },\n renderToolUseMessage(input: any) {\n const normalized = normalizeTaskOutputInput(input as any)\n if (!normalized.block) return 'non-blocking'\n return ''\n },\n renderToolUseRejectedMessage() {\n return null\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n const theme = getTheme()\n\n if (\n output.retrieval_status === 'timeout' ||\n output.retrieval_status === 'not_ready'\n ) {\n return (\n <Box>\n <Text color={theme.secondaryText}>Task is still running\u2026</Text>\n </Box>\n )\n }\n\n if (!output.task) {\n return (\n <Box>\n <Text color={theme.secondaryText}>No task output available</Text>\n </Box>\n )\n }\n\n if (output.task.task_type === 'local_agent') {\n const lines = output.task.result\n ? output.task.result.split('\\n').length\n : 0\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n Read output (ctrl+o to expand)\n </Text>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n {output.task.description} ({lines} lines)\n </Text>\n {output.task.prompt ? (\n <Box paddingLeft={2}>\n <Text color={theme.secondaryText}>{output.task.prompt}</Text>\n </Box>\n ) : null}\n {output.task.result ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(output.task.result, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n {output.task.error ? (\n <Box flexDirection=\"column\" marginTop={1} paddingLeft={2}>\n <Text color={theme.error} bold>\n Error:\n </Text>\n <Text color={theme.error}>{output.task.error}</Text>\n </Box>\n ) : null}\n </Box>\n )\n }\n\n const content = output.task.output?.trimEnd() ?? ''\n if (!verbose) {\n return (\n <Box>\n <Text color={theme.secondaryText}>\n {content.length > 0\n ? 'Read output (ctrl+o to expand)'\n : '(No content)'}\n </Text>\n </Box>\n )\n }\n return (\n <Box flexDirection=\"column\">\n <Text color={theme.secondaryText}>{output.task.description}</Text>\n {content ? (\n <Box paddingLeft={2} marginTop={1}>\n <Text>\n {\n maybeTruncateVerboseToolOutput(content, {\n maxLines: 200,\n maxChars: 40_000,\n }).text\n }\n </Text>\n </Box>\n ) : null}\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n const parts: string[] = []\n parts.push(\n `<retrieval_status>${output.retrieval_status}</retrieval_status>`,\n )\n\n if (output.task) {\n parts.push(`<task_id>${output.task.task_id}</task_id>`)\n parts.push(`<task_type>${output.task.task_type}</task_type>`)\n parts.push(`<status>${output.task.status}</status>`)\n if (output.task.exitCode !== undefined && output.task.exitCode !== null) {\n parts.push(`<exit_code>${output.task.exitCode}</exit_code>`)\n }\n if (output.task.output?.trim()) {\n parts.push(`<output>\\n${output.task.output.trimEnd()}\\n</output>`)\n }\n if (output.task.error) {\n parts.push(`<error>${output.task.error}</error>`)\n }\n if (output.task.analysis) {\n parts.push(`<analysis>${output.task.analysis}</analysis>`)\n }\n }\n\n return parts.join('\\n\\n')\n },\n async validateInput(input: Input): Promise<ValidationResult> {\n if (!input.task_id) {\n return { result: false, message: 'Task ID is required', errorCode: 1 }\n }\n\n const task = buildTaskSummary(input.task_id)\n if (!task) {\n return {\n result: false,\n message: `No task found with ID: ${input.task_id}`,\n errorCode: 2,\n }\n }\n\n return { result: true }\n },\n async *call(input: Input, context: ToolUseContext) {\n const normalized = normalizeTaskOutputInput(input as any)\n const taskId = normalized.task_id\n const block = normalized.block\n const timeoutMs = normalized.timeout\n const analyze = normalized.analyze\n\n const initial = buildTaskSummary(taskId)\n if (!initial) {\n throw new Error(`No task found with ID: ${taskId}`)\n }\n\n if (!block) {\n const isDone =\n initial.status !== 'running' && initial.status !== 'pending'\n \n if (analyze) {\n initial.analysis = await analyzeOutputWithLsp(initial.output || '', initial.exitCode)\n }\n\n const out: Output = {\n retrieval_status: isDone ? 'success' : 'not_ready',\n task: initial,\n }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${initial.description ? ` ${initial.description}\\n` : ''} Waiting for task (esc to give additional instructions)</tool-progress>`,\n ),\n }\n\n let finalTask: TaskSummary | null = null\n\n if (initial.task_type === 'local_agent') {\n try {\n const task = await waitForBackgroundAgentTask(\n taskId,\n timeoutMs,\n context.abortController.signal,\n )\n finalTask = task ? buildTaskSummary(taskId) : null\n } catch {\n finalTask = buildTaskSummary(taskId)\n }\n } else {\n finalTask = await waitForBashTaskCompletion({\n taskId,\n timeoutMs,\n signal: context.abortController.signal,\n })\n }\n\n if (!finalTask) {\n const out: Output = { retrieval_status: 'timeout', task: null }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n if (finalTask.status === 'running' || finalTask.status === 'pending') {\n const out: Output = { retrieval_status: 'timeout', task: finalTask }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n return\n }\n\n if (analyze) {\n finalTask.analysis = await analyzeOutputWithLsp(finalTask.output || '', finalTask.exitCode)\n }\n\n const out: Output = { retrieval_status: 'success', task: finalTask }\n yield {\n type: 'result',\n data: out,\n resultForAssistant: this.renderResultForAssistant(out),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import type { Message as ConversationMessage } from '@query'\n\nexport type BackgroundAgentStatus =\n | 'running'\n | 'completed'\n | 'failed'\n | 'killed'\n\nexport type BackgroundAgentTask = {\n type: 'async_agent'\n agentId: string\n description: string\n prompt: string\n status: BackgroundAgentStatus\n startedAt: number\n completedAt?: number\n error?: string\n resultText?: string\n messages: ConversationMessage[]\n retrieved?: boolean\n}\n\nexport type BackgroundAgentTaskRuntime = BackgroundAgentTask & {\n abortController: AbortController\n done: Promise<void>\n}\n\nconst backgroundTasks = new Map<string, BackgroundAgentTaskRuntime>()\n\nexport function getBackgroundAgentTask(\n agentId: string,\n): BackgroundAgentTaskRuntime | undefined {\n return backgroundTasks.get(agentId)\n}\n\nexport function getBackgroundAgentTaskSnapshot(\n agentId: string,\n): BackgroundAgentTask | undefined {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n const { abortController: _abortController, done: _done, ...snapshot } = task\n return snapshot\n}\n\nexport function upsertBackgroundAgentTask(\n task: BackgroundAgentTaskRuntime,\n): void {\n backgroundTasks.set(task.agentId, task)\n}\n\nexport function markBackgroundAgentTaskRetrieved(agentId: string): void {\n const task = backgroundTasks.get(agentId)\n if (!task) return\n task.retrieved = true\n}\n\nexport async function waitForBackgroundAgentTask(\n agentId: string,\n waitUpToMs: number,\n signal: AbortSignal,\n): Promise<BackgroundAgentTaskRuntime | undefined> {\n const task = backgroundTasks.get(agentId)\n if (!task) return undefined\n if (task.status !== 'running') return task\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Request timed out'))\n }, waitUpToMs)\n timeoutId.unref?.()\n })\n\n const abortPromise = new Promise<never>((_, reject) => {\n if (signal.aborted) {\n reject(new Error('Request aborted'))\n return\n }\n const onAbort = () => reject(new Error('Request aborted'))\n signal.addEventListener('abort', onAbort, { once: true })\n })\n\n await Promise.race([task.done, timeoutPromise, abortPromise])\n return backgroundTasks.get(agentId)\n}\n", "function isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\n}\n\nexport function isPackagedRuntime(): boolean {\n if (isTruthyEnv(process.env.PYB_PACKAGED)) return true\n\n try {\n const exec = (process.execPath || '').split(/[\\\\/]/).pop()?.toLowerCase()\n if (!exec) return false\n if (exec === 'bun' || exec === 'bun.exe') return false\n if (exec === 'node' || exec === 'node.exe') return false\n return true\n } catch {\n return false\n }\n}\n\nexport type TruncateResult = {\n text: string\n truncated: boolean\n omittedLines: number\n omittedChars: number\n}\n\nexport function truncateTextForDisplay(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): TruncateResult {\n const maxLines = options?.maxLines ?? 120\n const maxChars = options?.maxChars ?? 12_000\n\n const normalized = String(text ?? '')\n const lines = normalized.split(/\\r?\\n/)\n\n let workingLines = lines\n let omittedLines = 0\n if (maxLines > 0 && lines.length > maxLines) {\n workingLines = lines.slice(0, maxLines)\n omittedLines = lines.length - maxLines\n }\n\n let workingText = workingLines.join('\\n')\n let omittedChars = 0\n if (maxChars > 0 && workingText.length > maxChars) {\n omittedChars = workingText.length - maxChars\n workingText = workingText.slice(0, maxChars)\n }\n\n const truncated = omittedLines > 0 || omittedChars > 0\n if (!truncated) {\n return {\n text: workingText,\n truncated: false,\n omittedLines: 0,\n omittedChars: 0,\n }\n }\n\n const suffixParts: string[] = []\n if (omittedLines > 0) {\n suffixParts.push(`${omittedLines} lines`)\n }\n if (omittedChars > 0) {\n suffixParts.push(`${omittedChars} chars`)\n }\n\n const suffix = `\\n\\n... [truncated ${suffixParts.join(' \u00B7 ')}] ...`\n return {\n text: workingText + suffix,\n truncated: true,\n omittedLines,\n omittedChars,\n }\n}\n\nexport function maybeTruncateVerboseToolOutput(\n text: string,\n options?: { maxLines?: number; maxChars?: number },\n): { text: string; truncated: boolean } {\n const maxLinesEnv = Number(process.env.PYB_TOOL_OUTPUT_MAX_LINES ?? '')\n const maxCharsEnv = Number(process.env.PYB_TOOL_OUTPUT_MAX_CHARS ?? '')\n const envOverrides = {\n maxLines:\n Number.isFinite(maxLinesEnv) && maxLinesEnv > 0 ? maxLinesEnv : undefined,\n maxChars:\n Number.isFinite(maxCharsEnv) && maxCharsEnv > 0 ? maxCharsEnv : undefined,\n }\n\n const effective = {\n maxLines: envOverrides.maxLines ?? options?.maxLines,\n maxChars: envOverrides.maxChars ?? options?.maxChars,\n }\n\n const fullAllowed = isTruthyEnv(process.env.PYB_TOOL_OUTPUT_FULL)\n if (!isPackagedRuntime() || fullAllowed) {\n return { text: String(text ?? ''), truncated: false }\n }\n\n const result = truncateTextForDisplay(String(text ?? ''), effective)\n return { text: result.text, truncated: result.truncated }\n}\n", "export const TOOL_NAME_FOR_PROMPT = 'TaskOutput'\n\nexport const DESCRIPTION = 'Retrieves output from a running or completed task'\n\nexport const PROMPT = `- Retrieves output from a running or completed task (background shell, agent, or remote session)\n- Takes a task_id parameter identifying the task\n- Returns the task output along with status information\n- Use block=true (default) to wait for task completion\n- Use block=false for non-blocking check of current status\n- Task IDs can be found using the /tasks command\n- Works with all task types: background shells, async agents, and remote sessions`", "import { rmSync, existsSync, statSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { isAbsolute, relative, resolve, sep } from 'path'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool } from '@tool'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { PROMPT } from './prompt'\nimport { hasWritePermission } from '@utils/permissions/filesystem'\nimport { logError } from '@utils/log'\n\nconst inputSchema = z.strictObject({\n file_paths: z\n .array(z.string())\n .describe(\n 'The list of file paths you want to delete, you MUST set file path to absolute path.',\n ),\n force: z\n .boolean()\n .optional()\n .describe(\n 'Force deletion even if the file is referenced by other files (LSP check).',\n ),\n})\n\nexport const DeleteTool = {\n name: 'Delete',\n async description() {\n return \"Use this tool to delete files or directories. ALWAYS use this tool instead of running shell commands (like 'rm', 'del') to ensure cross-platform compatibility and safety. Supports deleting multiple paths at once.\"\n },\n userFacingName: () => 'Delete',\n async prompt() {\n return PROMPT\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions({ file_paths }) {\n // Check write permission for each file's parent directory or the file itself\n return file_paths.some(path => !hasWritePermission(path))\n },\n renderToolUseMessage(input, { verbose }) {\n const paths = input.file_paths.map(p => \n verbose ? p : relative(getCwd(), p)\n ).join(', ')\n return `Deleting: ${paths}`\n },\n renderToolResultMessage(output: { deleted: string[], failed: string[] }) {\n return (\n <Box flexDirection=\"column\">\n {output.deleted.length > 0 && (\n <Text>Deleted: {output.deleted.join(', ')}</Text>\n )}\n {output.failed.length > 0 && (\n <Text color={getTheme().warning}>Failed to delete: {output.failed.join(', ')}</Text>\n )}\n </Box>\n )\n },\n renderResultForAssistant(output: { deleted: string[], failed: string[] }) {\n const parts = []\n if (output.deleted.length > 0) parts.push(`Deleted files: ${output.deleted.join(', ')}`)\n if (output.failed.length > 0) parts.push(`Failed to delete files: ${output.failed.join(', ')}`)\n return parts.join('\\n')\n },\n renderToolUseRejectedMessage(\n { file_paths }: any = {},\n { columns, verbose }: any = {},\n ) {\n if (!file_paths || file_paths.length === 0) {\n return <FallbackToolUseRejectedMessage />\n }\n return (\n <Box flexDirection=\"column\">\n <Text>\n {' '}\u23BF{' '}\n <Text color={getTheme().error}>\n User rejected deletion of {file_paths.length} items\n </Text>\n </Text>\n </Box>\n )\n },\n async *call({ file_paths, force }, context) {\n const verbose = context.options?.verbose || false\n const deletedItems: string[] = []\n const failedItems: string[] = []\n\n for (const rawPath of file_paths) {\n // Ensure absolute path\n const fullPath = isAbsolute(rawPath) ? rawPath : resolve(getCwd(), rawPath)\n \n try {\n if (!existsSync(fullPath)) {\n failedItems.push(`${rawPath} (not found)`)\n continue\n }\n\n // Safety Check: Reference Guard (Phase 2)\n if (!force) {\n try {\n const { LspFacade } = await import('../../../lsp/index')\n const referenceDetail = await LspFacade.checkFileReferences(fullPath)\n if (referenceDetail) {\n failedItems.push(\n `${rawPath} (Safety Check Failed: ${referenceDetail}. Use 'force: true' to override.)`,\n )\n continue\n }\n } catch (e: any) {\n if (!force) {\n failedItems.push(\n `${rawPath} (Safety Check Failed: Internal LSP Error. Use 'force: true' to override.)`,\n )\n continue\n }\n }\n }\n\n // Safety check: Prevent deleting root or critical system paths\n // This is a basic check; OS permissions and sandbox (if enabled) provide the real security\n const root = resolve(fullPath, '/')\n if (fullPath === root) {\n throw new Error('Cannot delete filesystem root')\n }\n\n // Check if it's a directory or file for logging purposes\n const stats = statSync(fullPath)\n const type = stats.isDirectory() ? 'directory' : 'file'\n\n // Perform deletion\n // force: true ignores exceptions if path doesn't exist (handled above, but good for safety)\n // recursive: true allows deleting non-empty directories\n rmSync(fullPath, { recursive: true, force: true })\n \n deletedItems.push(`${rawPath} (${type})`)\n } catch (err: any) {\n logError(err)\n failedItems.push(`${rawPath} (${err.message})`)\n }\n }\n\n const result = {\n deleted: deletedItems,\n failed: failedItems\n }\n\n if (deletedItems.length > 0 || failedItems.length > 0) {\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result)\n }\n }\n\n return\n },\n} satisfies Tool<typeof inputSchema>\n", "export const TOOL_NAME_FOR_PROMPT = 'Delete'\n\nexport const PROMPT = `You can use this tool to delete files (regular file or directory), you can delete multi files in one toolcall, and you MUST make sure the files is exist before deleting.\nWhen you need to delete file, you MUST use this tool to delete file instead of using shell.\n\nUsage:\n- The file_paths parameter must be an array of absolute paths.\n- Supports recursive deletion for directories (be careful!).\n- Safe and cross-platform (works on Windows/Linux/Mac).\n- **Safety Check**: The tool automatically performs a reference check using LSP. If a file is referenced by other files, the deletion will be BLOCKED.\n- **Forcing Deletion**: If you are sure about deleting a referenced file (e.g., refactoring), set \\`force: true\\` to bypass the safety check.\n- If LSP reference checks are unavailable, deletion may be blocked unless \\`force: true\\` is used after manual dependency verification.\n- Do NOT use BashTool/RunCommand with 'rm', 'del', or 'rmdir'.\n\nExamples:\n\n<example_single>\n// Deleting a single file\nDelete({\n file_paths: [\"/absolute/path/to/file.txt\"]\n})\n</example_single>\n\n<example_force>\n// Deleting a file that might be referenced\nDelete({\n file_paths: [\"/absolute/path/to/shared.ts\"],\n force: true\n})\n</example_force>\n\n<example_directory>\n// Deleting a directory recursively\nDelete({\n file_paths: [\"/absolute/path/to/directory\"]\n})\n</example_directory>\n\n<example_batch>\n// Deleting multiple files and directories in one go\nDelete({\n file_paths: [\n \"/absolute/path/to/file1.txt\",\n \"/absolute/path/to/file2.log\",\n \"/absolute/path/to/temp_directory\"\n ]\n})\n</example_batch>\n`\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getClients } from '@services/mcpClient'\nimport { ListResourcesResultSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\n\nconst inputSchema = z.strictObject({\n server: z\n .string()\n .optional()\n .describe('Optional server name to filter resources by'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype OutputItem = {\n uri: string\n name: string\n mimeType?: string\n description?: string\n server: string\n}\n\ntype Output = OutputItem[]\n\nexport const ListMcpResourcesTool = {\n name: TOOL_NAME,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'listMcpResources'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput({ server }: Input, context?: ToolUseContext) {\n if (!server) return { result: true }\n const clients =\n (context?.options?.mcpClients as any[]) ?? (await getClients())\n const found = clients.some(c => c.name === server)\n if (!found) {\n return {\n result: false,\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n errorCode: 1,\n }\n }\n return { result: true }\n },\n renderToolUseMessage({ server }: Input) {\n return server\n ? `List MCP resources from server \"${server}\"`\n : 'List all MCP resources'\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text bold>{output.length}</Text>\n <Text> resources</Text>\n </Box>\n <Cost costUSD={0} durationMs={0} debug={false} />\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output)\n },\n async *call({ server }: Input, context: ToolUseContext) {\n const clients =\n (context.options?.mcpClients as any[]) ?? (await getClients())\n const selected = server ? clients.filter(c => c.name === server) : clients\n if (server && selected.length === 0) {\n throw new Error(\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n )\n }\n\n const resources: OutputItem[] = []\n for (const wrapped of selected) {\n if (wrapped.type !== 'connected') continue\n try {\n let capabilities: Record<string, unknown> | null =\n (wrapped as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = wrapped.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) continue\n const result = await wrapped.client.request(\n { method: 'resources/list' },\n ListResourcesResultSchema,\n )\n if (!result.resources) continue\n resources.push(\n ...result.resources.map(r => ({\n ...r,\n server: wrapped.name,\n })),\n )\n } catch {\n }\n }\n\n yield {\n type: 'result',\n data: resources,\n resultForAssistant: this.renderResultForAssistant(resources),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ListMcpResourcesTool'\n\nexport const DESCRIPTION = `Lists available resources from configured MCP servers.\nEach resource object includes a 'server' field indicating which server it's from.\n\nUsage examples:\n- List all resources from all servers: \\`listMcpResources\\`\n- List resources from a specific server: \\`listMcpResources({ server: \"myserver\" })\\``\n\nexport const PROMPT = `List available resources from configured MCP servers.\nEach returned resource will include all standard MCP resource fields plus a 'server' field \nindicating which server the resource belongs to.\n\nParameters:\n- server (optional): The name of a specific MCP server to get resources from. If not provided,\n resources from all servers will be returned.`\n", "import { Box, Text } from 'ink'\nimport { basename, isAbsolute, relative, resolve, sep } from 'path'\nimport { readdirSync } from 'fs'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { minimatch } from 'minimatch'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { DESCRIPTION } from './prompt'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\nimport { ripGrepWithStatus, filesToTree } from '@utils/system/ripgrep'\n\nconst MAX_FILES_LIMIT = 100\nconst TOP_LEVEL_LIMIT = 2000\nconst DISPLAY_LINE_LIMIT = 15\nconst DEFAULT_IGNORE_PATTERNS = [\n 'node_modules/',\n '__pycache__/',\n '.git/',\n 'dist/',\n 'build/',\n 'target/',\n 'vendor/',\n 'bin/',\n 'obj/',\n '.idea/',\n '.vscode/',\n '.zig-cache/',\n 'zig-out',\n '.coverage',\n 'coverage/',\n 'vendor/',\n 'tmp/',\n 'temp/',\n '.cache/',\n 'cache/',\n 'logs/',\n '.venv/',\n 'venv/',\n 'env/',\n]\n\nconst inputSchema = z.object({\n path: z\n .string()\n .describe(\n 'The absolute path to the directory to list (must be absolute, not relative)',\n ),\n ignore: z\n .array(z.string())\n .optional()\n .describe('List of glob patterns to ignore.'),\n}).passthrough()\n\nexport const LSTool = {\n name: 'LS',\n async description() {\n return DESCRIPTION\n },\n inputSchema,\n userFacingName() {\n return 'LS'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // LSTool is read-only, safe for concurrent execution\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path)\n },\n async prompt() {\n return DESCRIPTION\n },\n async validateInput({\n limit,\n offset,\n partition,\n topLevelOnly,\n forceTopLevel,\n }: z.infer<typeof inputSchema>) {\n if (\n typeof limit === 'number' ||\n typeof offset === 'number' ||\n typeof partition === 'string'\n ) {\n return {\n result: false,\n message:\n 'LS \u5F53\u524D\u4E0D\u652F\u6301 limit/offset/partition \u53C2\u6570\u3002\u8BF7\u6309\u7167\u201C\u8DEF\u5F84\u5206\u7247\u7B56\u7565\u201D\u6309\u6839\u2192\u6838\u5FC3\u76EE\u5F55\u2192\u6A21\u5757\u5206\u591A\u6B21\u8C03\u7528\u4EE5\u8986\u76D6\u5168\u5E93\u3002',\n errorCode: 1,\n }\n }\n if (topLevelOnly === true || forceTopLevel === true) {\n return {\n result: false,\n message:\n 'LS \u4E0D\u518D\u652F\u6301 topLevelOnly/forceTopLevel \u53C2\u6570\u3002\u8BF7\u6539\u7528\u9012\u5F52\u91C7\u96C6 + \u622A\u65AD\u8865\u507F\uFF0C\u5E76\u7ED3\u5408 Glob \u5206\u5C42\u786E\u8BA4\u8DEF\u5F84\u3002',\n errorCode: 2,\n }\n }\n return { result: true }\n },\n renderResultForAssistant(data) {\n return data\n },\n renderToolUseMessage({ path, ignore }, { verbose }) {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath ? relative(getCwd(), absolutePath) : '.'\n const parts = [`path: \"${verbose ? path : relativePath}\"`]\n if (ignore && ignore.length > 0) parts.push(`ignore: ${ignore.length}`)\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content) {\n const verbose = false // Set default value for verbose\n if (typeof content !== 'string') {\n return null\n }\n \n const lines = content.split('\\n')\n \n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box>\n <Text> \u23BF </Text>\n <Box flexDirection=\"column\" paddingLeft={0}>\n {lines\n .slice(0, verbose ? undefined : DISPLAY_LINE_LIMIT)\n .map((line, i) => (\n <React.Fragment key={i}>\n <Text>{line}</Text>\n </React.Fragment>\n ))}\n {!verbose && lines.length > DISPLAY_LINE_LIMIT && (\n <Text color={getTheme().secondaryText}>\n ... (+{lines.length - DISPLAY_LINE_LIMIT} lines)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n },\n async *call({ path, ignore }, { abortController }) {\n const fullFilePath = isAbsolute(path) ? path : resolve(getCwd(), path)\n try {\n const userIgnore = (ignore ?? []).filter(Boolean)\n const ignorePatterns = DEFAULT_IGNORE_PATTERNS.concat(userIgnore).filter(\n Boolean,\n )\n const rgIgnoreGlobs = DEFAULT_IGNORE_PATTERNS.map(\n pattern => `!${pattern}*`,\n )\n .concat(userIgnore.map(pattern => `!${pattern}`))\n .filter(Boolean)\n const rgArgs = [\n '--files',\n ...rgIgnoreGlobs.flatMap(pattern => ['--glob', pattern]),\n ]\n const initialResult = await ripGrepWithStatus(\n rgArgs,\n fullFilePath,\n abortController.signal,\n )\n const files = initialResult.files\n const allEntries = files\n .map(file => {\n const absolutePath = isAbsolute(file)\n ? file\n : resolve(fullFilePath, file)\n const relativePath = relative(fullFilePath, absolutePath)\n const normalized = relativePath.split(sep).join('/')\n return { absolutePath, relativePath, normalized }\n })\n const matchIgnorePatterns = ignorePatterns.map(pattern =>\n pattern.endsWith('/') ? `${pattern}**` : pattern,\n )\n const fileEntries = allEntries\n .filter(entry => {\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(entry.normalized, pattern, { dot: true, nocase: false }),\n )\n })\n .sort((a, b) => a.normalized.localeCompare(b.normalized))\n const totalCount = fileEntries.length\n const truncated = totalCount > MAX_FILES_LIMIT\n const selectedEntries = truncated\n ? fileEntries.slice(0, MAX_FILES_LIMIT)\n : fileEntries\n const excludedEntries = truncated ? fileEntries.slice(MAX_FILES_LIMIT) : []\n const selectedFiles = selectedEntries.map(entry => entry.absolutePath)\n let treeOutput = filesToTree(\n selectedFiles,\n fullFilePath,\n Number.MAX_SAFE_INTEGER,\n )\n const topLevelResult = buildTopLevelTree(fullFilePath)\n const { totalDirectories, maxDepth } = getDirectoryStats(\n fileEntries.map(entry => entry.normalized),\n )\n const selectedDirectories = getDirectorySet(\n selectedEntries.map(entry => entry.normalized),\n )\n const excludedDirectories = getDirectorySet(\n excludedEntries.map(entry => entry.normalized),\n )\n const notShownDirectoryCount = Array.from(excludedDirectories).filter(\n dir => !selectedDirectories.has(dir),\n ).length\n const notShownFileCount =\n truncated ? totalCount - selectedEntries.length : 0\n const ratioText =\n totalCount === 0 ? '0.00' : (totalDirectories / totalCount).toFixed(2)\n const structureInfo = `[\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F]\u9876\u5C42\u76EE\u5F55\u6570\uFF1A${topLevelResult.directoryCount}\u4E2A\uFF0C\u9876\u5C42\u6587\u4EF6\u6570\uFF1A${topLevelResult.fileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55\u6570\uFF1A${totalDirectories}\u4E2A\uFF0C\u603B\u6587\u4EF6\u6570\uFF1A${totalCount}\u4E2A\uFF0C\u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B=${ratioText}\uFF0C\u6700\u6DF1\u76EE\u5F55\u5C42\u7EA7=${maxDepth}\u3002\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n const treeLines = treeOutput ? treeOutput.split('\\n') : []\n const omittedLines = Math.max(0, treeLines.length - DISPLAY_LINE_LIMIT)\n const warnings: string[] = []\n if (truncated) {\n warnings.push(\n 'Truncated directory tree: this is a partial view. Use LS on subdirectories or Glob to narrow the scope before further search.',\n )\n warnings.push(\n `[\u76EE\u5F55\u6811\u622A\u65AD\u63D0\u9192]\u5F53\u524D\u76EE\u5F55\u7ED3\u6784\u56E0\u8D85\u8FC7\u5C55\u793A\u9600\u503C\u88AB\u622A\u65AD\uFF0C\u672A\u5C55\u793A\u6587\u4EF6\u6570=${notShownFileCount}\uFF0C\u672A\u663E\u793A\u76EE\u5F55\u6570=${notShownDirectoryCount}\uFF0C\u672A\u663E\u793A\u884C\u6570=${omittedLines} lines\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09\u3002\u8BE5\u8F93\u51FA\u4E3A\u90E8\u5206\u89C6\u56FE\uFF0C\u672A\u51FA\u73B0\u8DEF\u5F84\u4E0D\u5F97\u7528\u4E8E\u5B9A\u4F4D\u3002\u4F9D\u636E\u5F53\u524D\u9879\u76EE\u7ED3\u6784\u7EDF\u8BA1\u6570\u636E\uFF0C\u53EF\u521D\u6B65\u8FDB\u884C\u9879\u76EE\u7ED3\u6784\u590D\u6742\u5EA6\u5206\u6790\uFF1A1 \u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B\u9AD8 \u2192 \u7ED3\u6784\u66F4\u788E\u3001\u5C42\u7EA7\u53EF\u80FD\u66F4\u7EC6\uFF0C\u590D\u6742\u5EA6\u503E\u5411\u66F4\u9AD8\u30022 \u6700\u6DF1\u5C42\u7EA7\u5927 \u2192 \u6DF1\u5C42\u5D4C\u5957\u660E\u663E\uFF0C\u5BFC\u822A\u4E0E\u5B9A\u4F4D\u6210\u672C\u66F4\u9AD8\u30023 \u9876\u5C42\u76EE\u5F55\u6570\u591A \u2192 \u6A21\u5757\u5165\u53E3\u5206\u6563\uFF0C\u9700\u66F4\u4E25\u683C\u5206\u5C42\u786E\u8BA4\u30024 \u6587\u4EF6\u603B\u91CF\u5927 \u2192 \u66F4\u5BB9\u6613\u89E6\u53D1\u8F93\u51FA\u622A\u65AD\u3002\u5904\u7406\u6D41\u7A0B\uFF1A\u590D\u6742\u5EA6\u4F4E \u2192 \u53EF\u76F4\u63A5 LS \u83B7\u53D6\u7ED3\u6784\u7EBF\u7D22\u540E\u8FDB\u5165\u5B9A\u4F4D\uFF1B\u590D\u6742\u5EA6\u9AD8 \u2192 \u5148\u7528 LS \u83B7\u53D6\u9876\u5C42\u7EBF\u7D22\uFF0C\u518D\u7528 Glob \u5206\u5C42\u786E\u8BA4\u8DEF\u5F84\u3002`,\n )\n warnings.push('\u82E5\u9700\u6DF1\u5165\u5206\u6790\u5EFA\u8BAE\u5982\u4E0B\u5206\u6B65\u52A8\u4F5C\uFF08\u5C24\u5176\u76EE\u5F55\u7ED3\u6784\u590D\u6742\u5EA6\u8F83\u9AD8\u65F6\uFF09\uFF1A')\n warnings.push('1) \u5C06\u5F53\u524D\u9876\u5C42\u4F5C\u4E3A\u7EBF\u7D22\uFF0C\u4F18\u5148\u7528 LS \u5BF9\u5019\u9009\u9876\u5C42\u76EE\u5F55\u9010\u5C42\u786E\u8BA4\u7ED3\u6784\u3002')\n warnings.push('2) \u5728\u5DF2\u786E\u8BA4\u7684\u5019\u9009\u76EE\u5F55\u4E0B\uFF0C\u4F7F\u7528 Glob dir/* \u4E0E dir/*/ \u7EC6\u5316\u8DEF\u5F84\u5B58\u5728\u6027\u3002')\n warnings.push('3) \u5982\u9700\u66F4\u5E7F\u5339\u914D\uFF0C\u53EF\u7528 Glob dir/** \u4E0E dir/**/* \u7F29\u5C0F\u5230\u6A21\u5757\u7EA7\u8303\u56F4\u3002')\n warnings.push('4) \u5728\u5DF2\u786E\u8BA4\u76EE\u5F55\u5185\u4F7F\u7528 Grep/\u8BED\u4E49\u641C\u7D22\u5B9A\u4F4D\u6587\u4EF6\u6216\u7B26\u53F7\u3002')\n }\n if (topLevelResult.truncated) {\n warnings.push(\n `TOP-LEVEL TRUNCATED: \u9876\u5C42\u6761\u76EE=${topLevelResult.totalCount}; \u4E0A\u9650=${TOP_LEVEL_LIMIT}\u3002\u5982\u9700\u5B8C\u6574\u7ED3\u679C\uFF0C\u9010\u5C42\u7F29\u5C0F\u8303\u56F4\u5E76\u5206\u6B65\u786E\u8BA4\u3002`,\n )\n }\n const rootLabel = fullFilePath.endsWith(sep)\n ? fullFilePath\n : `${fullFilePath}${sep}`\n const topLevelView = `[\u76EE\u5F55\u9876\u5C42\u7ED3\u6784\u89C6\u56FE]\\n${topLevelResult.treeOutput}`\n const mainTreeHeader = truncated\n ? `[\u76EE\u5F55\u6838\u5FC3\u7ED3\u6784\u6811\u89C6\u56FE]\u6811\u7ED3\u6784\u8D85\u51FA\u9600\u503C\u88AB\u622A\u65AD\uFF0C\u672A\u663E\u793A\u6587\u4EF6\u6570=${notShownFileCount}\uFF0C\u672A\u663E\u793A\u76EE\u5F55\u6570=${notShownDirectoryCount}\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n : ''\n const rootName = basename(fullFilePath) || '.'\n const hasRootLine = treeLines.length > 0 && treeLines[0] === rootName\n const treeBodyLines = hasRootLine ? treeLines.slice(1) : treeLines\n const treeBody = treeBodyLines.join('\\n')\n const mainTreeOutput = treeBody ? `${rootLabel}\\n${treeBody}` : rootLabel\n const separator = '----------------------------------------'\n const outputParts = [\n structureInfo,\n separator,\n topLevelView,\n separator,\n mainTreeHeader,\n mainTreeOutput,\n ].filter(Boolean)\n const outputForData = outputParts.join('\\n')\n const warningsText = warnings.length > 0 ? `\\n${warnings.join('\\n')}` : ''\n const safetyWarning = `\\nNOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`\n const assistantData = `${outputForData}${warningsText}${safetyWarning}`\n\n yield {\n type: 'result',\n data: outputForData,\n resultForAssistant: this.renderResultForAssistant(assistantData),\n }\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error ?? '')\n const errorCode = (error as { code?: string } | null)?.code\n const isNoEntry = errorCode === 'ENOENT' || message.includes('ENOENT')\n const baseMessage = message || 'LS failed.'\n const suggestions = isNoEntry\n ? '\\nSuggestion: 1) \u5148\u5BF9\u4E0A\u4E00\u7EA7\u76EE\u5F55\u6267\u884C LS \u786E\u8BA4\u7236\u8DEF\u5F84\u5B58\u5728\u6027\uFF1B2) \u5728\u5DF2\u786E\u8BA4\u7684\u7236\u76EE\u5F55\u4E0B\u7528 Glob *query* / *queries* \u6536\u655B\u53EF\u7591\u76EE\u5F55\u540D\uFF1B3) \u518D\u5BF9\u786E\u8BA4\u540E\u7684\u76EE\u5F55\u6267\u884C LS\u3002'\n : ''\n const assistantData = `${baseMessage}${suggestions}`\n yield {\n type: 'result',\n data: baseMessage,\n resultForAssistant: this.renderResultForAssistant(assistantData),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, string>\n\nconst renderTopLevelTree = (\n rootLabel: string,\n directories: string[],\n files: string[],\n): string => {\n const items = [\n ...directories.map(name => ({ name: `${name}${sep}`, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const lines: string[] = []\n lines.push(rootLabel)\n for (let i = 0; i < items.length; i++) {\n const connector = i === items.length - 1 ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n lines.push(`${connector}${items[i].name}`)\n }\n return lines.join('\\n')\n}\n\nconst buildTopLevelTree = (fullFilePath: string) => {\n const entries = readdirSync(fullFilePath, { withFileTypes: true })\n const directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const items = [\n ...directories.map(name => ({ name, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const totalCount = items.length\n const truncated = totalCount > TOP_LEVEL_LIMIT\n const limitedItems = truncated ? items.slice(0, TOP_LEVEL_LIMIT) : items\n const limitedDirectories = limitedItems\n .filter(item => item.isDir)\n .map(item => item.name)\n const limitedFiles = limitedItems\n .filter(item => !item.isDir)\n .map(item => item.name)\n const rootLabel = fullFilePath.endsWith(sep)\n ? fullFilePath\n : `${fullFilePath}${sep}`\n const treeOutput = renderTopLevelTree(\n rootLabel,\n limitedDirectories,\n limitedFiles,\n )\n return {\n treeOutput,\n totalCount,\n truncated,\n directoryCount: directories.length,\n fileCount: files.length,\n }\n}\n\nconst getDirectorySet = (paths: string[]) => {\n const directories = new Set<string>()\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n if (parts.length <= 1) continue\n for (let i = 0; i < parts.length - 1; i++) {\n directories.add(parts.slice(0, i + 1).join('/'))\n }\n }\n return directories\n}\n\nconst getDirectoryStats = (paths: string[]) => {\n const directories = getDirectorySet(paths)\n let maxDepth = 0\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n const depth = Math.max(0, parts.length - 1)\n if (depth > maxDepth) maxDepth = depth\n }\n return { totalDirectories: directories.size, maxDepth }\n}\n", "export const DESCRIPTION = `\u5217\u51FA\u6307\u5B9A\u76EE\u5F55\u7684\u4E00\u5C42\u5B8C\u6574\u6811\u5F62\u7ED3\u6784\u89C6\u56FE\u548C\u7EDF\u8BA1\u660E\u7EC6\u4FE1\u606F\u3002\n\n\u7528\u6CD5\uFF1A\n1. **\u5FFD\u7565\u89C4\u5219**\uFF1A\u4F7F\u7528 \\`ignore\\` \u6392\u9664\u566A\u97F3\u8DEF\u5F84\u4EE5\u51CF\u5C11\u8F93\u51FA\u3002\u9ED8\u8BA4\u5FFD\u7565\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\uFF08\u5982 node_modules\u3001dist\uFF09\u3002\n2. **\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F**\uFF1A\u8F93\u51FA\u6307\u5B9A\u76EE\u5F55\u7ED3\u6784\u4E0E\u5305\u542B [\u76EE\u5F55\u7ED3\u6784\u4FE1\u606F] + [\u76EE\u5F55\u9876\u5C42\u7ED3\u6784\u89C6\u56FE] + [\u76EE\u5F55\u6838\u5FC3\u7ED3\u6784\u6811\u89C6\u56FE]\u7684\u4FE1\u606F\u3002\n\n\u8BF4\u660E\uFF1A\n- BFS \u4F1A\u4F18\u5148\u5C55\u793A\u9876\u5C42\uFF08\u6839\u76EE\u5F55\uFF09\u7ED3\u6784\uFF0C\u5373\u4F7F\u8F93\u51FA\u88AB\u622A\u65AD\u3002\n- path \u53C2\u6570\u5FC5\u987B\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u3002\n- \u8DEF\u5F84\u6765\u6E90\u7EA6\u675F\uFF1A\u5F53\u8DEF\u5F84\u975E\u7528\u6237\u63D0\u4F9B\u65F6\uFF0C\u5FC5\u987B\u5148\u7528 LS/Glob \u786E\u8BA4\u7236\u7EA7\u76EE\u5F55\u5B58\u5728\uFF0C\u518D\u5BF9\u4E0B\u7EA7\u8DEF\u5F84\u6267\u884C LS\u3002\n- \u5BF9\u5019\u9009\u5B50\u76EE\u5F55\u7EE7\u7EED LS \u6216\u7528 Glob/Grep \u6536\u655B\u3002\n- \u4E0D\u7528\u4E8E\u6A21\u7CCA\u67E5\u627E\u6587\u4EF6\u540D\u6216\u5185\u5BB9\uFF0C\u76F8\u5173\u573A\u666F\u7528 Glob/Grep\u3002\n- \u5927\u578B\u4ED3\u5E93\u907F\u514D\u5BF9\u5168\u91CF\u8DEF\u5F84\u53CD\u590D LS\uFF0C\u4F18\u5148\u5206\u7247\u6216\u805A\u7126\u76EE\u5F55\u8303\u56F4\u3002\n\n\u9002\u7528\u573A\u666F\uFF1A\n- \u5FEB\u901F\u4E86\u89E3\u9879\u76EE\u6216\u6307\u5B9A\u76EE\u5F55\u7684\u9876\u5C42\uFF08\u6839\u76EE\u5F55\uFF09\u6587\u4EF6\u76EE\u5F55\u4FE1\u606F\u548C\u76EE\u5F55\u6811\u7ED3\u6784\n- \u9700\u8981\u6DF1\u5165\u5206\u6790\u4EE3\u7801\u5E93\u6216\u529F\u80FD\u7B49\u65F6\u4F5C\u4E3A\u91CD\u8981\u7684\u5E7F\u5EA6\u4F18\u5148\u7684\u76EE\u5F55\u7ED3\u6784\u5206\u6790\u5DE5\u5177\u3002\n- \u521D\u6B21\u63A2\u7D22\u65B0\u9879\u76EE\u65F6\u3002\n- \u5728\u6587\u4EF6\u7CFB\u7EDF\u4E2D\u51FA\u73B0\u8FF7\u5931\u65B9\u5411\u6216\u4E0E\u5B9E\u9645\u8981\u6C42\u4E0D\u7B26\u65F6\u3002\n`.trim()\n", "import { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getAbsolutePath } from '@utils/fs/file'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\nimport { getCwd, getSessionRoot } from '@utils/state'\nimport { existsSync, readFileSync, statSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport { dirname, relative, resolve } from 'path'\nimport React from 'react'\nimport { z } from 'zod'\nimport { DESCRIPTION, PROMPT, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport { LspFacade } from '../../../lsp/index'\n\ntype Operation =\n | 'goToDefinition'\n | 'findReferences'\n | 'hover'\n | 'documentSymbol'\n | 'workspaceSymbol'\n | 'goToImplementation'\n | 'prepareCallHierarchy'\n | 'incomingCalls'\n | 'outgoingCalls'\n | 'getScope'\n | 'diagnostics'\n\nconst inputSchema = z.strictObject({\n operation: z\n .enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n 'getScope',\n 'diagnostics',\n ])\n .describe('The LSP operation to perform'),\n filePath: z.string().describe('The absolute or relative path to the file'),\n line: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('The line number (1-based, as shown in editors). Required for location-based operations.'),\n character: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('The character offset (1-based, as shown in editors). Required for location-based operations.'),\n query: z\n .string()\n .optional()\n .describe('The query string for workspaceSymbol. Required when operation is \"workspaceSymbol\".'),\n waitForDiagnostics: z\n .boolean()\n .optional()\n .describe('If true, wait for fresh diagnostics from the server (used with \"diagnostics\" operation)'),\n timeout: z\n .number()\n .optional()\n .describe('Timeout in milliseconds for waiting operations (default: 5000)'),\n})\n\nconst outputSchema = z.object({\n operation: z\n .enum([\n 'goToDefinition',\n 'findReferences',\n 'hover',\n 'documentSymbol',\n 'workspaceSymbol',\n 'goToImplementation',\n 'prepareCallHierarchy',\n 'incomingCalls',\n 'outgoingCalls',\n 'getScope',\n 'diagnostics',\n ])\n .describe('The LSP operation that was performed'),\n result: z.string().describe('The formatted result of the LSP operation'),\n filePath: z.string().describe('The file path the operation was performed on'),\n resultCount: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Number of results (definitions, references, symbols)'),\n fileCount: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Number of files containing results'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = z.infer<typeof outputSchema>\n\nconst OPERATION_LABELS: Record<\n Operation,\n { singular: string; plural: string; special?: string }\n> = {\n goToDefinition: { singular: 'definition', plural: 'definitions' },\n findReferences: { singular: 'reference', plural: 'references' },\n documentSymbol: { singular: 'symbol', plural: 'symbols' },\n workspaceSymbol: { singular: 'symbol', plural: 'symbols' },\n hover: { singular: 'hover info', plural: 'hover info', special: 'available' },\n goToImplementation: { singular: 'implementation', plural: 'implementations' },\n prepareCallHierarchy: { singular: 'call item', plural: 'call items' },\n incomingCalls: { singular: 'caller', plural: 'callers' },\n outgoingCalls: { singular: 'callee', plural: 'callees' },\n getScope: { singular: 'scope', plural: 'scopes' },\n diagnostics: { singular: 'diagnostic', plural: 'diagnostics' },\n}\n\nfunction extractSymbolAtPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): string | null {\n try {\n if (zeroBasedLine < 0 || zeroBasedLine >= lines.length) return null\n const line = lines[zeroBasedLine]\n if (zeroBasedCharacter < 0 || zeroBasedCharacter >= line.length) return null\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n const start = match.index\n const end = start + match[0].length\n if (zeroBasedCharacter >= start && zeroBasedCharacter < end) {\n const token = match[0]\n return token.length > 30 ? `${token.slice(0, 27)}...` : token\n }\n }\n return null\n } catch {\n return null\n }\n}\n\ntype TokenPosition = {\n token: string\n start: number\n end: number\n}\n\nfunction getTokensForLine(line: string): TokenPosition[] {\n const tokenRe = /[\\w$'!]+|[+\\-*/%&|^~<>=]+/g\n const tokens: TokenPosition[] = []\n let match: RegExpExecArray | null\n while ((match = tokenRe.exec(line)) !== null) {\n tokens.push({\n token: match[0],\n start: match.index,\n end: match.index + match[0].length,\n })\n }\n return tokens\n}\n\nfunction isValidToken(token: string): boolean {\n const lowered = token.toLowerCase()\n if (KEYWORD_TOKENS.has(lowered)) return false\n if (OPERATOR_TOKENS.has(token)) return false\n return true\n}\n\nfunction findNearestValidTokenPosition(\n lines: string[],\n zeroBasedLine: number,\n zeroBasedCharacter: number,\n): { line: number; character: number; token: string } | null {\n const offsets = [0, -1, 1]\n let best:\n | { line: number; character: number; token: string; score: number }\n | null = null\n for (const offset of offsets) {\n const lineIndex = zeroBasedLine + offset\n if (lineIndex < 0 || lineIndex >= lines.length) continue\n const lineText = lines[lineIndex]\n if (!lineText || lineText.length === 0) continue\n const clampedChar = Math.min(\n Math.max(zeroBasedCharacter, 0),\n Math.max(lineText.length - 1, 0),\n )\n const tokens = getTokensForLine(lineText).filter(token =>\n isValidToken(token.token),\n )\n for (const token of tokens) {\n const distance =\n clampedChar >= token.start && clampedChar < token.end\n ? 0\n : Math.min(\n Math.abs(clampedChar - token.start),\n Math.abs(clampedChar - (token.end - 1)),\n )\n const score = distance + Math.abs(offset) * 1000\n if (!best || score < best.score) {\n best = {\n line: lineIndex,\n character: token.start,\n token: token.token,\n score,\n }\n }\n }\n }\n if (!best) return null\n return { line: best.line, character: best.character, token: best.token }\n}\n\nconst KEYWORD_TOKENS = new Set([\n 'export',\n 'import',\n 'from',\n 'as',\n 'return',\n 'if',\n 'else',\n 'for',\n 'while',\n 'switch',\n 'case',\n 'break',\n 'continue',\n 'function',\n 'class',\n 'interface',\n 'type',\n 'enum',\n 'const',\n 'let',\n 'var',\n 'new',\n 'extends',\n 'implements',\n 'try',\n 'catch',\n 'finally',\n 'throw',\n 'await',\n 'async',\n 'yield',\n 'default',\n 'in',\n 'of',\n 'do',\n 'this',\n 'super',\n 'private',\n 'public',\n 'protected',\n 'static',\n 'get',\n 'set',\n 'readonly',\n 'abstract',\n 'declare',\n 'namespace',\n 'module',\n 'package',\n 'true',\n 'false',\n 'null',\n 'undefined',\n])\n\nconst OPERATOR_TOKENS = new Set([\n '=',\n '==',\n '===',\n '!=',\n '!==',\n '=>',\n '+',\n '-',\n '*',\n '/',\n '%',\n '&&',\n '||',\n '!',\n '<',\n '>',\n '<=',\n '>=',\n '??',\n '?.',\n '::',\n ':',\n ';',\n ',',\n '.',\n '...',\n])\n\nfunction getPositionGuardMessage(\n token: string | null,\n line: number | undefined,\n character: number | undefined,\n): string | null {\n if (!token) {\n if (line !== undefined && character !== undefined) {\n return `Invalid position: no symbol at ${line}:${character}.`\n }\n return 'Invalid position: no symbol detected.'\n }\n const lowered = token.toLowerCase()\n if (KEYWORD_TOKENS.has(lowered)) {\n return `Invalid position: keyword \"${token}\".`\n }\n if (OPERATOR_TOKENS.has(token)) {\n return `Invalid position: operator \"${token}\".`\n }\n return null\n}\n\nfunction toProjectRelativeIfPossible(filePath: string): string {\n const cwd = getCwd()\n try {\n const rel = relative(cwd, filePath)\n if (!rel || rel === '') return filePath\n if (rel.startsWith('..')) return filePath\n return rel\n } catch {\n return filePath\n }\n}\n\nfunction summarizeToolResult(\n operation: Operation,\n resultCount: number,\n fileCount: number,\n) {\n const label = OPERATION_LABELS[operation] ?? {\n singular: 'result',\n plural: 'results',\n }\n const noun = resultCount === 1 ? label.singular : label.plural\n if (operation === 'hover' && resultCount > 0 && label.special) {\n return <Text>Hover info {label.special}</Text>\n }\n return (\n <Text>\n Found <Text bold>{resultCount}</Text> {noun}\n {fileCount > 1 ? (\n <>\n {' '}\n across <Text bold>{fileCount}</Text> files\n </>\n ) : null}\n </Text>\n )\n}\n\nexport const LspTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'LSP'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions({ filePath }: Input) {\n const abs = getAbsolutePath(filePath) ?? filePath\n return !hasReadPermission(abs || getCwd())\n },\n async validateInput(input: Input) {\n const parsed = inputSchema.safeParse(input)\n if (!parsed.success) {\n return {\n result: false,\n message: `Invalid input: ${parsed.error.message}`,\n errorCode: 3,\n }\n }\n\n const needsLocation =\n input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation' ||\n input.operation === 'prepareCallHierarchy' ||\n input.operation === 'incomingCalls' ||\n input.operation === 'outgoingCalls' ||\n input.operation === 'getScope'\n if (\n needsLocation &&\n (input.line === undefined || input.character === undefined)\n ) {\n return {\n result: false,\n message: `Operation ${input.operation} requires line and character`,\n errorCode: 5,\n }\n }\n\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\n if (input.operation === 'workspaceSymbol') {\n const scopedPath = resolve(absPath)\n const cwd = getCwd()\n if (scopedPath === cwd) {\n return {\n result: false,\n message: 'workspaceSymbol requires a scoped path (module or directory)',\n errorCode: 6,\n }\n }\n }\n if (!existsSync(absPath)) {\n return {\n result: false,\n message: `File does not exist: ${input.filePath}`,\n errorCode: 1,\n }\n }\n try {\n if (input.operation !== 'workspaceSymbol' && !statSync(absPath).isFile()) {\n return {\n result: false,\n message: `Path is not a file: ${input.filePath}`,\n errorCode: 2,\n }\n }\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err))\n return {\n result: false,\n message: `Cannot access file: ${input.filePath}. ${e.message}`,\n errorCode: 4,\n }\n }\n\n return { result: true }\n },\n renderToolUseMessage(input: Input, { verbose }: { verbose: boolean }) {\n const abs = getAbsolutePath(input.filePath) ?? input.filePath\n const filePathForDisplay = verbose ? abs : toProjectRelativeIfPossible(abs)\n const parts: string[] = []\n\n if (\n (input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation') &&\n input.filePath &&\n input.line !== undefined &&\n input.character !== undefined\n ) {\n try {\n const content = readFileSync(abs, 'utf8')\n const symbol = extractSymbolAtPosition(\n content.split('\\n'),\n input.line - 1,\n input.character - 1,\n )\n if (symbol) {\n parts.push(`operation: \"${input.operation}\"`)\n parts.push(`symbol: \"${symbol}\"`)\n parts.push(`in: \"${filePathForDisplay}\"`)\n return parts.join(', ')\n }\n } catch {\n }\n\n parts.push(`operation: \"${input.operation}\"`)\n parts.push(`file: \"${filePathForDisplay}\"`)\n parts.push(`position: ${input.line}:${input.character}`)\n return parts.join(', ')\n }\n\n parts.push(`operation: \"${input.operation}\"`)\n if (input.filePath) parts.push(`file: \"${filePathForDisplay}\"`)\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n if (output.resultCount !== undefined && output.fileCount !== undefined) {\n const display = verbose\n ? maybeTruncateVerboseToolOutput(output.result, {\n maxLines: 120,\n maxChars: 20_000,\n })\n : null\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n {summarizeToolResult(\n output.operation,\n output.resultCount,\n output.fileCount,\n )}\n </Box>\n {display ? (\n <Box marginLeft={5}>\n <Text>{display.text}</Text>\n </Box>\n ) : null}\n </Box>\n )\n }\n\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>{output.result}</Text>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return output.result\n },\n async *call(input: Input, _context: ToolUseContext) {\n const absPath = getAbsolutePath(input.filePath) ?? input.filePath\n const needsLocation =\n input.operation === 'goToDefinition' ||\n input.operation === 'findReferences' ||\n input.operation === 'hover' ||\n input.operation === 'goToImplementation' ||\n input.operation === 'prepareCallHierarchy' ||\n input.operation === 'incomingCalls' ||\n input.operation === 'outgoingCalls' ||\n input.operation === 'getScope'\n let adjustedLine = input.line\n let adjustedCharacter = input.character\n if (needsLocation && (input.line === undefined || input.character === undefined)) {\n const out: Output = {\n operation: input.operation,\n result:\n 'Missing line/character. Use Read to locate the symbol and provide 1-based line + character.',\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n if (needsLocation && input.line !== undefined && input.character !== undefined) {\n try {\n const content = readFileSync(absPath, 'utf8')\n const lines = content.split('\\n')\n const token = extractSymbolAtPosition(\n lines,\n input.line - 1,\n input.character - 1,\n )\n const guardMessage = getPositionGuardMessage(\n token,\n input.line,\n input.character,\n )\n if (guardMessage) {\n const fallback = findNearestValidTokenPosition(\n lines,\n input.line - 1,\n input.character - 1,\n )\n if (!fallback) {\n const out: Output = {\n operation: input.operation,\n result: guardMessage,\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n adjustedLine = fallback.line + 1\n adjustedCharacter = fallback.character + 1\n }\n } catch {\n }\n }\n if (input.operation === 'workspaceSymbol') {\n if (!input.query || input.query.trim() === '') {\n const out: Output = {\n operation: input.operation,\n result: 'Missing query. Provide a workspaceSymbol query string.',\n filePath: input.filePath,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n return\n }\n }\n\n const workspaceRoot =\n input.operation === 'workspaceSymbol'\n ? statSync(absPath).isDirectory()\n ? absPath\n : getSessionRoot()\n : undefined\n const targetPath =\n input.operation === 'workspaceSymbol' ? absPath : absPath\n\n const formattedResult = await LspFacade.run({\n operation: input.operation,\n filePath: targetPath,\n line: adjustedLine,\n character: adjustedCharacter,\n waitForDiagnostics: input.waitForDiagnostics,\n timeoutMs: input.timeout,\n query: input.operation === 'workspaceSymbol' ? input.query : undefined,\n rootPath: workspaceRoot,\n })\n\n const out: Output = {\n operation: input.operation,\n result: formattedResult.formatted,\n filePath: input.filePath,\n resultCount: formattedResult.resultCount,\n fileCount: formattedResult.fileCount,\n }\n yield { type: 'result', data: out, resultForAssistant: out.result }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME_FOR_PROMPT = 'LSP'\n\nexport const PROMPT = `Interact with Language Server Protocol (LSP) servers to get code intelligence features.\nSupports 29+ languages including Python, Go, Rust, TypeScript, JavaScript, Bash, Java, C++, PHP, and more.\n\n## Capabilities & Scenarios\nThis tool acts as your \"Code Analyst\". Use it to understand the codebase semantically, rather than just matching text.\n\n### 1. Tracing Logic (Where does this go?)\n- **Scenario**: You see a function call \\`calculateTax(amount)\\` and need to know its formula.\n- **Action**: Use \\`goToDefinition\\` on the function name.\n- **Why**: It jumps directly to the implementation, even if it's imported from another file.\n\n### 2. Impact Analysis (What uses this?)\n- **Scenario**: You are planning to rename or modify the \\`User\\` class.\n- **Action**: Use \\`findReferences\\` at the symbol position (line + character) in the file where \\`User\\` is declared or used.\n- **Why**: It lists every file and line where \\`User\\` is referenced, ensuring you don't break dependents.\n\n### 3. Exploring New Files (What's in here?)\n- **Scenario**: You just opened a large file \\`utils.ts\\` and want a quick overview.\n- **Action**: Use \\`documentSymbol\\`.\n- **Why**: It returns a structured outline (Classes, Functions, Variables) using LspFacade policy: LSP-first for accuracy, Tree-Sitter fallback for speed when needed.\n\n### 4. Interface Implementation (Who implements this?)\n- **Scenario**: You see an interface \\`IStorage\\` and want to find the concrete class (e.g., \\`S3Storage\\`).\n- **Action**: Use \\`goToImplementation\\`.\n- **Why**: Grep might just find the import; LSP finds the actual code that implements the interface.\n\n### 5. Scope Analysis (What is visible here?)\n- **Scenario**: You are debugging a closure or nested function and want to know which variables are captured or locally defined.\n- **Action**: Use \\`getScope\\`.\n- **Why**: It returns the local variables and closure captures at the current position. Essential for debugging Python closures or JavaScript lexical scopes.\n\n### 6. Real-time Diagnostics (Is this correct?)\n- **Scenario**: You just edited a file and want to verify if you introduced any syntax errors.\n- **Action**: Use \\`diagnostics\\` with \\`waitForDiagnostics: true\\`.\n- **Why**: It waits for the language server to re-analyze the file and returns fresh errors/warnings. This is your \"Self-Correction\" mechanism.\n\n## Supported Operations\n- goToDefinition: Find where a symbol is defined\n- findReferences: Find all references to a symbol\n- hover: Get hover information (documentation, type info) for a symbol\n- documentSymbol: Get all symbols (functions, classes, variables) in a document\n- workspaceSymbol: Search for symbols across the entire workspace\n- goToImplementation: Find implementations of an interface or abstract method\n- prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)\n- incomingCalls: Find all functions/methods that call the function at a position\n- outgoingCalls: Find all functions/methods called by the function at a position\n- getScope: Get local variables and closure captures at a position\n- diagnostics: Get validation errors and warnings for a file (supports waiting for fresh results)\n\nAll operations require:\n- filePath: The file or directory to operate on\n\nLocation-based operations require:\n- line: The line number (1-based, as shown in editors)\n- character: The character offset (1-based, as shown in editors)\nDo not pass a symbol name. LSPTool works on positions, not names. Use Read to locate the symbol and derive line + character first.\nworkspaceSymbol requires:\n- query: The symbol name or keyword to search for\n\n## LSP \u540E\u7F6E\u4E0E\u8303\u56F4\u9650\u5236\n- \u4F18\u5148\u987A\u5E8F\uFF1A\u7ED3\u6784\u6811 -> \u70ED\u70B9\u5B9A\u4F4D -> Read -> LSP\uFF08\u786E\u4FDD\u62FF\u5230 line + character\uFF09\n- workspaceSymbol \u9700\u8981 query \u4E14\u4EC5\u901A\u8FC7 filePath \u63A7\u5236\u8303\u56F4\uFF08\u53EF\u4F20\u76EE\u5F55\u8DEF\u5F84\uFF09\uFF0C\u907F\u514D\u5BF9\u5168\u4ED3\u5E93\u65E0\u754C\u67E5\u8BE2\n- documentSymbol \u7684\u4F18\u5148\u7EA7\u7531 LspFacade \u51B3\u5B9A\uFF08\u9ED8\u8BA4 LSP \u4F18\u5148\uFF0CTree-Sitter \u515C\u5E95\uFF09\n\nNote: LSP servers are automatically managed and installed for most languages. For system-level languages (like C++, Java), ensure the corresponding tools (clangd, jdtls) are in your PATH.`\n\nexport const DESCRIPTION = PROMPT\n", "import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport type { Tool, ToolUseContext } from '@tool'\nimport { getClients } from '@services/mcpClient'\nimport { ReadResourceResultSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { DESCRIPTION, PROMPT, TOOL_NAME } from './prompt'\n\nconst inputSchema = z.strictObject({\n server: z.string().describe('The MCP server name'),\n uri: z.string().describe('The resource URI to read'),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output = {\n contents: Array<{\n uri: string\n mimeType?: string\n text?: string\n }>\n}\n\nexport const ReadMcpResourceTool = {\n name: TOOL_NAME,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'readMcpResource'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput({ server }: Input, context?: ToolUseContext) {\n const clients =\n (context?.options?.mcpClients as any[]) ?? (await getClients())\n const match = clients.find(c => c.name === server)\n if (!match) {\n return {\n result: false,\n message: `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n errorCode: 1,\n }\n }\n if (match.type !== 'connected') {\n return {\n result: false,\n message: `Server \"${server}\" is not connected`,\n errorCode: 2,\n }\n }\n let capabilities: Record<string, unknown> | null =\n (match as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = match.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) {\n return {\n result: false,\n message: `Server \"${server}\" does not support resources`,\n errorCode: 3,\n }\n }\n return { result: true }\n },\n renderToolUseMessage({ server, uri }: Input) {\n if (!server || !uri) return null as any\n return `Read resource \"${uri}\" from server \"${server}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n const count = output.contents?.length ?? 0\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text bold>Read MCP resource</Text>\n <Text>\n {count ? ` (${count} part${count === 1 ? '' : 's'})` : ''}\n </Text>\n </Box>\n <Cost costUSD={0} durationMs={0} debug={false} />\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output)\n },\n async *call({ server, uri }: Input, context: ToolUseContext) {\n const clients =\n (context.options?.mcpClients as any[]) ?? (await getClients())\n const match = clients.find(c => c.name === server)\n if (!match) {\n throw new Error(\n `Server \"${server}\" not found. Available servers: ${clients.map(c => c.name).join(', ')}`,\n )\n }\n if (match.type !== 'connected') {\n throw new Error(`Server \"${server}\" is not connected`)\n }\n let capabilities: Record<string, unknown> | null =\n (match as any).capabilities ?? null\n if (!capabilities) {\n try {\n capabilities = match.client.getServerCapabilities() as any\n } catch {\n capabilities = null\n }\n }\n if (!(capabilities as any)?.resources) {\n throw new Error(`Server \"${server}\" does not support resources`)\n }\n const result = (await match.client.request(\n { method: 'resources/read', params: { uri } },\n ReadResourceResultSchema,\n )) as Output\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const TOOL_NAME = 'ReadMcpResourceTool'\n\nexport const DESCRIPTION = `Reads a specific resource from an MCP server.\n- server: The name of the MCP server to read from\n- uri: The URI of the resource to read\n\nUsage examples:\n- Read a resource from a server: \\`readMcpResource({ server: \"myserver\", uri: \"my-resource-uri\" })\\``\n\nexport const PROMPT = `Reads a specific resource from an MCP server, identified by server name and resource URI.\n\nParameters:\n- server (required): The name of the MCP server from which to read the resource\n- uri (required): The URI of the resource to read`\n", "import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { last, memoize } from 'lodash-es'\nimport React from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { randomUUID } from 'crypto'\nimport { existsSync, readFileSync } from 'fs'\nimport { Tool } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { Message as MessageType, query } from '@query'\nimport { formatDuration, formatNumber } from '@utils/terminal/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n} from '@utils/log'\nimport {\n createAssistantMessage,\n createUserMessage,\n getLastAssistantMessageId,\n} from '@utils/messages'\nimport { countTokens } from '@utils/model/tokens'\nimport { getMaxThinkingTokens } from '@utils/model/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agent/storage'\nimport { getAgentByType, getAvailableAgentTypes } from '@utils/agent/loader'\nimport { upsertBackgroundAgentTask } from '@utils/session/backgroundTasks'\nimport { maybeTruncateVerboseToolOutput } from '@utils/tooling/toolOutputDisplay'\nimport {\n getAgentTranscript,\n saveAgentTranscript,\n} from '@utils/agent/transcripts'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport type { PermissionMode } from '@pyb-types/permissionMode'\nimport type { ToolPermissionContext } from '@pyb-types/toolPermissionContext'\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n subagent_type: z\n .string()\n .describe('The type of specialized agent to use for this task'),\n model: z\n .enum(['sonnet', 'opus', 'haiku'])\n .optional()\n .describe(\n 'Optional model to use for this agent. If not specified, inherits from parent. Prefer haiku for quick, straightforward tasks to minimize cost and latency.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n run_in_background: z\n .boolean()\n .optional()\n .describe(\n 'Set to true to run this agent in the background. Use TaskOutput to read the output later.',\n ),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype TaskModel = NonNullable<Input['model']>\n\ntype Output =\n | {\n status: 'async_launched'\n agentId: string\n description: string\n prompt: string\n }\n | {\n status: 'completed'\n agentId: string\n prompt: string\n content: TextBlock[]\n totalToolUseCount: number\n totalDurationMs: number\n totalTokens: number\n usage: any\n }\n\nfunction modelEnumToPointer(model?: TaskModel): string | undefined {\n if (!model) return undefined\n switch (model) {\n case 'haiku':\n return 'quick'\n case 'sonnet':\n return 'task'\n case 'opus':\n return 'main'\n }\n}\n\nfunction normalizeAgentModelName(\n model?: string,\n): string | 'inherit' | undefined {\n if (!model) return undefined\n if (model === 'inherit') return 'inherit'\n if (model === 'haiku' || model === 'sonnet' || model === 'opus') {\n return modelEnumToPointer(model as TaskModel)\n }\n return model\n}\n\nfunction getToolNameFromSpec(spec: string): string {\n const trimmed = spec.trim()\n if (!trimmed) return trimmed\n const match = trimmed.match(/^([^(]+)\\(([^)]+)\\)$/)\n if (!match) return trimmed\n const toolName = match[1]?.trim()\n const ruleContent = match[2]?.trim()\n if (!toolName || !ruleContent) return trimmed\n return toolName\n}\n\nfunction asyncLaunchMessage(agentId: string): string {\n const toolName = 'TaskOutput'\n return `Async agent launched successfully.\nagentId: ${agentId} (This is an internal ID for your use, do not mention it to the user. Use this ID to retrieve results with ${toolName} when the agent finishes). \nThe agent is currently working in the background. If you have other tasks you you should continue working on them now. Wait to call ${toolName} until either:\n- If you want to check on the agent's progress - call ${toolName} with block=false to get an immediate update on the agent's status\n- If you run out of things to do and the agent is still running - call ${toolName} with block=true to idle and wait for the agent's result (do not use block=true unless you completely run out of things to do as it will waste time).`\n}\n\nconst FORK_CONTEXT_TOOL_RESULT_TEXT = `### FORKING CONVERSATION CONTEXT ###\n### ENTERING SUB-AGENT ROUTINE ###\nEntered sub-agent context\n\nPLEASE NOTE: \n- The messages above this point are from the main thread prior to sub-agent execution. They are provided as context only.\n- Context messages may include tool_use blocks for tools that are not available in the sub-agent context. You should only use the tools specifically provided to you in the system prompt.\n- Only complete the specific sub-agent task you have been assigned below.`\n\nfunction normalizeAgentPermissionMode(\n mode: unknown,\n): PermissionMode | undefined {\n if (typeof mode !== 'string') return undefined\n const trimmed = mode.trim()\n if (!trimmed) return undefined\n if (trimmed === 'delegate') return 'default'\n if (\n trimmed === 'default' ||\n trimmed === 'acceptEdits' ||\n trimmed === 'plan' ||\n trimmed === 'bypassPermissions' ||\n trimmed === 'dontAsk'\n ) {\n return trimmed\n }\n return undefined\n}\n\nfunction applyAgentPermissionMode(\n base: ToolPermissionContext | undefined,\n options: {\n agentPermissionMode: PermissionMode | undefined\n safeMode: boolean\n },\n): ToolPermissionContext | undefined {\n if (!base) return base\n if (!options.agentPermissionMode) return base\n\n if (\n options.agentPermissionMode === 'bypassPermissions' &&\n (options.safeMode || base.isBypassPermissionsModeAvailable !== true)\n ) {\n return { ...base, mode: 'default' }\n }\n\n return { ...base, mode: options.agentPermissionMode }\n}\n\nfunction readJsonArrayFile(path: string): any[] | null {\n if (!existsSync(path)) return null\n try {\n const raw = readFileSync(path, 'utf8')\n const parsed = JSON.parse(raw)\n return Array.isArray(parsed) ? parsed : null\n } catch {\n return null\n }\n}\n\nfunction buildForkContextForAgent(options: {\n enabled: boolean\n prompt: string\n toolUseId: string | undefined\n messageLogName: string\n forkNumber: number\n}): {\n forkContextMessages: MessageType[]\n promptMessages: MessageType[]\n} {\n const userPromptMessage = createUserMessage(options.prompt)\n\n if (!options.enabled || !options.toolUseId) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n const mainPath = getMessagesPath(options.messageLogName, options.forkNumber, 0)\n const mainMessages = readJsonArrayFile(mainPath) as MessageType[] | null\n if (!mainMessages || mainMessages.length === 0) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n let toolUseMessageIndex = -1\n let toolUseMessage: any = null\n let taskToolUseBlock: any = null\n\n for (let i = 0; i < mainMessages.length; i++) {\n const msg: any = mainMessages[i]\n if (msg?.type !== 'assistant') continue\n const blocks: any[] = Array.isArray(msg?.message?.content)\n ? msg.message.content\n : []\n const match = blocks.find(\n b => b && b.type === 'tool_use' && b.id === options.toolUseId,\n )\n if (!match) continue\n toolUseMessageIndex = i\n toolUseMessage = msg\n taskToolUseBlock = match\n break\n }\n\n if (toolUseMessageIndex === -1 || !toolUseMessage || !taskToolUseBlock) {\n return {\n forkContextMessages: [],\n promptMessages: [userPromptMessage],\n }\n }\n\n const forkContextMessages = (mainMessages.slice(\n 0,\n toolUseMessageIndex,\n ) ?? []) as MessageType[]\n\n const toolUseOnlyAssistant: MessageType = {\n ...toolUseMessage,\n uuid: randomUUID(),\n message: {\n ...toolUseMessage.message,\n content: [taskToolUseBlock],\n },\n }\n\n const forkContextToolResult = createUserMessage(\n [\n {\n type: 'tool_result',\n tool_use_id: taskToolUseBlock.id,\n content: FORK_CONTEXT_TOOL_RESULT_TEXT,\n } as any,\n ],\n {\n data: {\n status: 'sub_agent_entered',\n description: 'Entered sub-agent context',\n message: FORK_CONTEXT_TOOL_RESULT_TEXT,\n },\n resultForAssistant: FORK_CONTEXT_TOOL_RESULT_TEXT,\n } as any,\n )\n\n return {\n forkContextMessages,\n promptMessages: [toolUseOnlyAssistant, forkContextToolResult, userPromptMessage],\n }\n}\n\nexport const TaskTool = {\n name: TOOL_NAME,\n inputSchema,\n async description() {\n return 'Launch a new task'\n },\n async prompt({ safeMode }: { safeMode?: boolean }) {\n return await getPrompt(safeMode)\n },\n userFacingName(input?: Partial<Input>) {\n if (input?.subagent_type && input.subagent_type !== 'general-purpose') {\n return input.subagent_type\n }\n return 'Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n async validateInput(input: Input) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' not found. Available agents: ${availableTypes.join(', ')}`,\n meta: { subagent_type: input.subagent_type, availableTypes },\n }\n }\n\n if (input.resume) {\n const transcript = getAgentTranscript(input.resume)\n if (!transcript) {\n return {\n result: false,\n message: `No transcript found for agent ID: ${input.resume}`,\n meta: { resume: input.resume },\n }\n }\n }\n\n return { result: true }\n },\n renderToolUseMessage({ description, prompt }: Input) {\n if (!description || !prompt) return '' as any\n return description\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output, { verbose }: { verbose: boolean }) {\n const theme = getTheme()\n if (output.status === 'async_launched') {\n const hint = output.prompt\n ? ' (down arrow \u2193 to manage \u00B7 ctrl+o to expand)'\n : ' (down arrow \u2193 to manage)'\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>\n Backgrounded agent\n {!verbose && <Text dimColor>{hint}</Text>}\n </Text>\n </Box>\n {verbose && output.prompt && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText} wrap=\"wrap\">\n {output.prompt}\n </Text>\n </Box>\n )}\n </Box>\n )\n }\n\n const summary = [\n output.totalToolUseCount === 1\n ? '1 tool use'\n : `${output.totalToolUseCount} tool uses`,\n `${formatNumber(output.totalTokens)} tokens`,\n formatDuration(output.totalDurationMs),\n ]\n return (\n <Box flexDirection=\"column\">\n {verbose && output.prompt && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText} wrap=\"wrap\">\n {\n maybeTruncateVerboseToolOutput(output.prompt, {\n maxLines: 120,\n maxChars: 20_000,\n }).text\n }\n </Text>\n </Box>\n )}\n {verbose && output.content.length > 0 && (\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text wrap=\"wrap\">\n {\n maybeTruncateVerboseToolOutput(\n output.content.map(b => b.text).join('\\n'),\n {\n maxLines: 200,\n maxChars: 40_000,\n },\n ).text\n }\n </Text>\n </Box>\n )}\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text dimColor>Done ({summary.join(' \u00B7 ')})</Text>\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n if (output.status === 'async_launched')\n return asyncLaunchMessage(output.agentId)\n return output.content.map(b => b.text).join('\\n')\n },\n\n async *call(input: Input, toolUseContext: any) {\n const startTime = Date.now()\n const {\n abortController,\n toolUseId,\n options: {\n safeMode = false,\n forkNumber,\n messageLogName,\n verbose,\n model: parentModel,\n mcpClients,\n },\n readFileTimestamps,\n } = toolUseContext\n\n const queryFn =\n typeof toolUseContext?.__testQuery === 'function'\n ? toolUseContext.__testQuery\n : query\n\n const agentConfig = await getAgentByType(input.subagent_type)\n if (!agentConfig) {\n const available = await getAvailableAgentTypes()\n throw Error(\n `Agent type '${input.subagent_type}' not found. Available agents: ${available.join(', ')}`,\n )\n }\n\n const effectivePrompt = input.prompt\n\n const normalizedAgentModel = normalizeAgentModelName(agentConfig.model)\n const defaultSubagentModel = 'task'\n const envSubagentModel =\n process.env.PYB_SUBAGENT_MODEL ??\n process.env.CLAUDE_CODE_SUBAGENT_MODEL\n const modelToUse: string =\n (typeof envSubagentModel === 'string' && envSubagentModel.trim()\n ? envSubagentModel.trim()\n : undefined) ||\n modelEnumToPointer(input.model) ||\n (normalizedAgentModel === 'inherit'\n ? parentModel || defaultSubagentModel\n : normalizedAgentModel) ||\n defaultSubagentModel\n\n const toolFilter = agentConfig.tools\n let tools = await getTaskTools(safeMode)\n if (toolFilter) {\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n } else if (Array.isArray(toolFilter)) {\n const allowedToolNames = new Set(\n toolFilter.map(getToolNameFromSpec).filter(Boolean),\n )\n tools = tools.filter(t => allowedToolNames.has(t.name))\n }\n }\n\n const disallowedTools = Array.isArray(agentConfig.disallowedTools)\n ? agentConfig.disallowedTools\n : []\n if (disallowedTools.length > 0) {\n const disallowedToolNames = new Set(\n disallowedTools.map(getToolNameFromSpec).filter(Boolean),\n )\n tools = tools.filter(t => !disallowedToolNames.has(t.name))\n }\n\n const agentId = input.resume || generateAgentId()\n const baseTranscript = input.resume\n ? (getAgentTranscript(input.resume)?.filter(m => m.type !== 'progress') ??\n null)\n : []\n if (input.resume && baseTranscript === null) {\n throw Error(`No transcript found for agent ID: ${input.resume}`)\n }\n\n const { forkContextMessages, promptMessages } = buildForkContextForAgent({\n enabled: agentConfig.forkContext === true,\n prompt: effectivePrompt,\n toolUseId,\n messageLogName,\n forkNumber,\n })\n\n const transcriptMessages: MessageType[] = [\n ...(baseTranscript || []),\n ...promptMessages,\n ]\n\n const messagesForQuery: MessageType[] = [\n ...forkContextMessages,\n ...transcriptMessages,\n ]\n\n const [baseSystemPrompt, context, maxThinkingTokens] = await Promise.all([\n getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messagesForQuery),\n ])\n const systemPrompt =\n agentConfig.systemPrompt && agentConfig.systemPrompt.length > 0\n ? [...baseSystemPrompt, agentConfig.systemPrompt]\n : baseSystemPrompt\n\n const agentPermissionMode = normalizeAgentPermissionMode(\n (agentConfig as any).permissionMode,\n )\n const toolPermissionContext = applyAgentPermissionMode(\n toolUseContext.options?.toolPermissionContext,\n { agentPermissionMode, safeMode },\n )\n\n const queryOptions = {\n safeMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [],\n verbose,\n permissionMode: 'dontAsk' as const,\n toolPermissionContext,\n maxThinkingTokens,\n model: modelToUse,\n mcpClients,\n }\n\n if (input.run_in_background) {\n const bgAbortController = new AbortController()\n\n const taskRecord: any = {\n type: 'async_agent',\n agentId,\n description: input.description,\n prompt: effectivePrompt,\n status: 'running',\n startedAt: Date.now(),\n messages: [...transcriptMessages],\n abortController: bgAbortController,\n done: Promise.resolve(),\n }\n\n taskRecord.done = (async () => {\n try {\n const bgMessages: MessageType[] = [...messagesForQuery]\n const bgTranscriptMessages: MessageType[] = [...transcriptMessages]\n\n for await (const msg of queryFn(\n bgMessages,\n systemPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController: bgAbortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(bgMessages),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {},\n },\n )) {\n bgMessages.push(msg)\n bgTranscriptMessages.push(msg)\n taskRecord.messages = [...bgTranscriptMessages]\n upsertBackgroundAgentTask(taskRecord)\n }\n\n const lastAssistant = last(\n bgTranscriptMessages.filter(m => m.type === 'assistant'),\n ) as any\n const content = lastAssistant?.message?.content?.filter(\n (b: any) => b.type === 'text',\n ) as TextBlock[] | undefined\n\n taskRecord.status = 'completed'\n taskRecord.completedAt = Date.now()\n taskRecord.resultText = (content || []).map(b => b.text).join('\\n')\n taskRecord.messages = [...bgTranscriptMessages]\n upsertBackgroundAgentTask(taskRecord)\n saveAgentTranscript(agentId, bgTranscriptMessages)\n } catch (e) {\n taskRecord.status = 'failed'\n taskRecord.completedAt = Date.now()\n taskRecord.error = e instanceof Error ? e.message : String(e)\n upsertBackgroundAgentTask(taskRecord)\n }\n })()\n\n upsertBackgroundAgentTask(taskRecord)\n\n const output: Output = {\n status: 'async_launched',\n agentId,\n description: input.description,\n prompt: effectivePrompt,\n }\n yield {\n type: 'result',\n data: output,\n resultForAssistant: asyncLaunchMessage(agentId),\n }\n return\n }\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n const PROGRESS_THROTTLE_MS = 200\n const MAX_RECENT_ACTIONS = 6\n let lastProgressEmitAt = 0\n let lastEmittedToolUseCount = 0\n const recentActions: string[] = []\n\n const addRecentAction = (action: string) => {\n const trimmed = action.trim()\n if (!trimmed) return\n recentActions.push(trimmed)\n if (recentActions.length > MAX_RECENT_ACTIONS) {\n recentActions.splice(0, recentActions.length - MAX_RECENT_ACTIONS)\n }\n }\n\n const truncate = (text: string, maxLen: number) => {\n const normalized = text.replace(/\\s+/g, ' ').trim()\n if (normalized.length <= maxLen) return normalized\n return `${normalized.slice(0, maxLen - 1)}\u2026`\n }\n\n const summarizeToolUse = (name: string, rawInput: unknown): string => {\n const input = (\n rawInput && typeof rawInput === 'object' ? rawInput : {}\n ) as Record<string, unknown>\n switch (name) {\n case 'Read': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `Read ${filePath}` : 'Read'\n }\n case 'Write': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `Write ${filePath}` : 'Write'\n }\n case 'Edit':\n case 'MultiEdit': {\n const filePath =\n (typeof input.file_path === 'string' && input.file_path) ||\n (typeof input.path === 'string' && input.path) ||\n ''\n return filePath ? `${name} ${filePath}` : name\n }\n case 'Grep': {\n const pattern = typeof input.pattern === 'string' ? input.pattern : ''\n return pattern ? `Grep ${truncate(pattern, 80)}` : 'Grep'\n }\n case 'Glob': {\n const pattern =\n (typeof input.pattern === 'string' && input.pattern) ||\n (typeof input.glob === 'string' && input.glob) ||\n ''\n return pattern ? `Glob ${truncate(pattern, 80)}` : 'Glob'\n }\n case 'Bash': {\n const command = typeof input.command === 'string' ? input.command : ''\n return command ? `Bash ${truncate(command, 80)}` : 'Bash'\n }\n case 'WebFetch':\n case 'WebSearch': {\n const url = typeof input.url === 'string' ? input.url : ''\n const query = typeof input.query === 'string' ? input.query : ''\n if (url) return `${name} ${truncate(url, 100)}`\n if (query) return `${name} ${truncate(query, 100)}`\n return name\n }\n default:\n return name\n }\n }\n\n const renderProgressText = (toolUseCount: number): string => {\n const header = `${input.description || 'Task'}\u2026 (${toolUseCount} tool${toolUseCount === 1 ? '' : 's'})`\n if (recentActions.length === 0) return header\n const lines = recentActions.map(a => `- ${a}`)\n return [header, ...lines].join('\\n')\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${renderProgressText(0)}</tool-progress>`,\n ),\n }\n lastProgressEmitAt = Date.now()\n\n let toolUseCount = 0\n for await (const message of queryFn(\n messagesForQuery,\n systemPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(messagesForQuery),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {},\n },\n )) {\n messagesForQuery.push(message)\n transcriptMessages.push(message)\n\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\n transcriptMessages.filter(_ => _.type !== 'progress'),\n { conversationKey: `${messageLogName}:${forkNumber}` },\n )\n\n if (message.type === 'assistant') {\n for (const block of message.message.content) {\n if (\n block.type === 'tool_use' ||\n block.type === 'server_tool_use' ||\n block.type === 'mcp_tool_use'\n ) {\n toolUseCount += 1\n addRecentAction(summarizeToolUse(block.name, (block as any).input))\n }\n }\n }\n\n const now = Date.now()\n const hasNewToolUses = toolUseCount > lastEmittedToolUseCount\n const shouldEmit =\n hasNewToolUses &&\n (lastEmittedToolUseCount === 0 ||\n now - lastProgressEmitAt >= PROGRESS_THROTTLE_MS)\n if (shouldEmit) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `<tool-progress>${renderProgressText(toolUseCount)}</tool-progress>`,\n ),\n }\n lastEmittedToolUseCount = toolUseCount\n lastProgressEmitAt = now\n }\n }\n\n const lastAssistant = last(\n transcriptMessages.filter(m => m.type === 'assistant'),\n ) as any\n if (!lastAssistant || lastAssistant.type !== 'assistant') {\n throw Error('No assistant messages found')\n }\n\n const content = lastAssistant.message.content.filter(\n (b: any) => b.type === 'text',\n ) as TextBlock[]\n\n saveAgentTranscript(agentId, transcriptMessages)\n\n const totalDurationMs = Date.now() - startTime\n const totalTokens = countTokens(transcriptMessages)\n const usage = lastAssistant.message.usage\n\n const output: Output = {\n status: 'completed',\n agentId,\n prompt: effectivePrompt,\n content,\n totalToolUseCount: toolUseCount,\n totalDurationMs,\n totalTokens,\n usage,\n }\n const agentIdBlock: TextBlock = {\n type: 'text',\n text: `agentId: ${agentId} (for resuming to continue this agent's work if needed)`,\n citations: [],\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: [...content, agentIdBlock],\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import type { Message as ConversationMessage } from '@query'\n\nconst transcripts = new Map<string, ConversationMessage[]>()\n\nexport function saveAgentTranscript(\n agentId: string,\n messages: ConversationMessage[],\n): void {\n transcripts.set(agentId, messages)\n}\n\nexport function getAgentTranscript(\n agentId: string,\n): ConversationMessage[] | undefined {\n return transcripts.get(agentId)\n}\n", "import { type Tool } from '@tool'\nimport { getTools, getReadOnlyTools } from '@tools'\nimport { TaskTool } from './TaskTool'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { FileWriteTool } from '@tools/FileWriteTool/FileWriteTool'\nimport { FileEditTool } from '@tools/FileEditTool/FileEditTool'\nimport { NotebookEditTool } from '@tools/NotebookEditTool/NotebookEditTool'\nimport { GlobTool } from '@tools/GlobTool/GlobTool'\nimport { FileReadTool } from '@tools/FileReadTool/FileReadTool'\nimport { getModelManager } from '@utils/model'\nimport { getActiveAgents } from '@utils/agent/loader'\n\nconst SUBAGENT_DISALLOWED_TOOL_NAMES = new Set<string>([\n 'Task',\n 'TaskOutput',\n 'KillShell',\n 'EnterPlanMode',\n 'ExitPlanMode',\n 'AskUserQuestion',\n])\n\nexport async function getTaskTools(safeMode: boolean): Promise<Tool[]> {\n return (await (!safeMode ? getTools() : getReadOnlyTools())).filter(\n tool => !SUBAGENT_DISALLOWED_TOOL_NAMES.has(tool.name),\n )\n}\n\nexport async function getPrompt(safeMode: boolean): Promise<string> {\n const agents = await getActiveAgents()\n\n const agentDescriptions = agents\n .map(agent => {\n const toolsStr = Array.isArray(agent.tools) ? agent.tools.join(', ') : '*'\n return `- ${agent.agentType}: ${agent.whenToUse} (Tools: ${toolsStr})`\n })\n .join('\\n')\n\n return `Launch a new agent to handle complex, multi-step tasks autonomously. \n\nAvailable agent types and the tools they have access to:\n${agentDescriptions}\n\nWhen using the Task tool, you must specify a subagent_type parameter to select which agent type to use.\n\nWhen to use the Agent tool:\n- When you are instructed to execute custom slash commands. Use the Agent tool with the slash command invocation as the entire prompt. The slash command can take arguments. For example: Task(description=\"Check the file\", prompt=\"/check-file path/to/file.py\")\n\nWhen NOT to use the Agent tool:\n- If you want to read a specific file path, use the ${FileReadTool.name} or ${GlobTool.name} tool instead of the Agent tool, to find the match more quickly\n- If you are searching for a specific class definition like \"class Foo\", use the ${GlobTool.name} tool instead, to find the match more quickly\n- If you are searching for code within a specific file or set of 2-3 files, use the ${FileReadTool.name} tool instead of the Agent tool, to find the match more quickly\n- Other tasks that are not related to the agent descriptions above\n\nUsage notes:\n1. Launch multiple agents concurrently whenever possible, to maximize performance; to do that, use a single message with multiple tool uses\n2. When the agent is done, it will return a single message back to you. The result returned by the agent is not visible to the user. To show the user the result, you should send a text message back to the user with a concise summary of the result.\n3. Each agent invocation is stateless. You will not be able to send additional messages to the agent, nor will the agent be able to communicate with you outside of its final report. Therefore, your prompt should contain a highly detailed task description for the agent to perform autonomously and you should specify exactly what information the agent should return back to you in its final and only message to you.\n4. The agent's outputs should generally be trusted\n5. Clearly tell the agent whether you expect it to write code or just to do research (search, file reads, web fetches, etc.), since it is not aware of the user's intent\n6. If the agent description mentions that it should be used proactively, then you should try your best to use it without the user having to ask for it first. Use your judgement.\n\nExample usage:\n\n<example_agent_descriptions>\n\"code-reviewer\": use this agent after you are done writing a signficant piece of code\n\"greeting-responder\": use this agent when to respond to user greetings with a friendly joke\n</example_agent_description>\n\n<example>\nuser: \"Please write a function that checks if a number is prime\"\nassistant: Sure let me write a function that checks if a number is prime\nassistant: First let me use the ${FileWriteTool.name} tool to write a function that checks if a number is prime\nassistant: I'm going to use the ${FileWriteTool.name} tool to write the following code:\n<code>\nfunction isPrime(n) {\n if (n <= 1) return false\n for (let i = 2; i * i <= n; i++) {\n if (n % i === 0) return false\n }\n return true\n}\n</code>\n<commentary>\nSince a signficant piece of code was written and the task was completed, now use the code-reviewer agent to review the code\n</commentary>\nassistant: Now let me use the code-reviewer agent to review the code\nassistant: Uses the Task tool to launch the with the code-reviewer agent \n</example>\n\n<example>\nuser: \"Hello\"\n<commentary>\nSince the user is greeting, use the greeting-responder agent to respond with a friendly joke\n</commentary>\nassistant: \"I'm going to use the Task tool to launch the with the greeting-responder agent\"\n</example>`\n}\n", "export const TOOL_NAME = 'Task'\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport {\n createTask,\n getTaskListPaths,\n listTasks,\n TaskRecord,\n} from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskDetail,\n toTaskDetail,\n} from '@utils/session/taskToolUtils'\nimport { buildTaskGraph, findTaskCycles } from '@utils/session/taskGraph'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z\n .strictObject({\n listId: z.string().optional(),\n subject: z.string().min(1),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .enum(['open', 'in_progress', 'blocked', 'done', 'archived'])\n .optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n metadata: z.record(z.string()).optional(),\n archived: z.boolean().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n parent: z.string().optional(),\n related: z.array(z.string()).optional(),\n legacyTodoId: z.string().optional(),\n })\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskDetail\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskCreateTool = {\n name: 'TaskCreate',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskCreate'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n try {\n const subject = input.subject\n const tasks = listTasks({ listId: input.listId })\n const nextId =\n Math.max(\n 0,\n ...tasks\n .map(task => Number(task.id))\n .filter(value => !Number.isNaN(value)),\n ) + 1\n const now = Date.now()\n const candidateTask: TaskRecord = {\n id: String(nextId),\n subject,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status ?? 'open',\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blocks: [],\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n createdAt: now,\n updatedAt: now,\n baseVersion: 1,\n version: 1,\n legacyTodoId: input.legacyTodoId,\n }\n const candidateTasks = [...tasks, candidateTask]\n const cycles = findTaskCycles(buildTaskGraph(candidateTasks))\n if (cycles.length > 0) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_CYCLE_DETECTED',\n message: 'Task dependency cycle detected',\n details: { cycles },\n }),\n }\n return\n }\n const task = createTask(\n {\n subject,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status,\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n legacyTodoId: input.legacyTodoId,\n },\n { listId: input.listId },\n )\n const { listId } = getTaskListPaths(input.listId)\n emitReminderEvent('task.created', {\n listId,\n taskId: task.id,\n task,\n timestamp: Date.now(),\n })\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskDetail(task),\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Task create failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "import { TaskRecord, TaskStatus } from './taskStore'\n\nexport type TaskToolError = {\n error: {\n type: 'conflict' | 'not_found' | 'validation' | 'unknown'\n code?: string\n message: string\n details?: unknown\n }\n}\n\nexport type TaskListItem = {\n id: string\n subject: string\n status: TaskStatus\n owner?: string\n blockedBy: string[]\n}\n\nexport type TaskDetail = {\n id: string\n subject: string\n description?: string\n activeForm?: string\n status: TaskStatus\n tags?: string[]\n assignee?: string\n metadata?: Record<string, string>\n archived?: boolean\n blocks: string[]\n blockedBy: string[]\n parent?: string\n related: string[]\n legacyTodoId?: string\n}\n\nexport function toTaskListItem(task: TaskRecord): TaskListItem {\n return {\n id: task.id,\n subject: task.subject,\n status: task.status,\n owner: task.assignee,\n blockedBy: task.blockedBy ?? [],\n }\n}\n\nexport function toTaskDetail(task: TaskRecord): TaskDetail {\n return {\n id: task.id,\n subject: task.subject,\n description: task.description,\n activeForm: task.activeForm,\n status: task.status,\n tags: task.tags,\n assignee: task.assignee,\n metadata: task.metadata,\n archived: task.archived,\n blocks: task.blocks ?? [],\n blockedBy: task.blockedBy ?? [],\n parent: task.parent,\n related: task.related ?? [],\n legacyTodoId: task.legacyTodoId,\n }\n}\n\nexport function createTaskToolError(params: {\n type: TaskToolError['error']['type']\n message: string\n code?: string\n details?: unknown\n}): TaskToolError {\n return {\n error: {\n type: params.type,\n message: params.message,\n code: params.code,\n details: params.details,\n },\n }\n}\n", "export const DESCRIPTION =\n 'Create a new task in the task list with optional status and dependencies.'\n\nexport const PROMPT = `Use this tool to create a new task in the current task list. It is the entry point for planning multi-step work.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n1. You need to add a task with structured fields (subject, status, tags).\n2. You want to seed a plan for multi-step work before implementation starts.\n3. You need to define dependencies (blockedBy, parent, related) at creation time.\n4. You need to align with a user request to create a task list or plan.\n\n## When NOT to Use This Tool\n- You need to modify an existing task (use TaskUpdate).\nSkip using this tool when:\n1. You only need to read task data (use TaskGet or TaskList).\n2. You need to modify an existing task (use TaskUpdate).\n3. You are only reporting progress without changing any task fields.\n- subject is required.\nNOTE that you should not use this tool if you are only updating status or details of an existing task.\n\n## Input Notes\n- subject is required.\n- listId is optional; omit to use the default list.\n- Dependencies are validated for cycles; invalid cycles will be rejected.\n- status can be open, in_progress, blocked, done, or archived.\n- activeForm will be generated from subject if omitted.\n- blockedBy is always stored as an array (empty when not used).\n- description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.\n- Task ordering relies on task id; do not use priority fields.\n\n## Status Notes\n- Use blocked when dependencies prevent work and fill blockedBy.\n\n## Examples of When to Use TaskCreate\n\n<example>\nUser: I need to implement user registration, product catalog, and checkout.\nAssistant: I will create tasks for each feature.\n*Creates tasks:*\n1. User registration\n2. Product catalog\n3. Checkout flow\n</example>\n\n<example>\nUser: Please add tests and run lint after the refactor.\nAssistant: I'll seed tasks for the refactor and verification steps.\n*Creates tasks:*\n1. Refactor target module\n2. Add tests\n3. Run lint and typecheck\n</example>\n\n<example>\nUser: The API task depends on database schema changes.\nAssistant: I'll create tasks with dependencies.\n*Creates tasks:*\n1. Update database schema\n2. Implement API endpoints (blockedBy: schema task)\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport { getTask, getTaskListPaths } from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskDetail,\n toTaskDetail,\n} from '@utils/session/taskToolUtils'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n taskId: z.string().min(1),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskDetail\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskGetTool = {\n name: 'TaskGet',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskGet'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n const { listId } = getTaskListPaths(input.listId)\n const task = getTask(input.taskId, { listId: input.listId })\n if (!task) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'not_found',\n code: 'TASK_NOT_FOUND',\n message: `Task ${input.taskId} not found`,\n details: { taskId: input.taskId, listId },\n }),\n }\n return\n }\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskDetail(task),\n },\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'Fetch a single task by id from the task list.'\n\nexport const PROMPT = `Use this tool to fetch a single task by id.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need details for one task to confirm its fields, status, or dependencies.\n2. You need the latest task details before updating a task.\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need multiple tasks or readiness info (use TaskList).\n2. You need to modify a task (use TaskUpdate) or create one (use TaskCreate).\n\nNOTE that TaskGet returns a single task only; use TaskList for summaries or readiness.\n\n## Input Notes\n- taskId is required.\n- listId is optional; omit to use the default list.\n\n## Examples of When to Use TaskGet\n\n<example>\nUser: Can you check the status of task t-17 before updating it?\nAssistant: I'll fetch the task details first.\n*Fetches task t-17*\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport {\n getTaskListPaths,\n listTasks,\n TaskRecord,\n TaskStatus,\n} from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskListItem,\n toTaskListItem,\n} from '@utils/session/taskToolUtils'\nimport { calculateReadyBlocked } from '@utils/session/taskGraph'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n status: z\n .array(z.enum(['open', 'in_progress', 'blocked', 'done', 'archived']))\n .optional(),\n includeBlocked: z.boolean().optional(),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n items: TaskListItem[]\n ready: TaskListItem[]\n blocked: TaskListItem[]\n }\n | ReturnType<typeof createTaskToolError>\n\nconst filterByStatus = (tasks: TaskRecord[], statuses?: TaskStatus[]) => {\n if (!statuses || statuses.length === 0) {\n return tasks.filter(item => item.status !== 'archived')\n }\n const allowed = new Set(statuses)\n return tasks.filter(item => allowed.has(item.status))\n}\n\nexport const TaskListTool = {\n name: 'TaskList',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskList'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n try {\n const { listId } = getTaskListPaths(input.listId)\n const tasks = listTasks({ listId: input.listId })\n const filtered = filterByStatus(tasks, input.status)\n const readyBlocked = calculateReadyBlocked(filtered)\n const ready = readyBlocked.ready.map(toTaskListItem)\n const blocked = readyBlocked.blocked.map(toTaskListItem)\n const includeBlocked = input.includeBlocked !== false\n const items = includeBlocked\n ? filtered.map(toTaskListItem)\n : filtered\n .filter(item => ready.some(entry => entry.id === item.id))\n .map(toTaskListItem)\n yield {\n type: 'result',\n data: {\n listId,\n items,\n ready,\n blocked: includeBlocked ? blocked : [],\n },\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Task list failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'List tasks in a task list, optionally filtered by status with ready/blocked breakdown.'\n\nexport const PROMPT = `Use this tool to list tasks and understand readiness. It returns ready and blocked groupings to help prioritize work. TaskList only returns id/subject/status/owner/blockedBy for summaries; use TaskGet for details.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need a list of tasks for a listId (or default list).\n2. You need ready/blocked calculations to prioritize work.\n3. You need to filter by status.\n4. You want a quick summary of what can be started now.\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need a single task by id (use TaskGet).\n2. You need to create or update tasks (use TaskCreate or TaskUpdate).\n\nNOTE that TaskList is for summaries and readiness; use TaskGet for details.\n\n## Input Notes\n- listId is optional; omit to use the default list.\n- status filters the returned items; omit to exclude archived tasks by default.\n- includeBlocked=false returns only ready items.\n\n## Examples of When to Use TaskList\n\n<example>\nUser: What should we work on next?\nAssistant: I'll list tasks and check readiness.\n*Lists tasks with ready/blocked breakdown*\n</example>\n\n<example>\nUser: Show only in-progress items.\nAssistant: I'll list tasks filtered by status.\n*Lists tasks with status filter*\n</example>\n`\n", "import { z } from 'zod'\nimport { Tool } from '@tool'\nimport {\n getTask,\n getTaskListPaths,\n listTasks,\n TaskStoreConflictError,\n TaskRecord,\n TaskStatus,\n updateTask,\n} from '@utils/session/taskStore'\nimport {\n createTaskToolError,\n TaskDetail,\n toTaskDetail,\n} from '@utils/session/taskToolUtils'\nimport { buildTaskGraph, findTaskCycles } from '@utils/session/taskGraph'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst isCompletedStatus = (status: TaskStatus) =>\n status === 'done' || status === 'archived'\n\nconst normalizeDeps = (items?: string[]) =>\n [...(items ?? [])].filter(Boolean).sort()\n\nconst depsChanged = (prev: TaskRecord, next: TaskRecord) => {\n if (prev.parent !== next.parent) return true\n const prevBlockedBy = normalizeDeps(prev.blockedBy)\n const nextBlockedBy = normalizeDeps(next.blockedBy)\n if (prevBlockedBy.length !== nextBlockedBy.length) return true\n for (let i = 0; i < prevBlockedBy.length; i += 1) {\n if (prevBlockedBy[i] !== nextBlockedBy[i]) return true\n }\n const prevRelated = normalizeDeps(prev.related)\n const nextRelated = normalizeDeps(next.related)\n if (prevRelated.length !== nextRelated.length) return true\n for (let i = 0; i < prevRelated.length; i += 1) {\n if (prevRelated[i] !== nextRelated[i]) return true\n }\n return false\n}\n\nconst getDepsSnapshot = (task: TaskRecord) => ({\n blocks: task.blocks ?? [],\n blockedBy: task.blockedBy ?? [],\n parent: task.parent,\n related: task.related ?? [],\n})\n\nconst inputSchema = z.strictObject({\n listId: z.string().optional(),\n taskId: z.string().min(1),\n subject: z.string().optional(),\n description: z.string().optional(),\n activeForm: z.string().optional(),\n status: z\n .enum(['open', 'in_progress', 'blocked', 'done', 'archived'])\n .optional(),\n tags: z.array(z.string()).optional(),\n assignee: z.string().optional(),\n metadata: z.record(z.string()).optional(),\n archived: z.boolean().optional(),\n blocks: z.array(z.string()).optional(),\n blockedBy: z.array(z.string()).optional(),\n parent: z.string().optional(),\n related: z.array(z.string()).optional(),\n baseVersion: z.number().optional(),\n version: z.number().optional(),\n allowMerge: z.boolean().optional(),\n legacyTodoId: z.string().optional(),\n})\n\ntype Input = z.infer<typeof inputSchema>\n\ntype Output =\n | {\n listId: string\n item: TaskDetail\n }\n | ReturnType<typeof createTaskToolError>\n\nexport const TaskUpdateTool = {\n name: 'TaskUpdate',\n cachedDescription: DESCRIPTION,\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'TaskUpdate'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(output: Output) {\n return JSON.stringify(output, null, 2)\n },\n renderToolUseMessage() {\n return null\n },\n async *call(input: Input) {\n const { listId } = getTaskListPaths(input.listId)\n const existing = getTask(input.taskId, { listId: input.listId })\n if (!existing) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'not_found',\n code: 'TASK_NOT_FOUND',\n message: `Task ${input.taskId} not found`,\n details: { taskId: input.taskId, listId },\n }),\n }\n return\n }\n\n const tasks = listTasks({ listId: input.listId })\n const subject = input.subject ?? existing.subject\n const updatedTask = {\n ...existing,\n subject,\n description: input.description ?? existing.description,\n activeForm: input.activeForm ?? existing.activeForm,\n status: input.status ?? existing.status,\n tags: input.tags ?? existing.tags,\n assignee: input.assignee ?? existing.assignee,\n metadata: input.metadata ?? existing.metadata,\n archived: input.archived ?? existing.archived,\n blockedBy: input.blockedBy ?? existing.blockedBy,\n parent: input.parent ?? existing.parent,\n related: input.related ?? existing.related,\n legacyTodoId: input.legacyTodoId ?? existing.legacyTodoId,\n }\n const candidateTasks = tasks.map(task =>\n task.id === existing.id ? updatedTask : task,\n )\n const cycles = findTaskCycles(buildTaskGraph(candidateTasks))\n if (cycles.length > 0) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_CYCLE_DETECTED',\n message: 'Task dependency cycle detected',\n details: { cycles },\n }),\n }\n return\n }\n\n if (input.status && isCompletedStatus(input.status)) {\n const parentId = updatedTask.parent\n if (parentId) {\n const parentTask = tasks.find(task => task.id === parentId)\n if (!parentTask || !isCompletedStatus(parentTask.status)) {\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'validation',\n code: 'TASK_PARENT_INCOMPLETE',\n message: 'Cannot complete task while parent is incomplete',\n details: {\n taskId: existing.id,\n parentId,\n },\n }),\n }\n return\n }\n }\n }\n\n try {\n const baseVersion = input.baseVersion ?? input.version\n const result = updateTask(\n input.taskId,\n {\n subject: input.subject,\n description: input.description,\n activeForm: input.activeForm,\n status: input.status,\n tags: input.tags,\n assignee: input.assignee,\n metadata: input.metadata,\n archived: input.archived,\n blockedBy: input.blockedBy,\n parent: input.parent,\n related: input.related,\n baseVersion,\n legacyTodoId: input.legacyTodoId,\n },\n { listId: input.listId, allowMerge: input.allowMerge },\n )\n emitReminderEvent('task.updated', {\n listId,\n taskId: result.task.id,\n task: result.task,\n timestamp: Date.now(),\n })\n if (existing.status !== result.task.status) {\n emitReminderEvent('task.status_changed', {\n listId,\n taskId: result.task.id,\n previousStatus: existing.status,\n status: result.task.status,\n timestamp: Date.now(),\n })\n }\n if (depsChanged(existing, result.task)) {\n emitReminderEvent('task.deps_changed', {\n listId,\n taskId: result.task.id,\n previousDeps: getDepsSnapshot(existing),\n deps: getDepsSnapshot(result.task),\n timestamp: Date.now(),\n })\n }\n yield {\n type: 'result',\n data: {\n listId,\n item: toTaskDetail(result.task),\n },\n }\n } catch (error) {\n if (error instanceof TaskStoreConflictError) {\n emitReminderEvent('task:conflict_detected', {\n listId,\n taskId: error.taskId,\n expected: error.expectedBaseVersion,\n actual: error.actualBaseVersion,\n timestamp: Date.now(),\n })\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'conflict',\n code: error.code,\n message: error.message,\n details: {\n taskId: error.taskId,\n expected: error.expectedBaseVersion,\n actual: error.actualBaseVersion,\n },\n }),\n }\n return\n }\n const message = error instanceof Error ? error.message : 'Task update failed'\n yield {\n type: 'result',\n data: createTaskToolError({\n type: 'unknown',\n message,\n }),\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n", "export const DESCRIPTION =\n 'Update an existing task, including status, metadata, and dependencies with conflict checks.'\n\nexport const PROMPT = `Use this tool to update an existing task. It is the primary way to track progress and adjust task details.\n\n## When to Use This Tool\nUse this tool proactively in these scenarios:\n\n1. You need to change task fields (subject/description/status/tags).\n2. You need to adjust dependencies (blockedBy, parent, related).\n3. You need to move a task across states (open \u2192 in_progress \u2192 done).\n4. You are moving a task across states (open \u2192 in_progress \u2192 done).\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n1. You need to create a new task (use TaskCreate).\n2. You only need to read tasks (use TaskGet or TaskList).\n\nNOTE that TaskUpdate should be used when you need to persist task changes.\n\n## Input Notes\n- taskId is required.\n- listId is optional; omit to use the default list.\n- If you provide status=done/archived and a parent exists, parent must already be completed.\n- Dependencies are validated for cycles; invalid cycles will be rejected.\n- If an update fails due to a conflict, refetch the task and retry.\n- activeForm will be generated from subject if omitted.\n- blockedBy is always stored as an array (empty when not used).\n- description and blockedBy are kept separate in JSON; any joining is only for terminal rendering.\n- Task ordering relies on task id; do not use priority fields.\n\n## Status Notes\n- Use in_progress for the task you are actively working on.\n- Use blocked when dependencies prevent progress and set blockedBy.\n- Use done or archived only when all child/parent constraints are satisfied.\n\n## Examples of When to Use TaskUpdate\n\n<example>\nUser: Mark the API task as in progress.\nAssistant: I'll update the task status.\n*Updates task status to in_progress*\n</example>\n\n<example>\nUser: The UI task depends on the API task now.\nAssistant: I'll update dependencies.\n*Updates blockedBy to include the API task*\n</example>\n\n<example>\nUser: The task update failed due to a conflict.\nAssistant: I'll refetch the task and retry the update.\n*Fetches task, then updates again*\n</example>\n`\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,WAAAA,gBAAe;;;ACAxB,YAAY,WAAW;AACvB,SAAS,KAAK,YAAY;AAC1B,SAAS,SAAS;;;ACFlB,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAmB3B,SAAS,yBAAiC;AACxC,QAAM,WAAW,QAAQ,IAAI,oBAAoB,KAAK;AACtD,QAAM,gBAAgB,WAClB,KAAK,UAAU,cAAc,IAC7B,mBAAmB,cAAc;AAErC,MAAI,CAAC,WAAW,aAAa,GAAG;AAC9B,cAAU,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EAC9C;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,WAA2B;AACrD,SAAO,KAAK,uBAAuB,GAAG,GAAG,SAAS,OAAO;AAC3D;AAEO,SAAS,wBACd,aACmB;AACnB,QAAM,YAAY,WAAW,EAAE,MAAM,GAAG,CAAC;AACzC,QAAM,UAA6B;AAAA,IACjC;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,IACX,WAAW,KAAK,IAAI;AAAA,IACpB,aAAa,KAAK,IAAI;AAAA,EACxB;AAEA,wBAAsB,OAAO;AAC7B,SAAO;AACT;AAEO,SAAS,sBACd,WAC0B;AAC1B,QAAM,WAAW,mBAAmB,SAAS;AAE7C,MAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,OAAO;AACd,aAAS,KAAK;AACd,UAAY,KAAK,mCAAmC;AAAA,MAClD;AAAA,MACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AACD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,sBAAsB,SAAkC;AACtE,QAAM,WAAW,mBAAmB,QAAQ,SAAS;AAErD,MAAI;AACF,YAAQ,cAAc,KAAK,IAAI;AAC/B,kBAAc,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAAA,EACnE,SAAS,OAAO;AACd,aAAS,KAAK;AACd,UAAY,KAAK,mCAAmC;AAAA,MAClD,WAAW,QAAQ;AAAA,MACnB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D,CAAC;AACD,UAAM;AAAA,EACR;AACF;AAEO,SAAS,oBACd,WACA,MACA,SAC0B;AAC1B,QAAM,UAAU,sBAAsB,SAAS;AAC/C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,UAAQ,SAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,wBAAsB,OAAO;AAE7B,SAAO;AACT;AAEO,SAAS,mBAAmB,WAAkC;AACnE,QAAM,UAAU,sBAAsB,SAAS;AAC/C,SAAO,SAAS,YAAY,CAAC;AAC/B;;;ADxFO,IAAM,cAAc,EAAE,aAAa;AAAA,EACxC,UAAU,EACP,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,cAAc,EACX,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,iBAAiB,EACd,OAAO,EACP;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AASM,IAAM,qBAAqB;AAAA,EAChC,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,mBAA4B;AAC1B,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cACJ,EAAE,UAAU,cAAc,gBAAgB,GAC1C,SAC2B;AAC3B,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAO,EAAE,QAAQ,OAAO,SAAS,2BAA2B;AAAA,IAC9D;AAEA,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,aAAO,EAAE,QAAQ,OAAO,SAAS,iCAAiC;AAAA,IACpE;AAEA,QAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI;AACF,YAAM,eAAe,gBAAgB;AAErC,UAAI;AACJ,UAAI,SAAS,WAAW,SAAS,SAAS,OAAO;AAC/C,uBAAe,QAAQ,QAAQ;AAAA,MACjC,OAAO;AACL,uBAAe,aAAa,aAAa,MAAM,KAAK;AAAA,MACtD;AAEA,YAAM,mBAAmB,aACtB,YAAY,EACZ,QAAQ,cAAc,EAAE;AAC3B,YAAM,oBAAoB,aACvB,YAAY,EACZ,QAAQ,cAAc,EAAE;AAE3B,UAAI,qBAAqB,mBAAmB;AAC1C,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS,8BAA8B,YAAY;AAAA,QACrD;AAAA,MACF;AAAA,IACF,SAAS,GAAG;AACV,YAAY,MAAM,kBAAkB;AAAA,QAClC,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,QAAI;AACF,YAAM,eAAe,gBAAgB;AACrC,YAAM,kBAAkB,aAAa,qBAAqB,YAAY;AAEtE,UAAI,CAAC,gBAAgB,SAAS;AAC5B,cAAM,kBAAkB,aAAa,0BAA0B;AAC/D,YAAI,gBAAgB,SAAS,GAAG;AAC9B,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS,UAAU,YAAY,0CAA0C,gBAAgB,KAAK,IAAI,CAAC,wOAAwO,YAAY;AAAA,UACzV;AAAA,QACF,OAAO;AACL,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS,UAAU,YAAY;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,eAAS,KAAK;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,oCAAoC,YAAY;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EAEA,qBACE,EAAE,UAAU,cAAc,gBAAgB,GAC1C,EAAE,QAAQ,GACV;AACA,QAAI,CAAC,YAAY,CAAC,aAAc,QAAO;AACvC,UAAM,eAAe,oBAAoB;AACzC,UAAM,iBAAiB,eACnB,gBACA,WAAW,gBAAgB,UAAU,GAAG,CAAC,CAAC;AAC9C,UAAM,QAAQ,SAAS;AAEvB,QAAI,SAAS;AACX,aACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,MAAC,OAAM,YACd,YACH,GACA,oCAAC,QAAK,OAAO,MAAM,iBAAgB,cAAe,GAClD,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,QAChB,SAAS,SAAS,MACf,SAAS,UAAU,GAAG,GAAG,IAAI,QAC7B,QACN,CACF,CACF;AAAA,IAEJ;AACA,WACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,MAAC,OAAM,YACd,cAAc,GACjB,GACA,oCAAC,QAAK,OAAO,MAAM,eAAe,UAAQ,QAAC,KACvC,gBAAe,GACnB,CACF;AAAA,EAEJ;AAAA,EAEA,wBAAwB,SAAS;AAC/B,UAAM,UAAU;AAChB,UAAM,QAAQ,SAAS;AAEvB,QAAI,OAAO,YAAY,YAAY,WAAW,kBAAkB,SAAS;AACvE,YAAM,eAAe;AACrB,YAAM,UACJ,aAAa,aAAa,WAAW,OAAO,KAC5C,aAAa,aAAa,SAAS,QAAQ;AAC7C,YAAM,gBAAgB,aAAa,kBAAkB;AAErD,UAAI,eAAe;AACjB,eACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,iBAAe,0BAAwB,CAC5D;AAAA,MAEJ;AAEA,YAAM,aAAa,UACf,aAAa,aAAa,KAAK,IAC/B,aAAa,aAAa,SAAS,MACjC,aAAa,aAAa,UAAU,GAAG,GAAG,IAAI,QAC9C,aAAa,aAAa,KAAK;AAErC,UAAI,SAAS;AACX,eACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,OAAM,SAAO,UAAW,CAChC;AAAA,MAEJ;AAEA,aACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,QAAM,kBACb,aAAa,iBAAgB,GAC9C,GACA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,QAAO,cAAc,UAAU,CAAE,CACtD,GACA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,MAAM,eAAe,UAAQ,QAAC,aAC/B,aAAa,cAAc,UAAU,GAAG,CAAC,CACrD,CACF,CACF;AAAA,IAEJ;AAEA,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,OAAO,MAAM,iBAAe,wBAAsB,CAC1D;AAAA,EAEJ;AAAA,EAEA,yBAAyB,QAAqB;AAC5C,WAAO;AAAA,gBACK,OAAO,eAAe;AAAA,cACxB,OAAO,aAAa;AAAA;AAAA;AAAA,EAGhC,OAAO,YAAY;AAAA,EACnB;AAAA,EAEA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EAEA,OAAO,KACL,EAAE,UAAU,cAAc,gBAAgB,GAC1C,EAAE,iBAAiB,mBAAmB,GACtC;AACA,UAAM,cAAc;AAEpB,QAAI;AACJ,QAAI,gBAAgB;AAEpB,UAAM,gBAAgB,MAAM;AAC1B,sBAAgB;AAAA,IAClB;AACA,oBAAgB,OAAO,iBAAiB,SAAS,aAAa;AAE9D,QAAI;AACF,UAAI,gBAAgB,OAAO,SAAS;AAClC,eAAO,OAAO,KAAK,gBAAgB;AAAA,MACrC;AACA,UAAI,oBAAoB,OAAO;AAC7B,YAAI;AACF,gBAAM,UAAU,wBAAwB,WAAW;AACnD,sBAAY,QAAQ;AAAA,QACtB,SAAS,OAAO;AACd,mBAAS,KAAK;AACd,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AAAA,MACF,OAAO;AACL,oBAAY;AACZ,YAAI;AACF,gBAAM,UAAU,sBAAsB,SAAS;AAC/C,cAAI,CAAC,SAAS;AACZ,kBAAM,aAAa,wBAAwB,WAAW;AACtD,wBAAY,WAAW;AAAA,UACzB;AAAA,QACF,SAAS,OAAO;AACd,mBAAS,KAAK;AACd,cAAI;AACF,kBAAM,aAAa,wBAAwB,WAAW;AACtD,wBAAY,WAAW;AAAA,UACzB,SAAS,aAAa;AACpB,qBAAS,WAAW;AACpB,kBAAM,IAAI,MAAM,uCAAuC;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,iBAAiB,gBAAgB,OAAO,SAAS;AACnD,eAAO,OAAO,KAAK,gBAAgB;AAAA,MACrC;AAEA,UAAI;AACJ,UAAI;AACF,0BAAkB,mBAAmB,SAAS;AAAA,MAChD,SAAS,OAAO;AACd,iBAAS,KAAK;AACd,0BAAkB,CAAC;AAAA,MACrB;AAEA,YAAM,WAAW,CAAC,GAAG,iBAAiB,EAAE,MAAM,QAAQ,SAAS,SAAS,CAAC;AAEzE,UAAI;AACJ,UAAI;AACF,yBAAiB,SAAS;AAAA,UAAI,SAC5B,IAAI,SAAS,SACT,kBAAkB,IAAI,OAAO,IAC7B,uBAAuB,IAAI,OAAO;AAAA,QACxC;AAAA,MACF,SAAS,OAAO;AACd,iBAAS,KAAK;AACd,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AAEA,UAAI,iBAAiB,gBAAgB,OAAO,SAAS;AACnD,eAAO,OAAO,KAAK,gBAAgB;AAAA,MACrC;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,UACP,iBAAiB,WAAW;AAAA,QAC9B;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,cAAM,eAAe,gBAAgB;AACrC,cAAM,kBAAkB,aAAa,qBAAqB,WAAW;AAErE,cAAY,IAAI,2BAA2B;AAAA,UACzC,gBAAgB;AAAA,UAChB,SAAS,gBAAgB;AAAA,UACzB,aAAa,gBAAgB,SAAS;AAAA,UACtC,kBAAkB,gBAAgB,SAAS;AAAA,UAC3C,UAAU,gBAAgB,SAAS;AAAA,UACnC,UAAU,gBAAgB,SAAS;AAAA,UACnC,OAAO,gBAAgB;AAAA,QACzB,CAAC;AAED,cAAM,YAAY;AAClB,cAAM,iBAAiB,IAAI,QAAQ,CAAC,GAAG,WAAW;AAChD,qBAAW,MAAM;AACf;AAAA,cACE,IAAI;AAAA,gBACF,sCAAsC,YAAY,GAAI;AAAA,cACxD;AAAA,YACF;AAAA,UACF,GAAG,SAAS;AAAA,QACd,CAAC;AAED,mBAAW,MAAM,QAAQ,KAAK;AAAA,UAC5B;AAAA,YACE;AAAA,YACA,CAAC;AAAA,YACD;AAAA,YACA,CAAC;AAAA,YACD,gBAAgB;AAAA,YAChB;AAAA,cACE,UAAU;AAAA,cACV,OAAO;AAAA,cACP,qBAAqB;AAAA,YACvB;AAAA,UACF;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,SAAS,OAAY;AACnB,iBAAS,KAAK;AAEd,YACE,MAAM,SAAS,gBACf,gBAAgB,QAAQ,WACxB,eACA;AACA,iBAAO,OAAO,KAAK,gBAAgB;AAAA,QACrC;AAEA,YAAI,MAAM,SAAS,SAAS,WAAW,GAAG;AACxC,gBAAM,IAAI;AAAA,YACR,iBAAiB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAK9B;AAAA,QACF;AAEA,YAAI,MAAM,SAAS,SAAS,YAAY,GAAG;AACzC,gBAAM,IAAI;AAAA,YACR,2BAA2B,WAAW;AAAA;AAAA;AAAA,UAExC;AAAA,QACF;AAEA,YAAI,MAAM,SAAS,SAAS,iBAAiB,GAAG;AAC9C,gBAAM,IAAI;AAAA,YACR,uBAAuB,WAAW;AAAA;AAAA;AAAA,UAEpC;AAAA,QACF;AAEA,YACE,MAAM,SAAS,SAAS,iBAAiB,KACzC,MAAM,SAAS,SAAS,yBAAyB,GACjD;AACA,cAAI;AACF,kBAAM,eAAe,gBAAgB;AACrC,kBAAM,kBAAkB,aAAa,0BAA0B;AAC/D,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,oBAAM,IAAI;AAAA,gBACR,UAAU,WAAW,0CAA0C,gBAAgB,KAAK,IAAI,CAAC,wOAAwO,WAAW;AAAA,cAC9U;AAAA,YACF,OAAO;AACL,oBAAM,IAAI;AAAA,gBACR,UAAU,WAAW;AAAA,cACvB;AAAA,YACF;AAAA,UACF,SAAS,YAAY;AACnB,kBAAM,IAAI;AAAA,cACR,UAAU,WAAW;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAEA,cAAM,IAAI;AAAA,UACR,8BAA8B,MAAM,WAAW,eAAe;AAAA,QAChE;AAAA,MACF;AAEA,UAAI;AACJ,UAAI;AACF,YAAI,CAAC,UAAU,SAAS,SAAS;AAC/B,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACjD;AAEA,uBAAe,SAAS,QAAQ,QAC7B,OAAO,WAAS,MAAM,SAAS,MAAM,EACrC,IAAI,WAAU,MAAc,IAAI,EAChC,KAAK,IAAI;AAEZ,YAAI,CAAC,aAAa,KAAK,GAAG;AACxB,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC7C;AAAA,MACF,SAAS,OAAO;AACd,iBAAS,KAAK;AACd,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAEA,UAAI;AACF,4BAAoB,WAAW,QAAQ,QAAQ;AAC/C,4BAAoB,WAAW,aAAa,YAAY;AAAA,MAC1D,SAAS,OAAO;AACd,iBAAS,KAAK;AAAA,MAChB;AAEA,YAAM,SAAc;AAAA,QAClB,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF,SAAS,OAAY;AACnB,UACE,MAAM,SAAS,gBACf,gBAAgB,QAAQ,WACxB,eACA;AACA,eAAO,OAAO,KAAK,gBAAgB;AAAA,MACrC;AAEA,eAAS,KAAK;AAEd,YAAM,iBAAiB,aAAa;AAEpC,YAAM,eACJ,MAAM,WAAW;AACnB,YAAM,SAAc;AAAA,QAClB,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,cAAc,UAAK,YAAY;AAAA,MACjC;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF,UAAE;AACA,sBAAgB,OAAO,oBAAoB,SAAS,aAAa;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,OAAO,kBAAkB;AACvB,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,cAAc;AAAA,MAChB;AAAA,MACA,oBAAoB;AAAA,IACtB;AAAA,EACF;AACF;;;AE7iBA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAOC,YAAW;AAClB,SAAS,KAAAC,UAAS;;;ACyBlB,IAAM,kBAAkB,oBAAI,IAAwC;AAQ7D,SAAS,+BACd,SACiC;AACjC,QAAM,OAAO,gBAAgB,IAAI,OAAO;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,EAAE,iBAAiB,kBAAkB,MAAM,OAAO,GAAG,SAAS,IAAI;AACxE,SAAO;AACT;AAEO,SAAS,0BACd,MACM;AACN,kBAAgB,IAAI,KAAK,SAAS,IAAI;AACxC;AAQA,eAAsB,2BACpB,SACA,YACA,QACiD;AACjD,QAAM,OAAO,gBAAgB,IAAI,OAAO;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,WAAW,UAAW,QAAO;AAEtC,QAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,UAAM,YAAY,WAAW,MAAM;AACjC,aAAO,IAAI,MAAM,mBAAmB,CAAC;AAAA,IACvC,GAAG,UAAU;AACb,cAAU,QAAQ;AAAA,EACpB,CAAC;AAED,QAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,QAAI,OAAO,SAAS;AAClB,aAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC;AAAA,IACF;AACA,UAAM,UAAU,MAAM,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACzD,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,EAC1D,CAAC;AAED,QAAM,QAAQ,KAAK,CAAC,KAAK,MAAM,gBAAgB,YAAY,CAAC;AAC5D,SAAO,gBAAgB,IAAI,OAAO;AACpC;;;ACnFA,SAAS,YAAY,OAAoC;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC;AACvE;AAEO,SAAS,oBAA6B;AAC3C,MAAI,YAAY,QAAQ,IAAI,YAAY,EAAG,QAAO;AAElD,MAAI;AACF,UAAM,QAAQ,QAAQ,YAAY,IAAI,MAAM,OAAO,EAAE,IAAI,GAAG,YAAY;AACxE,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,SAAS,SAAS,SAAS,UAAW,QAAO;AACjD,QAAI,SAAS,UAAU,SAAS,WAAY,QAAO;AACnD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,uBACd,MACA,SACgB;AAChB,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,aAAa,OAAO,QAAQ,EAAE;AACpC,QAAM,QAAQ,WAAW,MAAM,OAAO;AAEtC,MAAI,eAAe;AACnB,MAAI,eAAe;AACnB,MAAI,WAAW,KAAK,MAAM,SAAS,UAAU;AAC3C,mBAAe,MAAM,MAAM,GAAG,QAAQ;AACtC,mBAAe,MAAM,SAAS;AAAA,EAChC;AAEA,MAAI,cAAc,aAAa,KAAK,IAAI;AACxC,MAAI,eAAe;AACnB,MAAI,WAAW,KAAK,YAAY,SAAS,UAAU;AACjD,mBAAe,YAAY,SAAS;AACpC,kBAAc,YAAY,MAAM,GAAG,QAAQ;AAAA,EAC7C;AAEA,QAAM,YAAY,eAAe,KAAK,eAAe;AACrD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,MACX,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,cAAwB,CAAC;AAC/B,MAAI,eAAe,GAAG;AACpB,gBAAY,KAAK,GAAG,YAAY,QAAQ;AAAA,EAC1C;AACA,MAAI,eAAe,GAAG;AACpB,gBAAY,KAAK,GAAG,YAAY,QAAQ;AAAA,EAC1C;AAEA,QAAM,SAAS;AAAA;AAAA,iBAAsB,YAAY,KAAK,QAAK,CAAC;AAC5D,SAAO;AAAA,IACL,MAAM,cAAc;AAAA,IACpB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,+BACd,MACA,SACsC;AACtC,QAAM,cAAc,OAAO,QAAQ,IAAI,6BAA6B,EAAE;AACtE,QAAM,cAAc,OAAO,QAAQ,IAAI,6BAA6B,EAAE;AACtE,QAAM,eAAe;AAAA,IACnB,UACE,OAAO,SAAS,WAAW,KAAK,cAAc,IAAI,cAAc;AAAA,IAClE,UACE,OAAO,SAAS,WAAW,KAAK,cAAc,IAAI,cAAc;AAAA,EACpE;AAEA,QAAM,YAAY;AAAA,IAChB,UAAU,aAAa,YAAY,SAAS;AAAA,IAC5C,UAAU,aAAa,YAAY,SAAS;AAAA,EAC9C;AAEA,QAAM,cAAc,YAAY,QAAQ,IAAI,oBAAoB;AAChE,MAAI,CAAC,kBAAkB,KAAK,aAAa;AACvC,WAAO,EAAE,MAAM,OAAO,QAAQ,EAAE,GAAG,WAAW,MAAM;AAAA,EACtD;AAEA,QAAM,SAAS,uBAAuB,OAAO,QAAQ,EAAE,GAAG,SAAS;AACnE,SAAO,EAAE,MAAM,OAAO,MAAM,WAAW,OAAO,UAAU;AAC1D;;;ACtGO,IAAM,uBAAuB;AAE7B,IAAM,cAAc;AAEpB,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AHatB,IAAMC,eAAcC,GAAE,aAAa;AAAA,EACjC,SAASA,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,EAC7D,OAAOA,GACJ,QAAQ,EACR,SAAS,EACT,QAAQ,IAAI,EACZ,SAAS,gCAAgC;AAAA,EAC5C,SAASA,GACN,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAM,EACV,SAAS,EACT,QAAQ,GAAK,EACb,SAAS,qBAAqB;AAAA,EACjC,SAASA,GACN,QAAQ,EACR,SAAS,EACT,SAAS,4CAA4C;AAC1D,CAAC;AAyBD,SAAS,iCAA0C;AACjD,QAAM,MAAM,OAAO,QAAQ,IAAI,+BAA+B,EAAE,EAC7D,KAAK,EACL,YAAY;AACf,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,QAAQ,OAAO,QAAQ,UAAU,QAAQ,QAAQ,QAAQ;AAC3D,WAAO;AACT,MAAI,QAAQ,OAAO,QAAQ,WAAW,QAAQ,SAAS,QAAQ;AAC7D,WAAO;AACT,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAuC;AACvE,QAAM,UACH,OAAO,MAAM,YAAY,YAAY,MAAM,WAC3C,OAAQ,MAAc,YAAY,YACjC,OAAQ,MAAc,OAAO,KAC9B,OAAQ,MAAc,YAAY,YACjC,OAAQ,MAAc,OAAO,KAC/B;AAEF,QAAM,QAAQ,OAAO,MAAM,UAAU,YAAY,MAAM,QAAQ;AAC/D,QAAM,UAAU,OAAO,MAAM,YAAY,YAAY,MAAM,UAAU;AAErE,QAAM,UACJ,OAAO,MAAM,YAAY,WACrB,MAAM,UACN,OAAQ,MAAc,eAAe,WACnC,OAAQ,MAAc,UAAU,IAAI,MACpC;AAER,SAAO,EAAE,SAAS,OAAO,SAAS,QAAQ;AAC5C;AAEA,SAAS,mBACP,IACY;AACZ,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,OAAQ,QAAO;AACtB,MAAI,GAAG,SAAS,KAAM,QAAO;AAC7B,SAAO,GAAG,SAAS,IAAI,cAAc;AACvC;AAEA,SAAS,iBAAiB,QAAoC;AAC5D,QAAM,KAAK,SAAS,YAAY,EAAE,oBAAoB,MAAM;AAC5D,MAAI,IAAI;AACN,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ,mBAAmB,EAAE;AAAA,MAC7B,aAAa,GAAG;AAAA,MAChB,QAAQ,eAAe,MAAM;AAAA,MAC7B,UAAU,GAAG;AAAA,IACf;AAAA,EACF;AAEA,QAAM,QAAQ,+BAA+B,MAAM;AACnD,MAAI,OAAO;AACT,UAAM,SAAS,eAAe,MAAM,KAAK,MAAM,cAAc;AAC7D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ,MAAM;AAAA,MACd,aAAa,MAAM;AAAA,MACnB;AAAA,MACA,QAAQ,MAAM;AAAA,MACd,QAAQ;AAAA,MACR,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,qBAAqB,QAAgB,UAA2C;AACpG,QAAM,cAAc,OAAO,MAAM,UAAU,KAAK,CAAC,GAAG;AACpD,QAAM,gBAAgB,OAAO,MAAM,YAAY,KAAK,CAAC,GAAG;AAExD,MAAI,UAAU;AACd,MAAI,aAAa,GAAG;AAClB,cAAU;AAAA,EACZ,WAAW,aAAa,UAAa,aAAa,MAAM;AACtD,cAAU,sBAAsB,QAAQ;AAAA,EAC1C,OAAO;AACL,cAAU;AAAA,EACZ;AAEA,QAAM,QAAQ,CAAC,OAAO;AACtB,MAAI,aAAa,EAAG,OAAM,KAAK,GAAG,UAAU,SAAS,eAAe,IAAI,KAAK,GAAG,EAAE;AAClF,MAAI,eAAe,EAAG,OAAM,KAAK,GAAG,YAAY,WAAW,iBAAiB,IAAI,KAAK,GAAG,EAAE;AAE1F,MAAI,CAAC,+BAA+B,GAAG;AACrC,UAAM,KAAK,wBAAwB;AACnC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,MAAI,aAAa,KAAK,eAAe,KAAK,iBAAiB,GAAG;AAC5D,UAAM,KAAK,uBAAuB;AAClC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,MAAI,aAAa,KAAK,aAAa,KAAK,eAAe,GAAG;AACtD,QAAI;AACC,YAAM,EAAE,YAAAC,aAAY,SAAAC,SAAQ,IAAI,MAAM,OAAO,MAAM;AACnD,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM,OAAO,qBAAc;AAEtD,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,YAAM,cAAc,oBAAI,IAAY;AACpC,YAAM,iBAA2B,CAAC;AAQlC,YAAM,YAAY;AAElB,iBAAW,QAAQ,OAAO;AACtB,cAAM,UAAU,KAAK,MAAM,SAAS;AACpC,YAAI,SAAS;AACT,qBAAW,SAAS,SAAS;AAEzB,gBAAI,YAAY;AAGhB,gBAAI,UAAU,SAAS,GAAG,GAAG;AACzB,0BAAY,UAAU,MAAM,GAAG,EAAE,CAAC;AAAA,YACtC,OAAO;AAIH,0BAAY,UAAU,QAAQ,kBAAkB,EAAE;AAAA,YACtD;AAEA,wBAAY,IAAI,SAAS;AAAA,UAC7B;AAAA,QACJ;AAAA,MACJ;AACA,UAAI,YAAY,SAAS,GAAG;AACxB,cAAM,KAAK,iCAAiC;AAC5C,eAAO,MAAM,KAAK,IAAI;AAAA,MAC1B;AAEA,iBAAW,QAAQ,aAAa;AAC5B,YAAI;AAEC,gBAAM,UAAUF,YAAW,IAAI,IAAI,OAAOC,SAAQC,gBAAe,GAAG,IAAI;AACxE,gBAAM,UAAU,IAAI;AAAA,YAClB,WAAW;AAAA,YACX,UAAU;AAAA,YACV,oBAAoB;AAAA,YACpB,WAAW;AAAA,YACX,UAAUA,gBAAe;AAAA,UAC3B,CAAC;AAED,gBAAM,cAAc,MAAM,UAAU,YAAY,SAAS;AAAA,YACvD,UAAUA,gBAAe;AAAA,UAC3B,CAAC;AACD,cAAI,eAAe,YAAY,SAAS,GAAG;AACvC,kBAAM,SAAS,wBAAwB,aAAa,EAAE,UAAU,EAAE,CAAC;AACnE,gBAAI,QAAQ;AACR,6BAAe,KAAK,uBAAuB,IAAI,GAAG;AAClD,6BAAe,KAAK,MAAM;AAAA,YAC9B;AAAA,UACJ;AAAA,QACL,SAAS,GAAG;AAER,kBAAQ,MAAM,uBAAuB,CAAC;AAAA,QAC1C;AAAA,MACJ;AAEA,UAAI,eAAe,SAAS,GAAG;AAC3B,cAAM,KAAK,sBAAsB,eAAe,KAAK,IAAI,CAAC;AAAA,MAC9D,OAAO;AACH,cAAM,KAAK,8BAA8B;AAAA,MAC7C;AAAA,IAEL,SAAS,GAAG;AAER,cAAQ,MAAM,6BAA6B,CAAC;AAAA,IAChD;AAAA,EACJ;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAOA,eAAe,0BAA0B,MAIT;AAC9B,QAAM,EAAE,QAAQ,WAAW,OAAO,IAAI;AACtC,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,QAAI,OAAO,QAAS,QAAO;AAC3B,UAAM,UAAU,iBAAiB,MAAM;AACvC,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,QAAQ,WAAW,aAAa,QAAQ,WAAW;AACrD,aAAO;AACT,UAAM,IAAI,QAAQ,CAAAC,aAAW,WAAWA,UAAS,GAAG,CAAC;AAAA,EACvD;AAEA,SAAO,iBAAiB,MAAM;AAChC;AAEO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,aAAAC;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAY;AAC/B,UAAM,aAAa,yBAAyB,KAAY;AACxD,QAAI,CAAC,WAAW,MAAO,QAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EACA,+BAA+B;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,wBAAwB,QAAgB,EAAE,QAAQ,GAAyB;AACzE,UAAM,QAAQ,SAAS;AAEvB,QACE,OAAO,qBAAqB,aAC5B,OAAO,qBAAqB,aAC5B;AACA,aACE,gBAAAC,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAAe,6BAAsB,CAC1D;AAAA,IAEJ;AAEA,QAAI,CAAC,OAAO,MAAM;AAChB,aACE,gBAAAF,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAAe,0BAAwB,CAC5D;AAAA,IAEJ;AAEA,QAAI,OAAO,KAAK,cAAc,eAAe;AAC3C,YAAM,QAAQ,OAAO,KAAK,SACtB,OAAO,KAAK,OAAO,MAAM,IAAI,EAAE,SAC/B;AACJ,UAAI,CAAC,SAAS;AACZ,eACE,gBAAAF,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAAe,gCAElC,CACF;AAAA,MAEJ;AACA,aACE,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAACE,OAAA,MACE,OAAO,KAAK,aAAY,MAAG,OAAM,SACpC,GACC,OAAO,KAAK,SACX,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAa,KAChB,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAAgB,OAAO,KAAK,MAAO,CACxD,IACE,MACH,OAAO,KAAK,SACX,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAa,GAAG,WAAW,KAC9B,gBAAAD,OAAA,cAACE,OAAA,MAEG,+BAA+B,OAAO,KAAK,QAAQ;AAAA,QACjD,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC,EAAE,IAEP,CACF,IACE,MACH,OAAO,KAAK,QACX,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,WAAW,GAAG,aAAa,KACrD,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,OAAO,MAAI,QAAC,QAE/B,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,SAAQ,OAAO,KAAK,KAAM,CAC/C,IACE,IACN;AAAA,IAEJ;AAEA,UAAM,UAAU,OAAO,KAAK,QAAQ,QAAQ,KAAK;AACjD,QAAI,CAAC,SAAS;AACZ,aACE,gBAAAF,OAAA,cAACC,MAAA,MACC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAChB,QAAQ,SAAS,IACd,mCACA,cACN,CACF;AAAA,IAEJ;AACA,WACE,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,iBAAgB,OAAO,KAAK,WAAY,GAC1D,UACC,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAa,GAAG,WAAW,KAC9B,gBAAAD,OAAA,cAACE,OAAA,MAEG,+BAA+B,SAAS;AAAA,MACtC,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC,EAAE,IAEP,CACF,IACE,IACN;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAgB;AACvC,UAAM,QAAkB,CAAC;AACzB,UAAM;AAAA,MACJ,qBAAqB,OAAO,gBAAgB;AAAA,IAC9C;AAEA,QAAI,OAAO,MAAM;AACf,YAAM,KAAK,YAAY,OAAO,KAAK,OAAO,YAAY;AACtD,YAAM,KAAK,cAAc,OAAO,KAAK,SAAS,cAAc;AAC5D,YAAM,KAAK,WAAW,OAAO,KAAK,MAAM,WAAW;AACnD,UAAI,OAAO,KAAK,aAAa,UAAa,OAAO,KAAK,aAAa,MAAM;AACvE,cAAM,KAAK,cAAc,OAAO,KAAK,QAAQ,cAAc;AAAA,MAC7D;AACA,UAAI,OAAO,KAAK,QAAQ,KAAK,GAAG;AAC9B,cAAM,KAAK;AAAA,EAAa,OAAO,KAAK,OAAO,QAAQ,CAAC;AAAA,UAAa;AAAA,MACnE;AACA,UAAI,OAAO,KAAK,OAAO;AACrB,cAAM,KAAK,UAAU,OAAO,KAAK,KAAK,UAAU;AAAA,MAClD;AACA,UAAI,OAAO,KAAK,UAAU;AACxB,cAAM,KAAK,aAAa,OAAO,KAAK,QAAQ,aAAa;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EACA,MAAM,cAAc,OAAyC;AAC3D,QAAI,CAAC,MAAM,SAAS;AAClB,aAAO,EAAE,QAAQ,OAAO,SAAS,uBAAuB,WAAW,EAAE;AAAA,IACvE;AAEA,UAAM,OAAO,iBAAiB,MAAM,OAAO;AAC3C,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,0BAA0B,MAAM,OAAO;AAAA,QAChD,WAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,OAAc,SAAyB;AACjD,UAAM,aAAa,yBAAyB,KAAY;AACxD,UAAM,SAAS,WAAW;AAC1B,UAAM,QAAQ,WAAW;AACzB,UAAM,YAAY,WAAW;AAC7B,UAAM,UAAU,WAAW;AAE3B,UAAM,UAAU,iBAAiB,MAAM;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0BAA0B,MAAM,EAAE;AAAA,IACpD;AAEA,QAAI,CAAC,OAAO;AACV,YAAM,SACJ,QAAQ,WAAW,aAAa,QAAQ,WAAW;AAErD,UAAI,SAAS;AACT,gBAAQ,WAAW,MAAM,qBAAqB,QAAQ,UAAU,IAAI,QAAQ,QAAQ;AAAA,MACxF;AAEA,YAAMC,OAAc;AAAA,QAClB,kBAAkB,SAAS,YAAY;AAAA,QACvC,MAAM;AAAA,MACR;AACA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAMA;AAAA,QACN,oBAAoB,KAAK,yBAAyBA,IAAG;AAAA,MACvD;AACA;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,QACP,kBAAkB,QAAQ,cAAc,KAAK,QAAQ,WAAW;AAAA,IAAO,EAAE;AAAA,MAC3E;AAAA,IACF;AAEA,QAAI,YAAgC;AAEpC,QAAI,QAAQ,cAAc,eAAe;AACvC,UAAI;AACF,cAAM,OAAO,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,QAAQ,gBAAgB;AAAA,QAC1B;AACA,oBAAY,OAAO,iBAAiB,MAAM,IAAI;AAAA,MAChD,QAAQ;AACN,oBAAY,iBAAiB,MAAM;AAAA,MACrC;AAAA,IACF,OAAO;AACL,kBAAY,MAAM,0BAA0B;AAAA,QAC1C;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ,gBAAgB;AAAA,MAClC,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,WAAW;AACd,YAAMA,OAAc,EAAE,kBAAkB,WAAW,MAAM,KAAK;AAC9D,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAMA;AAAA,QACN,oBAAoB,KAAK,yBAAyBA,IAAG;AAAA,MACvD;AACA;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,aAAa,UAAU,WAAW,WAAW;AACpE,YAAMA,OAAc,EAAE,kBAAkB,WAAW,MAAM,UAAU;AACnE,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAMA;AAAA,QACN,oBAAoB,KAAK,yBAAyBA,IAAG;AAAA,MACvD;AACA;AAAA,IACF;AAEA,QAAI,SAAS;AACT,gBAAU,WAAW,MAAM,qBAAqB,UAAU,UAAU,IAAI,UAAU,QAAQ;AAAA,IAC9F;AAEA,UAAM,MAAc,EAAE,kBAAkB,WAAW,MAAM,UAAU;AACnE,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,oBAAoB,KAAK,yBAAyB,GAAG;AAAA,IACvD;AAAA,EACF;AACF;;;AIvhBA,SAAS,QAAQ,cAAAC,aAAY,gBAAgB;AAC7C,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,YAAYC,YAAW;AACvB,SAAS,KAAAC,UAAS;AAClB,SAAS,YAAY,UAAU,eAAoB;;;ACF5C,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADWtB,IAAMC,eAAcC,GAAE,aAAa;AAAA,EACjC,YAAYA,GACT,MAAMA,GAAE,OAAO,CAAC,EAChB;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAOA,GACJ,QAAQ,EACR,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAEM,IAAM,aAAa;AAAA,EACxB,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,gBAAgB,MAAM;AAAA,EACtB,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAF;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,EAAE,WAAW,GAAG;AAE/B,WAAO,WAAW,KAAK,UAAQ,CAAC,mBAAmB,IAAI,CAAC;AAAA,EAC1D;AAAA,EACA,qBAAqB,OAAO,EAAE,QAAQ,GAAG;AACvC,UAAM,QAAQ,MAAM,WAAW;AAAA,MAAI,OACjC,UAAU,IAAI,SAAS,OAAO,GAAG,CAAC;AAAA,IACpC,EAAE,KAAK,IAAI;AACX,WAAO,aAAa,KAAK;AAAA,EAC3B;AAAA,EACA,wBAAwB,QAAiD;AACvE,WACE,qCAACG,MAAA,EAAI,eAAc,YAChB,OAAO,QAAQ,SAAS,KACvB,qCAACC,OAAA,MAAK,aAAU,OAAO,QAAQ,KAAK,IAAI,CAAE,GAE3C,OAAO,OAAO,SAAS,KACtB,qCAACA,OAAA,EAAK,OAAO,SAAS,EAAE,WAAS,sBAAmB,OAAO,OAAO,KAAK,IAAI,CAAE,CAEjF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAiD;AACxE,UAAM,QAAQ,CAAC;AACf,QAAI,OAAO,QAAQ,SAAS,EAAG,OAAM,KAAK,kBAAkB,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE;AACvF,QAAI,OAAO,OAAO,SAAS,EAAG,OAAM,KAAK,2BAA2B,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAC9F,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EACA,6BACE,EAAE,WAAW,IAAS,CAAC,GACvB,EAAE,SAAS,QAAQ,IAAS,CAAC,GAC7B;AACA,QAAI,CAAC,cAAc,WAAW,WAAW,GAAG;AAC1C,aAAO,qCAAC,oCAA+B;AAAA,IACzC;AACA,WACE,qCAACD,MAAA,EAAI,eAAc,YACjB,qCAACC,OAAA,MACE,MAAK,UAAE,KACR,qCAACA,OAAA,EAAK,OAAO,SAAS,EAAE,SAAO,8BACF,WAAW,QAAO,QAC/C,CACF,CACF;AAAA,EAEJ;AAAA,EACA,OAAO,KAAK,EAAE,YAAY,MAAM,GAAG,SAAS;AAC1C,UAAM,UAAU,QAAQ,SAAS,WAAW;AAC5C,UAAM,eAAyB,CAAC;AAChC,UAAM,cAAwB,CAAC;AAE/B,eAAW,WAAW,YAAY;AAEhC,YAAM,WAAW,WAAW,OAAO,IAAI,UAAU,QAAQ,OAAO,GAAG,OAAO;AAE1E,UAAI;AACF,YAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,sBAAY,KAAK,GAAG,OAAO,cAAc;AACzC;AAAA,QACF;AAGA,YAAI,CAAC,OAAO;AACV,cAAI;AACF,kBAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,mBAAoB;AACvD,kBAAM,kBAAkB,MAAMA,WAAU,oBAAoB,QAAQ;AACpE,gBAAI,iBAAiB;AACnB,0BAAY;AAAA,gBACV,GAAG,OAAO,0BAA0B,eAAe;AAAA,cACrD;AACA;AAAA,YACF;AAAA,UACF,SAAS,GAAQ;AACf,gBAAI,CAAC,OAAO;AACV,0BAAY;AAAA,gBACV,GAAG,OAAO;AAAA,cACZ;AACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAIA,cAAM,OAAO,QAAQ,UAAU,GAAG;AAClC,YAAI,aAAa,MAAM;AACnB,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QACnD;AAGA,cAAM,QAAQ,SAAS,QAAQ;AAC/B,cAAM,OAAO,MAAM,YAAY,IAAI,cAAc;AAKjD,eAAO,UAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEjD,qBAAa,KAAK,GAAG,OAAO,KAAK,IAAI,GAAG;AAAA,MAC1C,SAAS,KAAU;AACjB,iBAAS,GAAG;AACZ,oBAAY,KAAK,GAAG,OAAO,KAAK,IAAI,OAAO,GAAG;AAAA,MAChD;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,MACb,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAEA,QAAI,aAAa,SAAS,KAAK,YAAY,SAAS,GAAG;AACrD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA;AAAA,EACF;AACF;;;AEtKA,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,OAAOC,YAAW;AAClB,SAAS,KAAAC,UAAS;AAKlB,SAAS,iCAAiC;;;ACPnC,IAAM,YAAY;AAElB,IAAMC,eAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpB,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADCtB,IAAMC,eAAcC,GAAE,aAAa;AAAA,EACjC,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,6CAA6C;AAC3D,CAAC;AAcM,IAAM,uBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAOC;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAH;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,EAAE,OAAO,GAAU,SAA0B;AAC/D,QAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,KAAK;AACnC,UAAM,UACH,SAAS,SAAS,cAAyB,MAAM,WAAW;AAC/D,UAAM,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACjD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,WAAW,MAAM,mCAAmC,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,QAChG,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,qBAAqB,EAAE,OAAO,GAAU;AACtC,WAAO,SACH,mCAAmC,MAAM,MACzC;AAAA,EACN;AAAA,EACA,+BAA+B;AAC7B,WAAO,gBAAAI,OAAA,cAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAgB;AACtC,WACE,gBAAAA,OAAA,cAACC,MAAA,EAAI,gBAAe,iBAAgB,OAAM,UACxC,gBAAAD,OAAA,cAACC,MAAA,EAAI,eAAc,SACjB,gBAAAD,OAAA,cAACE,OAAA,MAAK,qBAAoB,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,MAAI,QAAE,OAAO,MAAO,GAC1B,gBAAAF,OAAA,cAACE,OAAA,MAAK,YAAU,CAClB,GACA,gBAAAF,OAAA,cAAC,QAAK,SAAS,GAAG,YAAY,GAAG,OAAO,OAAO,CACjD;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B;AAAA,EACA,OAAO,KAAK,EAAE,OAAO,GAAU,SAAyB;AACtD,UAAM,UACH,QAAQ,SAAS,cAAyB,MAAM,WAAW;AAC9D,UAAM,WAAW,SAAS,QAAQ,OAAO,OAAK,EAAE,SAAS,MAAM,IAAI;AACnE,QAAI,UAAU,SAAS,WAAW,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,WAAW,MAAM,mCAAmC,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MACzF;AAAA,IACF;AAEA,UAAM,YAA0B,CAAC;AACjC,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,SAAS,YAAa;AAClC,UAAI;AACF,YAAI,eACD,QAAgB,gBAAgB;AACnC,YAAI,CAAC,cAAc;AACjB,cAAI;AACF,2BAAe,QAAQ,OAAO,sBAAsB;AAAA,UACtD,QAAQ;AACN,2BAAe;AAAA,UACjB;AAAA,QACF;AACA,YAAI,CAAE,cAAsB,UAAW;AACvC,cAAM,SAAS,MAAM,QAAQ,OAAO;AAAA,UAClC,EAAE,QAAQ,iBAAiB;AAAA,UAC3B;AAAA,QACF;AACA,YAAI,CAAC,OAAO,UAAW;AACvB,kBAAU;AAAA,UACR,GAAG,OAAO,UAAU,IAAI,QAAM;AAAA,YAC5B,GAAG;AAAA,YACH,QAAQ,QAAQ;AAAA,UAClB,EAAE;AAAA,QACJ;AAAA,MACF,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,oBAAoB,KAAK,yBAAyB,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;;;AEvIA,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAC1B,SAAS,UAAU,cAAAC,aAAY,YAAAC,WAAU,WAAAC,UAAS,OAAAC,YAAW;AAC7D,SAAS,mBAAmB;AAC5B,YAAYC,YAAW;AACvB,SAAS,KAAAC,UAAS;AAClB,SAAS,iBAAiB;;;ACLnB,IAAMC,eAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBzB,KAAK;;;ADLP,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,eAAcC,GAAE,OAAO;AAAA,EAC3B,MAAMA,GACH,OAAO,EACP;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQA,GACL,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,kCAAkC;AAChD,CAAC,EAAE,YAAY;AAER,IAAM,SAAS;AAAA,EACpB,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAOC;AAAA,EACT;AAAA,EACA,aAAAF;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,EAAE,KAAK,GAAG;AACzB,WAAO,CAAC,kBAAkB,IAAI;AAAA,EAChC;AAAA,EACA,MAAM,SAAS;AACb,WAAOE;AAAA,EACT;AAAA,EACA,MAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAgC;AAC9B,QACE,OAAO,UAAU,YACjB,OAAO,WAAW,YAClB,OAAO,cAAc,UACrB;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SACE;AAAA,QACF,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,iBAAiB,QAAQ,kBAAkB,MAAM;AACnD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SACE;AAAA,QACF,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,yBAAyB,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,EAAE,MAAM,OAAO,GAAG,EAAE,QAAQ,GAAG;AAClD,UAAM,eAAe,OACjBC,YAAW,IAAI,IACb,OACAC,SAAQ,OAAO,GAAG,IAAI,IACxB;AACJ,UAAM,eAAe,eAAeC,UAAS,OAAO,GAAG,YAAY,IAAI;AACvE,UAAM,QAAQ,CAAC,UAAU,UAAU,OAAO,YAAY,GAAG;AACzD,QAAI,UAAU,OAAO,SAAS,EAAG,OAAM,KAAK,WAAW,OAAO,MAAM,EAAE;AACtE,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EACA,+BAA+B;AAC7B,WAAO,qCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,SAAS;AAC/B,UAAM,UAAU;AAChB,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,WACE,qCAACC,MAAA,EAAI,gBAAe,iBAAgB,OAAM,UACxC,qCAACA,MAAA,MACC,qCAACC,OAAA,MAAK,qBAAoB,GAC1B,qCAACD,MAAA,EAAI,eAAc,UAAS,aAAa,KACtC,MACE,MAAM,GAAG,UAAU,SAAY,kBAAkB,EACjD,IAAI,CAAC,MAAM,MACV,qCAAO,iBAAN,EAAe,KAAK,KACnB,qCAACC,OAAA,MAAM,IAAK,CACd,CACD,GACF,CAAC,WAAW,MAAM,SAAS,sBAC1B,qCAACA,OAAA,EAAK,OAAO,SAAS,EAAE,iBAAe,UAC9B,MAAM,SAAS,oBAAmB,SAC3C,CAEJ,CACF,CACF;AAAA,EAEJ;AAAA,EACA,OAAO,KAAK,EAAE,MAAM,OAAO,GAAG,EAAE,gBAAgB,GAAG;AACjD,UAAM,eAAeJ,YAAW,IAAI,IAAI,OAAOC,SAAQ,OAAO,GAAG,IAAI;AACrE,QAAI;AACF,YAAM,cAAc,UAAU,CAAC,GAAG,OAAO,OAAO;AAChD,YAAM,iBAAiB,wBAAwB,OAAO,UAAU,EAAE;AAAA,QAChE;AAAA,MACF;AACA,YAAM,gBAAgB,wBAAwB;AAAA,QAC5C,aAAW,IAAI,OAAO;AAAA,MACxB,EACG,OAAO,WAAW,IAAI,aAAW,IAAI,OAAO,EAAE,CAAC,EAC/C,OAAO,OAAO;AACjB,YAAM,SAAS;AAAA,QACb;AAAA,QACA,GAAG,cAAc,QAAQ,aAAW,CAAC,UAAU,OAAO,CAAC;AAAA,MACzD;AACA,YAAM,gBAAgB,MAAM;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,MAClB;AACA,YAAM,QAAQ,cAAc;AAC5B,YAAM,aAAa,MAChB,IAAI,UAAQ;AACX,cAAM,eAAeD,YAAW,IAAI,IAChC,OACAC,SAAQ,cAAc,IAAI;AAC9B,cAAM,eAAeC,UAAS,cAAc,YAAY;AACxD,cAAM,aAAa,aAAa,MAAMG,IAAG,EAAE,KAAK,GAAG;AACnD,eAAO,EAAE,cAAc,cAAc,WAAW;AAAA,MAClD,CAAC;AACH,YAAM,sBAAsB,eAAe;AAAA,QAAI,aAC7C,QAAQ,SAAS,GAAG,IAAI,GAAG,OAAO,OAAO;AAAA,MAC3C;AACA,YAAM,cAAc,WACjB,OAAO,WAAS;AACf,YAAI,oBAAoB,WAAW,EAAG,QAAO;AAC7C,eAAO,CAAC,oBAAoB;AAAA,UAAK,aAC/B,UAAU,MAAM,YAAY,SAAS,EAAE,KAAK,MAAM,QAAQ,MAAM,CAAC;AAAA,QACnE;AAAA,MACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AAC1D,YAAM,aAAa,YAAY;AAC/B,YAAM,YAAY,aAAa;AAC/B,YAAM,kBAAkB,YACpB,YAAY,MAAM,GAAG,eAAe,IACpC;AACJ,YAAM,kBAAkB,YAAY,YAAY,MAAM,eAAe,IAAI,CAAC;AAC1E,YAAM,gBAAgB,gBAAgB,IAAI,WAAS,MAAM,YAAY;AACrE,UAAI,aAAa;AAAA,QACf;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT;AACA,YAAM,iBAAiB,kBAAkB,YAAY;AACrD,YAAM,EAAE,kBAAkB,SAAS,IAAI;AAAA,QACrC,YAAY,IAAI,WAAS,MAAM,UAAU;AAAA,MAC3C;AACA,YAAM,sBAAsB;AAAA,QAC1B,gBAAgB,IAAI,WAAS,MAAM,UAAU;AAAA,MAC/C;AACA,YAAM,sBAAsB;AAAA,QAC1B,gBAAgB,IAAI,WAAS,MAAM,UAAU;AAAA,MAC/C;AACA,YAAM,yBAAyB,MAAM,KAAK,mBAAmB,EAAE;AAAA,QAC7D,SAAO,CAAC,oBAAoB,IAAI,GAAG;AAAA,MACrC,EAAE;AACF,YAAM,oBACJ,YAAY,aAAa,gBAAgB,SAAS;AACpD,YAAM,YACJ,eAAe,IAAI,UAAU,mBAAmB,YAAY,QAAQ,CAAC;AACvE,YAAM,gBAAgB,6EAAiB,eAAe,cAAc,mDAAW,eAAe,SAAS,6CAAU,gBAAgB,6CAAU,UAAU,iEAAe,SAAS,8CAAW,QAAQ;AAChM,YAAM,YAAY,aAAa,WAAW,MAAM,IAAI,IAAI,CAAC;AACzD,YAAM,eAAe,KAAK,IAAI,GAAG,UAAU,SAAS,kBAAkB;AACtE,YAAM,WAAqB,CAAC;AAC5B,UAAI,WAAW;AACb,iBAAS;AAAA,UACP;AAAA,QACF;AACA,iBAAS;AAAA,UACP,0LAAoC,iBAAiB,8CAAW,sBAAsB,wCAAU,YAAY;AAAA,QAC9G;AACA,iBAAS,KAAK,gLAA+B;AAC7C,iBAAS,KAAK,2KAAoC;AAClD,iBAAS,KAAK,6JAA+C;AAC7D,iBAAS,KAAK,8IAA+C;AAC7D,iBAAS,KAAK,yIAAgC;AAAA,MAChD;AACA,UAAI,eAAe,WAAW;AAC5B,iBAAS;AAAA,UACP,iDAA6B,eAAe,UAAU,kBAAQ,eAAe;AAAA,QAC/E;AAAA,MACF;AACA,YAAM,YAAY,aAAa,SAASA,IAAG,IACvC,eACA,GAAG,YAAY,GAAGA,IAAG;AACzB,YAAM,eAAe;AAAA,EAAe,eAAe,UAAU;AAC7D,YAAM,iBAAiB,YACnB,kKAAgC,iBAAiB,8CAAW,sBAAsB,yNAClF;AACJ,YAAM,WAAW,SAAS,YAAY,KAAK;AAC3C,YAAM,cAAc,UAAU,SAAS,KAAK,UAAU,CAAC,MAAM;AAC7D,YAAM,gBAAgB,cAAc,UAAU,MAAM,CAAC,IAAI;AACzD,YAAM,WAAW,cAAc,KAAK,IAAI;AACxC,YAAM,iBAAiB,WAAW,GAAG,SAAS;AAAA,EAAK,QAAQ,KAAK;AAChE,YAAM,YAAY;AAClB,YAAM,cAAc;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,OAAO,OAAO;AAChB,YAAM,gBAAgB,YAAY,KAAK,IAAI;AAC3C,YAAM,eAAe,SAAS,SAAS,IAAI;AAAA,EAAK,SAAS,KAAK,IAAI,CAAC,KAAK;AACxE,YAAM,gBAAgB;AAAA;AACtB,YAAM,gBAAgB,GAAG,aAAa,GAAG,YAAY,GAAG,aAAa;AAErE,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,aAAa;AAAA,MACjE;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UACJ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC7D,YAAM,YAAa,OAAoC;AACvD,YAAM,YAAY,cAAc,YAAY,QAAQ,SAAS,QAAQ;AACrE,YAAM,cAAc,WAAW;AAC/B,YAAM,cAAc,YAChB,uVACA;AACJ,YAAM,gBAAgB,GAAG,WAAW,GAAG,WAAW;AAClD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,aAAa;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,qBAAqB,CACzB,WACA,aACA,UACW;AACX,QAAM,QAAQ;AAAA,IACZ,GAAG,YAAY,IAAI,WAAS,EAAE,MAAM,GAAG,IAAI,GAAGA,IAAG,IAAI,OAAO,KAAK,EAAE;AAAA,IACnE,GAAG,MAAM,IAAI,WAAS,EAAE,MAAM,OAAO,MAAM,EAAE;AAAA,EAC/C;AACA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,SAAS;AACpB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,YAAY,MAAM,MAAM,SAAS,IAAI,wBAAS;AACpD,UAAM,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC,EAAE,IAAI,EAAE;AAAA,EAC3C;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,IAAM,oBAAoB,CAAC,iBAAyB;AAClD,QAAM,UAAU,YAAY,cAAc,EAAE,eAAe,KAAK,CAAC;AACjE,QAAM,cAAc,QACjB,OAAO,WAAS,MAAM,YAAY,CAAC,EACnC,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACpC,QAAM,QAAQ,QACX,OAAO,WAAS,CAAC,MAAM,YAAY,CAAC,EACpC,IAAI,WAAS,MAAM,IAAI,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACpC,QAAM,QAAQ;AAAA,IACZ,GAAG,YAAY,IAAI,WAAS,EAAE,MAAM,OAAO,KAAK,EAAE;AAAA,IAClD,GAAG,MAAM,IAAI,WAAS,EAAE,MAAM,OAAO,MAAM,EAAE;AAAA,EAC/C;AACA,QAAM,aAAa,MAAM;AACzB,QAAM,YAAY,aAAa;AAC/B,QAAM,eAAe,YAAY,MAAM,MAAM,GAAG,eAAe,IAAI;AACnE,QAAM,qBAAqB,aACxB,OAAO,UAAQ,KAAK,KAAK,EACzB,IAAI,UAAQ,KAAK,IAAI;AACxB,QAAM,eAAe,aAClB,OAAO,UAAQ,CAAC,KAAK,KAAK,EAC1B,IAAI,UAAQ,KAAK,IAAI;AACxB,QAAM,YAAY,aAAa,SAASA,IAAG,IACvC,eACA,GAAG,YAAY,GAAGA,IAAG;AACzB,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,YAAY;AAAA,IAC5B,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,IAAM,kBAAkB,CAAC,UAAoB;AAC3C,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,SAAS,OAAO;AACzB,UAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC7C,QAAI,MAAM,UAAU,EAAG;AACvB,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,kBAAY,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,CAAC,UAAoB;AAC7C,QAAM,cAAc,gBAAgB,KAAK;AACzC,MAAI,WAAW;AACf,aAAW,SAAS,OAAO;AACzB,UAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,OAAO;AAC7C,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;AAC1C,QAAI,QAAQ,SAAU,YAAW;AAAA,EACnC;AACA,SAAO,EAAE,kBAAkB,YAAY,MAAM,SAAS;AACxD;;;AErXA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,YAAAC,iBAAgB;AACnD,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAkB,YAAAC,WAAU,WAAAC,gBAAe;AAC3C,OAAOC,YAAW;AAClB,SAAS,KAAAC,UAAS;;;ACTX,IAAMC,wBAAuB;AAE7B,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEf,IAAMC,eAAcD;;;ADzC3B,IAAME,eAAcC,GAAE,aAAa;AAAA,EACjC,WAAWA,GACR,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS,8BAA8B;AAAA,EAC1C,UAAUA,GAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,EACzE,MAAMA,GACH,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,yFAAyF;AAAA,EACrG,WAAWA,GACR,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,SAAS,8FAA8F;AAAA,EAC1G,OAAOA,GACJ,OAAO,EACP,SAAS,EACT,SAAS,qFAAqF;AAAA,EACjG,oBAAoBA,GACjB,QAAQ,EACR,SAAS,EACT,SAAS,yFAAyF;AAAA,EACrG,SAASA,GACN,OAAO,EACP,SAAS,EACT,SAAS,gEAAgE;AAC9E,CAAC;AAED,IAAM,eAAeA,GAAE,OAAO;AAAA,EAC5B,WAAWA,GACR,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS,sCAAsC;AAAA,EAClD,QAAQA,GAAE,OAAO,EAAE,SAAS,2CAA2C;AAAA,EACvE,UAAUA,GAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,EAC5E,aAAaA,GACV,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,SAAS,sDAAsD;AAAA,EAClE,WAAWA,GACR,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,SAAS,oCAAoC;AAClD,CAAC;AAKD,IAAM,mBAGF;AAAA,EACF,gBAAgB,EAAE,UAAU,cAAc,QAAQ,cAAc;AAAA,EAChE,gBAAgB,EAAE,UAAU,aAAa,QAAQ,aAAa;AAAA,EAC9D,gBAAgB,EAAE,UAAU,UAAU,QAAQ,UAAU;AAAA,EACxD,iBAAiB,EAAE,UAAU,UAAU,QAAQ,UAAU;AAAA,EACzD,OAAO,EAAE,UAAU,cAAc,QAAQ,cAAc,SAAS,YAAY;AAAA,EAC5E,oBAAoB,EAAE,UAAU,kBAAkB,QAAQ,kBAAkB;AAAA,EAC5E,sBAAsB,EAAE,UAAU,aAAa,QAAQ,aAAa;AAAA,EACpE,eAAe,EAAE,UAAU,UAAU,QAAQ,UAAU;AAAA,EACvD,eAAe,EAAE,UAAU,UAAU,QAAQ,UAAU;AAAA,EACvD,UAAU,EAAE,UAAU,SAAS,QAAQ,SAAS;AAAA,EAChD,aAAa,EAAE,UAAU,cAAc,QAAQ,cAAc;AAC/D;AAEA,SAAS,wBACP,OACA,eACA,oBACe;AACf,MAAI;AACF,QAAI,gBAAgB,KAAK,iBAAiB,MAAM,OAAQ,QAAO;AAC/D,UAAM,OAAO,MAAM,aAAa;AAChC,QAAI,qBAAqB,KAAK,sBAAsB,KAAK,OAAQ,QAAO;AACxE,UAAM,UAAU;AAChB,QAAI;AACJ,YAAQ,QAAQ,QAAQ,KAAK,IAAI,OAAO,MAAM;AAC5C,YAAM,QAAQ,MAAM;AACpB,YAAM,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC7B,UAAI,sBAAsB,SAAS,qBAAqB,KAAK;AAC3D,cAAM,QAAQ,MAAM,CAAC;AACrB,eAAO,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ;AAAA,MAC1D;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,SAAS,iBAAiB,MAA+B;AACvD,QAAM,UAAU;AAChB,QAAM,SAA0B,CAAC;AACjC,MAAI;AACJ,UAAQ,QAAQ,QAAQ,KAAK,IAAI,OAAO,MAAM;AAC5C,WAAO,KAAK;AAAA,MACV,OAAO,MAAM,CAAC;AAAA,MACd,OAAO,MAAM;AAAA,MACb,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,aAAa,OAAwB;AAC5C,QAAM,UAAU,MAAM,YAAY;AAClC,MAAI,eAAe,IAAI,OAAO,EAAG,QAAO;AACxC,MAAI,gBAAgB,IAAI,KAAK,EAAG,QAAO;AACvC,SAAO;AACT;AAEA,SAAS,8BACP,OACA,eACA,oBAC2D;AAC3D,QAAM,UAAU,CAAC,GAAG,IAAI,CAAC;AACzB,MAAI,OAEO;AACX,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,gBAAgB;AAClC,QAAI,YAAY,KAAK,aAAa,MAAM,OAAQ;AAChD,UAAM,WAAW,MAAM,SAAS;AAChC,QAAI,CAAC,YAAY,SAAS,WAAW,EAAG;AACxC,UAAM,cAAc,KAAK;AAAA,MACvB,KAAK,IAAI,oBAAoB,CAAC;AAAA,MAC9B,KAAK,IAAI,SAAS,SAAS,GAAG,CAAC;AAAA,IACjC;AACA,UAAM,SAAS,iBAAiB,QAAQ,EAAE;AAAA,MAAO,WAC/C,aAAa,MAAM,KAAK;AAAA,IAC1B;AACA,eAAW,SAAS,QAAQ;AAC1B,YAAM,WACJ,eAAe,MAAM,SAAS,cAAc,MAAM,MAC9C,IACA,KAAK;AAAA,QACH,KAAK,IAAI,cAAc,MAAM,KAAK;AAAA,QAClC,KAAK,IAAI,eAAe,MAAM,MAAM,EAAE;AAAA,MACxC;AACN,YAAM,QAAQ,WAAW,KAAK,IAAI,MAAM,IAAI;AAC5C,UAAI,CAAC,QAAQ,QAAQ,KAAK,OAAO;AAC/B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW,MAAM;AAAA,UACjB,OAAO,MAAM;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,EAAE,MAAM,KAAK,MAAM,WAAW,KAAK,WAAW,OAAO,KAAK,MAAM;AACzE;AAEA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,wBACP,OACA,MACA,WACe;AACf,MAAI,CAAC,OAAO;AACV,QAAI,SAAS,UAAa,cAAc,QAAW;AACjD,aAAO,kCAAkC,IAAI,IAAI,SAAS;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,YAAY;AAClC,MAAI,eAAe,IAAI,OAAO,GAAG;AAC/B,WAAO,8BAA8B,KAAK;AAAA,EAC5C;AACA,MAAI,gBAAgB,IAAI,KAAK,GAAG;AAC9B,WAAO,+BAA+B,KAAK;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,UAA0B;AAC7D,QAAM,MAAM,OAAO;AACnB,MAAI;AACF,UAAM,MAAMC,UAAS,KAAK,QAAQ;AAClC,QAAI,CAAC,OAAO,QAAQ,GAAI,QAAO;AAC/B,QAAI,IAAI,WAAW,IAAI,EAAG,QAAO;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBACP,WACA,aACA,WACA;AACA,QAAM,QAAQ,iBAAiB,SAAS,KAAK;AAAA,IAC3C,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACA,QAAM,OAAO,gBAAgB,IAAI,MAAM,WAAW,MAAM;AACxD,MAAI,cAAc,WAAW,cAAc,KAAK,MAAM,SAAS;AAC7D,WAAO,gBAAAC,OAAA,cAACC,OAAA,MAAK,eAAY,MAAM,OAAQ;AAAA,EACzC;AACA,SACE,gBAAAD,OAAA,cAACC,OAAA,MAAK,UACE,gBAAAD,OAAA,cAACC,OAAA,EAAK,MAAI,QAAE,WAAY,GAAO,KAAE,MACtC,YAAY,IACX,gBAAAD,OAAA,cAAAA,OAAA,gBACG,KAAI,WACE,gBAAAA,OAAA,cAACC,OAAA,EAAK,MAAI,QAAE,SAAU,GAAO,QACtC,IACE,IACN;AAEJ;AAEO,IAAM,UAAU;AAAA,EACrB,MAAMC;AAAA,EACN,MAAM,cAAc;AAClB,WAAOC;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAP;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB,EAAE,SAAS,GAAU;AACpC,UAAM,MAAM,gBAAgB,QAAQ,KAAK;AACzC,WAAO,CAAC,kBAAkB,OAAO,OAAO,CAAC;AAAA,EAC3C;AAAA,EACA,MAAM,cAAc,OAAc;AAChC,UAAM,SAASA,aAAY,UAAU,KAAK;AAC1C,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,kBAAkB,OAAO,MAAM,OAAO;AAAA,QAC/C,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,gBACJ,MAAM,cAAc,oBACpB,MAAM,cAAc,oBACpB,MAAM,cAAc,WACpB,MAAM,cAAc,wBACpB,MAAM,cAAc,0BACpB,MAAM,cAAc,mBACpB,MAAM,cAAc,mBACpB,MAAM,cAAc;AACtB,QACE,kBACC,MAAM,SAAS,UAAa,MAAM,cAAc,SACjD;AACA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,aAAa,MAAM,SAAS;AAAA,QACrC,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB,MAAM,QAAQ,KAAK,MAAM;AACzD,QAAI,MAAM,cAAc,mBAAmB;AACzC,YAAM,aAAaQ,SAAQ,OAAO;AAClC,YAAM,MAAM,OAAO;AACnB,UAAI,eAAe,KAAK;AACtB,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AACA,QAAI,CAACC,YAAW,OAAO,GAAG;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,wBAAwB,MAAM,QAAQ;AAAA,QAC/C,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI;AACF,UAAI,MAAM,cAAc,qBAAqB,CAACC,UAAS,OAAO,EAAE,OAAO,GAAG;AACxE,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS,uBAAuB,MAAM,QAAQ;AAAA,UAC9C,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,IAAI,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAC5D,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,uBAAuB,MAAM,QAAQ,KAAK,EAAE,OAAO;AAAA,QAC5D,WAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,qBAAqB,OAAc,EAAE,QAAQ,GAAyB;AACpE,UAAM,MAAM,gBAAgB,MAAM,QAAQ,KAAK,MAAM;AACrD,UAAM,qBAAqB,UAAU,MAAM,4BAA4B,GAAG;AAC1E,UAAM,QAAkB,CAAC;AAEzB,SACG,MAAM,cAAc,oBACnB,MAAM,cAAc,oBACpB,MAAM,cAAc,WACpB,MAAM,cAAc,yBACtB,MAAM,YACN,MAAM,SAAS,UACf,MAAM,cAAc,QACpB;AACA,UAAI;AACF,cAAM,UAAUC,cAAa,KAAK,MAAM;AACxC,cAAM,SAAS;AAAA,UACb,QAAQ,MAAM,IAAI;AAAA,UAClB,MAAM,OAAO;AAAA,UACb,MAAM,YAAY;AAAA,QACpB;AACA,YAAI,QAAQ;AACV,gBAAM,KAAK,eAAe,MAAM,SAAS,GAAG;AAC5C,gBAAM,KAAK,YAAY,MAAM,GAAG;AAChC,gBAAM,KAAK,QAAQ,kBAAkB,GAAG;AACxC,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB;AAAA,MACF,QAAQ;AAAA,MACR;AAEA,YAAM,KAAK,eAAe,MAAM,SAAS,GAAG;AAC5C,YAAM,KAAK,UAAU,kBAAkB,GAAG;AAC1C,YAAM,KAAK,aAAa,MAAM,IAAI,IAAI,MAAM,SAAS,EAAE;AACvD,aAAO,MAAM,KAAK,IAAI;AAAA,IACxB;AAEA,UAAM,KAAK,eAAe,MAAM,SAAS,GAAG;AAC5C,QAAI,MAAM,SAAU,OAAM,KAAK,UAAU,kBAAkB,GAAG;AAC9D,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EACA,+BAA+B;AAC7B,WAAO,gBAAAR,OAAA,cAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAgB,EAAE,QAAQ,GAAyB;AACzE,QAAI,OAAO,gBAAgB,UAAa,OAAO,cAAc,QAAW;AACtE,YAAM,UAAU,UACZ,+BAA+B,OAAO,QAAQ;AAAA,QAC5C,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC,IACD;AACJ,aACE,gBAAAA,OAAA,cAACS,MAAA,EAAI,eAAc,YACjB,gBAAAT,OAAA,cAACS,MAAA,EAAI,eAAc,SACjB,gBAAAT,OAAA,cAACC,OAAA,MAAK,qBAAoB,GACzB;AAAA,QACC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,MACT,CACF,GACC,UACC,gBAAAD,OAAA,cAACS,MAAA,EAAI,YAAY,KACf,gBAAAT,OAAA,cAACC,OAAA,MAAM,QAAQ,IAAK,CACtB,IACE,IACN;AAAA,IAEJ;AAEA,WACE,gBAAAD,OAAA,cAACS,MAAA,EAAI,gBAAe,iBAAgB,OAAM,UACxC,gBAAAT,OAAA,cAACS,MAAA,EAAI,eAAc,SACjB,gBAAAT,OAAA,cAACC,OAAA,MAAK,qBAAoB,GAC1B,gBAAAD,OAAA,cAACC,OAAA,MAAM,OAAO,MAAO,CACvB,CACF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,OAAO;AAAA,EAChB;AAAA,EACA,OAAO,KAAK,OAAc,UAA0B;AAClD,UAAM,UAAU,gBAAgB,MAAM,QAAQ,KAAK,MAAM;AACzD,UAAM,gBACJ,MAAM,cAAc,oBACpB,MAAM,cAAc,oBACpB,MAAM,cAAc,WACpB,MAAM,cAAc,wBACpB,MAAM,cAAc,0BACpB,MAAM,cAAc,mBACpB,MAAM,cAAc,mBACpB,MAAM,cAAc;AACtB,QAAI,eAAe,MAAM;AACzB,QAAI,oBAAoB,MAAM;AAC9B,QAAI,kBAAkB,MAAM,SAAS,UAAa,MAAM,cAAc,SAAY;AAChF,YAAMS,OAAc;AAAA,QAClB,WAAW,MAAM;AAAA,QACjB,QACE;AAAA,QACF,UAAU,MAAM;AAAA,MAClB;AACA,YAAM,EAAE,MAAM,UAAU,MAAMA,MAAK,oBAAoBA,KAAI,OAAO;AAClE;AAAA,IACF;AACA,QAAI,iBAAiB,MAAM,SAAS,UAAa,MAAM,cAAc,QAAW;AAC9E,UAAI;AACF,cAAM,UAAUF,cAAa,SAAS,MAAM;AAC5C,cAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA,MAAM,OAAO;AAAA,UACb,MAAM,YAAY;AAAA,QACpB;AACA,cAAM,eAAe;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AACA,YAAI,cAAc;AAChB,gBAAM,WAAW;AAAA,YACf;AAAA,YACA,MAAM,OAAO;AAAA,YACb,MAAM,YAAY;AAAA,UACpB;AACA,cAAI,CAAC,UAAU;AACb,kBAAME,OAAc;AAAA,cAClB,WAAW,MAAM;AAAA,cACjB,QAAQ;AAAA,cACR,UAAU,MAAM;AAAA,YAClB;AACA,kBAAM,EAAE,MAAM,UAAU,MAAMA,MAAK,oBAAoBA,KAAI,OAAO;AAClE;AAAA,UACF;AACA,yBAAe,SAAS,OAAO;AAC/B,8BAAoB,SAAS,YAAY;AAAA,QAC3C;AAAA,MACF,QAAQ;AAAA,MACR;AAAA,IACF;AACA,QAAI,MAAM,cAAc,mBAAmB;AACzC,UAAI,CAAC,MAAM,SAAS,MAAM,MAAM,KAAK,MAAM,IAAI;AAC7C,cAAMA,OAAc;AAAA,UAClB,WAAW,MAAM;AAAA,UACjB,QAAQ;AAAA,UACR,UAAU,MAAM;AAAA,QAClB;AACA,cAAM,EAAE,MAAM,UAAU,MAAMA,MAAK,oBAAoBA,KAAI,OAAO;AAClE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBACJ,MAAM,cAAc,oBAChBH,UAAS,OAAO,EAAE,YAAY,IAC5B,UACA,eAAe,IACjB;AACN,UAAM,aACJ,MAAM,cAAc,oBAAoB,UAAU;AAEpD,UAAM,kBAAkB,MAAM,UAAU,IAAI;AAAA,MAC1C,WAAW,MAAM;AAAA,MACjB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,MACX,oBAAoB,MAAM;AAAA,MAC1B,WAAW,MAAM;AAAA,MACjB,OAAO,MAAM,cAAc,oBAAoB,MAAM,QAAQ;AAAA,MAC7D,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,MAAc;AAAA,MAClB,WAAW,MAAM;AAAA,MACjB,QAAQ,gBAAgB;AAAA,MACxB,UAAU,MAAM;AAAA,MAChB,aAAa,gBAAgB;AAAA,MAC7B,WAAW,gBAAgB;AAAA,IAC7B;AACA,UAAM,EAAE,MAAM,UAAU,MAAM,KAAK,oBAAoB,IAAI,OAAO;AAAA,EACpE;AACF;;;AE5nBA,SAAS,OAAAI,MAAK,QAAAC,aAAY;AAC1B,OAAOC,YAAW;AAClB,SAAS,KAAAC,UAAS;AAKlB,SAAS,gCAAgC;;;ACPlC,IAAMC,aAAY;AAElB,IAAMC,eAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAOpB,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;;;ADCtB,IAAMC,eAAcC,GAAE,aAAa;AAAA,EACjC,QAAQA,GAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA,EACjD,KAAKA,GAAE,OAAO,EAAE,SAAS,0BAA0B;AACrD,CAAC;AAYM,IAAM,sBAAsB;AAAA,EACjC,MAAMC;AAAA,EACN,MAAM,cAAc;AAClB,WAAOC;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAJ;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,EAAE,OAAO,GAAU,SAA0B;AAC/D,UAAM,UACH,SAAS,SAAS,cAAyB,MAAM,WAAW;AAC/D,UAAM,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACjD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,WAAW,MAAM,mCAAmC,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,QAChG,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,WAAW,MAAM;AAAA,QAC1B,WAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,eACD,MAAc,gBAAgB;AACjC,QAAI,CAAC,cAAc;AACjB,UAAI;AACF,uBAAe,MAAM,OAAO,sBAAsB;AAAA,MACpD,QAAQ;AACN,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,QAAI,CAAE,cAAsB,WAAW;AACrC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,WAAW,MAAM;AAAA,QAC1B,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,qBAAqB,EAAE,QAAQ,IAAI,GAAU;AAC3C,QAAI,CAAC,UAAU,CAAC,IAAK,QAAO;AAC5B,WAAO,kBAAkB,GAAG,kBAAkB,MAAM;AAAA,EACtD;AAAA,EACA,+BAA+B;AAC7B,WAAO,gBAAAK,OAAA,cAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAgB;AACtC,UAAM,QAAQ,OAAO,UAAU,UAAU;AACzC,WACE,gBAAAA,OAAA,cAACC,MAAA,EAAI,gBAAe,iBAAgB,OAAM,UACxC,gBAAAD,OAAA,cAACC,MAAA,EAAI,eAAc,SACjB,gBAAAD,OAAA,cAACE,OAAA,MAAK,qBAAoB,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,MAAI,QAAC,mBAAiB,GAC5B,gBAAAF,OAAA,cAACE,OAAA,MACE,QAAQ,KAAK,KAAK,QAAQ,UAAU,IAAI,KAAK,GAAG,MAAM,EACzD,CACF,GACA,gBAAAF,OAAA,cAAC,QAAK,SAAS,GAAG,YAAY,GAAG,OAAO,OAAO,CACjD;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B;AAAA,EACA,OAAO,KAAK,EAAE,QAAQ,IAAI,GAAU,SAAyB;AAC3D,UAAM,UACH,QAAQ,SAAS,cAAyB,MAAM,WAAW;AAC9D,UAAM,QAAQ,QAAQ,KAAK,OAAK,EAAE,SAAS,MAAM;AACjD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,WAAW,MAAM,mCAAmC,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MACzF;AAAA,IACF;AACA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,IAAI,MAAM,WAAW,MAAM,oBAAoB;AAAA,IACvD;AACA,QAAI,eACD,MAAc,gBAAgB;AACjC,QAAI,CAAC,cAAc;AACjB,UAAI;AACF,uBAAe,MAAM,OAAO,sBAAsB;AAAA,MACpD,QAAQ;AACN,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,QAAI,CAAE,cAAsB,WAAW;AACrC,YAAM,IAAI,MAAM,WAAW,MAAM,8BAA8B;AAAA,IACjE;AACA,UAAM,SAAU,MAAM,MAAM,OAAO;AAAA,MACjC,EAAE,QAAQ,kBAAkB,QAAQ,EAAE,IAAI,EAAE;AAAA,MAC5C;AAAA,IACF;AACA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,IAC1D;AAAA,EACF;AACF;;;AE/IA,SAAS,MAAM,eAAe;AAC9B,OAAOG,YAAW;AAClB,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,KAAAC,UAAS;AAClB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;;;ACJzC,IAAM,cAAc,oBAAI,IAAmC;AAEpD,SAAS,oBACd,SACA,UACM;AACN,cAAY,IAAI,SAAS,QAAQ;AACnC;AAEO,SAAS,mBACd,SACmC;AACnC,SAAO,YAAY,IAAI,OAAO;AAChC;;;ACHA,IAAM,iCAAiC,oBAAI,IAAY;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,eAAsB,aAAa,UAAoC;AACrE,UAAQ,OAAO,CAAC,WAAW,SAAS,IAAI,iBAAiB,IAAI;AAAA,IAC3D,UAAQ,CAAC,+BAA+B,IAAI,KAAK,IAAI;AAAA,EACvD;AACF;AAEA,eAAsB,UAAU,UAAoC;AAClE,QAAM,SAAS,MAAM,gBAAgB;AAErC,QAAM,oBAAoB,OACvB,IAAI,WAAS;AACZ,UAAM,WAAW,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,MAAM,KAAK,IAAI,IAAI;AACvE,WAAO,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,YAAY,QAAQ;AAAA,EACrE,CAAC,EACA,KAAK,IAAI;AAEZ,SAAO;AAAA;AAAA;AAAA,EAGP,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAQmC,aAAa,IAAI,OAAO,SAAS,IAAI;AAAA,mFACR,SAAS,IAAI;AAAA,sFACV,aAAa,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAqBrE,cAAc,IAAI;AAAA,kCAClB,cAAc,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBpD;;;AChGO,IAAMC,aAAY;;;AHwCzB,IAAMC,eAAcC,GAAE,OAAO;AAAA,EAC3B,aAAaA,GACV,OAAO,EACP,SAAS,4CAA4C;AAAA,EACxD,QAAQA,GAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,EAC/D,eAAeA,GACZ,OAAO,EACP,SAAS,oDAAoD;AAAA,EAChE,OAAOA,GACJ,KAAK,CAAC,UAAU,QAAQ,OAAO,CAAC,EAChC,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQA,GACL,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,mBAAmBA,GAChB,QAAQ,EACR,SAAS,EACT;AAAA,IACC;AAAA,EACF;AACJ,CAAC;AAuBD,SAAS,mBAAmB,OAAuC;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAAS,wBACP,OACgC;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,UAAU,UAAW,QAAO;AAChC,MAAI,UAAU,WAAW,UAAU,YAAY,UAAU,QAAQ;AAC/D,WAAO,mBAAmB,KAAkB;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAsB;AACjD,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,QAAQ,QAAQ,MAAM,sBAAsB;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,WAAW,MAAM,CAAC,GAAG,KAAK;AAChC,QAAM,cAAc,MAAM,CAAC,GAAG,KAAK;AACnC,MAAI,CAAC,YAAY,CAAC,YAAa,QAAO;AACtC,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAyB;AACnD,QAAM,WAAW;AACjB,SAAO;AAAA,WACE,OAAO,8GAA8G,QAAQ;AAAA,sIACF,QAAQ;AAAA,wDACtF,QAAQ;AAAA,yEACS,QAAQ;AACjF;AAEA,IAAM,gCAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStC,SAAS,6BACP,MAC4B;AAC5B,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,YAAY,WAAY,QAAO;AACnC,MACE,YAAY,aACZ,YAAY,iBACZ,YAAY,UACZ,YAAY,uBACZ,YAAY,WACZ;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,yBACP,MACA,SAImC;AACnC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,CAAC,QAAQ,oBAAqB,QAAO;AAEzC,MACE,QAAQ,wBAAwB,wBAC/B,QAAQ,YAAY,KAAK,qCAAqC,OAC/D;AACA,WAAO,EAAE,GAAG,MAAM,MAAM,UAAU;AAAA,EACpC;AAEA,SAAO,EAAE,GAAG,MAAM,MAAM,QAAQ,oBAAoB;AACtD;AAEA,SAAS,kBAAkB,MAA4B;AACrD,MAAI,CAACC,YAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,MAAMC,cAAa,MAAM,MAAM;AACrC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,MAAM,QAAQ,MAAM,IAAI,SAAS;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,yBAAyB,SAShC;AACA,QAAM,oBAAoB,kBAAkB,QAAQ,MAAM;AAE1D,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,WAAW;AAC1C,WAAO;AAAA,MACL,qBAAqB,CAAC;AAAA,MACtB,gBAAgB,CAAC,iBAAiB;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,WAAW,gBAAgB,QAAQ,gBAAgB,QAAQ,YAAY,CAAC;AAC9E,QAAM,eAAe,kBAAkB,QAAQ;AAC/C,MAAI,CAAC,gBAAgB,aAAa,WAAW,GAAG;AAC9C,WAAO;AAAA,MACL,qBAAqB,CAAC;AAAA,MACtB,gBAAgB,CAAC,iBAAiB;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,sBAAsB;AAC1B,MAAI,iBAAsB;AAC1B,MAAI,mBAAwB;AAE5B,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,MAAW,aAAa,CAAC;AAC/B,QAAI,KAAK,SAAS,YAAa;AAC/B,UAAM,SAAgB,MAAM,QAAQ,KAAK,SAAS,OAAO,IACrD,IAAI,QAAQ,UACZ,CAAC;AACL,UAAM,QAAQ,OAAO;AAAA,MACnB,OAAK,KAAK,EAAE,SAAS,cAAc,EAAE,OAAO,QAAQ;AAAA,IACtD;AACA,QAAI,CAAC,MAAO;AACZ,0BAAsB;AACtB,qBAAiB;AACjB,uBAAmB;AACnB;AAAA,EACF;AAEA,MAAI,wBAAwB,MAAM,CAAC,kBAAkB,CAAC,kBAAkB;AACtE,WAAO;AAAA,MACL,qBAAqB,CAAC;AAAA,MACtB,gBAAgB,CAAC,iBAAiB;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,sBAAuB,aAAa;AAAA,IACxC;AAAA,IACA;AAAA,EACF,KAAK,CAAC;AAEN,QAAM,uBAAoC;AAAA,IACxC,GAAG;AAAA,IACH,MAAMC,YAAW;AAAA,IACjB,SAAS;AAAA,MACP,GAAG,eAAe;AAAA,MAClB,SAAS,CAAC,gBAAgB;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,aAAa,iBAAiB;AAAA,QAC9B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAM;AAAA,QACJ,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,oBAAoB;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,CAAC,sBAAsB,uBAAuB,iBAAiB;AAAA,EACjF;AACF;AAEO,IAAM,WAAW;AAAA,EACtB,MAAMC;AAAA,EACN,aAAAL;AAAA,EACA,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,EAAE,SAAS,GAA2B;AACjD,WAAO,MAAM,UAAU,QAAQ;AAAA,EACjC;AAAA,EACA,eAAe,OAAwB;AACrC,QAAI,OAAO,iBAAiB,MAAM,kBAAkB,mBAAmB;AACrE,aAAO,MAAM;AAAA,IACf;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,cAAc,OAAc;AAChC,QAAI,CAAC,MAAM,eAAe,OAAO,MAAM,gBAAgB,UAAU;AAC/D,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,MAAM,UAAU,OAAO,MAAM,WAAW,UAAU;AACrD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,uBAAuB;AACpD,QAAI,CAAC,eAAe,SAAS,MAAM,aAAa,GAAG;AACjD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,eAAe,MAAM,aAAa,kCAAkC,eAAe,KAAK,IAAI,CAAC;AAAA,QACtG,MAAM,EAAE,eAAe,MAAM,eAAe,eAAe;AAAA,MAC7D;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ;AAChB,YAAM,aAAa,mBAAmB,MAAM,MAAM;AAClD,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,SAAS,qCAAqC,MAAM,MAAM;AAAA,UAC1D,MAAM,EAAE,QAAQ,MAAM,OAAO;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,qBAAqB,EAAE,aAAa,OAAO,GAAU;AACnD,QAAI,CAAC,eAAe,CAAC,OAAQ,QAAO;AACpC,WAAO;AAAA,EACT;AAAA,EACA,+BAA+B;AAC7B,WAAO,gBAAAM,OAAA,cAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAgB,EAAE,QAAQ,GAAyB;AACzE,UAAM,QAAQ,SAAS;AACvB,QAAI,OAAO,WAAW,kBAAkB;AACtC,YAAM,OAAO,OAAO,SAChB,yDACA;AACJ,aACE,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,YACjB,gBAAAD,OAAA,cAACC,MAAA,EAAI,eAAc,SACjB,gBAAAD,OAAA,cAACE,OAAA,MAAK,qBAAoB,GAC1B,gBAAAF,OAAA,cAACE,OAAA,MAAK,sBAEH,CAAC,WAAW,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,IAAK,CACpC,CACF,GACC,WAAW,OAAO,UACjB,gBAAAF,OAAA;AAAA,QAACC;AAAA,QAAA;AAAA,UACC,aAAa;AAAA,UACb,iBAAgB;AAAA,UAChB,iBAAiB,MAAM;AAAA;AAAA,QAEvB,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,eAAe,MAAK,UACpC,OAAO,MACV;AAAA,MACF,CAEJ;AAAA,IAEJ;AAEA,UAAM,UAAU;AAAA,MACd,OAAO,sBAAsB,IACzB,eACA,GAAG,OAAO,iBAAiB;AAAA,MAC/B,GAAG,aAAa,OAAO,WAAW,CAAC;AAAA,MACnC,eAAe,OAAO,eAAe;AAAA,IACvC;AACA,WACE,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,YAChB,WAAW,OAAO,UACjB,gBAAAD,OAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,aAAa;AAAA,QACb,iBAAgB;AAAA,QAChB,iBAAiB,MAAM;AAAA;AAAA,MAEvB,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAO,MAAM,eAAe,MAAK,UAEnC,+BAA+B,OAAO,QAAQ;AAAA,QAC5C,UAAU;AAAA,QACV,UAAU;AAAA,MACZ,CAAC,EAAE,IAEP;AAAA,IACF,GAED,WAAW,OAAO,QAAQ,SAAS,KAClC,gBAAAF,OAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,aAAa;AAAA,QACb,iBAAgB;AAAA,QAChB,iBAAiB,MAAM;AAAA;AAAA,MAEvB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAK,UAEP;AAAA,QACE,OAAO,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,QACzC;AAAA,UACE,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,MACF,EAAE,IAEN;AAAA,IACF,GAEF,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,SACjB,gBAAAD,OAAA,cAACE,OAAA,MAAK,qBAAoB,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,UAAO,QAAQ,KAAK,QAAK,GAAE,GAAC,CAC7C,CACF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAgB;AACvC,QAAI,OAAO,WAAW;AACpB,aAAO,mBAAmB,OAAO,OAAO;AAC1C,WAAO,OAAO,QAAQ,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,EAClD;AAAA,EAEA,OAAO,KAAK,OAAc,gBAAqB;AAC7C,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,UACJ,OAAO,gBAAgB,gBAAgB,aACnC,eAAe,cACf;AAEN,UAAM,cAAc,MAAM,eAAe,MAAM,aAAa;AAC5D,QAAI,CAAC,aAAa;AAChB,YAAM,YAAY,MAAM,uBAAuB;AAC/C,YAAM;AAAA,QACJ,eAAe,MAAM,aAAa,kCAAkC,UAAU,KAAK,IAAI,CAAC;AAAA,MAC1F;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAE9B,UAAM,uBAAuB,wBAAwB,YAAY,KAAK;AACtE,UAAM,uBAAuB;AAC7B,UAAM,mBACJ,QAAQ,IAAI,sBACZ,QAAQ,IAAI;AACd,UAAM,cACH,OAAO,qBAAqB,YAAY,iBAAiB,KAAK,IAC3D,iBAAiB,KAAK,IACtB,WACJ,mBAAmB,MAAM,KAAK,MAC7B,yBAAyB,YACtB,eAAe,uBACf,yBACJ;AAEF,UAAM,aAAa,YAAY;AAC/B,QAAI,QAAQ,MAAM,aAAa,QAAQ;AACvC,QAAI,YAAY;AACd,YAAM,aACJ,MAAM,QAAQ,UAAU,KACxB,WAAW,WAAW,KACtB,WAAW,CAAC,MAAM;AACpB,UAAI,eAAe,OAAO,YAAY;AAAA,MACtC,WAAW,MAAM,QAAQ,UAAU,GAAG;AACpC,cAAM,mBAAmB,IAAI;AAAA,UAC3B,WAAW,IAAI,mBAAmB,EAAE,OAAO,OAAO;AAAA,QACpD;AACA,gBAAQ,MAAM,OAAO,OAAK,iBAAiB,IAAI,EAAE,IAAI,CAAC;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM,QAAQ,YAAY,eAAe,IAC7D,YAAY,kBACZ,CAAC;AACL,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,sBAAsB,IAAI;AAAA,QAC9B,gBAAgB,IAAI,mBAAmB,EAAE,OAAO,OAAO;AAAA,MACzD;AACA,cAAQ,MAAM,OAAO,OAAK,CAAC,oBAAoB,IAAI,EAAE,IAAI,CAAC;AAAA,IAC5D;AAEA,UAAM,UAAU,MAAM,UAAU,gBAAgB;AAChD,UAAM,iBAAiB,MAAM,SACxB,mBAAmB,MAAM,MAAM,GAAG,OAAO,OAAK,EAAE,SAAS,UAAU,KACpE,OACA,CAAC;AACL,QAAI,MAAM,UAAU,mBAAmB,MAAM;AAC3C,YAAM,MAAM,qCAAqC,MAAM,MAAM,EAAE;AAAA,IACjE;AAEA,UAAM,EAAE,qBAAqB,eAAe,IAAI,yBAAyB;AAAA,MACvE,SAAS,YAAY,gBAAgB;AAAA,MACrC,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,qBAAoC;AAAA,MACxC,GAAI,kBAAkB,CAAC;AAAA,MACvB,GAAG;AAAA,IACL;AAEA,UAAM,mBAAkC;AAAA,MACtC,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,UAAM,CAAC,kBAAkB,SAAS,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACvE,eAAe;AAAA,MACf,WAAW;AAAA,MACX,qBAAqB,gBAAgB;AAAA,IACvC,CAAC;AACD,UAAM,eACJ,YAAY,gBAAgB,YAAY,aAAa,SAAS,IAC1D,CAAC,GAAG,kBAAkB,YAAY,YAAY,IAC9C;AAEN,UAAM,sBAAsB;AAAA,MACzB,YAAoB;AAAA,IACvB;AACA,UAAM,wBAAwB;AAAA,MAC5B,eAAe,SAAS;AAAA,MACxB,EAAE,qBAAqB,SAAS;AAAA,IAClC;AAEA,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,CAAC;AAAA,MACX;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF;AAEA,QAAI,MAAM,mBAAmB;AAC3B,YAAM,oBAAoB,IAAI,gBAAgB;AAE9C,YAAM,aAAkB;AAAA,QACtB,MAAM;AAAA,QACN;AAAA,QACA,aAAa,MAAM;AAAA,QACnB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,WAAW,KAAK,IAAI;AAAA,QACpB,UAAU,CAAC,GAAG,kBAAkB;AAAA,QAChC,iBAAiB;AAAA,QACjB,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAEA,iBAAW,QAAQ,YAAY;AAC7B,YAAI;AACF,gBAAM,aAA4B,CAAC,GAAG,gBAAgB;AACtD,gBAAM,uBAAsC,CAAC,GAAG,kBAAkB;AAElE,2BAAiB,OAAO;AAAA,YACtB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,cACE,iBAAiB;AAAA,cACjB,SAAS;AAAA,cACT,WAAW,0BAA0B,UAAU;AAAA,cAC/C;AAAA,cACA;AAAA,cACA,YAAY,MAAM;AAAA,cAAC;AAAA,YACrB;AAAA,UACF,GAAG;AACD,uBAAW,KAAK,GAAG;AACnB,iCAAqB,KAAK,GAAG;AAC7B,uBAAW,WAAW,CAAC,GAAG,oBAAoB;AAC9C,sCAA0B,UAAU;AAAA,UACtC;AAEA,gBAAMC,iBAAgB;AAAA,YACpB,qBAAqB,OAAO,OAAK,EAAE,SAAS,WAAW;AAAA,UACzD;AACA,gBAAMC,WAAUD,gBAAe,SAAS,SAAS;AAAA,YAC/C,CAAC,MAAW,EAAE,SAAS;AAAA,UACzB;AAEA,qBAAW,SAAS;AACpB,qBAAW,cAAc,KAAK,IAAI;AAClC,qBAAW,cAAcC,YAAW,CAAC,GAAG,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAClE,qBAAW,WAAW,CAAC,GAAG,oBAAoB;AAC9C,oCAA0B,UAAU;AACpC,8BAAoB,SAAS,oBAAoB;AAAA,QACnD,SAAS,GAAG;AACV,qBAAW,SAAS;AACpB,qBAAW,cAAc,KAAK,IAAI;AAClC,qBAAW,QAAQ,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAC5D,oCAA0B,UAAU;AAAA,QACtC;AAAA,MACF,GAAG;AAEH,gCAA0B,UAAU;AAEpC,YAAMC,UAAiB;AAAA,QACrB,QAAQ;AAAA,QACR;AAAA,QACA,aAAa,MAAM;AAAA,QACnB,QAAQ;AAAA,MACV;AACA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAMA;AAAA,QACN,oBAAoB,mBAAmB,OAAO;AAAA,MAChD;AACA;AAAA,IACF;AAEA,UAAM,qBAAqB;AAAA,MAAQ,MACjC,mCAAmC,gBAAgB,UAAU;AAAA,IAC/D;AAEA,UAAM,uBAAuB;AAC7B,UAAM,qBAAqB;AAC3B,QAAI,qBAAqB;AACzB,QAAI,0BAA0B;AAC9B,UAAM,gBAA0B,CAAC;AAEjC,UAAM,kBAAkB,CAAC,WAAmB;AAC1C,YAAM,UAAU,OAAO,KAAK;AAC5B,UAAI,CAAC,QAAS;AACd,oBAAc,KAAK,OAAO;AAC1B,UAAI,cAAc,SAAS,oBAAoB;AAC7C,sBAAc,OAAO,GAAG,cAAc,SAAS,kBAAkB;AAAA,MACnE;AAAA,IACF;AAEA,UAAM,WAAW,CAAC,MAAc,WAAmB;AACjD,YAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAClD,UAAI,WAAW,UAAU,OAAQ,QAAO;AACxC,aAAO,GAAG,WAAW,MAAM,GAAG,SAAS,CAAC,CAAC;AAAA,IAC3C;AAEA,UAAM,mBAAmB,CAAC,MAAc,aAA8B;AACpE,YAAMC,SACJ,YAAY,OAAO,aAAa,WAAW,WAAW,CAAC;AAEzD,cAAQ,MAAM;AAAA,QACZ,KAAK,QAAQ;AACX,gBAAM,WACH,OAAOA,OAAM,cAAc,YAAYA,OAAM,aAC7C,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACzC;AACF,iBAAO,WAAW,QAAQ,QAAQ,KAAK;AAAA,QACzC;AAAA,QACA,KAAK,SAAS;AACZ,gBAAM,WACH,OAAOA,OAAM,cAAc,YAAYA,OAAM,aAC7C,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACzC;AACF,iBAAO,WAAW,SAAS,QAAQ,KAAK;AAAA,QAC1C;AAAA,QACA,KAAK;AAAA,QACL,KAAK,aAAa;AAChB,gBAAM,WACH,OAAOA,OAAM,cAAc,YAAYA,OAAM,aAC7C,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACzC;AACF,iBAAO,WAAW,GAAG,IAAI,IAAI,QAAQ,KAAK;AAAA,QAC5C;AAAA,QACA,KAAK,QAAQ;AACX,gBAAM,UAAU,OAAOA,OAAM,YAAY,WAAWA,OAAM,UAAU;AACpE,iBAAO,UAAU,QAAQ,SAAS,SAAS,EAAE,CAAC,KAAK;AAAA,QACrD;AAAA,QACA,KAAK,QAAQ;AACX,gBAAM,UACH,OAAOA,OAAM,YAAY,YAAYA,OAAM,WAC3C,OAAOA,OAAM,SAAS,YAAYA,OAAM,QACzC;AACF,iBAAO,UAAU,QAAQ,SAAS,SAAS,EAAE,CAAC,KAAK;AAAA,QACrD;AAAA,QACA,KAAK,QAAQ;AACX,gBAAM,UAAU,OAAOA,OAAM,YAAY,WAAWA,OAAM,UAAU;AACpE,iBAAO,UAAU,QAAQ,SAAS,SAAS,EAAE,CAAC,KAAK;AAAA,QACrD;AAAA,QACA,KAAK;AAAA,QACL,KAAK,aAAa;AAChB,gBAAM,MAAM,OAAOA,OAAM,QAAQ,WAAWA,OAAM,MAAM;AACxD,gBAAMC,SAAQ,OAAOD,OAAM,UAAU,WAAWA,OAAM,QAAQ;AAC9D,cAAI,IAAK,QAAO,GAAG,IAAI,IAAI,SAAS,KAAK,GAAG,CAAC;AAC7C,cAAIC,OAAO,QAAO,GAAG,IAAI,IAAI,SAASA,QAAO,GAAG,CAAC;AACjD,iBAAO;AAAA,QACT;AAAA,QACA;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAEA,UAAM,qBAAqB,CAACC,kBAAiC;AAC3D,YAAM,SAAS,GAAG,MAAM,eAAe,MAAM,WAAMA,aAAY,QAAQA,kBAAiB,IAAI,KAAK,GAAG;AACpG,UAAI,cAAc,WAAW,EAAG,QAAO;AACvC,YAAM,QAAQ,cAAc,IAAI,OAAK,KAAK,CAAC,EAAE;AAC7C,aAAO,CAAC,QAAQ,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,IACrC;AAEA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,QACP,kBAAkB,mBAAmB,CAAC,CAAC;AAAA,MACzC;AAAA,IACF;AACA,yBAAqB,KAAK,IAAI;AAE9B,QAAI,eAAe;AACnB,qBAAiB,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,WAAW,0BAA0B,gBAAgB;AAAA,QACrD;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,QAAC;AAAA,MACrB;AAAA,IACF,GAAG;AACD,uBAAiB,KAAK,OAAO;AAC7B,yBAAmB,KAAK,OAAO;AAE/B;AAAA,QACE,gBAAgB,gBAAgB,YAAY,mBAAmB,CAAC;AAAA,QAChE,mBAAmB,OAAO,OAAK,EAAE,SAAS,UAAU;AAAA,QACpD,EAAE,iBAAiB,GAAG,cAAc,IAAI,UAAU,GAAG;AAAA,MACvD;AAEA,UAAI,QAAQ,SAAS,aAAa;AAChC,mBAAW,SAAS,QAAQ,QAAQ,SAAS;AAC3C,cACE,MAAM,SAAS,cACf,MAAM,SAAS,qBACf,MAAM,SAAS,gBACf;AACA,4BAAgB;AAChB,4BAAgB,iBAAiB,MAAM,MAAO,MAAc,KAAK,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,iBAAiB,eAAe;AACtC,YAAM,aACJ,mBACC,4BAA4B,KAC3B,MAAM,sBAAsB;AAChC,UAAI,YAAY;AACd,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,YACP,kBAAkB,mBAAmB,YAAY,CAAC;AAAA,UACpD;AAAA,QACF;AACA,kCAA0B;AAC1B,6BAAqB;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,gBAAgB;AAAA,MACpB,mBAAmB,OAAO,OAAK,EAAE,SAAS,WAAW;AAAA,IACvD;AACA,QAAI,CAAC,iBAAiB,cAAc,SAAS,aAAa;AACxD,YAAM,MAAM,6BAA6B;AAAA,IAC3C;AAEA,UAAM,UAAU,cAAc,QAAQ,QAAQ;AAAA,MAC5C,CAAC,MAAW,EAAE,SAAS;AAAA,IACzB;AAEA,wBAAoB,SAAS,kBAAkB;AAE/C,UAAM,kBAAkB,KAAK,IAAI,IAAI;AACrC,UAAM,cAAc,YAAY,kBAAkB;AAClD,UAAM,QAAQ,cAAc,QAAQ;AAEpC,UAAM,SAAiB;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,eAA0B;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM,YAAY,OAAO;AAAA,MACzB,WAAW,CAAC;AAAA,IACd;AAEA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,oBAAoB,CAAC,GAAG,SAAS,YAAY;AAAA,IAC/C;AAAA,EACF;AACF;;;AIt0BA,SAAS,KAAAC,UAAS;;;ACoCX,SAAS,eAAe,MAAgC;AAC7D,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK,aAAa,CAAC;AAAA,EAChC;AACF;AAEO,SAAS,aAAa,MAA8B;AACzD,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK;AAAA,IACjB,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK,UAAU,CAAC;AAAA,IACxB,WAAW,KAAK,aAAa,CAAC;AAAA,IAC9B,QAAQ,KAAK;AAAA,IACb,SAAS,KAAK,WAAW,CAAC;AAAA,IAC1B,cAAc,KAAK;AAAA,EACrB;AACF;AAEO,SAAS,oBAAoB,QAKlB;AAChB,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACF;;;AC/EO,IAAMC,eACX;AAEK,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AFctB,IAAMC,eAAcC,GACjB,aAAa;AAAA,EACZ,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,EAChC,QAAQA,GACL,KAAK,CAAC,QAAQ,eAAe,WAAW,QAAQ,UAAU,CAAC,EAC3D,SAAS;AAAA,EACZ,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAUA,GAAE,OAAOA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,cAAcA,GAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAWI,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,mBAAmBC;AAAA,EACnB,MAAM,cAAc;AAClB,WAAOA;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAH;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EACA,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,OAAc;AACxB,QAAI;AACF,YAAM,UAAU,MAAM;AACtB,YAAM,QAAQ,UAAU,EAAE,QAAQ,MAAM,OAAO,CAAC;AAChD,YAAM,SACJ,KAAK;AAAA,QACH;AAAA,QACA,GAAG,MACA,IAAI,CAAAI,UAAQ,OAAOA,MAAK,EAAE,CAAC,EAC3B,OAAO,WAAS,CAAC,OAAO,MAAM,KAAK,CAAC;AAAA,MACzC,IAAI;AACN,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,gBAA4B;AAAA,QAChC,IAAI,OAAO,MAAM;AAAA,QACjB;AAAA,QACA,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM,UAAU;AAAA,QACxB,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,QAAQ,CAAC;AAAA,QACT,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,QACT,cAAc,MAAM;AAAA,MACtB;AACA,YAAM,iBAAiB,CAAC,GAAG,OAAO,aAAa;AAC/C,YAAM,SAAS,eAAe,eAAe,cAAc,CAAC;AAC5D,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,oBAAoB;AAAA,YACxB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,EAAE,OAAO;AAAA,UACpB,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,YAAM,OAAO;AAAA,QACX;AAAA,UACE;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf,cAAc,MAAM;AAAA,QACtB;AAAA,QACA,EAAE,QAAQ,MAAM,OAAO;AAAA,MACzB;AACA,YAAM,EAAE,OAAO,IAAI,iBAAiB,MAAM,MAAM;AAChD,wBAAkB,gBAAgB;AAAA,QAChC;AAAA,QACA,QAAQ,KAAK;AAAA,QACb;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA,MAAM,aAAa,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AGrKA,SAAS,KAAAC,WAAS;;;ACAX,IAAMC,eACX;AAEK,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADOtB,IAAMC,gBAAcC,IAAE,aAAa;AAAA,EACjC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC;AAC1B,CAAC;AAWM,IAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,mBAAmBC;AAAA,EACnB,MAAM,cAAc;AAClB,WAAOA;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAH;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EACA,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,OAAc;AACxB,UAAM,EAAE,OAAO,IAAI,iBAAiB,MAAM,MAAM;AAChD,UAAM,OAAO,QAAQ,MAAM,QAAQ,EAAE,QAAQ,MAAM,OAAO,CAAC;AAC3D,QAAI,CAAC,MAAM;AACT,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,QAAQ,MAAM,MAAM;AAAA,UAC7B,SAAS,EAAE,QAAQ,MAAM,QAAQ,OAAO;AAAA,QAC1C,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,QACA,MAAM,aAAa,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;;;AE9EA,SAAS,KAAAI,WAAS;;;ACAX,IAAMC,eACX;AAEK,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADatB,IAAMC,gBAAcC,IAAE,aAAa;AAAA,EACjC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,IACL,MAAMA,IAAE,KAAK,CAAC,QAAQ,eAAe,WAAW,QAAQ,UAAU,CAAC,CAAC,EACpE,SAAS;AAAA,EACZ,gBAAgBA,IAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAaD,IAAM,iBAAiB,CAAC,OAAqB,aAA4B;AACvE,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO,MAAM,OAAO,UAAQ,KAAK,WAAW,UAAU;AAAA,EACxD;AACA,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,SAAO,MAAM,OAAO,UAAQ,QAAQ,IAAI,KAAK,MAAM,CAAC;AACtD;AAEO,IAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,mBAAmBC;AAAA,EACnB,MAAM,cAAc;AAClB,WAAOA;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAH;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EACA,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,OAAc;AACxB,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,iBAAiB,MAAM,MAAM;AAChD,YAAM,QAAQ,UAAU,EAAE,QAAQ,MAAM,OAAO,CAAC;AAChD,YAAM,WAAW,eAAe,OAAO,MAAM,MAAM;AACnD,YAAM,eAAe,sBAAsB,QAAQ;AACnD,YAAM,QAAQ,aAAa,MAAM,IAAI,cAAc;AACnD,YAAM,UAAU,aAAa,QAAQ,IAAI,cAAc;AACvD,YAAM,iBAAiB,MAAM,mBAAmB;AAChD,YAAM,QAAQ,iBACV,SAAS,IAAI,cAAc,IAC3B,SACG,OAAO,UAAQ,MAAM,KAAK,WAAS,MAAM,OAAO,KAAK,EAAE,CAAC,EACxD,IAAI,cAAc;AACzB,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,iBAAiB,UAAU,CAAC;AAAA,QACvC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;AE5GA,SAAS,KAAAI,WAAS;;;ACAX,IAAMC,eACX;AAEK,IAAMC,UAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADiBtB,IAAM,oBAAoB,CAAC,WACzB,WAAW,UAAU,WAAW;AAElC,IAAM,gBAAgB,CAAC,UACrB,CAAC,GAAI,SAAS,CAAC,CAAE,EAAE,OAAO,OAAO,EAAE,KAAK;AAE1C,IAAM,cAAc,CAAC,MAAkB,SAAqB;AAC1D,MAAI,KAAK,WAAW,KAAK,OAAQ,QAAO;AACxC,QAAM,gBAAgB,cAAc,KAAK,SAAS;AAClD,QAAM,gBAAgB,cAAc,KAAK,SAAS;AAClD,MAAI,cAAc,WAAW,cAAc,OAAQ,QAAO;AAC1D,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,GAAG;AAChD,QAAI,cAAc,CAAC,MAAM,cAAc,CAAC,EAAG,QAAO;AAAA,EACpD;AACA,QAAM,cAAc,cAAc,KAAK,OAAO;AAC9C,QAAM,cAAc,cAAc,KAAK,OAAO;AAC9C,MAAI,YAAY,WAAW,YAAY,OAAQ,QAAO;AACtD,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,QAAI,YAAY,CAAC,MAAM,YAAY,CAAC,EAAG,QAAO;AAAA,EAChD;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB,CAAC,UAAsB;AAAA,EAC7C,QAAQ,KAAK,UAAU,CAAC;AAAA,EACxB,WAAW,KAAK,aAAa,CAAC;AAAA,EAC9B,QAAQ,KAAK;AAAA,EACb,SAAS,KAAK,WAAW,CAAC;AAC5B;AAEA,IAAMC,gBAAcC,IAAE,aAAa;AAAA,EACjC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,EAChC,QAAQA,IACL,KAAK,CAAC,QAAQ,eAAe,WAAW,QAAQ,UAAU,CAAC,EAC3D,SAAS;AAAA,EACZ,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAUA,IAAE,OAAOA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,UAAUA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,QAAQA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,WAAWA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAASA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAYA,IAAE,QAAQ,EAAE,SAAS;AAAA,EACjC,cAAcA,IAAE,OAAO,EAAE,SAAS;AACpC,CAAC;AAWM,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,mBAAmBC;AAAA,EACnB,MAAM,cAAc;AAClB,WAAOA;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAOC;AAAA,EACT;AAAA,EACA,aAAAH;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAgB;AACvC,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAAA,EACA,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,OAAO,KAAK,OAAc;AACxB,UAAM,EAAE,OAAO,IAAI,iBAAiB,MAAM,MAAM;AAChD,UAAM,WAAW,QAAQ,MAAM,QAAQ,EAAE,QAAQ,MAAM,OAAO,CAAC;AAC/D,QAAI,CAAC,UAAU;AACb,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,QAAQ,MAAM,MAAM;AAAA,UAC7B,SAAS,EAAE,QAAQ,MAAM,QAAQ,OAAO;AAAA,QAC1C,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,UAAU,EAAE,QAAQ,MAAM,OAAO,CAAC;AAChD,UAAM,UAAU,MAAM,WAAW,SAAS;AAC1C,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH;AAAA,MACA,aAAa,MAAM,eAAe,SAAS;AAAA,MAC3C,YAAY,MAAM,cAAc,SAAS;AAAA,MACzC,QAAQ,MAAM,UAAU,SAAS;AAAA,MACjC,MAAM,MAAM,QAAQ,SAAS;AAAA,MAC7B,UAAU,MAAM,YAAY,SAAS;AAAA,MACrC,UAAU,MAAM,YAAY,SAAS;AAAA,MACrC,UAAU,MAAM,YAAY,SAAS;AAAA,MACrC,WAAW,MAAM,aAAa,SAAS;AAAA,MACvC,QAAQ,MAAM,UAAU,SAAS;AAAA,MACjC,SAAS,MAAM,WAAW,SAAS;AAAA,MACnC,cAAc,MAAM,gBAAgB,SAAS;AAAA,IAC/C;AACA,UAAM,iBAAiB,MAAM;AAAA,MAAI,UAC/B,KAAK,OAAO,SAAS,KAAK,cAAc;AAAA,IAC1C;AACA,UAAM,SAAS,eAAe,eAAe,cAAc,CAAC;AAC5D,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,EAAE,OAAO;AAAA,QACpB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,MAAM,UAAU,kBAAkB,MAAM,MAAM,GAAG;AACnD,YAAM,WAAW,YAAY;AAC7B,UAAI,UAAU;AACZ,cAAM,aAAa,MAAM,KAAK,UAAQ,KAAK,OAAO,QAAQ;AAC1D,YAAI,CAAC,cAAc,CAAC,kBAAkB,WAAW,MAAM,GAAG;AACxD,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,MAAM,oBAAoB;AAAA,cACxB,MAAM;AAAA,cACN,MAAM;AAAA,cACN,SAAS;AAAA,cACT,SAAS;AAAA,gBACP,QAAQ,SAAS;AAAA,gBACjB;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,cAAc,MAAM,eAAe,MAAM;AAC/C,YAAM,SAAS;AAAA,QACb,MAAM;AAAA,QACN;AAAA,UACE,SAAS,MAAM;AAAA,UACf,aAAa,MAAM;AAAA,UACnB,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,UACf;AAAA,UACA,cAAc,MAAM;AAAA,QACtB;AAAA,QACA,EAAE,QAAQ,MAAM,QAAQ,YAAY,MAAM,WAAW;AAAA,MACvD;AACA,wBAAkB,gBAAgB;AAAA,QAChC;AAAA,QACA,QAAQ,OAAO,KAAK;AAAA,QACpB,MAAM,OAAO;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,UAAI,SAAS,WAAW,OAAO,KAAK,QAAQ;AAC1C,0BAAkB,uBAAuB;AAAA,UACvC;AAAA,UACA,QAAQ,OAAO,KAAK;AAAA,UACpB,gBAAgB,SAAS;AAAA,UACzB,QAAQ,OAAO,KAAK;AAAA,UACpB,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AACA,UAAI,YAAY,UAAU,OAAO,IAAI,GAAG;AACtC,0BAAkB,qBAAqB;AAAA,UACrC;AAAA,UACA,QAAQ,OAAO,KAAK;AAAA,UACpB,cAAc,gBAAgB,QAAQ;AAAA,UACtC,MAAM,gBAAgB,OAAO,IAAI;AAAA,UACjC,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AACA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA,MAAM,aAAa,OAAO,IAAI;AAAA,QAChC;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,wBAAwB;AAC3C,0BAAkB,0BAA0B;AAAA,UAC1C;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,UACd,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,oBAAoB;AAAA,YACxB,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,SAAS,MAAM;AAAA,YACf,SAAS;AAAA,cACP,QAAQ,MAAM;AAAA,cACd,UAAU,MAAM;AAAA,cAChB,QAAQ,MAAM;AAAA,YAChB;AAAA,UACF,CAAC;AAAA,QACH;AACA;AAAA,MACF;AACA,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,oBAAoB;AAAA,UACxB,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;;;A5B/OO,IAAM,cAAc,MAAc;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,WAAWI;AAAA,EACtB,OAAO,qBAAgD;AACrD,UAAM,QAAQ,CAAC,GAAG,YAAY,GAAG,GAAI,MAAM,YAAY,CAAE;AAEzD,UAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,WAAO,MAAM,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;AAAA,EAC5C;AACF;AAEO,IAAM,mBAAmBA,SAAQ,YAA6B;AACnE,QAAM,QAAQ,YAAY,EAAE,OAAO,UAAQ,KAAK,WAAW,CAAC;AAC5D,QAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,SAAO,MAAM,OAAO,CAAC,GAAG,UAAU,UAAU,KAAK,CAAC;AACpD,CAAC;",
|
|
6
6
|
"names": ["memoize", "Box", "Text", "React", "z", "inputSchema", "z", "isAbsolute", "resolve", "getSessionRoot", "resolve", "inputSchema", "React", "Box", "Text", "out", "existsSync", "Box", "Text", "React", "z", "PROMPT", "inputSchema", "z", "PROMPT", "Box", "Text", "existsSync", "LspFacade", "Box", "Text", "React", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "React", "Box", "Text", "Box", "Text", "isAbsolute", "relative", "resolve", "sep", "React", "z", "DESCRIPTION", "inputSchema", "z", "DESCRIPTION", "isAbsolute", "resolve", "relative", "Box", "Text", "sep", "existsSync", "readFileSync", "statSync", "Box", "Text", "relative", "resolve", "React", "z", "TOOL_NAME_FOR_PROMPT", "PROMPT", "DESCRIPTION", "inputSchema", "z", "relative", "React", "Text", "TOOL_NAME_FOR_PROMPT", "DESCRIPTION", "PROMPT", "resolve", "existsSync", "statSync", "readFileSync", "Box", "out", "Box", "Text", "React", "z", "TOOL_NAME", "DESCRIPTION", "PROMPT", "inputSchema", "z", "TOOL_NAME", "DESCRIPTION", "PROMPT", "React", "Box", "Text", "React", "Box", "Text", "z", "randomUUID", "existsSync", "readFileSync", "TOOL_NAME", "inputSchema", "z", "existsSync", "readFileSync", "randomUUID", "TOOL_NAME", "React", "Box", "Text", "lastAssistant", "content", "output", "input", "query", "toolUseCount", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "task", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "z", "DESCRIPTION", "PROMPT", "inputSchema", "z", "DESCRIPTION", "PROMPT", "memoize"]
|
|
7
7
|
}
|