cast-code 1.0.2 → 1.0.4
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/README.md +150 -150
- package/dist/modules/config/services/config-commands.service.js +9 -3
- package/dist/modules/config/services/config-commands.service.js.map +1 -1
- package/dist/modules/config/services/init-config.service.js +8 -3
- package/dist/modules/config/services/init-config.service.js.map +1 -1
- package/dist/modules/core/services/deep-agent.service.js +27 -7
- package/dist/modules/core/services/deep-agent.service.js.map +1 -1
- package/dist/modules/mcp/services/mcp-client.service.js +0 -3
- package/dist/modules/mcp/services/mcp-client.service.js.map +1 -1
- package/dist/modules/repl/services/commands/mcp-commands.service.js +1 -7
- package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -1
- package/dist/modules/repl/services/repl.service.js +2 -0
- package/dist/modules/repl/services/repl.service.js.map +1 -1
- package/dist/modules/repl/services/smart-input.js +30 -30
- package/dist/modules/repl/services/smart-input.js.map +1 -1
- package/package.json +1 -1
|
@@ -12,7 +12,6 @@ const _common = require("@nestjs/common");
|
|
|
12
12
|
const _messages = require("@langchain/core/messages");
|
|
13
13
|
const _child_process = require("child_process");
|
|
14
14
|
const _deepagents = require("deepagents");
|
|
15
|
-
const _configservice = require("../../../common/services/config.service");
|
|
16
15
|
const _multillmservice = require("../../../common/services/multi-llm.service");
|
|
17
16
|
const _markdownrendererservice = require("../../../common/services/markdown-renderer.service");
|
|
18
17
|
const _agentregistryservice = require("../../agents/services/agent-registry.service");
|
|
@@ -45,9 +44,6 @@ const DEEPAGENT_BUILTIN_TOOLS = new Set([
|
|
|
45
44
|
'task'
|
|
46
45
|
]);
|
|
47
46
|
let DeepAgentService = class DeepAgentService {
|
|
48
|
-
async onModuleInit() {
|
|
49
|
-
await this.configService.loadGlobalConfig();
|
|
50
|
-
}
|
|
51
47
|
async initialize() {
|
|
52
48
|
const projectPath = await this.projectLoader.detectProject();
|
|
53
49
|
if (projectPath) {
|
|
@@ -80,6 +76,11 @@ let DeepAgentService = class DeepAgentService {
|
|
|
80
76
|
const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();
|
|
81
77
|
const mcpServerSummaries = this.mcpRegistry.getServerSummaries();
|
|
82
78
|
const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);
|
|
79
|
+
this.cachedSystemPrompt = systemPrompt;
|
|
80
|
+
this.cachedExtraTools = extraTools;
|
|
81
|
+
this.cachedMcpTools = mcpTools;
|
|
82
|
+
this.cachedMcpDiscoveryTools = mcpDiscoveryTools;
|
|
83
|
+
this.cachedSubagents = subagents;
|
|
83
84
|
this.agent = (0, _deepagents.createDeepAgent)({
|
|
84
85
|
model: this.model,
|
|
85
86
|
systemPrompt,
|
|
@@ -100,6 +101,22 @@ let DeepAgentService = class DeepAgentService {
|
|
|
100
101
|
toolCount: extraTools.length + mcpTools.length
|
|
101
102
|
};
|
|
102
103
|
}
|
|
104
|
+
async reinitializeModel() {
|
|
105
|
+
this.model = this.multiLlmService.createStreamingModel('default');
|
|
106
|
+
this.agent = (0, _deepagents.createDeepAgent)({
|
|
107
|
+
model: this.model,
|
|
108
|
+
systemPrompt: this.cachedSystemPrompt,
|
|
109
|
+
tools: [
|
|
110
|
+
...this.cachedExtraTools,
|
|
111
|
+
...this.cachedMcpTools,
|
|
112
|
+
...this.cachedMcpDiscoveryTools
|
|
113
|
+
],
|
|
114
|
+
subagents: this.cachedSubagents,
|
|
115
|
+
backend: ()=>new _deepagents.FilesystemBackend({
|
|
116
|
+
rootDir: process.cwd()
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
}
|
|
103
120
|
getGitStatus() {
|
|
104
121
|
try {
|
|
105
122
|
const branch = (0, _child_process.execSync)('git rev-parse --abbrev-ref HEAD 2>/dev/null', {
|
|
@@ -538,8 +555,7 @@ Keep the summary under 500 words. Output ONLY the summary, no preamble.`),
|
|
|
538
555
|
};
|
|
539
556
|
}
|
|
540
557
|
}
|
|
541
|
-
constructor(
|
|
542
|
-
this.configService = configService;
|
|
558
|
+
constructor(multiLlmService, agentRegistry, toolsRegistry, mcpRegistry, projectLoader, projectContext, skillRegistry, memoryService, markdownRenderer){
|
|
543
559
|
this.multiLlmService = multiLlmService;
|
|
544
560
|
this.agentRegistry = agentRegistry;
|
|
545
561
|
this.toolsRegistry = toolsRegistry;
|
|
@@ -553,13 +569,17 @@ Keep the summary under 500 words. Output ONLY the summary, no preamble.`),
|
|
|
553
569
|
this.messages = [];
|
|
554
570
|
this.tokenCount = 0;
|
|
555
571
|
this.lastToolOutputs = [];
|
|
572
|
+
this.cachedSystemPrompt = '';
|
|
573
|
+
this.cachedExtraTools = [];
|
|
574
|
+
this.cachedMcpTools = [];
|
|
575
|
+
this.cachedMcpDiscoveryTools = [];
|
|
576
|
+
this.cachedSubagents = [];
|
|
556
577
|
}
|
|
557
578
|
};
|
|
558
579
|
DeepAgentService = _ts_decorate([
|
|
559
580
|
(0, _common.Injectable)(),
|
|
560
581
|
_ts_metadata("design:type", Function),
|
|
561
582
|
_ts_metadata("design:paramtypes", [
|
|
562
|
-
typeof _configservice.ConfigService === "undefined" ? Object : _configservice.ConfigService,
|
|
563
583
|
typeof _multillmservice.MultiLlmService === "undefined" ? Object : _multillmservice.MultiLlmService,
|
|
564
584
|
typeof _agentregistryservice.AgentRegistryService === "undefined" ? Object : _agentregistryservice.AgentRegistryService,
|
|
565
585
|
typeof _toolsregistryservice.ToolsRegistryService === "undefined" ? Object : _toolsregistryservice.ToolsRegistryService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/core/services/deep-agent.service.ts"],"sourcesContent":["import { Injectable, OnModuleInit } from '@nestjs/common';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { HumanMessage, AIMessage, SystemMessage, BaseMessage } from '@langchain/core/messages';\nimport { execSync } from 'child_process';\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MarkdownRendererService } from '../../../common/services/markdown-renderer.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { ProjectLoaderService } from '../../project/services/project-loader.service';\nimport { ProjectContextService } from '../../project/services/project-context.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { MemoryService } from '../../memory/services/memory.service';\nimport { ProjectInitResult } from '../../project/types';\nimport { Task } from '../../tasks/types/task.types';\nimport { McpServerSummary } from '../../mcp/types';\n\nconst SUMMARIZE_THRESHOLD = 40;\nconst KEEP_RECENT = 10;\nconst RECURSION_LIMIT = 100;\nconst DEEPAGENT_BUILTIN_TOOLS = new Set([\n 'read_file', 'write_file', 'edit_file', 'glob', 'grep', 'ls',\n 'write_todos', 'task',\n]);\n\n@Injectable()\nexport class DeepAgentService implements OnModuleInit {\n private agent: any;\n private model: BaseChatModel | null = null;\n private messages: BaseMessage[] = [];\n private tokenCount = 0;\n private lastToolOutputs: { tool: string; output: string }[] = [];\n\n constructor(\n private readonly configService: ConfigService,\n private readonly multiLlmService: MultiLlmService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly toolsRegistry: ToolsRegistryService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly projectLoader: ProjectLoaderService,\n private readonly projectContext: ProjectContextService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly memoryService: MemoryService,\n private readonly markdownRenderer: MarkdownRendererService,\n ) {}\n\n async onModuleInit() {\n await this.configService.loadGlobalConfig();\n }\n\n async initialize(): Promise<ProjectInitResult> {\n const projectPath = await this.projectLoader.detectProject();\n\n if (projectPath) {\n const projectConfig = await this.projectLoader.loadProject(projectPath);\n\n if (projectConfig.context) {\n this.projectContext.setContext(projectConfig.context);\n }\n\n if (projectConfig.mcpConfigs) {\n this.mcpRegistry.loadConfigs(projectConfig.mcpConfigs);\n await this.mcpRegistry.connectAll();\n }\n\n const agentsOverridePath = this.projectLoader.getAgentsOverridePath(projectPath);\n const legacyAgentsOverridePath = this.projectLoader.getLegacyAgentsOverridePath(projectPath);\n await this.agentRegistry.loadProjectAgents(agentsOverridePath);\n await this.agentRegistry.loadProjectAgents(legacyAgentsOverridePath);\n\n const skillsOverridePath = this.projectLoader.getSkillsOverridePath(projectPath);\n const legacySkillsOverridePath = this.projectLoader.getLegacySkillsOverridePath(projectPath);\n await this.skillRegistry.loadProjectSkills(skillsOverridePath);\n await this.skillRegistry.loadProjectSkills(legacySkillsOverridePath);\n\n await this.memoryService.initialize(projectPath);\n }\n\n this.model = this.multiLlmService.createStreamingModel('default');\n\n const contextPrompt = this.projectContext.getContextPrompt();\n const memoryPrompt = await this.memoryService.getMemoryPrompt();\n const skillKnowledge = this.skillRegistry.getAllSkillKnowledge();\n const subagents = this.agentRegistry.getSubagentDefinitions(contextPrompt);\n const allTools = this.toolsRegistry.getAllTools();\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n\n const extraTools = allTools.filter(t => !DEEPAGENT_BUILTIN_TOOLS.has(t.name));\n const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();\n const mcpServerSummaries = this.mcpRegistry.getServerSummaries();\n\n const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);\n\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt,\n tools: [...extraTools, ...mcpTools, ...mcpDiscoveryTools],\n subagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n\n return {\n projectPath,\n hasContext: this.projectContext.hasContext(),\n agentCount: subagents.length,\n toolCount: extraTools.length + mcpTools.length,\n };\n }\n\n private getGitStatus(): string {\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const status = execSync('git status --short 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const log = execSync('git log --oneline -5 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n\n let result = `Branch: ${branch}`;\n if (status) {\n result += `\\nChanges:\\n${status}`;\n } else {\n result += `\\nStatus: clean`;\n }\n if (log) {\n result += `\\nRecent commits:\\n${log}`;\n }\n return result;\n } catch {\n return 'Not a git repository';\n }\n }\n\n private buildSystemPrompt(\n contextPrompt: string,\n memoryPrompt: string,\n skillKnowledge: string,\n subagents: any[],\n tools: any[],\n mcpTools: any[],\n mcpServerSummaries: McpServerSummary[] = [],\n ): string {\n const gitInfo = this.getGitStatus();\n const allToolNames = [\n ...tools.map((t: any) => t.name),\n ...mcpTools.map((t: any) => t.name),\n ];\n\n const parts: string[] = [];\n\n parts.push(\n `You are Cast, an autonomous AI coding assistant running as a CLI tool.`,\n `You are a highly capable agent that can independently explore codebases, make decisions, execute multi-step plans, and delegate work to specialized sub-agents. You help developers with software engineering tasks including writing code, debugging, refactoring, and answering questions about codebases.`,\n ``,\n );\n\n parts.push(\n `# CRITICAL RULES`,\n ``,\n `## NEVER Guess — ALWAYS Verify`,\n `- NEVER say a file \"doesn't exist\" without FIRST using glob or read_file to check`,\n `- NEVER guess file contents — ALWAYS read_file before answering about a file`,\n `- NEVER assume a directory structure — ALWAYS use ls or glob to discover it`,\n `- NEVER say \"I don't have access\" — you DO have access through your tools`,\n `- If a user mentions a file path, your FIRST action must be to read it or verify it exists`,\n ``,\n `## Read Before Edit`,\n `- ALWAYS use read_file on a file before using edit_file or write_file on it`,\n `- NEVER edit a file you haven't read in this conversation`,\n `- Understand existing code before suggesting modifications`,\n ``,\n `## Minimal Changes`,\n `- Only make changes that are directly requested or clearly necessary`,\n `- Don't add features, refactor code, or make \"improvements\" beyond what was asked`,\n `- Don't add docstrings, comments, or type annotations to code you didn't change`,\n `- Preserve existing code style and conventions`,\n ``,\n );\n\n const builtInCount = tools.length;\n const mcpCount = mcpTools.length;\n const discoveryCount = 2;\n\n parts.push(\n `# Available Tools`,\n ``,\n `You have ${allToolNames.length} tools available:`,\n `- **Built-in**: ${builtInCount} tools (read_file, write_file, edit_file, glob, grep, ls, shell, task management, memory)`,\n );\n\n if (mcpCount > 0) {\n const serverCount = mcpServerSummaries.length;\n parts.push(`- **MCP**: ${mcpCount} tools from ${serverCount} server(s)`);\n }\n\n if (mcpCount > 0) {\n parts.push(`- **Discovery**: ${discoveryCount} tools (mcp_list_servers, mcp_list_tools)`);\n }\n\n parts.push(\n ``,\n `USE THEM PROACTIVELY.`,\n ``,\n );\n\n if (tools.length > 0) {\n parts.push(`## Built-in Tools`);\n for (const t of tools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n parts.push(``);\n }\n\n if (mcpTools.length > 0) {\n parts.push(`## MCP Tools (External Services)`);\n parts.push(``);\n parts.push(`**⚠️ Important**: Only tools from servers with status \"connected\" are available. Tools from disconnected servers will fail.`);\n parts.push(``);\n\n if (mcpServerSummaries.length > 0) {\n for (const server of mcpServerSummaries) {\n const statusIcon = server.status === 'connected' ? '✓' : '✗';\n parts.push(`### ${statusIcon} ${server.name} (${server.transport}, ${server.status}) — ${server.toolCount} tools`);\n for (const td of server.toolDescriptions) {\n parts.push(`- **${td.name}**: ${td.description}`);\n }\n }\n } else {\n for (const t of mcpTools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n }\n parts.push(`## MCP Discovery Tools`);\n parts.push(`- **mcp_list_servers**: List all connected MCP servers with status and tool counts`);\n parts.push(`- **mcp_list_tools**: List tools from a specific server or all servers`);\n parts.push(``);\n }\n\n parts.push(\n `# Tool Usage Guidelines`,\n ``,\n `## File Operations`,\n `- Use **read_file** to read file contents. Always read before editing.`,\n `- Use **write_file** only to create NEW files. Prefer edit_file for existing files.`,\n `- Use **edit_file** for precise string replacements in existing files.`,\n ` - Provide enough context in old_string to make it unique`,\n ` - Use replace_all=true only when renaming across the file`,\n ``,\n `## Search & Discovery`,\n `- Use **glob** to find files by pattern (e.g., \"**/*.ts\", \"src/**/*.service.ts\")`,\n `- Use **grep** to search content within files (supports regex)`,\n ` - Use context_lines to see surrounding code`,\n ` - Use output_mode=\"files_with_matches\" to just find file paths`,\n `- Use **ls** to list directory contents`,\n `- When looking for something, try glob first, then grep if needed`,\n ``,\n `## Shell Commands`,\n `- Use **shell** for git, npm, docker, and other CLI operations`,\n `- Dangerous commands (rm -rf, sudo, git push --force) require user approval`,\n `- Use **shell_background** for long-running tasks (dev servers, watch mode)`,\n ``,\n `## Task Management`,\n `- Use **task_create** to break complex work into trackable subtasks`,\n `- Use **task_update** to mark tasks as in_progress or completed`,\n `- Use **task_list** to see all tasks and their status`,\n `- Use **ask_user_question** when you need clarification BEFORE acting`,\n ``,\n `## Memory`,\n `- Use **memory_write** to save important learnings and project insights`,\n `- Use **memory_read** to recall previously saved notes`,\n `- Memory persists across sessions — use it to avoid repeating mistakes`,\n ``,\n );\n\n if (mcpTools.length > 0) {\n parts.push(\n `# MCP Integration Protocol`,\n ``,\n `MCP (Model Context Protocol) tools connect you to external services. They work exactly like built-in tools but reach outside the local filesystem.`,\n ``,\n `## Connected Servers`,\n );\n if (mcpServerSummaries.length > 0) {\n for (const s of mcpServerSummaries) {\n parts.push(`- **${s.name}** (${s.transport}, ${s.status}) — ${s.toolCount} tools`);\n }\n }\n parts.push(\n ``,\n `## When to Use MCP vs Built-in`,\n `| Need | Use |`,\n `|------|-----|`,\n `| Read/write local files | Built-in (read_file, write_file, edit_file) |`,\n `| Search local codebase | Built-in (glob, grep) |`,\n `| Run commands | Built-in (shell) |`,\n `| Interact with external APIs/services | MCP tools |`,\n `| Discover available MCP capabilities | mcp_list_servers, mcp_list_tools |`,\n ``,\n `## MCP Tool Naming Convention`,\n `MCP tools follow the pattern \\`{server}_{tool}\\` (e.g., \\`figma_get_file\\`, \\`github_create_issue\\`).`,\n `The prefix tells you which server provides the tool.`,\n ``,\n `## Discovery`,\n `- Use **mcp_list_servers** to see which servers are connected and their status`,\n `- Use **mcp_list_tools** to explore what tools a server provides (with descriptions)`,\n `- When you're unsure which MCP tool to use, call mcp_list_tools first`,\n ``,\n `## Error Handling`,\n `- If an MCP tool returns an error, check the server status with mcp_list_servers`,\n `- MCP servers can disconnect — if a tool fails, the server may need reconnection`,\n `- Report MCP errors to the user and suggest they check /mcp list in the REPL`,\n ``,\n );\n }\n\n parts.push(\n `# Planning Protocol`,\n ``,\n `## When to Enter Plan Mode`,\n `Use **enter_plan_mode** when:`,\n `- Task touches 3+ files`,\n `- Task involves new features or architecture changes`,\n `- Task is ambiguous and needs scope definition`,\n `- User explicitly asks for a plan`,\n ``,\n `Do NOT plan for: simple fixes, single-file edits, questions, explanations`,\n ``,\n `## Plan Mode Workflow`,\n `1. **enter_plan_mode** — signals you are planning`,\n `2. **Explore rapidly**: Use glob and grep efficiently to understand codebase`,\n `3. **Design**: Create structured plan with specific file changes and order`,\n `4. **exit_plan_mode** — present plan for approval`,\n `5. **Execute immediately** after approval without asking for further confirmation`,\n ``,\n `## Critical: Autonomous Execution`,\n `AFTER the user approves your plan, you MUST:`,\n `- Start implementing immediately`,\n `- Create tasks and execute them sequentially`,\n `- Do NOT ask \"should I proceed?\" or \"ready to start?\"`,\n `- Do NOT wait for additional confirmation`,\n `- Just execute the approved plan autonomously`,\n ``,\n `## Plan Quality Rules`,\n `- Specify WHAT changes and WHY for each file`,\n `- Order by dependency (foundations first)`,\n `- Include verification at the end`,\n `- Use ask_user_question ONLY to clarify requirements, not to ask for permission to execute`,\n ``,\n );\n\n if (subagents.length > 0) {\n parts.push(\n `# Sub-Agent Orchestration`,\n ``,\n `You have ${subagents.length} specialized sub-agents available. Each has domain-specific knowledge and tools.`,\n ``,\n `## Available Sub-Agents`,\n );\n for (const sa of subagents) {\n const mcpAnnotation = sa.mcp && sa.mcp.length > 0 ? ` [MCP: ${sa.mcp.join(', ')}]` : '';\n parts.push(`- **${sa.name}**: ${sa.description}${mcpAnnotation}`);\n }\n parts.push(\n ``,\n `## When to Delegate to Sub-Agents`,\n `- Task requires specialized domain knowledge (React, testing, API design, databases)`,\n `- Multiple independent subtasks can be worked on in parallel`,\n `- Task is well-defined and self-contained (a sub-agent can complete it without further guidance)`,\n `- You want a focused review or analysis (e.g., code review, architecture review)`,\n ``,\n `## When NOT to Delegate`,\n `- Simple tasks you can do yourself quickly`,\n `- Tasks that require back-and-forth with the user`,\n `- Tasks that depend heavily on earlier context in this conversation`,\n ``,\n `## Delegation Pattern`,\n `1. Identify the task and which sub-agent is best suited`,\n `2. Create a clear, specific task description with all necessary context`,\n `3. Delegate execution to that sub-agent (do not stop at planning only)`,\n `4. Track delegated work with task_create/task_update`,\n `5. When the sub-agent returns, verify the result and integrate it`,\n `6. Mark the task as completed`,\n ``,\n `## Delegation Quality Bar`,\n `- If user explicitly asks to use a specific sub-agent, you MUST delegate to it`,\n `- For frontend UI generation from Figma, prefer the frontend sub-agent when available`,\n `- Avoid fake delegation: creating tasks without executing delegated work is not enough`,\n `- Return concrete delegated outputs (files changed, decisions made, validations run)`,\n ``,\n `## Multi-Agent Coordination`,\n `For large tasks, you can orchestrate multiple sub-agents:`,\n `1. Break the work into independent pieces`,\n `2. Assign each piece to the most qualified sub-agent`,\n `3. Track progress with task_create/task_update`,\n `4. Integrate results and verify the combined output`,\n ``,\n `## MCP-Aware Delegation`,\n `When a task involves heavy interaction with an external service (e.g., fetching Figma designs, managing GitHub issues):`,\n `- Check which sub-agents have MCP access (annotated with [MCP: name] above)`,\n `- Delegate MCP-heavy work to the sub-agent with the right MCP connection`,\n `- If no sub-agent has the needed MCP, handle it yourself using the MCP tools directly`,\n `- Include the MCP server name in the task description so the sub-agent knows which tools to use`,\n ``,\n );\n }\n\n parts.push(\n `# Execution Protocol`,\n ``,\n `## Exploring a Project`,\n `1. ls the root directory`,\n `2. Read key config files (package.json, tsconfig.json, etc.)`,\n `3. glob to map directory tree with key patterns`,\n `4. Read the most important files (entry points, main modules)`,\n `5. Present a structured summary`,\n `Be EXHAUSTIVE. Read as many files as needed.`,\n ``,\n `## Implementing Changes`,\n `1. Understand the current codebase (read relevant files)`,\n `2. If complex (3+ files): use enter_plan_mode`,\n `3. Create a task list with task_create for each step`,\n `4. Execute each step, marking tasks as completed`,\n `5. Verify changes (re-read edited files, run tests)`,\n `6. Summarize what was done`,\n ``,\n `## Tool Chain Patterns`,\n `- **Find something**: glob → grep → read_file`,\n `- **Edit a file**: read_file → edit_file → read_file (verify)`,\n `- **Explore a module**: ls → glob(\"module/**/*\") → read_file (key files)`,\n `- **Debug an issue**: grep (error) → read_file → edit_file → shell (test)`,\n `- **New feature**: enter_plan_mode → task_create → [implement] → shell (test)`,\n ``,\n `## Thoroughness Rules`,\n `- NEVER give up after one failed search. Try different patterns and approaches.`,\n `- ALWAYS verify changes by re-reading the file after editing.`,\n `- If tests exist, run them after changes: shell(\"npm test\") or equivalent.`,\n `- When you encounter an error, analyze and fix it — don't just report it.`,\n `- If blocked, try a different approach. If still blocked, ask the user.`,\n ``,\n );\n\n parts.push(\n `# Autonomous Decision-Making`,\n ``,\n `You are an autonomous agent. Make decisions proactively:`,\n ``,\n `## Decision Framework`,\n `| Situation | Action |`,\n `|-----------|--------|`,\n `| User asks to implement something | Explore first, then plan if complex |`,\n `| You find a bug while working | Fix it AND mention it to the user |`,\n `| Test fails after your change | Analyze the failure and fix it |`,\n `| Build fails | Read the error, fix the cause |`,\n `| File you need doesn't exist | Search broader, check for alternatives |`,\n `| Task is ambiguous | ask_user_question BEFORE starting |`,\n `| Task has multiple approaches | Briefly explain options, pick the best one |`,\n `| Something could break | Use enter_plan_mode and verify |`,\n ``,\n `## Self-Correction`,\n `- After editing, always re-read the file to verify the change is correct`,\n `- If a tool call fails, understand why and adjust (don't retry the same thing)`,\n `- If your approach isn't working after 3 attempts, step back and reconsider`,\n `- Save important learnings with memory_write so you don't repeat mistakes`,\n ``,\n );\n\n parts.push(\n `# Git Safety Protocol`,\n `- NEVER update git config`,\n `- NEVER run destructive git commands (push --force, reset --hard, clean -f) without explicit user request`,\n `- NEVER skip hooks (--no-verify) unless user explicitly requests it`,\n `- When committing: stage specific files (not \"git add -A\"), write clear commit messages`,\n `- When creating PRs: summarize all commits, not just the latest`,\n ``,\n );\n\n parts.push(\n `# Response Style`,\n `- Be concise in responses but thorough in your work`,\n `- Show your work: mention which tools you're using and why`,\n `- When showing code changes, explain WHAT changed and WHY`,\n `- Use markdown formatting for readability`,\n `- Reference files with their path (e.g., \"In src/main.ts:\")`,\n ``,\n );\n\n parts.push(\n `# User Mentions`,\n `When the user's message contains <file>, <directory>, <url>, or <git> tags,`,\n `these are automatically injected file/directory contents from @ mentions.`,\n `The content inside these tags is REAL and CURRENT — trust it and use it to answer.`,\n `Do NOT re-read a file that was already provided via a mention tag unless you need a different section.`,\n ``,\n );\n\n if (skillKnowledge) {\n const skillSummaries = this.skillRegistry.getSkillSummaries();\n\n parts.push(\n `# Domain Knowledge`,\n ``,\n `You have ${skillSummaries.length} skills loaded:`,\n );\n\n for (const skill of skillSummaries) {\n parts.push(`- **${skill.name}**: ${skill.description}`);\n }\n\n parts.push(\n ``,\n `The following are the complete guidelines from your skill library. These are reference materials — study them to learn patterns, decision frameworks, and anti-patterns for each domain. Use this knowledge when making decisions about how to approach tasks.`,\n ``,\n skillKnowledge,\n ``,\n );\n }\n\n parts.push(\n `# Environment`,\n `- Working directory: ${process.cwd()}`,\n `- Platform: ${process.platform}`,\n `- Node.js: ${process.version}`,\n ``,\n `# Git Status (snapshot)`,\n gitInfo,\n ``,\n );\n\n if (contextPrompt) {\n parts.push(contextPrompt, ``);\n }\n\n if (memoryPrompt) {\n parts.push(\n `# Auto Memory`,\n `These are notes from previous sessions:`,\n memoryPrompt,\n ``,\n );\n }\n\n return parts.join('\\n');\n }\n\n private formatToolStart(toolName: string, input: any): string {\n const dim = '\\x1b[2m';\n const cyan = '\\x1b[36m';\n const reset = '\\x1b[0m';\n const icon = '\\u23bf';\n\n let detail = '';\n\n switch (toolName) {\n case 'read_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'write_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'edit_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'glob':\n detail = input?.pattern ? ` ${input.pattern}` : '';\n if (input?.cwd) detail += ` in ${input.cwd}`;\n break;\n case 'grep':\n detail = input?.pattern ? ` \"${input.pattern}\"` : '';\n if (input?.file_pattern) detail += ` (${input.file_pattern})`;\n break;\n case 'shell':\n if (input?.command) {\n const cmd = input.command.length > 80 ? input.command.slice(0, 80) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'shell_background':\n if (input?.command) {\n const cmd = input.command.length > 60 ? input.command.slice(0, 60) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'ls':\n detail = ` ${input?.directory || input?.path || '.'}`;\n break;\n case 'web_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'web_fetch':\n detail = input?.url ? ` ${input.url}` : '';\n break;\n case 'task_create':\n detail = input?.title ? ` \"${input.title}\"` : '';\n break;\n case 'task_update':\n detail = input?.id ? ` #${input.id} → ${input?.status || ''}` : '';\n break;\n case 'task_list':\n detail = '';\n break;\n case 'task_get':\n detail = input?.id ? ` #${input.id}` : '';\n break;\n case 'ask_user_question':\n detail = input?.question ? ` \"${input.question.slice(0, 50)}${input.question.length > 50 ? '...' : ''}\"` : '';\n break;\n case 'enter_plan_mode':\n detail = ' Starting plan...';\n break;\n case 'exit_plan_mode':\n detail = ' Submitting plan';\n break;\n case 'memory_write':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_read':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'mcp_list_servers':\n detail = ' Listing MCP servers';\n break;\n case 'mcp_list_tools':\n detail = input?.server ? ` server=${input.server}` : ' (all servers)';\n break;\n default:\n if (input) {\n const keys = Object.keys(input);\n if (keys.length > 0) {\n const firstVal = String(input[keys[0]]).slice(0, 60);\n detail = ` ${keys[0]}=${firstVal}`;\n }\n }\n }\n\n return `\\n${dim} ${cyan}${icon}${reset}${dim} ${toolName}${detail}${reset}\\n`;\n }\n\n private formatToolEnd(toolName: string, output: string): string {\n if (!output || output.length === 0) return '';\n\n const dim = '\\x1b[2m';\n const green = '\\x1b[32m';\n const reset = '\\x1b[0m';\n\n switch (toolName) {\n case 'read_file': {\n const lineCount = output.split('\\n').length;\n return `${dim} ${green}\\u2713${reset}${dim} ${lineCount} lines${reset}\\n`;\n }\n case 'write_file':\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n case 'edit_file': {\n if (output.startsWith('Error')) {\n return `${dim} \\x1b[31m${output.slice(0, 150)}${reset}\\n`;\n }\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n }\n case 'glob': {\n const lines = output.split('\\n').filter(l => l.trim());\n const fileCount = lines.length;\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 100)}${reset}`).join('\\n');\n const more = fileCount > 5 ? `\\n${dim} ... (${fileCount - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'grep': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 5 ? `\\n${dim} ... (${lines.length - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'shell':\n case 'shell_background': {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 8).map(l => `${dim} ${l.slice(0, 150)}${reset}`).join('\\n');\n const more = lines.length > 8 ? `\\n${dim} ... (${lines.length - 8} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'ls': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 10).map(l => `${dim} ${l}${reset}`).join('\\n');\n const more = lines.length > 10 ? `\\n${dim} ... (${lines.length - 10} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n default: {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 3).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 3 ? `\\n${dim} ... (${lines.length - 3} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n }\n }\n\n private async autoSummarize(force = false): Promise<boolean> {\n if ((!force && this.messages.length < SUMMARIZE_THRESHOLD) || !this.model) {\n return false;\n }\n\n if (this.messages.length < 4) {\n return false;\n }\n\n const oldMessages = this.messages.slice(0, this.messages.length - KEEP_RECENT);\n const recentMessages = this.messages.slice(this.messages.length - KEEP_RECENT);\n\n const conversationText = oldMessages.map((m) => {\n const role = m._getType() === 'human' ? 'User' : 'Assistant';\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const truncated = content.length > 500 ? content.slice(0, 500) + '...' : content;\n return `${role}: ${truncated}`;\n }).join('\\n');\n\n try {\n const summaryResponse = await this.model.invoke([\n new SystemMessage(\n `You are a conversation summarizer. Produce a concise summary of the following conversation between a user and an AI assistant. Focus on:\n- Key decisions made\n- Files that were read or modified\n- Tasks completed or pending\n- Important context the assistant needs to remember\nKeep the summary under 500 words. Output ONLY the summary, no preamble.`\n ),\n new HumanMessage(conversationText),\n ]);\n\n const summaryText = typeof summaryResponse.content === 'string'\n ? summaryResponse.content\n : JSON.stringify(summaryResponse.content);\n\n this.messages = [\n new SystemMessage(`[Conversation Summary — ${oldMessages.length} messages compacted]\\n\\n${summaryText}`),\n ...recentMessages,\n ];\n\n return true;\n } catch {\n return false;\n }\n }\n\n async *chat(message: string): AsyncGenerator<string> {\n const summarized = await this.autoSummarize();\n if (summarized) {\n yield `\\n\\x1b[2m \\u2500 conversation compacted (${this.messages.length} messages retained)\\x1b[0m\\n`;\n }\n\n this.messages.push(new HumanMessage(message));\n this.lastToolOutputs = [];\n\n let stream: any;\n try {\n stream = this.agent.streamEvents(\n { messages: this.messages },\n { version: 'v2', recursionLimit: RECURSION_LIMIT },\n );\n } catch (error) {\n yield `\\n\\x1b[31m Error starting agent: ${(error as Error).message}\\x1b[0m\\n`;\n return;\n }\n\n let fullResponse = '';\n let lastToolName = '';\n let interactionInputTokens = 0;\n let interactionOutputTokens = 0;\n\n try {\n for await (const event of stream) {\n if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {\n const content = event.data.chunk.content;\n if (typeof content === 'string' && content) {\n yield content;\n fullResponse += content;\n }\n }\n\n if (event.event === 'on_chat_model_end') {\n const output = event.data?.output;\n const usage = output?.usage_metadata\n || output?.response_metadata?.usage;\n if (usage) {\n interactionInputTokens += usage.input_tokens || usage.prompt_tokens || usage.promptTokens || 0;\n interactionOutputTokens += usage.output_tokens || usage.completion_tokens || usage.completionTokens || 0;\n }\n }\n\n if (event.event === 'on_tool_start') {\n lastToolName = event.name;\n yield this.formatToolStart(event.name, event.data?.input);\n }\n\n if (event.event === 'on_tool_end') {\n const raw = event.data?.output;\n let output = '';\n if (typeof raw === 'string') {\n output = raw;\n } else if (raw?.content) {\n output = typeof raw.content === 'string' ? raw.content : JSON.stringify(raw.content);\n } else if (raw?.output) {\n output = typeof raw.output === 'string' ? raw.output : JSON.stringify(raw.output);\n } else if (raw) {\n output = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);\n }\n if (output) {\n this.lastToolOutputs.push({ tool: lastToolName, output });\n yield this.formatToolEnd(lastToolName, output);\n }\n }\n\n if (event.event === 'on_tool_error') {\n const error = event.data?.error;\n yield `\\n\\x1b[31m \\u2717 Error: ${error?.message || 'Unknown error'}\\x1b[0m\\n`;\n }\n }\n } catch (error) {\n const msg = (error as Error).message;\n if (!msg.includes('abort') && !msg.includes('cancel')) {\n yield `\\n\\x1b[31m Stream error: ${msg}\\x1b[0m\\n`;\n }\n }\n\n if (fullResponse) {\n this.messages.push(new AIMessage(fullResponse));\n }\n\n this.tokenCount += interactionInputTokens + interactionOutputTokens;\n\n const fmt = (n: number) => n.toLocaleString();\n yield `\\n\\x1b[2m \\u2500 tokens: ${fmt(interactionInputTokens)} in / ${fmt(interactionOutputTokens)} out (session: ${fmt(this.tokenCount)})\\x1b[0m\\n`;\n }\n\n clearHistory() {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n async compactHistory(): Promise<{ compacted: boolean; messagesBefore: number; messagesAfter: number }> {\n const before = this.messages.length;\n if (before < 4) {\n return { compacted: false, messagesBefore: before, messagesAfter: before };\n }\n const result = await this.autoSummarize(true);\n return { compacted: result, messagesBefore: before, messagesAfter: this.messages.length };\n }\n\n getHistory(): BaseMessage[] {\n return this.messages;\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n getLastToolOutputs(): { tool: string; output: string }[] {\n return this.lastToolOutputs;\n }\n\n async executeTask(task: Task): Promise<{ success: boolean; error?: string }> {\n try {\n const message = `Execute a seguinte tarefa:\\n\\n**${task.subject}**\\n\\n${task.description}\\n\\nCertifique-se de completar a tarefa totalmente e verificar o resultado.`;\n\n let fullResponse = '';\n for await (const chunk of this.chat(message)) {\n fullResponse += chunk;\n process.stdout.write(chunk);\n }\n\n return { success: true };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n}\n"],"names":["DeepAgentService","SUMMARIZE_THRESHOLD","KEEP_RECENT","RECURSION_LIMIT","DEEPAGENT_BUILTIN_TOOLS","Set","onModuleInit","configService","loadGlobalConfig","initialize","projectPath","projectLoader","detectProject","projectConfig","loadProject","context","projectContext","setContext","mcpConfigs","mcpRegistry","loadConfigs","connectAll","agentsOverridePath","getAgentsOverridePath","legacyAgentsOverridePath","getLegacyAgentsOverridePath","agentRegistry","loadProjectAgents","skillsOverridePath","getSkillsOverridePath","legacySkillsOverridePath","getLegacySkillsOverridePath","skillRegistry","loadProjectSkills","memoryService","model","multiLlmService","createStreamingModel","contextPrompt","getContextPrompt","memoryPrompt","getMemoryPrompt","skillKnowledge","getAllSkillKnowledge","subagents","getSubagentDefinitions","allTools","toolsRegistry","getAllTools","mcpTools","getAllMcpTools","extraTools","filter","t","has","name","mcpDiscoveryTools","getDiscoveryTools","mcpServerSummaries","getServerSummaries","systemPrompt","buildSystemPrompt","agent","createDeepAgent","tools","backend","FilesystemBackend","rootDir","process","cwd","hasContext","agentCount","length","toolCount","getGitStatus","branch","execSync","encoding","trim","status","log","result","gitInfo","allToolNames","map","parts","push","builtInCount","mcpCount","discoveryCount","serverCount","description","server","statusIcon","transport","td","toolDescriptions","s","sa","mcpAnnotation","mcp","join","skillSummaries","getSkillSummaries","skill","platform","version","formatToolStart","toolName","input","dim","cyan","reset","icon","detail","file_path","pattern","file_pattern","command","cmd","slice","directory","path","query","url","title","id","question","key","keys","Object","firstVal","String","formatToolEnd","output","green","lineCount","split","startsWith","lines","l","fileCount","preview","more","autoSummarize","force","messages","oldMessages","recentMessages","conversationText","m","role","_getType","content","JSON","stringify","truncated","summaryResponse","invoke","SystemMessage","HumanMessage","summaryText","chat","message","summarized","lastToolOutputs","stream","streamEvents","recursionLimit","error","fullResponse","lastToolName","interactionInputTokens","interactionOutputTokens","event","data","chunk","usage","usage_metadata","response_metadata","input_tokens","prompt_tokens","promptTokens","output_tokens","completion_tokens","completionTokens","raw","tool","msg","includes","AIMessage","tokenCount","fmt","n","toLocaleString","clearHistory","compactHistory","before","compacted","messagesBefore","messagesAfter","getHistory","getMessageCount","getTokenCount","getLastToolOutputs","executeTask","task","subject","stdout","write","success","markdownRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/core/services/deep-agent.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { HumanMessage, AIMessage, SystemMessage, BaseMessage } from '@langchain/core/messages';\nimport { execSync } from 'child_process';\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MarkdownRendererService } from '../../../common/services/markdown-renderer.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { ProjectLoaderService } from '../../project/services/project-loader.service';\nimport { ProjectContextService } from '../../project/services/project-context.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { MemoryService } from '../../memory/services/memory.service';\nimport { ProjectInitResult } from '../../project/types';\nimport { Task } from '../../tasks/types/task.types';\nimport { McpServerSummary } from '../../mcp/types';\n\nconst SUMMARIZE_THRESHOLD = 40;\nconst KEEP_RECENT = 10;\nconst RECURSION_LIMIT = 100;\nconst DEEPAGENT_BUILTIN_TOOLS = new Set([\n 'read_file', 'write_file', 'edit_file', 'glob', 'grep', 'ls',\n 'write_todos', 'task',\n]);\n\n@Injectable()\nexport class DeepAgentService {\n private agent: any;\n private model: BaseChatModel | null = null;\n private messages: BaseMessage[] = [];\n private tokenCount = 0;\n private lastToolOutputs: { tool: string; output: string }[] = [];\n\n private cachedSystemPrompt: string = '';\n private cachedExtraTools: any[] = [];\n private cachedMcpTools: any[] = [];\n private cachedMcpDiscoveryTools: any[] = [];\n private cachedSubagents: any[] = [];\n\n constructor(\n private readonly multiLlmService: MultiLlmService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly toolsRegistry: ToolsRegistryService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly projectLoader: ProjectLoaderService,\n private readonly projectContext: ProjectContextService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly memoryService: MemoryService,\n private readonly markdownRenderer: MarkdownRendererService,\n ) {}\n\n async initialize(): Promise<ProjectInitResult> {\n const projectPath = await this.projectLoader.detectProject();\n\n if (projectPath) {\n const projectConfig = await this.projectLoader.loadProject(projectPath);\n\n if (projectConfig.context) {\n this.projectContext.setContext(projectConfig.context);\n }\n\n if (projectConfig.mcpConfigs) {\n this.mcpRegistry.loadConfigs(projectConfig.mcpConfigs);\n await this.mcpRegistry.connectAll();\n }\n\n const agentsOverridePath = this.projectLoader.getAgentsOverridePath(projectPath);\n const legacyAgentsOverridePath = this.projectLoader.getLegacyAgentsOverridePath(projectPath);\n await this.agentRegistry.loadProjectAgents(agentsOverridePath);\n await this.agentRegistry.loadProjectAgents(legacyAgentsOverridePath);\n\n const skillsOverridePath = this.projectLoader.getSkillsOverridePath(projectPath);\n const legacySkillsOverridePath = this.projectLoader.getLegacySkillsOverridePath(projectPath);\n await this.skillRegistry.loadProjectSkills(skillsOverridePath);\n await this.skillRegistry.loadProjectSkills(legacySkillsOverridePath);\n\n await this.memoryService.initialize(projectPath);\n }\n\n this.model = this.multiLlmService.createStreamingModel('default');\n\n const contextPrompt = this.projectContext.getContextPrompt();\n const memoryPrompt = await this.memoryService.getMemoryPrompt();\n const skillKnowledge = this.skillRegistry.getAllSkillKnowledge();\n const subagents = this.agentRegistry.getSubagentDefinitions(contextPrompt);\n const allTools = this.toolsRegistry.getAllTools();\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n\n const extraTools = allTools.filter(t => !DEEPAGENT_BUILTIN_TOOLS.has(t.name));\n const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();\n const mcpServerSummaries = this.mcpRegistry.getServerSummaries();\n\n const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);\n\n this.cachedSystemPrompt = systemPrompt;\n this.cachedExtraTools = extraTools;\n this.cachedMcpTools = mcpTools;\n this.cachedMcpDiscoveryTools = mcpDiscoveryTools;\n this.cachedSubagents = subagents;\n\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt,\n tools: [...extraTools, ...mcpTools, ...mcpDiscoveryTools],\n subagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n\n return {\n projectPath,\n hasContext: this.projectContext.hasContext(),\n agentCount: subagents.length,\n toolCount: extraTools.length + mcpTools.length,\n };\n }\n\n async reinitializeModel(): Promise<void> {\n this.model = this.multiLlmService.createStreamingModel('default');\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt: this.cachedSystemPrompt,\n tools: [...this.cachedExtraTools, ...this.cachedMcpTools, ...this.cachedMcpDiscoveryTools],\n subagents: this.cachedSubagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n }\n\n private getGitStatus(): string {\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const status = execSync('git status --short 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const log = execSync('git log --oneline -5 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n\n let result = `Branch: ${branch}`;\n if (status) {\n result += `\\nChanges:\\n${status}`;\n } else {\n result += `\\nStatus: clean`;\n }\n if (log) {\n result += `\\nRecent commits:\\n${log}`;\n }\n return result;\n } catch {\n return 'Not a git repository';\n }\n }\n\n private buildSystemPrompt(\n contextPrompt: string,\n memoryPrompt: string,\n skillKnowledge: string,\n subagents: any[],\n tools: any[],\n mcpTools: any[],\n mcpServerSummaries: McpServerSummary[] = [],\n ): string {\n const gitInfo = this.getGitStatus();\n const allToolNames = [\n ...tools.map((t: any) => t.name),\n ...mcpTools.map((t: any) => t.name),\n ];\n\n const parts: string[] = [];\n\n parts.push(\n `You are Cast, an autonomous AI coding assistant running as a CLI tool.`,\n `You are a highly capable agent that can independently explore codebases, make decisions, execute multi-step plans, and delegate work to specialized sub-agents. You help developers with software engineering tasks including writing code, debugging, refactoring, and answering questions about codebases.`,\n ``,\n );\n\n parts.push(\n `# CRITICAL RULES`,\n ``,\n `## NEVER Guess — ALWAYS Verify`,\n `- NEVER say a file \"doesn't exist\" without FIRST using glob or read_file to check`,\n `- NEVER guess file contents — ALWAYS read_file before answering about a file`,\n `- NEVER assume a directory structure — ALWAYS use ls or glob to discover it`,\n `- NEVER say \"I don't have access\" — you DO have access through your tools`,\n `- If a user mentions a file path, your FIRST action must be to read it or verify it exists`,\n ``,\n `## Read Before Edit`,\n `- ALWAYS use read_file on a file before using edit_file or write_file on it`,\n `- NEVER edit a file you haven't read in this conversation`,\n `- Understand existing code before suggesting modifications`,\n ``,\n `## Minimal Changes`,\n `- Only make changes that are directly requested or clearly necessary`,\n `- Don't add features, refactor code, or make \"improvements\" beyond what was asked`,\n `- Don't add docstrings, comments, or type annotations to code you didn't change`,\n `- Preserve existing code style and conventions`,\n ``,\n );\n\n const builtInCount = tools.length;\n const mcpCount = mcpTools.length;\n const discoveryCount = 2;\n\n parts.push(\n `# Available Tools`,\n ``,\n `You have ${allToolNames.length} tools available:`,\n `- **Built-in**: ${builtInCount} tools (read_file, write_file, edit_file, glob, grep, ls, shell, task management, memory)`,\n );\n\n if (mcpCount > 0) {\n const serverCount = mcpServerSummaries.length;\n parts.push(`- **MCP**: ${mcpCount} tools from ${serverCount} server(s)`);\n }\n\n if (mcpCount > 0) {\n parts.push(`- **Discovery**: ${discoveryCount} tools (mcp_list_servers, mcp_list_tools)`);\n }\n\n parts.push(\n ``,\n `USE THEM PROACTIVELY.`,\n ``,\n );\n\n if (tools.length > 0) {\n parts.push(`## Built-in Tools`);\n for (const t of tools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n parts.push(``);\n }\n\n if (mcpTools.length > 0) {\n parts.push(`## MCP Tools (External Services)`);\n parts.push(``);\n parts.push(`**⚠️ Important**: Only tools from servers with status \"connected\" are available. Tools from disconnected servers will fail.`);\n parts.push(``);\n\n if (mcpServerSummaries.length > 0) {\n for (const server of mcpServerSummaries) {\n const statusIcon = server.status === 'connected' ? '✓' : '✗';\n parts.push(`### ${statusIcon} ${server.name} (${server.transport}, ${server.status}) — ${server.toolCount} tools`);\n for (const td of server.toolDescriptions) {\n parts.push(`- **${td.name}**: ${td.description}`);\n }\n }\n } else {\n for (const t of mcpTools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n }\n parts.push(`## MCP Discovery Tools`);\n parts.push(`- **mcp_list_servers**: List all connected MCP servers with status and tool counts`);\n parts.push(`- **mcp_list_tools**: List tools from a specific server or all servers`);\n parts.push(``);\n }\n\n parts.push(\n `# Tool Usage Guidelines`,\n ``,\n `## File Operations`,\n `- Use **read_file** to read file contents. Always read before editing.`,\n `- Use **write_file** only to create NEW files. Prefer edit_file for existing files.`,\n `- Use **edit_file** for precise string replacements in existing files.`,\n ` - Provide enough context in old_string to make it unique`,\n ` - Use replace_all=true only when renaming across the file`,\n ``,\n `## Search & Discovery`,\n `- Use **glob** to find files by pattern (e.g., \"**/*.ts\", \"src/**/*.service.ts\")`,\n `- Use **grep** to search content within files (supports regex)`,\n ` - Use context_lines to see surrounding code`,\n ` - Use output_mode=\"files_with_matches\" to just find file paths`,\n `- Use **ls** to list directory contents`,\n `- When looking for something, try glob first, then grep if needed`,\n ``,\n `## Shell Commands`,\n `- Use **shell** for git, npm, docker, and other CLI operations`,\n `- Dangerous commands (rm -rf, sudo, git push --force) require user approval`,\n `- Use **shell_background** for long-running tasks (dev servers, watch mode)`,\n ``,\n `## Task Management`,\n `- Use **task_create** to break complex work into trackable subtasks`,\n `- Use **task_update** to mark tasks as in_progress or completed`,\n `- Use **task_list** to see all tasks and their status`,\n `- Use **ask_user_question** when you need clarification BEFORE acting`,\n ``,\n `## Memory`,\n `- Use **memory_write** to save important learnings and project insights`,\n `- Use **memory_read** to recall previously saved notes`,\n `- Memory persists across sessions — use it to avoid repeating mistakes`,\n ``,\n );\n\n if (mcpTools.length > 0) {\n parts.push(\n `# MCP Integration Protocol`,\n ``,\n `MCP (Model Context Protocol) tools connect you to external services. They work exactly like built-in tools but reach outside the local filesystem.`,\n ``,\n `## Connected Servers`,\n );\n if (mcpServerSummaries.length > 0) {\n for (const s of mcpServerSummaries) {\n parts.push(`- **${s.name}** (${s.transport}, ${s.status}) — ${s.toolCount} tools`);\n }\n }\n parts.push(\n ``,\n `## When to Use MCP vs Built-in`,\n `| Need | Use |`,\n `|------|-----|`,\n `| Read/write local files | Built-in (read_file, write_file, edit_file) |`,\n `| Search local codebase | Built-in (glob, grep) |`,\n `| Run commands | Built-in (shell) |`,\n `| Interact with external APIs/services | MCP tools |`,\n `| Discover available MCP capabilities | mcp_list_servers, mcp_list_tools |`,\n ``,\n `## MCP Tool Naming Convention`,\n `MCP tools follow the pattern \\`{server}_{tool}\\` (e.g., \\`figma_get_file\\`, \\`github_create_issue\\`).`,\n `The prefix tells you which server provides the tool.`,\n ``,\n `## Discovery`,\n `- Use **mcp_list_servers** to see which servers are connected and their status`,\n `- Use **mcp_list_tools** to explore what tools a server provides (with descriptions)`,\n `- When you're unsure which MCP tool to use, call mcp_list_tools first`,\n ``,\n `## Error Handling`,\n `- If an MCP tool returns an error, check the server status with mcp_list_servers`,\n `- MCP servers can disconnect — if a tool fails, the server may need reconnection`,\n `- Report MCP errors to the user and suggest they check /mcp list in the REPL`,\n ``,\n );\n }\n\n parts.push(\n `# Planning Protocol`,\n ``,\n `## When to Enter Plan Mode`,\n `Use **enter_plan_mode** when:`,\n `- Task touches 3+ files`,\n `- Task involves new features or architecture changes`,\n `- Task is ambiguous and needs scope definition`,\n `- User explicitly asks for a plan`,\n ``,\n `Do NOT plan for: simple fixes, single-file edits, questions, explanations`,\n ``,\n `## Plan Mode Workflow`,\n `1. **enter_plan_mode** — signals you are planning`,\n `2. **Explore rapidly**: Use glob and grep efficiently to understand codebase`,\n `3. **Design**: Create structured plan with specific file changes and order`,\n `4. **exit_plan_mode** — present plan for approval`,\n `5. **Execute immediately** after approval without asking for further confirmation`,\n ``,\n `## Critical: Autonomous Execution`,\n `AFTER the user approves your plan, you MUST:`,\n `- Start implementing immediately`,\n `- Create tasks and execute them sequentially`,\n `- Do NOT ask \"should I proceed?\" or \"ready to start?\"`,\n `- Do NOT wait for additional confirmation`,\n `- Just execute the approved plan autonomously`,\n ``,\n `## Plan Quality Rules`,\n `- Specify WHAT changes and WHY for each file`,\n `- Order by dependency (foundations first)`,\n `- Include verification at the end`,\n `- Use ask_user_question ONLY to clarify requirements, not to ask for permission to execute`,\n ``,\n );\n\n if (subagents.length > 0) {\n parts.push(\n `# Sub-Agent Orchestration`,\n ``,\n `You have ${subagents.length} specialized sub-agents available. Each has domain-specific knowledge and tools.`,\n ``,\n `## Available Sub-Agents`,\n );\n for (const sa of subagents) {\n const mcpAnnotation = sa.mcp && sa.mcp.length > 0 ? ` [MCP: ${sa.mcp.join(', ')}]` : '';\n parts.push(`- **${sa.name}**: ${sa.description}${mcpAnnotation}`);\n }\n parts.push(\n ``,\n `## When to Delegate to Sub-Agents`,\n `- Task requires specialized domain knowledge (React, testing, API design, databases)`,\n `- Multiple independent subtasks can be worked on in parallel`,\n `- Task is well-defined and self-contained (a sub-agent can complete it without further guidance)`,\n `- You want a focused review or analysis (e.g., code review, architecture review)`,\n ``,\n `## When NOT to Delegate`,\n `- Simple tasks you can do yourself quickly`,\n `- Tasks that require back-and-forth with the user`,\n `- Tasks that depend heavily on earlier context in this conversation`,\n ``,\n `## Delegation Pattern`,\n `1. Identify the task and which sub-agent is best suited`,\n `2. Create a clear, specific task description with all necessary context`,\n `3. Delegate execution to that sub-agent (do not stop at planning only)`,\n `4. Track delegated work with task_create/task_update`,\n `5. When the sub-agent returns, verify the result and integrate it`,\n `6. Mark the task as completed`,\n ``,\n `## Delegation Quality Bar`,\n `- If user explicitly asks to use a specific sub-agent, you MUST delegate to it`,\n `- For frontend UI generation from Figma, prefer the frontend sub-agent when available`,\n `- Avoid fake delegation: creating tasks without executing delegated work is not enough`,\n `- Return concrete delegated outputs (files changed, decisions made, validations run)`,\n ``,\n `## Multi-Agent Coordination`,\n `For large tasks, you can orchestrate multiple sub-agents:`,\n `1. Break the work into independent pieces`,\n `2. Assign each piece to the most qualified sub-agent`,\n `3. Track progress with task_create/task_update`,\n `4. Integrate results and verify the combined output`,\n ``,\n `## MCP-Aware Delegation`,\n `When a task involves heavy interaction with an external service (e.g., fetching Figma designs, managing GitHub issues):`,\n `- Check which sub-agents have MCP access (annotated with [MCP: name] above)`,\n `- Delegate MCP-heavy work to the sub-agent with the right MCP connection`,\n `- If no sub-agent has the needed MCP, handle it yourself using the MCP tools directly`,\n `- Include the MCP server name in the task description so the sub-agent knows which tools to use`,\n ``,\n );\n }\n\n parts.push(\n `# Execution Protocol`,\n ``,\n `## Exploring a Project`,\n `1. ls the root directory`,\n `2. Read key config files (package.json, tsconfig.json, etc.)`,\n `3. glob to map directory tree with key patterns`,\n `4. Read the most important files (entry points, main modules)`,\n `5. Present a structured summary`,\n `Be EXHAUSTIVE. Read as many files as needed.`,\n ``,\n `## Implementing Changes`,\n `1. Understand the current codebase (read relevant files)`,\n `2. If complex (3+ files): use enter_plan_mode`,\n `3. Create a task list with task_create for each step`,\n `4. Execute each step, marking tasks as completed`,\n `5. Verify changes (re-read edited files, run tests)`,\n `6. Summarize what was done`,\n ``,\n `## Tool Chain Patterns`,\n `- **Find something**: glob → grep → read_file`,\n `- **Edit a file**: read_file → edit_file → read_file (verify)`,\n `- **Explore a module**: ls → glob(\"module/**/*\") → read_file (key files)`,\n `- **Debug an issue**: grep (error) → read_file → edit_file → shell (test)`,\n `- **New feature**: enter_plan_mode → task_create → [implement] → shell (test)`,\n ``,\n `## Thoroughness Rules`,\n `- NEVER give up after one failed search. Try different patterns and approaches.`,\n `- ALWAYS verify changes by re-reading the file after editing.`,\n `- If tests exist, run them after changes: shell(\"npm test\") or equivalent.`,\n `- When you encounter an error, analyze and fix it — don't just report it.`,\n `- If blocked, try a different approach. If still blocked, ask the user.`,\n ``,\n );\n\n parts.push(\n `# Autonomous Decision-Making`,\n ``,\n `You are an autonomous agent. Make decisions proactively:`,\n ``,\n `## Decision Framework`,\n `| Situation | Action |`,\n `|-----------|--------|`,\n `| User asks to implement something | Explore first, then plan if complex |`,\n `| You find a bug while working | Fix it AND mention it to the user |`,\n `| Test fails after your change | Analyze the failure and fix it |`,\n `| Build fails | Read the error, fix the cause |`,\n `| File you need doesn't exist | Search broader, check for alternatives |`,\n `| Task is ambiguous | ask_user_question BEFORE starting |`,\n `| Task has multiple approaches | Briefly explain options, pick the best one |`,\n `| Something could break | Use enter_plan_mode and verify |`,\n ``,\n `## Self-Correction`,\n `- After editing, always re-read the file to verify the change is correct`,\n `- If a tool call fails, understand why and adjust (don't retry the same thing)`,\n `- If your approach isn't working after 3 attempts, step back and reconsider`,\n `- Save important learnings with memory_write so you don't repeat mistakes`,\n ``,\n );\n\n parts.push(\n `# Git Safety Protocol`,\n `- NEVER update git config`,\n `- NEVER run destructive git commands (push --force, reset --hard, clean -f) without explicit user request`,\n `- NEVER skip hooks (--no-verify) unless user explicitly requests it`,\n `- When committing: stage specific files (not \"git add -A\"), write clear commit messages`,\n `- When creating PRs: summarize all commits, not just the latest`,\n ``,\n );\n\n parts.push(\n `# Response Style`,\n `- Be concise in responses but thorough in your work`,\n `- Show your work: mention which tools you're using and why`,\n `- When showing code changes, explain WHAT changed and WHY`,\n `- Use markdown formatting for readability`,\n `- Reference files with their path (e.g., \"In src/main.ts:\")`,\n ``,\n );\n\n parts.push(\n `# User Mentions`,\n `When the user's message contains <file>, <directory>, <url>, or <git> tags,`,\n `these are automatically injected file/directory contents from @ mentions.`,\n `The content inside these tags is REAL and CURRENT — trust it and use it to answer.`,\n `Do NOT re-read a file that was already provided via a mention tag unless you need a different section.`,\n ``,\n );\n\n if (skillKnowledge) {\n const skillSummaries = this.skillRegistry.getSkillSummaries();\n\n parts.push(\n `# Domain Knowledge`,\n ``,\n `You have ${skillSummaries.length} skills loaded:`,\n );\n\n for (const skill of skillSummaries) {\n parts.push(`- **${skill.name}**: ${skill.description}`);\n }\n\n parts.push(\n ``,\n `The following are the complete guidelines from your skill library. These are reference materials — study them to learn patterns, decision frameworks, and anti-patterns for each domain. Use this knowledge when making decisions about how to approach tasks.`,\n ``,\n skillKnowledge,\n ``,\n );\n }\n\n parts.push(\n `# Environment`,\n `- Working directory: ${process.cwd()}`,\n `- Platform: ${process.platform}`,\n `- Node.js: ${process.version}`,\n ``,\n `# Git Status (snapshot)`,\n gitInfo,\n ``,\n );\n\n if (contextPrompt) {\n parts.push(contextPrompt, ``);\n }\n\n if (memoryPrompt) {\n parts.push(\n `# Auto Memory`,\n `These are notes from previous sessions:`,\n memoryPrompt,\n ``,\n );\n }\n\n return parts.join('\\n');\n }\n\n private formatToolStart(toolName: string, input: any): string {\n const dim = '\\x1b[2m';\n const cyan = '\\x1b[36m';\n const reset = '\\x1b[0m';\n const icon = '\\u23bf';\n\n let detail = '';\n\n switch (toolName) {\n case 'read_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'write_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'edit_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'glob':\n detail = input?.pattern ? ` ${input.pattern}` : '';\n if (input?.cwd) detail += ` in ${input.cwd}`;\n break;\n case 'grep':\n detail = input?.pattern ? ` \"${input.pattern}\"` : '';\n if (input?.file_pattern) detail += ` (${input.file_pattern})`;\n break;\n case 'shell':\n if (input?.command) {\n const cmd = input.command.length > 80 ? input.command.slice(0, 80) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'shell_background':\n if (input?.command) {\n const cmd = input.command.length > 60 ? input.command.slice(0, 60) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'ls':\n detail = ` ${input?.directory || input?.path || '.'}`;\n break;\n case 'web_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'web_fetch':\n detail = input?.url ? ` ${input.url}` : '';\n break;\n case 'task_create':\n detail = input?.title ? ` \"${input.title}\"` : '';\n break;\n case 'task_update':\n detail = input?.id ? ` #${input.id} → ${input?.status || ''}` : '';\n break;\n case 'task_list':\n detail = '';\n break;\n case 'task_get':\n detail = input?.id ? ` #${input.id}` : '';\n break;\n case 'ask_user_question':\n detail = input?.question ? ` \"${input.question.slice(0, 50)}${input.question.length > 50 ? '...' : ''}\"` : '';\n break;\n case 'enter_plan_mode':\n detail = ' Starting plan...';\n break;\n case 'exit_plan_mode':\n detail = ' Submitting plan';\n break;\n case 'memory_write':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_read':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'mcp_list_servers':\n detail = ' Listing MCP servers';\n break;\n case 'mcp_list_tools':\n detail = input?.server ? ` server=${input.server}` : ' (all servers)';\n break;\n default:\n if (input) {\n const keys = Object.keys(input);\n if (keys.length > 0) {\n const firstVal = String(input[keys[0]]).slice(0, 60);\n detail = ` ${keys[0]}=${firstVal}`;\n }\n }\n }\n\n return `\\n${dim} ${cyan}${icon}${reset}${dim} ${toolName}${detail}${reset}\\n`;\n }\n\n private formatToolEnd(toolName: string, output: string): string {\n if (!output || output.length === 0) return '';\n\n const dim = '\\x1b[2m';\n const green = '\\x1b[32m';\n const reset = '\\x1b[0m';\n\n switch (toolName) {\n case 'read_file': {\n const lineCount = output.split('\\n').length;\n return `${dim} ${green}\\u2713${reset}${dim} ${lineCount} lines${reset}\\n`;\n }\n case 'write_file':\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n case 'edit_file': {\n if (output.startsWith('Error')) {\n return `${dim} \\x1b[31m${output.slice(0, 150)}${reset}\\n`;\n }\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n }\n case 'glob': {\n const lines = output.split('\\n').filter(l => l.trim());\n const fileCount = lines.length;\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 100)}${reset}`).join('\\n');\n const more = fileCount > 5 ? `\\n${dim} ... (${fileCount - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'grep': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 5 ? `\\n${dim} ... (${lines.length - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'shell':\n case 'shell_background': {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 8).map(l => `${dim} ${l.slice(0, 150)}${reset}`).join('\\n');\n const more = lines.length > 8 ? `\\n${dim} ... (${lines.length - 8} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'ls': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 10).map(l => `${dim} ${l}${reset}`).join('\\n');\n const more = lines.length > 10 ? `\\n${dim} ... (${lines.length - 10} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n default: {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 3).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 3 ? `\\n${dim} ... (${lines.length - 3} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n }\n }\n\n private async autoSummarize(force = false): Promise<boolean> {\n if ((!force && this.messages.length < SUMMARIZE_THRESHOLD) || !this.model) {\n return false;\n }\n\n if (this.messages.length < 4) {\n return false;\n }\n\n const oldMessages = this.messages.slice(0, this.messages.length - KEEP_RECENT);\n const recentMessages = this.messages.slice(this.messages.length - KEEP_RECENT);\n\n const conversationText = oldMessages.map((m) => {\n const role = m._getType() === 'human' ? 'User' : 'Assistant';\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const truncated = content.length > 500 ? content.slice(0, 500) + '...' : content;\n return `${role}: ${truncated}`;\n }).join('\\n');\n\n try {\n const summaryResponse = await this.model.invoke([\n new SystemMessage(\n `You are a conversation summarizer. Produce a concise summary of the following conversation between a user and an AI assistant. Focus on:\n- Key decisions made\n- Files that were read or modified\n- Tasks completed or pending\n- Important context the assistant needs to remember\nKeep the summary under 500 words. Output ONLY the summary, no preamble.`\n ),\n new HumanMessage(conversationText),\n ]);\n\n const summaryText = typeof summaryResponse.content === 'string'\n ? summaryResponse.content\n : JSON.stringify(summaryResponse.content);\n\n this.messages = [\n new SystemMessage(`[Conversation Summary — ${oldMessages.length} messages compacted]\\n\\n${summaryText}`),\n ...recentMessages,\n ];\n\n return true;\n } catch {\n return false;\n }\n }\n\n async *chat(message: string): AsyncGenerator<string> {\n const summarized = await this.autoSummarize();\n if (summarized) {\n yield `\\n\\x1b[2m \\u2500 conversation compacted (${this.messages.length} messages retained)\\x1b[0m\\n`;\n }\n\n this.messages.push(new HumanMessage(message));\n this.lastToolOutputs = [];\n\n let stream: any;\n try {\n stream = this.agent.streamEvents(\n { messages: this.messages },\n { version: 'v2', recursionLimit: RECURSION_LIMIT },\n );\n } catch (error) {\n yield `\\n\\x1b[31m Error starting agent: ${(error as Error).message}\\x1b[0m\\n`;\n return;\n }\n\n let fullResponse = '';\n let lastToolName = '';\n let interactionInputTokens = 0;\n let interactionOutputTokens = 0;\n\n try {\n for await (const event of stream) {\n if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {\n const content = event.data.chunk.content;\n if (typeof content === 'string' && content) {\n yield content;\n fullResponse += content;\n }\n }\n\n if (event.event === 'on_chat_model_end') {\n const output = event.data?.output;\n const usage = output?.usage_metadata\n || output?.response_metadata?.usage;\n if (usage) {\n interactionInputTokens += usage.input_tokens || usage.prompt_tokens || usage.promptTokens || 0;\n interactionOutputTokens += usage.output_tokens || usage.completion_tokens || usage.completionTokens || 0;\n }\n }\n\n if (event.event === 'on_tool_start') {\n lastToolName = event.name;\n yield this.formatToolStart(event.name, event.data?.input);\n }\n\n if (event.event === 'on_tool_end') {\n const raw = event.data?.output;\n let output = '';\n if (typeof raw === 'string') {\n output = raw;\n } else if (raw?.content) {\n output = typeof raw.content === 'string' ? raw.content : JSON.stringify(raw.content);\n } else if (raw?.output) {\n output = typeof raw.output === 'string' ? raw.output : JSON.stringify(raw.output);\n } else if (raw) {\n output = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);\n }\n if (output) {\n this.lastToolOutputs.push({ tool: lastToolName, output });\n yield this.formatToolEnd(lastToolName, output);\n }\n }\n\n if (event.event === 'on_tool_error') {\n const error = event.data?.error;\n yield `\\n\\x1b[31m \\u2717 Error: ${error?.message || 'Unknown error'}\\x1b[0m\\n`;\n }\n }\n } catch (error) {\n const msg = (error as Error).message;\n if (!msg.includes('abort') && !msg.includes('cancel')) {\n yield `\\n\\x1b[31m Stream error: ${msg}\\x1b[0m\\n`;\n }\n }\n\n if (fullResponse) {\n this.messages.push(new AIMessage(fullResponse));\n }\n\n this.tokenCount += interactionInputTokens + interactionOutputTokens;\n\n const fmt = (n: number) => n.toLocaleString();\n yield `\\n\\x1b[2m \\u2500 tokens: ${fmt(interactionInputTokens)} in / ${fmt(interactionOutputTokens)} out (session: ${fmt(this.tokenCount)})\\x1b[0m\\n`;\n }\n\n clearHistory() {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n async compactHistory(): Promise<{ compacted: boolean; messagesBefore: number; messagesAfter: number }> {\n const before = this.messages.length;\n if (before < 4) {\n return { compacted: false, messagesBefore: before, messagesAfter: before };\n }\n const result = await this.autoSummarize(true);\n return { compacted: result, messagesBefore: before, messagesAfter: this.messages.length };\n }\n\n getHistory(): BaseMessage[] {\n return this.messages;\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n getLastToolOutputs(): { tool: string; output: string }[] {\n return this.lastToolOutputs;\n }\n\n async executeTask(task: Task): Promise<{ success: boolean; error?: string }> {\n try {\n const message = `Execute a seguinte tarefa:\\n\\n**${task.subject}**\\n\\n${task.description}\\n\\nCertifique-se de completar a tarefa totalmente e verificar o resultado.`;\n\n let fullResponse = '';\n for await (const chunk of this.chat(message)) {\n fullResponse += chunk;\n process.stdout.write(chunk);\n }\n\n return { success: true };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n}\n"],"names":["DeepAgentService","SUMMARIZE_THRESHOLD","KEEP_RECENT","RECURSION_LIMIT","DEEPAGENT_BUILTIN_TOOLS","Set","initialize","projectPath","projectLoader","detectProject","projectConfig","loadProject","context","projectContext","setContext","mcpConfigs","mcpRegistry","loadConfigs","connectAll","agentsOverridePath","getAgentsOverridePath","legacyAgentsOverridePath","getLegacyAgentsOverridePath","agentRegistry","loadProjectAgents","skillsOverridePath","getSkillsOverridePath","legacySkillsOverridePath","getLegacySkillsOverridePath","skillRegistry","loadProjectSkills","memoryService","model","multiLlmService","createStreamingModel","contextPrompt","getContextPrompt","memoryPrompt","getMemoryPrompt","skillKnowledge","getAllSkillKnowledge","subagents","getSubagentDefinitions","allTools","toolsRegistry","getAllTools","mcpTools","getAllMcpTools","extraTools","filter","t","has","name","mcpDiscoveryTools","getDiscoveryTools","mcpServerSummaries","getServerSummaries","systemPrompt","buildSystemPrompt","cachedSystemPrompt","cachedExtraTools","cachedMcpTools","cachedMcpDiscoveryTools","cachedSubagents","agent","createDeepAgent","tools","backend","FilesystemBackend","rootDir","process","cwd","hasContext","agentCount","length","toolCount","reinitializeModel","getGitStatus","branch","execSync","encoding","trim","status","log","result","gitInfo","allToolNames","map","parts","push","builtInCount","mcpCount","discoveryCount","serverCount","description","server","statusIcon","transport","td","toolDescriptions","s","sa","mcpAnnotation","mcp","join","skillSummaries","getSkillSummaries","skill","platform","version","formatToolStart","toolName","input","dim","cyan","reset","icon","detail","file_path","pattern","file_pattern","command","cmd","slice","directory","path","query","url","title","id","question","key","keys","Object","firstVal","String","formatToolEnd","output","green","lineCount","split","startsWith","lines","l","fileCount","preview","more","autoSummarize","force","messages","oldMessages","recentMessages","conversationText","m","role","_getType","content","JSON","stringify","truncated","summaryResponse","invoke","SystemMessage","HumanMessage","summaryText","chat","message","summarized","lastToolOutputs","stream","streamEvents","recursionLimit","error","fullResponse","lastToolName","interactionInputTokens","interactionOutputTokens","event","data","chunk","usage","usage_metadata","response_metadata","input_tokens","prompt_tokens","promptTokens","output_tokens","completion_tokens","completionTokens","raw","tool","msg","includes","AIMessage","tokenCount","fmt","n","toLocaleString","clearHistory","compactHistory","before","compacted","messagesBefore","messagesAfter","getHistory","getMessageCount","getTokenCount","getLastToolOutputs","executeTask","task","subject","stdout","write","success","markdownRenderer"],"mappings":";;;;+BA2BaA;;;eAAAA;;;wBA3Bc;0BAEyC;+BAC3C;4BAC0B;iCACnB;yCACQ;sCACH;sCACA;oCACF;sCACE;uCACC;sCACD;+BACP;;;;;;;;;;AAK9B,MAAMC,sBAAsB;AAC5B,MAAMC,cAAc;AACpB,MAAMC,kBAAkB;AACxB,MAAMC,0BAA0B,IAAIC,IAAI;IACtC;IAAa;IAAc;IAAa;IAAQ;IAAQ;IACxD;IAAe;CAChB;AAGM,IAAA,AAAML,mBAAN,MAAMA;IAyBX,MAAMM,aAAyC;QAC7C,MAAMC,cAAc,MAAM,IAAI,CAACC,aAAa,CAACC,aAAa;QAE1D,IAAIF,aAAa;YACf,MAAMG,gBAAgB,MAAM,IAAI,CAACF,aAAa,CAACG,WAAW,CAACJ;YAE3D,IAAIG,cAAcE,OAAO,EAAE;gBACzB,IAAI,CAACC,cAAc,CAACC,UAAU,CAACJ,cAAcE,OAAO;YACtD;YAEA,IAAIF,cAAcK,UAAU,EAAE;gBAC5B,IAAI,CAACC,WAAW,CAACC,WAAW,CAACP,cAAcK,UAAU;gBACrD,MAAM,IAAI,CAACC,WAAW,CAACE,UAAU;YACnC;YAEA,MAAMC,qBAAqB,IAAI,CAACX,aAAa,CAACY,qBAAqB,CAACb;YACpE,MAAMc,2BAA2B,IAAI,CAACb,aAAa,CAACc,2BAA2B,CAACf;YAChF,MAAM,IAAI,CAACgB,aAAa,CAACC,iBAAiB,CAACL;YAC3C,MAAM,IAAI,CAACI,aAAa,CAACC,iBAAiB,CAACH;YAE3C,MAAMI,qBAAqB,IAAI,CAACjB,aAAa,CAACkB,qBAAqB,CAACnB;YACpE,MAAMoB,2BAA2B,IAAI,CAACnB,aAAa,CAACoB,2BAA2B,CAACrB;YAChF,MAAM,IAAI,CAACsB,aAAa,CAACC,iBAAiB,CAACL;YAC3C,MAAM,IAAI,CAACI,aAAa,CAACC,iBAAiB,CAACH;YAE3C,MAAM,IAAI,CAACI,aAAa,CAACzB,UAAU,CAACC;QACtC;QAEA,IAAI,CAACyB,KAAK,GAAG,IAAI,CAACC,eAAe,CAACC,oBAAoB,CAAC;QAEvD,MAAMC,gBAAgB,IAAI,CAACtB,cAAc,CAACuB,gBAAgB;QAC1D,MAAMC,eAAe,MAAM,IAAI,CAACN,aAAa,CAACO,eAAe;QAC7D,MAAMC,iBAAiB,IAAI,CAACV,aAAa,CAACW,oBAAoB;QAC9D,MAAMC,YAAY,IAAI,CAAClB,aAAa,CAACmB,sBAAsB,CAACP;QAC5D,MAAMQ,WAAW,IAAI,CAACC,aAAa,CAACC,WAAW;QAC/C,MAAMC,WAAW,IAAI,CAAC9B,WAAW,CAAC+B,cAAc;QAEhD,MAAMC,aAAaL,SAASM,MAAM,CAACC,CAAAA,IAAK,CAAC9C,wBAAwB+C,GAAG,CAACD,EAAEE,IAAI;QAC3E,MAAMC,oBAAoB,IAAI,CAACrC,WAAW,CAACsC,iBAAiB;QAC5D,MAAMC,qBAAqB,IAAI,CAACvC,WAAW,CAACwC,kBAAkB;QAE9D,MAAMC,eAAe,IAAI,CAACC,iBAAiB,CAACvB,eAAeE,cAAcE,gBAAgBE,WAAWE,UAAUG,UAAUS;QAExH,IAAI,CAACI,kBAAkB,GAAGF;QAC1B,IAAI,CAACG,gBAAgB,GAAGZ;QACxB,IAAI,CAACa,cAAc,GAAGf;QACtB,IAAI,CAACgB,uBAAuB,GAAGT;QAC/B,IAAI,CAACU,eAAe,GAAGtB;QAEvB,IAAI,CAACuB,KAAK,GAAGC,IAAAA,2BAAe,EAAC;YAC3BjC,OAAO,IAAI,CAACA,KAAK;YACjByB;YACAS,OAAO;mBAAIlB;mBAAeF;mBAAaO;aAAkB;YACzDZ;YACA0B,SAAS,IAAM,IAAIC,6BAAiB,CAAC;oBAAEC,SAASC,QAAQC,GAAG;gBAAG;QAChE;QAEA,OAAO;YACLhE;YACAiE,YAAY,IAAI,CAAC3D,cAAc,CAAC2D,UAAU;YAC1CC,YAAYhC,UAAUiC,MAAM;YAC5BC,WAAW3B,WAAW0B,MAAM,GAAG5B,SAAS4B,MAAM;QAChD;IACF;IAEA,MAAME,oBAAmC;QACvC,IAAI,CAAC5C,KAAK,GAAG,IAAI,CAACC,eAAe,CAACC,oBAAoB,CAAC;QACvD,IAAI,CAAC8B,KAAK,GAAGC,IAAAA,2BAAe,EAAC;YAC3BjC,OAAO,IAAI,CAACA,KAAK;YACjByB,cAAc,IAAI,CAACE,kBAAkB;YACrCO,OAAO;mBAAI,IAAI,CAACN,gBAAgB;mBAAK,IAAI,CAACC,cAAc;mBAAK,IAAI,CAACC,uBAAuB;aAAC;YAC1FrB,WAAW,IAAI,CAACsB,eAAe;YAC/BI,SAAS,IAAM,IAAIC,6BAAiB,CAAC;oBAAEC,SAASC,QAAQC,GAAG;gBAAG;QAChE;IACF;IAEQM,eAAuB;QAC7B,IAAI;YACF,MAAMC,SAASC,IAAAA,uBAAQ,EAAC,+CAA+C;gBACrEC,UAAU;gBACVT,KAAKD,QAAQC,GAAG;YAClB,GAAGU,IAAI;YACP,MAAMC,SAASH,IAAAA,uBAAQ,EAAC,kCAAkC;gBACxDC,UAAU;gBACVT,KAAKD,QAAQC,GAAG;YAClB,GAAGU,IAAI;YACP,MAAME,MAAMJ,IAAAA,uBAAQ,EAAC,oCAAoC;gBACvDC,UAAU;gBACVT,KAAKD,QAAQC,GAAG;YAClB,GAAGU,IAAI;YAEP,IAAIG,SAAS,CAAC,QAAQ,EAAEN,QAAQ;YAChC,IAAII,QAAQ;gBACVE,UAAU,CAAC,YAAY,EAAEF,QAAQ;YACnC,OAAO;gBACLE,UAAU,CAAC,eAAe,CAAC;YAC7B;YACA,IAAID,KAAK;gBACPC,UAAU,CAAC,mBAAmB,EAAED,KAAK;YACvC;YACA,OAAOC;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEQ1B,kBACNvB,aAAqB,EACrBE,YAAoB,EACpBE,cAAsB,EACtBE,SAAgB,EAChByB,KAAY,EACZpB,QAAe,EACfS,qBAAyC,EAAE,EACnC;QACR,MAAM8B,UAAU,IAAI,CAACR,YAAY;QACjC,MAAMS,eAAe;eAChBpB,MAAMqB,GAAG,CAAC,CAACrC,IAAWA,EAAEE,IAAI;eAC5BN,SAASyC,GAAG,CAAC,CAACrC,IAAWA,EAAEE,IAAI;SACnC;QAED,MAAMoC,QAAkB,EAAE;QAE1BA,MAAMC,IAAI,CACR,CAAC,sEAAsE,CAAC,EACxE,CAAC,4SAA4S,CAAC,EAC9S,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,gBAAgB,CAAC,EAClB,EAAE,EACF,CAAC,8BAA8B,CAAC,EAChC,CAAC,iFAAiF,CAAC,EACnF,CAAC,4EAA4E,CAAC,EAC9E,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,0FAA0F,CAAC,EAC5F,EAAE,EACF,CAAC,mBAAmB,CAAC,EACrB,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yDAAyD,CAAC,EAC3D,CAAC,0DAA0D,CAAC,EAC5D,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,oEAAoE,CAAC,EACtE,CAAC,iFAAiF,CAAC,EACnF,CAAC,+EAA+E,CAAC,EACjF,CAAC,8CAA8C,CAAC,EAChD,EAAE;QAGJ,MAAMC,eAAexB,MAAMQ,MAAM;QACjC,MAAMiB,WAAW7C,SAAS4B,MAAM;QAChC,MAAMkB,iBAAiB;QAEvBJ,MAAMC,IAAI,CACR,CAAC,iBAAiB,CAAC,EACnB,EAAE,EACF,CAAC,SAAS,EAAEH,aAAaZ,MAAM,CAAC,iBAAiB,CAAC,EAClD,CAAC,gBAAgB,EAAEgB,aAAa,yFAAyF,CAAC;QAG5H,IAAIC,WAAW,GAAG;YAChB,MAAME,cAActC,mBAAmBmB,MAAM;YAC7Cc,MAAMC,IAAI,CAAC,CAAC,WAAW,EAAEE,SAAS,YAAY,EAAEE,YAAY,UAAU,CAAC;QACzE;QAEA,IAAIF,WAAW,GAAG;YAChBH,MAAMC,IAAI,CAAC,CAAC,iBAAiB,EAAEG,eAAe,yCAAyC,CAAC;QAC1F;QAEAJ,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,EAAE;QAGJ,IAAIvB,MAAMQ,MAAM,GAAG,GAAG;YACpBc,MAAMC,IAAI,CAAC,CAAC,iBAAiB,CAAC;YAC9B,KAAK,MAAMvC,KAAKgB,MAAO;gBACrBsB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEvC,EAAEE,IAAI,CAAC,IAAI,EAAEF,EAAE4C,WAAW,EAAE;YAChD;YACAN,MAAMC,IAAI,CAAC,EAAE;QACf;QAEA,IAAI3C,SAAS4B,MAAM,GAAG,GAAG;YACvBc,MAAMC,IAAI,CAAC,CAAC,gCAAgC,CAAC;YAC7CD,MAAMC,IAAI,CAAC,EAAE;YACbD,MAAMC,IAAI,CAAC,CAAC,2HAA2H,CAAC;YACxID,MAAMC,IAAI,CAAC,EAAE;YAEb,IAAIlC,mBAAmBmB,MAAM,GAAG,GAAG;gBACjC,KAAK,MAAMqB,UAAUxC,mBAAoB;oBACvC,MAAMyC,aAAaD,OAAOb,MAAM,KAAK,cAAc,MAAM;oBACzDM,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEO,WAAW,CAAC,EAAED,OAAO3C,IAAI,CAAC,EAAE,EAAE2C,OAAOE,SAAS,CAAC,EAAE,EAAEF,OAAOb,MAAM,CAAC,IAAI,EAAEa,OAAOpB,SAAS,CAAC,MAAM,CAAC;oBACjH,KAAK,MAAMuB,MAAMH,OAAOI,gBAAgB,CAAE;wBACxCX,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAES,GAAG9C,IAAI,CAAC,IAAI,EAAE8C,GAAGJ,WAAW,EAAE;oBAClD;gBACF;YACF,OAAO;gBACL,KAAK,MAAM5C,KAAKJ,SAAU;oBACxB0C,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEvC,EAAEE,IAAI,CAAC,IAAI,EAAEF,EAAE4C,WAAW,EAAE;gBAChD;YACF;YACAN,MAAMC,IAAI,CAAC,CAAC,sBAAsB,CAAC;YACnCD,MAAMC,IAAI,CAAC,CAAC,kFAAkF,CAAC;YAC/FD,MAAMC,IAAI,CAAC,CAAC,sEAAsE,CAAC;YACnFD,MAAMC,IAAI,CAAC,EAAE;QACf;QAEAD,MAAMC,IAAI,CACR,CAAC,uBAAuB,CAAC,EACzB,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,sEAAsE,CAAC,EACxE,CAAC,mFAAmF,CAAC,EACrF,CAAC,sEAAsE,CAAC,EACxE,CAAC,0DAA0D,CAAC,EAC5D,CAAC,2DAA2D,CAAC,EAC7D,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,gFAAgF,CAAC,EAClF,CAAC,8DAA8D,CAAC,EAChE,CAAC,6CAA6C,CAAC,EAC/C,CAAC,gEAAgE,CAAC,EAClE,CAAC,uCAAuC,CAAC,EACzC,CAAC,iEAAiE,CAAC,EACnE,EAAE,EACF,CAAC,iBAAiB,CAAC,EACnB,CAAC,8DAA8D,CAAC,EAChE,CAAC,2EAA2E,CAAC,EAC7E,CAAC,2EAA2E,CAAC,EAC7E,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,mEAAmE,CAAC,EACrE,CAAC,+DAA+D,CAAC,EACjE,CAAC,qDAAqD,CAAC,EACvD,CAAC,qEAAqE,CAAC,EACvE,EAAE,EACF,CAAC,SAAS,CAAC,EACX,CAAC,uEAAuE,CAAC,EACzE,CAAC,sDAAsD,CAAC,EACxD,CAAC,sEAAsE,CAAC,EACxE,EAAE;QAGJ,IAAI3C,SAAS4B,MAAM,GAAG,GAAG;YACvBc,MAAMC,IAAI,CACR,CAAC,0BAA0B,CAAC,EAC5B,EAAE,EACF,CAAC,kJAAkJ,CAAC,EACpJ,EAAE,EACF,CAAC,oBAAoB,CAAC;YAExB,IAAIlC,mBAAmBmB,MAAM,GAAG,GAAG;gBACjC,KAAK,MAAM0B,KAAK7C,mBAAoB;oBAClCiC,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEW,EAAEhD,IAAI,CAAC,IAAI,EAAEgD,EAAEH,SAAS,CAAC,EAAE,EAAEG,EAAElB,MAAM,CAAC,IAAI,EAAEkB,EAAEzB,SAAS,CAAC,MAAM,CAAC;gBACnF;YACF;YACAa,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,8BAA8B,CAAC,EAChC,CAAC,cAAc,CAAC,EAChB,CAAC,cAAc,CAAC,EAChB,CAAC,wEAAwE,CAAC,EAC1E,CAAC,iDAAiD,CAAC,EACnD,CAAC,mCAAmC,CAAC,EACrC,CAAC,oDAAoD,CAAC,EACtD,CAAC,0EAA0E,CAAC,EAC5E,EAAE,EACF,CAAC,6BAA6B,CAAC,EAC/B,CAAC,qGAAqG,CAAC,EACvG,CAAC,oDAAoD,CAAC,EACtD,EAAE,EACF,CAAC,YAAY,CAAC,EACd,CAAC,8EAA8E,CAAC,EAChF,CAAC,oFAAoF,CAAC,EACtF,CAAC,qEAAqE,CAAC,EACvE,EAAE,EACF,CAAC,iBAAiB,CAAC,EACnB,CAAC,gFAAgF,CAAC,EAClF,CAAC,gFAAgF,CAAC,EAClF,CAAC,4EAA4E,CAAC,EAC9E,EAAE;QAEN;QAEAD,MAAMC,IAAI,CACR,CAAC,mBAAmB,CAAC,EACrB,EAAE,EACF,CAAC,0BAA0B,CAAC,EAC5B,CAAC,6BAA6B,CAAC,EAC/B,CAAC,uBAAuB,CAAC,EACzB,CAAC,oDAAoD,CAAC,EACtD,CAAC,8CAA8C,CAAC,EAChD,CAAC,iCAAiC,CAAC,EACnC,EAAE,EACF,CAAC,yEAAyE,CAAC,EAC3E,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,iDAAiD,CAAC,EACnD,CAAC,4EAA4E,CAAC,EAC9E,CAAC,0EAA0E,CAAC,EAC5E,CAAC,iDAAiD,CAAC,EACnD,CAAC,iFAAiF,CAAC,EACnF,EAAE,EACF,CAAC,iCAAiC,CAAC,EACnC,CAAC,4CAA4C,CAAC,EAC9C,CAAC,gCAAgC,CAAC,EAClC,CAAC,4CAA4C,CAAC,EAC9C,CAAC,qDAAqD,CAAC,EACvD,CAAC,yCAAyC,CAAC,EAC3C,CAAC,6CAA6C,CAAC,EAC/C,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,4CAA4C,CAAC,EAC9C,CAAC,yCAAyC,CAAC,EAC3C,CAAC,iCAAiC,CAAC,EACnC,CAAC,0FAA0F,CAAC,EAC5F,EAAE;QAGJ,IAAIhD,UAAUiC,MAAM,GAAG,GAAG;YACxBc,MAAMC,IAAI,CACR,CAAC,yBAAyB,CAAC,EAC3B,EAAE,EACF,CAAC,SAAS,EAAEhD,UAAUiC,MAAM,CAAC,gFAAgF,CAAC,EAC9G,EAAE,EACF,CAAC,uBAAuB,CAAC;YAE3B,KAAK,MAAM2B,MAAM5D,UAAW;gBAC1B,MAAM6D,gBAAgBD,GAAGE,GAAG,IAAIF,GAAGE,GAAG,CAAC7B,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE2B,GAAGE,GAAG,CAACC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG;gBACrFhB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEY,GAAGjD,IAAI,CAAC,IAAI,EAAEiD,GAAGP,WAAW,GAAGQ,eAAe;YAClE;YACAd,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,iCAAiC,CAAC,EACnC,CAAC,oFAAoF,CAAC,EACtF,CAAC,4DAA4D,CAAC,EAC9D,CAAC,gGAAgG,CAAC,EAClG,CAAC,gFAAgF,CAAC,EAClF,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,0CAA0C,CAAC,EAC5C,CAAC,iDAAiD,CAAC,EACnD,CAAC,mEAAmE,CAAC,EACrE,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,uDAAuD,CAAC,EACzD,CAAC,uEAAuE,CAAC,EACzE,CAAC,sEAAsE,CAAC,EACxE,CAAC,oDAAoD,CAAC,EACtD,CAAC,iEAAiE,CAAC,EACnE,CAAC,6BAA6B,CAAC,EAC/B,EAAE,EACF,CAAC,yBAAyB,CAAC,EAC3B,CAAC,8EAA8E,CAAC,EAChF,CAAC,qFAAqF,CAAC,EACvF,CAAC,sFAAsF,CAAC,EACxF,CAAC,oFAAoF,CAAC,EACtF,EAAE,EACF,CAAC,2BAA2B,CAAC,EAC7B,CAAC,yDAAyD,CAAC,EAC3D,CAAC,yCAAyC,CAAC,EAC3C,CAAC,oDAAoD,CAAC,EACtD,CAAC,8CAA8C,CAAC,EAChD,CAAC,mDAAmD,CAAC,EACrD,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,uHAAuH,CAAC,EACzH,CAAC,2EAA2E,CAAC,EAC7E,CAAC,wEAAwE,CAAC,EAC1E,CAAC,qFAAqF,CAAC,EACvF,CAAC,+FAA+F,CAAC,EACjG,EAAE;QAEN;QAEAD,MAAMC,IAAI,CACR,CAAC,oBAAoB,CAAC,EACtB,EAAE,EACF,CAAC,sBAAsB,CAAC,EACxB,CAAC,wBAAwB,CAAC,EAC1B,CAAC,4DAA4D,CAAC,EAC9D,CAAC,+CAA+C,CAAC,EACjD,CAAC,6DAA6D,CAAC,EAC/D,CAAC,+BAA+B,CAAC,EACjC,CAAC,4CAA4C,CAAC,EAC9C,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,wDAAwD,CAAC,EAC1D,CAAC,6CAA6C,CAAC,EAC/C,CAAC,oDAAoD,CAAC,EACtD,CAAC,gDAAgD,CAAC,EAClD,CAAC,mDAAmD,CAAC,EACrD,CAAC,0BAA0B,CAAC,EAC5B,EAAE,EACF,CAAC,sBAAsB,CAAC,EACxB,CAAC,6CAA6C,CAAC,EAC/C,CAAC,6DAA6D,CAAC,EAC/D,CAAC,wEAAwE,CAAC,EAC1E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,6EAA6E,CAAC,EAC/E,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,+EAA+E,CAAC,EACjF,CAAC,6DAA6D,CAAC,EAC/D,CAAC,0EAA0E,CAAC,EAC5E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,uEAAuE,CAAC,EACzE,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,4BAA4B,CAAC,EAC9B,EAAE,EACF,CAAC,wDAAwD,CAAC,EAC1D,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,sBAAsB,CAAC,EACxB,CAAC,sBAAsB,CAAC,EACxB,CAAC,0EAA0E,CAAC,EAC5E,CAAC,oEAAoE,CAAC,EACtE,CAAC,iEAAiE,CAAC,EACnE,CAAC,+CAA+C,CAAC,EACjD,CAAC,wEAAwE,CAAC,EAC1E,CAAC,yDAAyD,CAAC,EAC3D,CAAC,6EAA6E,CAAC,EAC/E,CAAC,0DAA0D,CAAC,EAC5D,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,wEAAwE,CAAC,EAC1E,CAAC,8EAA8E,CAAC,EAChF,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,qBAAqB,CAAC,EACvB,CAAC,yBAAyB,CAAC,EAC3B,CAAC,yGAAyG,CAAC,EAC3G,CAAC,mEAAmE,CAAC,EACrE,CAAC,uFAAuF,CAAC,EACzF,CAAC,+DAA+D,CAAC,EACjE,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,gBAAgB,CAAC,EAClB,CAAC,mDAAmD,CAAC,EACrD,CAAC,0DAA0D,CAAC,EAC5D,CAAC,yDAAyD,CAAC,EAC3D,CAAC,yCAAyC,CAAC,EAC3C,CAAC,2DAA2D,CAAC,EAC7D,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,eAAe,CAAC,EACjB,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,kFAAkF,CAAC,EACpF,CAAC,sGAAsG,CAAC,EACxG,EAAE;QAGJ,IAAIlD,gBAAgB;YAClB,MAAMkE,iBAAiB,IAAI,CAAC5E,aAAa,CAAC6E,iBAAiB;YAE3DlB,MAAMC,IAAI,CACR,CAAC,kBAAkB,CAAC,EACpB,EAAE,EACF,CAAC,SAAS,EAAEgB,eAAe/B,MAAM,CAAC,eAAe,CAAC;YAGpD,KAAK,MAAMiC,SAASF,eAAgB;gBAClCjB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEkB,MAAMvD,IAAI,CAAC,IAAI,EAAEuD,MAAMb,WAAW,EAAE;YACxD;YAEAN,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,8PAA8P,CAAC,EAChQ,EAAE,EACFlD,gBACA,EAAE;QAEN;QAEAiD,MAAMC,IAAI,CACR,CAAC,aAAa,CAAC,EACf,CAAC,qBAAqB,EAAEnB,QAAQC,GAAG,IAAI,EACvC,CAAC,YAAY,EAAED,QAAQsC,QAAQ,EAAE,EACjC,CAAC,WAAW,EAAEtC,QAAQuC,OAAO,EAAE,EAC/B,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzBxB,SACA,EAAE;QAGJ,IAAIlD,eAAe;YACjBqD,MAAMC,IAAI,CAACtD,eAAe,EAAE;QAC9B;QAEA,IAAIE,cAAc;YAChBmD,MAAMC,IAAI,CACR,CAAC,aAAa,CAAC,EACf,CAAC,uCAAuC,CAAC,EACzCpD,cACA,EAAE;QAEN;QAEA,OAAOmD,MAAMgB,IAAI,CAAC;IACpB;IAEQM,gBAAgBC,QAAgB,EAAEC,KAAU,EAAU;QAC5D,MAAMC,MAAM;QACZ,MAAMC,OAAO;QACb,MAAMC,QAAQ;QACd,MAAMC,OAAO;QAEb,IAAIC,SAAS;QAEb,OAAQN;YACN,KAAK;gBACHM,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOO,UAAU,CAAC,CAAC,EAAEP,MAAMO,OAAO,EAAE,GAAG;gBAChD,IAAIP,OAAOzC,KAAK8C,UAAU,CAAC,IAAI,EAAEL,MAAMzC,GAAG,EAAE;gBAC5C;YACF,KAAK;gBACH8C,SAASL,OAAOO,UAAU,CAAC,EAAE,EAAEP,MAAMO,OAAO,CAAC,CAAC,CAAC,GAAG;gBAClD,IAAIP,OAAOQ,cAAcH,UAAU,CAAC,EAAE,EAAEL,MAAMQ,YAAY,CAAC,CAAC,CAAC;gBAC7D;YACF,KAAK;gBACH,IAAIR,OAAOS,SAAS;oBAClB,MAAMC,MAAMV,MAAMS,OAAO,CAAC/C,MAAM,GAAG,KAAKsC,MAAMS,OAAO,CAACE,KAAK,CAAC,GAAG,MAAM,QAAQX,MAAMS,OAAO;oBAC1FJ,SAAS,CAAC,CAAC,EAAEK,KAAK;gBACpB;gBACA;YACF,KAAK;gBACH,IAAIV,OAAOS,SAAS;oBAClB,MAAMC,MAAMV,MAAMS,OAAO,CAAC/C,MAAM,GAAG,KAAKsC,MAAMS,OAAO,CAACE,KAAK,CAAC,GAAG,MAAM,QAAQX,MAAMS,OAAO;oBAC1FJ,SAAS,CAAC,CAAC,EAAEK,KAAK;gBACpB;gBACA;YACF,KAAK;gBACHL,SAAS,CAAC,CAAC,EAAEL,OAAOY,aAAaZ,OAAOa,QAAQ,KAAK;gBACrD;YACF,KAAK;gBACHR,SAASL,OAAOc,QAAQ,CAAC,EAAE,EAAEd,MAAMc,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHT,SAASL,OAAOe,MAAM,CAAC,CAAC,EAAEf,MAAMe,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHV,SAASL,OAAOgB,QAAQ,CAAC,EAAE,EAAEhB,MAAMgB,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHX,SAASL,OAAOiB,KAAK,CAAC,EAAE,EAAEjB,MAAMiB,EAAE,CAAC,GAAG,EAAEjB,OAAO9B,UAAU,IAAI,GAAG;gBAChE;YACF,KAAK;gBACHmC,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOiB,KAAK,CAAC,EAAE,EAAEjB,MAAMiB,EAAE,EAAE,GAAG;gBACvC;YACF,KAAK;gBACHZ,SAASL,OAAOkB,WAAW,CAAC,EAAE,EAAElB,MAAMkB,QAAQ,CAACP,KAAK,CAAC,GAAG,MAAMX,MAAMkB,QAAQ,CAACxD,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,CAAC,GAAG;gBAC3G;YACF,KAAK;gBACH2C,SAAS;gBACT;YACF,KAAK;gBACHA,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOmB,MAAM,CAAC,CAAC,EAAEnB,MAAMmB,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHd,SAASL,OAAOmB,MAAM,CAAC,CAAC,EAAEnB,MAAMmB,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHd,SAASL,OAAOc,QAAQ,CAAC,EAAE,EAAEd,MAAMc,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHT,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOjB,SAAS,CAAC,QAAQ,EAAEiB,MAAMjB,MAAM,EAAE,GAAG;gBACrD;YACF;gBACE,IAAIiB,OAAO;oBACT,MAAMoB,OAAOC,OAAOD,IAAI,CAACpB;oBACzB,IAAIoB,KAAK1D,MAAM,GAAG,GAAG;wBACnB,MAAM4D,WAAWC,OAAOvB,KAAK,CAACoB,IAAI,CAAC,EAAE,CAAC,EAAET,KAAK,CAAC,GAAG;wBACjDN,SAAS,CAAC,CAAC,EAAEe,IAAI,CAAC,EAAE,CAAC,CAAC,EAAEE,UAAU;oBACpC;gBACF;QACJ;QAEA,OAAO,CAAC,EAAE,EAAErB,IAAI,EAAE,EAAEC,OAAOE,OAAOD,QAAQF,IAAI,CAAC,EAAEF,WAAWM,SAASF,MAAM,EAAE,CAAC;IAChF;IAEQqB,cAAczB,QAAgB,EAAE0B,MAAc,EAAU;QAC9D,IAAI,CAACA,UAAUA,OAAO/D,MAAM,KAAK,GAAG,OAAO;QAE3C,MAAMuC,MAAM;QACZ,MAAMyB,QAAQ;QACd,MAAMvB,QAAQ;QAEd,OAAQJ;YACN,KAAK;gBAAa;oBAChB,MAAM4B,YAAYF,OAAOG,KAAK,CAAC,MAAMlE,MAAM;oBAC3C,OAAO,GAAGuC,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAE0B,UAAU,MAAM,EAAExB,MAAM,EAAE,CAAC;gBAC9E;YACA,KAAK;gBACH,OAAO,GAAGF,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;YACnF,KAAK;gBAAa;oBAChB,IAAIsB,OAAOI,UAAU,CAAC,UAAU;wBAC9B,OAAO,GAAG5B,IAAI,YAAY,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;oBAC9D;oBACA,OAAO,GAAGF,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;gBACnF;YACA,KAAK;gBAAQ;oBACX,MAAM2B,QAAQL,OAAOG,KAAK,CAAC,MAAM3F,MAAM,CAAC8F,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAM+D,YAAYF,MAAMpE,MAAM;oBAC9B,MAAMuE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOF,YAAY,IAAI,CAAC,EAAE,EAAE/B,IAAI,SAAS,EAAE+B,YAAY,EAAE,MAAM,EAAE7B,OAAO,GAAG;oBACjF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;gBAAQ;oBACX,MAAMJ,QAAQL,OAAOG,KAAK,CAAC,MAAM3F,MAAM,CAAC8F,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAMgE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMpE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEuC,IAAI,SAAS,EAAE6B,MAAMpE,MAAM,GAAG,EAAE,MAAM,EAAEyC,OAAO,GAAG;oBACvF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;YACL,KAAK;gBAAoB;oBACvB,MAAMJ,QAAQL,OAAOG,KAAK,CAAC;oBAC3B,MAAMK,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMpE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEuC,IAAI,SAAS,EAAE6B,MAAMpE,MAAM,GAAG,EAAE,YAAY,EAAEyC,OAAO,GAAG;oBAC7F,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;gBAAM;oBACT,MAAMJ,QAAQL,OAAOG,KAAK,CAAC,MAAM3F,MAAM,CAAC8F,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAMgE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,IAAIpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,IAAI5B,OAAO,EAAEX,IAAI,CAAC;oBAC3E,MAAM0C,OAAOJ,MAAMpE,MAAM,GAAG,KAAK,CAAC,EAAE,EAAEuC,IAAI,SAAS,EAAE6B,MAAMpE,MAAM,GAAG,GAAG,MAAM,EAAEyC,OAAO,GAAG;oBACzF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA;gBAAS;oBACP,MAAMJ,QAAQL,OAAOG,KAAK,CAAC;oBAC3B,MAAMK,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMpE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEuC,IAAI,SAAS,EAAE6B,MAAMpE,MAAM,GAAG,EAAE,YAAY,EAAEyC,OAAO,GAAG;oBAC7F,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;QACF;IACF;IAEA,MAAcC,cAAcC,QAAQ,KAAK,EAAoB;QAC3D,IAAI,AAAC,CAACA,SAAS,IAAI,CAACC,QAAQ,CAAC3E,MAAM,GAAGzE,uBAAwB,CAAC,IAAI,CAAC+B,KAAK,EAAE;YACzE,OAAO;QACT;QAEA,IAAI,IAAI,CAACqH,QAAQ,CAAC3E,MAAM,GAAG,GAAG;YAC5B,OAAO;QACT;QAEA,MAAM4E,cAAc,IAAI,CAACD,QAAQ,CAAC1B,KAAK,CAAC,GAAG,IAAI,CAAC0B,QAAQ,CAAC3E,MAAM,GAAGxE;QAClE,MAAMqJ,iBAAiB,IAAI,CAACF,QAAQ,CAAC1B,KAAK,CAAC,IAAI,CAAC0B,QAAQ,CAAC3E,MAAM,GAAGxE;QAElE,MAAMsJ,mBAAmBF,YAAY/D,GAAG,CAAC,CAACkE;YACxC,MAAMC,OAAOD,EAAEE,QAAQ,OAAO,UAAU,SAAS;YACjD,MAAMC,UAAU,OAAOH,EAAEG,OAAO,KAAK,WAAWH,EAAEG,OAAO,GAAGC,KAAKC,SAAS,CAACL,EAAEG,OAAO;YACpF,MAAMG,YAAYH,QAAQlF,MAAM,GAAG,MAAMkF,QAAQjC,KAAK,CAAC,GAAG,OAAO,QAAQiC;YACzE,OAAO,GAAGF,KAAK,EAAE,EAAEK,WAAW;QAChC,GAAGvD,IAAI,CAAC;QAER,IAAI;YACF,MAAMwD,kBAAkB,MAAM,IAAI,CAAChI,KAAK,CAACiI,MAAM,CAAC;gBAC9C,IAAIC,uBAAa,CACf,CAAC;;;;;uEAK4D,CAAC;gBAEhE,IAAIC,sBAAY,CAACX;aAClB;YAED,MAAMY,cAAc,OAAOJ,gBAAgBJ,OAAO,KAAK,WACnDI,gBAAgBJ,OAAO,GACvBC,KAAKC,SAAS,CAACE,gBAAgBJ,OAAO;YAE1C,IAAI,CAACP,QAAQ,GAAG;gBACd,IAAIa,uBAAa,CAAC,CAAC,wBAAwB,EAAEZ,YAAY5E,MAAM,CAAC,wBAAwB,EAAE0F,aAAa;mBACpGb;aACJ;YAED,OAAO;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEA,OAAOc,KAAKC,OAAe,EAA0B;QACnD,MAAMC,aAAa,MAAM,IAAI,CAACpB,aAAa;QAC3C,IAAIoB,YAAY;YACd,MAAM,CAAC,0CAA0C,EAAE,IAAI,CAAClB,QAAQ,CAAC3E,MAAM,CAAC,4BAA4B,CAAC;QACvG;QAEA,IAAI,CAAC2E,QAAQ,CAAC5D,IAAI,CAAC,IAAI0E,sBAAY,CAACG;QACpC,IAAI,CAACE,eAAe,GAAG,EAAE;QAEzB,IAAIC;QACJ,IAAI;YACFA,SAAS,IAAI,CAACzG,KAAK,CAAC0G,YAAY,CAC9B;gBAAErB,UAAU,IAAI,CAACA,QAAQ;YAAC,GAC1B;gBAAExC,SAAS;gBAAM8D,gBAAgBxK;YAAgB;QAErD,EAAE,OAAOyK,OAAO;YACd,MAAM,CAAC,kCAAkC,EAAE,AAACA,MAAgBN,OAAO,CAAC,SAAS,CAAC;YAC9E;QACF;QAEA,IAAIO,eAAe;QACnB,IAAIC,eAAe;QACnB,IAAIC,yBAAyB;QAC7B,IAAIC,0BAA0B;QAE9B,IAAI;YACF,WAAW,MAAMC,SAASR,OAAQ;gBAChC,IAAIQ,MAAMA,KAAK,KAAK,0BAA0BA,MAAMC,IAAI,EAAEC,OAAOvB,SAAS;oBACxE,MAAMA,UAAUqB,MAAMC,IAAI,CAACC,KAAK,CAACvB,OAAO;oBACxC,IAAI,OAAOA,YAAY,YAAYA,SAAS;wBAC1C,MAAMA;wBACNiB,gBAAgBjB;oBAClB;gBACF;gBAEA,IAAIqB,MAAMA,KAAK,KAAK,qBAAqB;oBACvC,MAAMxC,SAASwC,MAAMC,IAAI,EAAEzC;oBAC3B,MAAM2C,QAAQ3C,QAAQ4C,kBACjB5C,QAAQ6C,mBAAmBF;oBAChC,IAAIA,OAAO;wBACTL,0BAA0BK,MAAMG,YAAY,IAAIH,MAAMI,aAAa,IAAIJ,MAAMK,YAAY,IAAI;wBAC7FT,2BAA2BI,MAAMM,aAAa,IAAIN,MAAMO,iBAAiB,IAAIP,MAAMQ,gBAAgB,IAAI;oBACzG;gBACF;gBAEA,IAAIX,MAAMA,KAAK,KAAK,iBAAiB;oBACnCH,eAAeG,MAAM7H,IAAI;oBACzB,MAAM,IAAI,CAAC0D,eAAe,CAACmE,MAAM7H,IAAI,EAAE6H,MAAMC,IAAI,EAAElE;gBACrD;gBAEA,IAAIiE,MAAMA,KAAK,KAAK,eAAe;oBACjC,MAAMY,MAAMZ,MAAMC,IAAI,EAAEzC;oBACxB,IAAIA,SAAS;oBACb,IAAI,OAAOoD,QAAQ,UAAU;wBAC3BpD,SAASoD;oBACX,OAAO,IAAIA,KAAKjC,SAAS;wBACvBnB,SAAS,OAAOoD,IAAIjC,OAAO,KAAK,WAAWiC,IAAIjC,OAAO,GAAGC,KAAKC,SAAS,CAAC+B,IAAIjC,OAAO;oBACrF,OAAO,IAAIiC,KAAKpD,QAAQ;wBACtBA,SAAS,OAAOoD,IAAIpD,MAAM,KAAK,WAAWoD,IAAIpD,MAAM,GAAGoB,KAAKC,SAAS,CAAC+B,IAAIpD,MAAM;oBAClF,OAAO,IAAIoD,KAAK;wBACdpD,SAAS,OAAOoD,QAAQ,WAAWhC,KAAKC,SAAS,CAAC+B,OAAOtD,OAAOsD;oBAClE;oBACA,IAAIpD,QAAQ;wBACV,IAAI,CAAC+B,eAAe,CAAC/E,IAAI,CAAC;4BAAEqG,MAAMhB;4BAAcrC;wBAAO;wBACvD,MAAM,IAAI,CAACD,aAAa,CAACsC,cAAcrC;oBACzC;gBACF;gBAEA,IAAIwC,MAAMA,KAAK,KAAK,iBAAiB;oBACnC,MAAML,QAAQK,MAAMC,IAAI,EAAEN;oBAC1B,MAAM,CAAC,0BAA0B,EAAEA,OAAON,WAAW,gBAAgB,SAAS,CAAC;gBACjF;YACF;QACF,EAAE,OAAOM,OAAO;YACd,MAAMmB,MAAM,AAACnB,MAAgBN,OAAO;YACpC,IAAI,CAACyB,IAAIC,QAAQ,CAAC,YAAY,CAACD,IAAIC,QAAQ,CAAC,WAAW;gBACrD,MAAM,CAAC,0BAA0B,EAAED,IAAI,SAAS,CAAC;YACnD;QACF;QAEA,IAAIlB,cAAc;YAChB,IAAI,CAACxB,QAAQ,CAAC5D,IAAI,CAAC,IAAIwG,mBAAS,CAACpB;QACnC;QAEA,IAAI,CAACqB,UAAU,IAAInB,yBAAyBC;QAE5C,MAAMmB,MAAM,CAACC,IAAcA,EAAEC,cAAc;QAC3C,MAAM,CAAC,0BAA0B,EAAEF,IAAIpB,wBAAwB,MAAM,EAAEoB,IAAInB,yBAAyB,eAAe,EAAEmB,IAAI,IAAI,CAACD,UAAU,EAAE,UAAU,CAAC;IACvJ;IAEAI,eAAe;QACb,IAAI,CAACjD,QAAQ,GAAG,EAAE;QAClB,IAAI,CAAC6C,UAAU,GAAG;IACpB;IAEA,MAAMK,iBAAiG;QACrG,MAAMC,SAAS,IAAI,CAACnD,QAAQ,CAAC3E,MAAM;QACnC,IAAI8H,SAAS,GAAG;YACd,OAAO;gBAAEC,WAAW;gBAAOC,gBAAgBF;gBAAQG,eAAeH;YAAO;QAC3E;QACA,MAAMpH,SAAS,MAAM,IAAI,CAAC+D,aAAa,CAAC;QACxC,OAAO;YAAEsD,WAAWrH;YAAQsH,gBAAgBF;YAAQG,eAAe,IAAI,CAACtD,QAAQ,CAAC3E,MAAM;QAAC;IAC1F;IAEAkI,aAA4B;QAC1B,OAAO,IAAI,CAACvD,QAAQ;IACtB;IAEAwD,kBAA0B;QACxB,OAAO,IAAI,CAACxD,QAAQ,CAAC3E,MAAM;IAC7B;IAEAoI,gBAAwB;QACtB,OAAO,IAAI,CAACZ,UAAU;IACxB;IAEAa,qBAAyD;QACvD,OAAO,IAAI,CAACvC,eAAe;IAC7B;IAEA,MAAMwC,YAAYC,IAAU,EAAiD;QAC3E,IAAI;YACF,MAAM3C,UAAU,CAAC,gCAAgC,EAAE2C,KAAKC,OAAO,CAAC,MAAM,EAAED,KAAKnH,WAAW,CAAC,2EAA2E,CAAC;YAErK,IAAI+E,eAAe;YACnB,WAAW,MAAMM,SAAS,IAAI,CAACd,IAAI,CAACC,SAAU;gBAC5CO,gBAAgBM;gBAChB7G,QAAQ6I,MAAM,CAACC,KAAK,CAACjC;YACvB;YAEA,OAAO;gBAAEkC,SAAS;YAAK;QACzB,EAAE,OAAOzC,OAAO;YACd,OAAO;gBAAEyC,SAAS;gBAAOzC,OAAO,AAACA,MAAgBN,OAAO;YAAC;QAC3D;IACF;IA71BA,YACE,AAAiBrI,eAAgC,EACjD,AAAiBV,aAAmC,EACpD,AAAiBqB,aAAmC,EACpD,AAAiB5B,WAA+B,EAChD,AAAiBR,aAAmC,EACpD,AAAiBK,cAAqC,EACtD,AAAiBgB,aAAmC,EACpD,AAAiBE,aAA4B,EAC7C,AAAiBuL,gBAAyC,CAC1D;aATiBrL,kBAAAA;aACAV,gBAAAA;aACAqB,gBAAAA;aACA5B,cAAAA;aACAR,gBAAAA;aACAK,iBAAAA;aACAgB,gBAAAA;aACAE,gBAAAA;aACAuL,mBAAAA;aApBXtL,QAA8B;aAC9BqH,WAA0B,EAAE;aAC5B6C,aAAa;aACb1B,kBAAsD,EAAE;aAExD7G,qBAA6B;aAC7BC,mBAA0B,EAAE;aAC5BC,iBAAwB,EAAE;aAC1BC,0BAAiC,EAAE;aACnCC,kBAAyB,EAAE;IAYhC;AAo1BL"}
|
|
@@ -113,7 +113,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
113
113
|
const headers = {
|
|
114
114
|
'Content-Type': 'application/json'
|
|
115
115
|
};
|
|
116
|
-
// Restore cached Bearer token if available (avoids re-running OAuth on reconnect)
|
|
117
116
|
const provider = new _castoauthprovider.CastOAuthProvider(name);
|
|
118
117
|
const cachedTokens = provider.tokens();
|
|
119
118
|
if (cachedTokens?.access_token) {
|
|
@@ -147,7 +146,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
147
146
|
}
|
|
148
147
|
};
|
|
149
148
|
let initResponse = await doFetch(initBody);
|
|
150
|
-
// If 401: run full OAuth flow, then retry once with the new token
|
|
151
149
|
if (initResponse.status === 401) {
|
|
152
150
|
provider.invalidateCredentials('tokens');
|
|
153
151
|
let authResult = await (0, _auth.auth)(provider, {
|
|
@@ -233,7 +231,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
233
231
|
}
|
|
234
232
|
if (connection.config.type === 'http') {
|
|
235
233
|
const endpoint = connection.config.endpoint;
|
|
236
|
-
// Use headers stored during connectHttp (includes Bearer token + session ID)
|
|
237
234
|
const headers = connection._httpHeaders ?? {
|
|
238
235
|
'Content-Type': 'application/json'
|
|
239
236
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/mcp/services/mcp-client.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { EventEmitter } from 'events';\nimport { spawn, ChildProcess } from 'child_process';\nimport { McpConfig, McpTool, McpConnection } from '../types';\nimport { auth } from '@modelcontextprotocol/sdk/client/auth.js';\nimport { CastOAuthProvider } from './cast-oauth-provider';\n\n@Injectable()\nexport class McpClientService extends EventEmitter {\n private connections: Map<string, McpConnection> = new Map();\n private stdioBuffers: Map<string, string> = new Map();\n private requestIdCounter = 0;\n\n async connect(name: string, config: McpConfig): Promise<boolean> {\n if (this.connections.has(name)) {\n const existing = this.connections.get(name)!;\n if (existing.status === 'connected') {\n return true;\n }\n }\n\n const connection: McpConnection = {\n config,\n tools: [],\n status: 'connecting',\n };\n\n this.connections.set(name, connection);\n\n try {\n if (config.type === 'stdio' && config.command) {\n await this.connectStdio(name, connection);\n } else if (config.type === 'sse' && config.endpoint) {\n throw new Error('SSE transport not yet supported. Use stdio or http instead.');\n } else if (config.type === 'http' && config.endpoint) {\n await this.connectHttp(name, connection);\n }\n\n connection.status = 'connected';\n return true;\n } catch (error) {\n connection.status = 'error';\n return false;\n }\n }\n\n private async connectStdio(name: string, connection: McpConnection): Promise<void> {\n const { command, args = [], env = {} } = connection.config;\n\n const proc = spawn(command!, args, {\n env: { ...process.env, ...env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n connection.process = proc;\n this.stdioBuffers.set(name, '');\n\n proc.stdout?.on('data', (data: Buffer) => {\n const buffer = (this.stdioBuffers.get(name) || '') + data.toString();\n const lines = buffer.split('\\n');\n\n this.stdioBuffers.set(name, lines.pop() || '');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n this.emit(`response:${name}`, parsed);\n } catch {\n }\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && !msg.startsWith('Debugger') && !msg.startsWith('Warning')) {\n console.error(`MCP ${name} stderr:`, msg);\n }\n });\n\n proc.on('close', (code) => {\n connection.status = 'disconnected';\n this.stdioBuffers.delete(name);\n this.emit('disconnected', name);\n\n if (code !== null && code !== 0) {\n setTimeout(() => {\n this.reconnect(name).catch(() => {});\n }, 3000);\n }\n });\n\n await this.sendRequest(name, 'initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n });\n\n const toolsResponse = await this.sendRequest(name, 'tools/list', {});\n connection.tools = toolsResponse?.tools || [];\n }\n\n private async connectHttp(name: string, connection: McpConnection): Promise<void> {\n const endpoint = connection.config.endpoint!;\n\n try {\n new URL(endpoint);\n } catch {\n throw new Error(`Invalid MCP HTTP endpoint: ${endpoint}`);\n }\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Restore cached Bearer token if available (avoids re-running OAuth on reconnect)\n const provider = new CastOAuthProvider(name);\n const cachedTokens = provider.tokens();\n if (cachedTokens?.access_token) {\n headers['Authorization'] = `Bearer ${cachedTokens.access_token}`;\n }\n\n const doFetch = async (body: object, hdrs = headers, timeoutMs = 15000): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(endpoint, {\n method: 'POST',\n headers: hdrs,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n };\n\n const initBody = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n },\n };\n\n let initResponse = await doFetch(initBody);\n\n // If 401: run full OAuth flow, then retry once with the new token\n if (initResponse.status === 401) {\n provider.invalidateCredentials('tokens');\n\n let authResult = await auth(provider, { serverUrl: endpoint });\n\n if (authResult === 'REDIRECT') {\n this.emit('oauth:browser-opened', name, provider.redirectUrl);\n const code = await provider.waitForCallback();\n authResult = await auth(provider, { serverUrl: endpoint, authorizationCode: code });\n }\n\n if (authResult !== 'AUTHORIZED') {\n throw new Error(`OAuth failed for ${name}`);\n }\n\n const tokens = provider.tokens();\n if (!tokens?.access_token) {\n throw new Error(`No access token for ${name} after OAuth`);\n }\n\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n initResponse = await doFetch(initBody);\n }\n\n if (!initResponse.ok) {\n throw new Error(`HTTP MCP init failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('mcp-session-id');\n if (sessionId) headers['Mcp-Session-Id'] = sessionId;\n\n const toolsResponse = await doFetch({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/list',\n params: {},\n });\n\n if (toolsResponse.ok) {\n const data = await toolsResponse.json();\n connection.tools = data.result?.tools || data.tools || [];\n }\n\n (connection as any)._httpHeaders = headers;\n }\n\n private sendRequest(\n name: string,\n method: string,\n params: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(name);\n\n if (!connection?.process) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n const id = this.nextId();\n const request = JSON.stringify({ jsonrpc: '2.0', id, method, params });\n let resolved = false;\n\n const handler = (response: any) => {\n if (response.id === id && !resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(response.result);\n }\n };\n\n this.on(`response:${name}`, handler);\n (connection.process as ChildProcess).stdin?.write(request + '\\n');\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(null);\n }\n }, 15000);\n });\n }\n\n async callTool(\n mcpName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(mcpName);\n\n if (!connection || connection.status !== 'connected') {\n throw new Error(`MCP ${mcpName} not connected`);\n }\n\n if (connection.config.type === 'stdio') {\n return this.sendRequest(mcpName, 'tools/call', { name: toolName, arguments: args });\n }\n\n if (connection.config.type === 'http') {\n const endpoint = connection.config.endpoint!;\n // Use headers stored during connectHttp (includes Bearer token + session ID)\n const headers: Record<string, string> = (connection as any)._httpHeaders ?? {\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n }),\n });\n\n const data = await response.json();\n return data.result || data;\n }\n\n return null;\n }\n\n getTools(name: string): McpTool[] {\n return this.connections.get(name)?.tools || [];\n }\n\n getStatus(name: string): string {\n return this.connections.get(name)?.status || 'unknown';\n }\n\n getAuthUrl(name: string): string | undefined {\n return this.connections.get(name)?.authUrl;\n }\n\n getAllStatuses(): Map<string, string> {\n const statuses = new Map<string, string>();\n for (const [name, conn] of this.connections) {\n statuses.set(name, conn.status);\n }\n return statuses;\n }\n\n private async reconnect(name: string): Promise<boolean> {\n const connection = this.connections.get(name);\n if (!connection) return false;\n\n if (connection.process) {\n try {\n (connection.process as ChildProcess).kill();\n } catch {}\n }\n\n connection.status = 'connecting';\n try {\n if (connection.config.type === 'stdio') {\n await this.connectStdio(name, connection);\n } else if (connection.config.type === 'http') {\n await this.connectHttp(name, connection);\n }\n connection.status = 'connected';\n this.emit('reconnected', name);\n return true;\n } catch {\n connection.status = 'error';\n return false;\n }\n }\n\n disconnect(name: string) {\n const connection = this.connections.get(name);\n\n if (connection?.process) {\n (connection.process as ChildProcess).kill();\n }\n\n this.stdioBuffers.delete(name);\n this.connections.delete(name);\n }\n\n disconnectAll() {\n for (const name of this.connections.keys()) {\n this.disconnect(name);\n }\n }\n\n private nextId(): string {\n return `${++this.requestIdCounter}`;\n }\n}\n"],"names":["McpClientService","EventEmitter","connect","name","config","connections","has","existing","get","status","connection","tools","set","type","command","connectStdio","endpoint","Error","connectHttp","error","args","env","proc","spawn","process","stdio","stdioBuffers","stdout","on","data","buffer","toString","lines","split","pop","line","trimmed","trim","parsed","JSON","parse","emit","stderr","msg","startsWith","console","code","delete","setTimeout","reconnect","catch","sendRequest","protocolVersion","capabilities","clientInfo","version","toolsResponse","URL","headers","provider","CastOAuthProvider","cachedTokens","tokens","access_token","doFetch","body","hdrs","timeoutMs","controller","AbortController","timer","abort","fetch","method","stringify","signal","clearTimeout","initBody","jsonrpc","id","nextId","params","initResponse","invalidateCredentials","authResult","auth","serverUrl","redirectUrl","waitForCallback","authorizationCode","ok","statusText","sessionId","json","result","_httpHeaders","Promise","resolve","request","resolved","handler","response","off","stdin","write","callTool","mcpName","toolName","arguments","getTools","getStatus","getAuthUrl","authUrl","getAllStatuses","statuses","Map","conn","kill","disconnect","disconnectAll","keys","requestIdCounter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/mcp/services/mcp-client.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { EventEmitter } from 'events';\nimport { spawn, ChildProcess } from 'child_process';\nimport { McpConfig, McpTool, McpConnection } from '../types';\nimport { auth } from '@modelcontextprotocol/sdk/client/auth.js';\nimport { CastOAuthProvider } from './cast-oauth-provider';\n\n@Injectable()\nexport class McpClientService extends EventEmitter {\n private connections: Map<string, McpConnection> = new Map();\n private stdioBuffers: Map<string, string> = new Map();\n private requestIdCounter = 0;\n\n async connect(name: string, config: McpConfig): Promise<boolean> {\n if (this.connections.has(name)) {\n const existing = this.connections.get(name)!;\n if (existing.status === 'connected') {\n return true;\n }\n }\n\n const connection: McpConnection = {\n config,\n tools: [],\n status: 'connecting',\n };\n\n this.connections.set(name, connection);\n\n try {\n if (config.type === 'stdio' && config.command) {\n await this.connectStdio(name, connection);\n } else if (config.type === 'sse' && config.endpoint) {\n throw new Error('SSE transport not yet supported. Use stdio or http instead.');\n } else if (config.type === 'http' && config.endpoint) {\n await this.connectHttp(name, connection);\n }\n\n connection.status = 'connected';\n return true;\n } catch (error) {\n connection.status = 'error';\n return false;\n }\n }\n\n private async connectStdio(name: string, connection: McpConnection): Promise<void> {\n const { command, args = [], env = {} } = connection.config;\n\n const proc = spawn(command!, args, {\n env: { ...process.env, ...env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n connection.process = proc;\n this.stdioBuffers.set(name, '');\n\n proc.stdout?.on('data', (data: Buffer) => {\n const buffer = (this.stdioBuffers.get(name) || '') + data.toString();\n const lines = buffer.split('\\n');\n\n this.stdioBuffers.set(name, lines.pop() || '');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n this.emit(`response:${name}`, parsed);\n } catch {\n }\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && !msg.startsWith('Debugger') && !msg.startsWith('Warning')) {\n console.error(`MCP ${name} stderr:`, msg);\n }\n });\n\n proc.on('close', (code) => {\n connection.status = 'disconnected';\n this.stdioBuffers.delete(name);\n this.emit('disconnected', name);\n\n if (code !== null && code !== 0) {\n setTimeout(() => {\n this.reconnect(name).catch(() => {});\n }, 3000);\n }\n });\n\n await this.sendRequest(name, 'initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n });\n\n const toolsResponse = await this.sendRequest(name, 'tools/list', {});\n connection.tools = toolsResponse?.tools || [];\n }\n\n private async connectHttp(name: string, connection: McpConnection): Promise<void> {\n const endpoint = connection.config.endpoint!;\n\n try {\n new URL(endpoint);\n } catch {\n throw new Error(`Invalid MCP HTTP endpoint: ${endpoint}`);\n }\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n const provider = new CastOAuthProvider(name);\n const cachedTokens = provider.tokens();\n if (cachedTokens?.access_token) {\n headers['Authorization'] = `Bearer ${cachedTokens.access_token}`;\n }\n\n const doFetch = async (body: object, hdrs = headers, timeoutMs = 15000): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(endpoint, {\n method: 'POST',\n headers: hdrs,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n };\n\n const initBody = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n },\n };\n\n let initResponse = await doFetch(initBody);\n\n if (initResponse.status === 401) {\n provider.invalidateCredentials('tokens');\n\n let authResult = await auth(provider, { serverUrl: endpoint });\n\n if (authResult === 'REDIRECT') {\n this.emit('oauth:browser-opened', name, provider.redirectUrl);\n const code = await provider.waitForCallback();\n authResult = await auth(provider, { serverUrl: endpoint, authorizationCode: code });\n }\n\n if (authResult !== 'AUTHORIZED') {\n throw new Error(`OAuth failed for ${name}`);\n }\n\n const tokens = provider.tokens();\n if (!tokens?.access_token) {\n throw new Error(`No access token for ${name} after OAuth`);\n }\n\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n initResponse = await doFetch(initBody);\n }\n\n if (!initResponse.ok) {\n throw new Error(`HTTP MCP init failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('mcp-session-id');\n if (sessionId) headers['Mcp-Session-Id'] = sessionId;\n\n const toolsResponse = await doFetch({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/list',\n params: {},\n });\n\n if (toolsResponse.ok) {\n const data = await toolsResponse.json();\n connection.tools = data.result?.tools || data.tools || [];\n }\n\n (connection as any)._httpHeaders = headers;\n }\n\n private sendRequest(\n name: string,\n method: string,\n params: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(name);\n\n if (!connection?.process) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n const id = this.nextId();\n const request = JSON.stringify({ jsonrpc: '2.0', id, method, params });\n let resolved = false;\n\n const handler = (response: any) => {\n if (response.id === id && !resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(response.result);\n }\n };\n\n this.on(`response:${name}`, handler);\n (connection.process as ChildProcess).stdin?.write(request + '\\n');\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(null);\n }\n }, 15000);\n });\n }\n\n async callTool(\n mcpName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(mcpName);\n\n if (!connection || connection.status !== 'connected') {\n throw new Error(`MCP ${mcpName} not connected`);\n }\n\n if (connection.config.type === 'stdio') {\n return this.sendRequest(mcpName, 'tools/call', { name: toolName, arguments: args });\n }\n\n if (connection.config.type === 'http') {\n const endpoint = connection.config.endpoint!;\n const headers: Record<string, string> = (connection as any)._httpHeaders ?? {\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n }),\n });\n\n const data = await response.json();\n return data.result || data;\n }\n\n return null;\n }\n\n getTools(name: string): McpTool[] {\n return this.connections.get(name)?.tools || [];\n }\n\n getStatus(name: string): string {\n return this.connections.get(name)?.status || 'unknown';\n }\n\n getAuthUrl(name: string): string | undefined {\n return this.connections.get(name)?.authUrl;\n }\n\n getAllStatuses(): Map<string, string> {\n const statuses = new Map<string, string>();\n for (const [name, conn] of this.connections) {\n statuses.set(name, conn.status);\n }\n return statuses;\n }\n\n private async reconnect(name: string): Promise<boolean> {\n const connection = this.connections.get(name);\n if (!connection) return false;\n\n if (connection.process) {\n try {\n (connection.process as ChildProcess).kill();\n } catch {}\n }\n\n connection.status = 'connecting';\n try {\n if (connection.config.type === 'stdio') {\n await this.connectStdio(name, connection);\n } else if (connection.config.type === 'http') {\n await this.connectHttp(name, connection);\n }\n connection.status = 'connected';\n this.emit('reconnected', name);\n return true;\n } catch {\n connection.status = 'error';\n return false;\n }\n }\n\n disconnect(name: string) {\n const connection = this.connections.get(name);\n\n if (connection?.process) {\n (connection.process as ChildProcess).kill();\n }\n\n this.stdioBuffers.delete(name);\n this.connections.delete(name);\n }\n\n disconnectAll() {\n for (const name of this.connections.keys()) {\n this.disconnect(name);\n }\n }\n\n private nextId(): string {\n return `${++this.requestIdCounter}`;\n }\n}\n"],"names":["McpClientService","EventEmitter","connect","name","config","connections","has","existing","get","status","connection","tools","set","type","command","connectStdio","endpoint","Error","connectHttp","error","args","env","proc","spawn","process","stdio","stdioBuffers","stdout","on","data","buffer","toString","lines","split","pop","line","trimmed","trim","parsed","JSON","parse","emit","stderr","msg","startsWith","console","code","delete","setTimeout","reconnect","catch","sendRequest","protocolVersion","capabilities","clientInfo","version","toolsResponse","URL","headers","provider","CastOAuthProvider","cachedTokens","tokens","access_token","doFetch","body","hdrs","timeoutMs","controller","AbortController","timer","abort","fetch","method","stringify","signal","clearTimeout","initBody","jsonrpc","id","nextId","params","initResponse","invalidateCredentials","authResult","auth","serverUrl","redirectUrl","waitForCallback","authorizationCode","ok","statusText","sessionId","json","result","_httpHeaders","Promise","resolve","request","resolved","handler","response","off","stdin","write","callTool","mcpName","toolName","arguments","getTools","getStatus","getAuthUrl","authUrl","getAllStatuses","statuses","Map","conn","kill","disconnect","disconnectAll","keys","requestIdCounter"],"mappings":"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"}
|
|
@@ -69,7 +69,6 @@ function _ts_metadata(k, v) {
|
|
|
69
69
|
let McpCommandsService = class McpCommandsService {
|
|
70
70
|
async cmdMcp(args, smartInput) {
|
|
71
71
|
const sub = args[0] || 'menu';
|
|
72
|
-
// 'menu' uses SmartInput directly — must NOT pause before it
|
|
73
72
|
if (sub === 'menu') {
|
|
74
73
|
try {
|
|
75
74
|
await this.showMcpMenu(smartInput);
|
|
@@ -82,7 +81,6 @@ let McpCommandsService = class McpCommandsService {
|
|
|
82
81
|
}
|
|
83
82
|
return;
|
|
84
83
|
}
|
|
85
|
-
// Other sub-commands use inquirer and need pause/resume
|
|
86
84
|
smartInput.pause();
|
|
87
85
|
try {
|
|
88
86
|
switch(sub){
|
|
@@ -229,17 +227,15 @@ let McpCommandsService = class McpCommandsService {
|
|
|
229
227
|
w(` ${icon} ${(0, _theme.colorize)(name, 'cyan')} — ${status}\r\n`);
|
|
230
228
|
if (!ok) {
|
|
231
229
|
const config = this.mcpRegistry.getConfig(name);
|
|
232
|
-
// OAuth/HTTP: the SDK already ran the full flow. Failure = server blocked DCR
|
|
233
230
|
if (config?.type === 'http') {
|
|
234
231
|
w(`\r\n ${(0, _theme.colorize)('⚠️ ' + name + ': OAuth bloqueado pelo servidor', 'warning')}\r\n`);
|
|
235
232
|
w(` Este servidor só aceita clientes pré-aprovados (ex: VS Code, Cursor).\r\n`);
|
|
236
233
|
w(` Alternativa: use o proxy mcp-remote para redirecionar via cliente aprovado.\r\n\r\n`);
|
|
237
|
-
// stdio server — check for missing credentials
|
|
238
234
|
} else if (config?.type === 'stdio' && smartInput) {
|
|
239
235
|
const template = (0, _mcptemplates.getTemplate)(name);
|
|
240
236
|
if (template?.credentials?.length) {
|
|
241
237
|
const missing = template.credentials.filter((cred)=>{
|
|
242
|
-
if (cred.isArg) return false;
|
|
238
|
+
if (cred.isArg) return false;
|
|
243
239
|
return !config.env?.[cred.envVar];
|
|
244
240
|
});
|
|
245
241
|
if (missing.length > 0) {
|
|
@@ -254,12 +250,10 @@ let McpCommandsService = class McpCommandsService {
|
|
|
254
250
|
updatedConfig.env[cred.envVar] = value.trim();
|
|
255
251
|
}
|
|
256
252
|
}
|
|
257
|
-
// Save updated config
|
|
258
253
|
_fs.writeFileSync(filePath, JSON.stringify({
|
|
259
254
|
[name]: updatedConfig
|
|
260
255
|
}, null, 2));
|
|
261
256
|
this.mcpRegistry.registerMcp(name, updatedConfig);
|
|
262
|
-
// Retry connection
|
|
263
257
|
w(`\r\n ${(0, _theme.colorize)('Reconectando ' + name + '...', 'muted')}\r\n`);
|
|
264
258
|
const retryOk = await this.mcpRegistry.connectMcp(name);
|
|
265
259
|
const retryIcon = retryOk ? (0, _theme.colorize)('●', 'success') : (0, _theme.colorize)('○', 'error');
|