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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/modules/repl/services/commands/mcp-commands.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { Colors, colorize, Box, Icons } from '../../utils/theme';\nimport { McpRegistryService } from '../../../mcp/services/mcp-registry.service';\nimport { McpClientService } from '../../../mcp/services/mcp-client.service';\nimport {\n selectWithEsc,\n inputWithEsc,\n confirmWithEsc,\n CancelledPromptError,\n} from '../../utils/prompts-with-esc';\nimport { getAllTemplates, getTemplatesByCategory, getTemplate, McpCategory } from '../../../mcp/catalog/mcp-templates';\n\ninterface SmartInput {\n askChoice: (question: string, choices: { key: string; label: string; description: string }[]) => Promise<string>;\n question: (prompt: string) => Promise<string>;\n}\n\n@Injectable()\nexport class McpCommandsService {\n constructor(\n private readonly mcpRegistry: McpRegistryService,\n private readonly mcpClient: McpClientService,\n ) {}\n\n async cmdMcp(args: string[], smartInput: SmartInput & { pause: () => void; resume: () => void }): Promise<void> {\n const sub = args[0] || 'menu';\n\n // 'menu' uses SmartInput directly — must NOT pause before it\n if (sub === 'menu') {\n try {\n await this.showMcpMenu(smartInput);\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error?.name === 'CancelledPromptError') {\n console.log(colorize('\\n❌ Cancelado. Voltando ao chat...\\n', 'warning'));\n } else {\n throw error;\n }\n }\n return;\n }\n\n // Other sub-commands use inquirer and need pause/resume\n smartInput.pause();\n try {\n switch (sub) {\n case 'list':\n await this.listServers();\n break;\n case 'tools':\n await this.listTools();\n break;\n case 'add':\n await this.addMcpWizard(smartInput);\n break;\n case 'remove':\n await this.removeMcpWizard(smartInput);\n break;\n case 'test':\n await this.testMcpTool(smartInput);\n break;\n case 'what':\n case 'about':\n this.printWhatIsMcp();\n break;\n case 'help':\n default:\n this.printMcpHelp();\n break;\n }\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error?.name === 'CancelledPromptError') {\n console.log(colorize('\\n❌ Cancelado. Voltando ao chat...\\n', 'warning'));\n return;\n }\n throw error;\n } finally {\n smartInput.resume();\n }\n }\n\n private async showMcpMenu(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n while (true) {\n w(`\\n${colorize('☁️ MCP Hub', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(30), 'subtle')}\\n\\n`);\n\n const summaries = this.mcpRegistry.getServerSummaries();\n const totalTools = summaries.reduce((sum, s) => sum + s.toolCount, 0);\n\n w(`${colorize('Servidores:', 'muted')} ${summaries.length} `);\n w(`${colorize('Ferramentas:', 'muted')} ${totalTools}\\n\\n`);\n\n console.log(colorize('(pressione ESC para voltar ao chat)\\n', 'muted'));\n\n const action = await this.withEsc(() => smartInput.askChoice('O que deseja fazer?', [\n { key: '1', label: 'Ver servidores', description: 'Listar MCPs configurados' },\n { key: '2', label: 'Ver ferramentas', description: 'Todas as tools disponíveis' },\n { key: '3', label: 'Conectar servidores', description: 'Conectar/reconectar MCPs configurados' },\n { key: '4', label: 'Adicionar servidor', description: 'Configurar novo MCP' },\n { key: '5', label: 'Remover servidor', description: 'Desconectar MCP' },\n { key: '6', label: 'O que é MCP?', description: 'Entenda o protocolo' },\n { key: 'q', label: 'Voltar', description: 'Sair do MCP Hub' },\n ]));\n\n if (action === null) {\n console.log(colorize('\\nSaindo do MCP Hub...\\n', 'muted'));\n return;\n }\n\n let pause = true;\n switch (action) {\n case '1':\n await this.listServers();\n break;\n case '2':\n await this.listTools();\n break;\n case '3':\n await this.connectServers(smartInput as any);\n break;\n case '4':\n await this.addMcpWizard(smartInput);\n pause = false;\n break;\n case '5':\n await this.removeMcpWizard(smartInput);\n pause = false;\n break;\n case '6':\n this.printWhatIsMcp();\n break;\n case 'q':\n return;\n }\n\n if (pause) {\n await smartInput.question(colorize('\\nEnter para continuar...', 'muted'));\n }\n }\n }\n\n private async withEsc<T>(fn: () => Promise<T>): Promise<T | null> {\n try {\n return await fn();\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error.name === 'CancelledPromptError') {\n return null;\n }\n throw error;\n }\n }\n\n private async connectServers(smartInput?: SmartInput & { pause: () => void; resume: () => void }): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Conectar Servidores MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n\\n');\n\n if (summaries.length === 0) {\n w(` ${colorize('Nenhum servidor configurado. Use a opção Adicionar servidor.', 'muted')}\\r\\n\\n`);\n return;\n }\n\n w(` ${colorize('Conectando ' + summaries.length + ' servidor(es)...', 'muted')}\\r\\n\\n`);\n\n const results = await this.mcpRegistry.connectAll();\n\n for (const [name, ok] of results.entries()) {\n const icon = ok ? colorize('●', 'success') : colorize('○', 'error');\n const status = ok ? colorize('conectado', 'success') : colorize('falhou', 'error');\n w(` ${icon} ${colorize(name, 'cyan')} — ${status}\\r\\n`);\n\n if (!ok) {\n const config = this.mcpRegistry.getConfig(name);\n\n // OAuth/HTTP: the SDK already ran the full flow. Failure = server blocked DCR\n if (config?.type === 'http') {\n w(`\\r\\n ${colorize('⚠️ ' + name + ': OAuth bloqueado pelo servidor', 'warning')}\\r\\n`);\n w(` Este servidor só aceita clientes pré-aprovados (ex: VS Code, Cursor).\\r\\n`);\n w(` Alternativa: use o proxy mcp-remote para redirecionar via cliente aprovado.\\r\\n\\r\\n`);\n\n // stdio server — check for missing credentials\n } else if (config?.type === 'stdio' && smartInput) {\n const template = getTemplate(name);\n if (template?.credentials?.length) {\n const missing = template.credentials.filter(cred => {\n if (cred.isArg) return false; // args are set at add time\n return !config.env?.[cred.envVar];\n });\n\n if (missing.length > 0) {\n w(`\\r\\n ${colorize('🔑 Credenciais necessárias para ' + name, 'warning')}\\r\\n\\r\\n`);\n\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n const filePath = path.join(mcpDir, `${name}.json`);\n const updatedConfig = JSON.parse(JSON.stringify(config));\n if (!updatedConfig.env) updatedConfig.env = {};\n\n for (const cred of missing) {\n const value = await smartInput.question(\n colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'),\n );\n if (value.trim()) {\n updatedConfig.env[cred.envVar] = value.trim();\n }\n }\n\n // Save updated config\n fs.writeFileSync(filePath, JSON.stringify({ [name]: updatedConfig }, null, 2));\n this.mcpRegistry.registerMcp(name, updatedConfig);\n\n // Retry connection\n w(`\\r\\n ${colorize('Reconectando ' + name + '...', 'muted')}\\r\\n`);\n const retryOk = await this.mcpRegistry.connectMcp(name);\n const retryIcon = retryOk ? colorize('●', 'success') : colorize('○', 'error');\n const retryStatus = retryOk ? colorize('conectado', 'success') : colorize('falhou — verifique a credencial', 'error');\n w(` ${retryIcon} ${colorize(name, 'cyan')} — ${retryStatus}\\r\\n\\r\\n`);\n } else {\n w(` ${colorize('Verifique se o servidor está disponível e tente novamente.', 'muted')}\\r\\n\\r\\n`);\n }\n }\n }\n }\n }\n\n const finalResults = await this.mcpRegistry.connectAll();\n const connected = [...finalResults.values()].filter(Boolean).length;\n w(` ${colorize(`${connected}/${finalResults.size} conectado(s)`, connected === finalResults.size ? 'success' : 'warning')}\\r\\n\\r\\n`);\n }\n\n private async listServers(): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('MCP Servers', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n\\n');\n\n if (summaries.length === 0) {\n w(` ${colorize('Nenhum servidor MCP configurado', 'muted')}\\r\\n\\n`);\n w(` ${colorize('O que é MCP?', 'cyan')} → /mcp what\\r\\n`);\n w(` ${colorize('Como adicionar?', 'cyan')} → /mcp add\\r\\n\\n`);\n return;\n }\n\n for (const s of summaries) {\n const statusIcon = s.status === 'connected' ? colorize('●', 'success') : colorize('○', 'error');\n const statusText = s.status === 'connected' ? colorize('conectado', 'success') : colorize(s.status, 'error');\n \n w(` ${statusIcon} ${colorize(s.name, 'cyan')} ${colorize(`(${s.transport})`, 'muted')}\\r\\n`);\n w(` Status: ${statusText} | Ferramentas: ${s.toolCount}\\r\\n`);\n \n if (s.toolCount > 0) {\n const toolNames = s.toolDescriptions.slice(0, 3).map(t => t.name.split('_').pop()).join(', ');\n const more = s.toolCount > 3 ? ` +${s.toolCount - 3} mais` : '';\n w(` Tools: ${colorize(toolNames + more, 'muted')}\\r\\n`);\n }\n w('\\r\\n');\n }\n }\n\n private async listTools(): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n const totalTools = summaries.reduce((sum, s) => sum + s.toolCount, 0);\n\n w('\\r\\n');\n w(colorize(Icons.tool + ' ', 'accent') + colorize(`MCP Tools (${totalTools})`, 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n');\n\n if (totalTools === 0) {\n w(`\\n ${colorize('Nenhuma ferramenta disponível', 'muted')}\\r\\n\\n`);\n return;\n }\n\n for (const server of summaries) {\n if (server.toolCount === 0) continue;\n \n w(`\\n ${colorize(server.name, 'bold')} ${colorize(`(${server.transport}, ${server.status})`, 'muted')}\\r\\n`);\n w(` ${colorize(Box.horizontal.repeat(30), 'subtle')}\\r\\n`);\n \n for (const td of server.toolDescriptions) {\n const shortName = td.name.replace(`${server.name}_`, '');\n w(` ${colorize('•', 'primary')} ${colorize(shortName, 'cyan')}\\r\\n`);\n const desc = td.description.length > 70 \n ? td.description.slice(0, 67) + '...' \n : td.description;\n w(` ${colorize(desc, 'muted')}\\r\\n`);\n }\n }\n w('\\r\\n');\n }\n\n private async addMcpWizard(smartInput: SmartInput): Promise<void> {\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n\n if (!fs.existsSync(mcpDir)) {\n fs.mkdirSync(mcpDir, { recursive: true });\n }\n\n const w = (s: string) => process.stdout.write(s);\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Adicionar Servidor MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(30), 'subtle') + '\\r\\n\\r\\n');\n\n console.log(colorize('(pressione ESC para cancelar a qualquer momento)\\r\\n', 'muted'));\n\n const category = await selectWithEsc<McpCategory | 'custom'>({\n message: 'Escolha uma categoria:',\n choices: [\n { name: '🔧 Dev Tools (GitHub, Linear, Jira, Sentry, Docker)', value: 'dev' as McpCategory },\n { name: '🎨 Design (Figma)', value: 'design' as McpCategory },\n { name: '🗄️ Data (PostgreSQL, MongoDB, Redis, Supabase)', value: 'data' as McpCategory },\n { name: '🔍 Search (Brave, Exa, Perplexity, Context7)', value: 'search' as McpCategory },\n { name: '☁️ Cloud (Vercel, Cloudflare, AWS S3)', value: 'cloud' as McpCategory },\n { name: '📋 Productivity (Slack, Notion, Google Drive, Maps)', value: 'productivity' as McpCategory },\n { name: '💳 Payments (Stripe, Twilio)', value: 'payments' as McpCategory },\n { name: '🌐 Browser (Puppeteer)', value: 'browser' as McpCategory },\n { name: '📁 Filesystem', value: 'filesystem' as McpCategory },\n { name: '➕ Configuração manual', value: 'custom' },\n ],\n });\n\n if (category === null) {\n w(colorize('\\r\\n ❌ Cancelado.\\r\\n\\r\\n', 'warning'));\n return;\n }\n\n let config: Record<string, any> = {};\n let name: string;\n\n if (category !== 'custom') {\n const templates = getTemplatesByCategory(category);\n const templateId = await selectWithEsc<string>({\n message: 'Escolha um servidor:',\n choices: templates.map(t => ({\n name: `${t.name} - ${t.description}`,\n value: t.id,\n })),\n });\n\n if (templateId === null) {\n w(colorize('\\r\\n ❌ Cancelado.\\r\\n\\r\\n', 'warning'));\n return;\n }\n\n const template = getTemplate(templateId);\n if (!template) {\n w(colorize('\\r\\n ❌ Template não encontrado.\\r\\n\\r\\n', 'error'));\n return;\n }\n\n name = template.id;\n config = JSON.parse(JSON.stringify(template.config)); // Deep clone\n\n if (template.credentials.length > 0) {\n w(`\\r\\n${colorize('📝 Configuração:', 'bold')}\\r\\n`);\n\n for (const cred of template.credentials) {\n if (cred.isArg) {\n const value = await smartInput.question(colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'));\n if (!value.trim() && cred.required) {\n w(colorize('\\r\\n ❌ Campo obrigatório!\\r\\n\\r\\n', 'error'));\n return;\n }\n if (value.trim()) {\n config.args.push(value.trim());\n }\n } else {\n const value = await smartInput.question(colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'));\n if (!value.trim() && cred.required) {\n w(colorize('\\r\\n ❌ Campo obrigatório!\\r\\n\\r\\n', 'error'));\n return;\n }\n if (value.trim()) {\n if (!config.env) config.env = {};\n config.env[cred.envVar] = value.trim();\n }\n }\n }\n }\n\n const filePath = path.join(mcpDir, `${name}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ [name]: config }, null, 2));\n w(`\\r\\n${colorize('✓', 'success')} MCP configurado: ${colorize(filePath, 'accent')}\\r\\n`);\n\n if (name === 'figma') {\n w('\\r\\n');\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w(colorize(' Tutorial — Figma Desktop MCP\\r\\n', 'bold'));\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w('\\r\\n');\n w(colorize(' Passo 1: ', 'accent') + 'Instale o Figma Desktop\\r\\n');\n w(colorize(' https://www.figma.com/downloads/\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 2: ', 'accent') + 'Abra qualquer arquivo de Design no Figma\\r\\n');\n w('\\r\\n');\n w(colorize(' Passo 3: ', 'accent') + 'Ative o Dev Mode\\r\\n');\n w(colorize(' Clique no botão \"<>\" no canto superior direito\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 4: ', 'accent') + 'Habilite o servidor MCP\\r\\n');\n w(colorize(' Painel Inspect → seção MCP\\r\\n', 'muted'));\n w(colorize(' Ative \"Enable desktop MCP server\"\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 5: ', 'accent') + 'Conecte via Cast\\r\\n');\n w(colorize(' Reinicie o Cast e use /mcp → Conectar servidores\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w('\\r\\n');\n } else if (template.config.type === 'http') {\n w(colorize('\\r\\n ⚠️ Servidor HTTP/OAuth detectado!\\r\\n', 'warning'));\n w(colorize(' Autenticação pode ser necessária após conectar.\\r\\n\\r\\n', 'muted'));\n }\n\n w(colorize(' Reinicie o Cast para conectar\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n const nameInput = await inputWithEsc({\n message: colorize(' Nome do servidor: ', 'cyan'),\n });\n if (nameInput === null || !nameInput.trim()) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n name = nameInput;\n\n const typeChoice = await smartInput.askChoice(' Tipo de transporte:', [\n { key: 'stdio', label: 'stdio', description: 'Processo local (npx, node, python)' },\n { key: 'http', label: 'http', description: 'Endpoint HTTP' },\n ]);\n\n config.type = typeChoice;\n\n if (typeChoice === 'stdio') {\n const command = await inputWithEsc({\n message: colorize(' Comando: ', 'cyan'),\n });\n if (command === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n \n const argsInput = await inputWithEsc({\n message: colorize(' Argumentos (separados por vírgula): ', 'cyan'),\n });\n if (argsInput === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n \n config.command = command.trim();\n config.args = argsInput.trim() ? argsInput.split(',').map((a: string) => a.trim()) : [];\n \n const hasEnv = await confirmWithEsc({ message: 'Precisa de variáveis de ambiente?', default: false });\n if (hasEnv === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n if (hasEnv) {\n config.env = {};\n while (true) {\n const key = await inputWithEsc({\n message: colorize(' Nome da variável (ou vazio para parar): ', 'cyan'),\n });\n if (key === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n if (!key) break;\n \n const value = await inputWithEsc({\n message: colorize(` Valor para ${key}: `, 'cyan'),\n });\n if (value === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n config.env[key] = value;\n }\n }\n } else {\n const endpoint = await inputWithEsc({\n message: colorize(' URL do endpoint: ', 'cyan'),\n });\n if (endpoint === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n config.endpoint = endpoint.trim();\n }\n\n const filePath = path.join(mcpDir, `${name.trim().toLowerCase()}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ [name.trim()]: config }, null, 2));\n\n w(`\\r\\n${colorize('✓', 'success')} Config salva: ${colorize(filePath, 'accent')}\\r\\n`);\n w(colorize(' Reinicie o Cast para conectar\\r\\n\\r\\n', 'muted'));\n }\n\n private async removeMcpWizard(smartInput: SmartInput): Promise<void> {\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n\n if (!fs.existsSync(mcpDir)) {\n console.log(colorize('\\nNenhum MCP configurado\\n', 'muted'));\n return;\n }\n\n const files = fs.readdirSync(mcpDir).filter((f: string) => f.endsWith('.json'));\n if (files.length === 0) {\n console.log(colorize('\\nNenhum MCP configurado\\n', 'muted'));\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Remover Servidor MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(25), 'subtle') + '\\r\\n\\n');\n\n const toRemove = await select<string>({\n message: 'Qual servidor remover?',\n choices: files.map((f: string) => ({ \n name: f.replace('.json', ''), \n value: f \n })),\n });\n\n const confirmRemove = await confirm({\n message: `Tem certeza que deseja remover \"${toRemove.replace('.json', '')}\"?`,\n default: false,\n });\n\n if (confirmRemove) {\n fs.unlinkSync(path.join(mcpDir, toRemove));\n console.log(colorize(`\\n✓ Servidor removido\\n`, 'success'));\n }\n }\n\n private async testMcpTool(smartInput: SmartInput): Promise<void> {\n console.log(colorize('\\nEm breve!\\n', 'muted'));\n }\n\n private printWhatIsMcp(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('☁️ O que é MCP?', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(50), 'subtle')}\\n\\n`);\n\n w(`${colorize('Model Context Protocol (MCP)', 'cyan')} é um protocolo aberto\\n`);\n w(`que permite que assistentes de IA se conectem a fontes de dados\\n`);\n w(`e ferramentas externas de forma padronizada.\\n\\n`);\n\n w(`${colorize('Como funciona:', 'bold')}\\n`);\n w(` ${colorize('1.', 'primary')} Um servidor MCP expõe ferramentas (tools)\\n`);\n w(` ${colorize('2.', 'primary')} O Cast se conecta a esse servidor\\n`);\n w(` ${colorize('3.', 'primary')} A IA pode chamar essas ferramentas automaticamente\\n\\n`);\n\n w(`${colorize('Exemplos de uso:', 'bold')}\\n`);\n w(` ${colorize('•', 'muted')} GitHub: criar issues, ler PRs, fazer commits\\n`);\n w(` ${colorize('•', 'muted')} Filesystem: acessar arquivos fora do projeto\\n`);\n w(` ${colorize('•', 'muted')} PostgreSQL: consultar bancos de dados\\n`);\n w(` ${colorize('•', 'muted')} Brave: buscar informações atualizadas na web\\n\\n`);\n\n w(`${colorize('Vantagens:', 'bold')}\\n`);\n w(` ${colorize('✓', 'success')} Segurança: o usuário controla o acesso\\n`);\n w(` ${colorize('✓', 'success')} Flexibilidade: qualquer linguagem/framework\\n`);\n w(` ${colorize('✓', 'success')} Padrão aberto: não é vendor lock-in\\n\\n`);\n\n w(`${colorize('Quer criar seu próprio MCP?', 'accent')}\\n`);\n w(` → /mcp help (guia completo)\\n`);\n w(` → https://modelcontextprotocol.io\\n\\n`);\n }\n\n private printHowToCreate(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('🛠️ Como Criar um Servidor MCP', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(50), 'subtle')}\\n\\n`);\n\n w(`${colorize('Opção 1: TypeScript/JavaScript (mais fácil)', 'bold')}\\n\\n`);\n w(`${colorize('1.', 'primary')} Crie um projeto:\\n`);\n w(` ${colorize('mkdir meu-mcp && cd meu-mcp', 'muted')}\\n`);\n w(` ${colorize('npm init -y', 'muted')}\\n`);\n w(` ${colorize('npm install @modelcontextprotocol/sdk zod', 'muted')}\\n\\n`);\n\n w(`${colorize('2.', 'primary')} Crie o servidor (index.ts):\\n`);\n w(colorize(` import { Server } from '@modelcontextprotocol/sdk/server/index.js';\\n`, 'muted'));\n w(colorize(` import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` const server = new Server(\\n`, 'muted'));\n w(colorize(` { name: 'meu-mcp', version: '1.0.0' },\\n`, 'muted'));\n w(colorize(` { capabilities: { tools: {} } }\\n`, 'muted'));\n w(colorize(` );\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` server.setRequestHandler(ListToolsRequestSchema, async () => ({\\n`, 'muted'));\n w(colorize(` tools: [{\\n`, 'muted'));\n w(colorize(` name: 'minha_tool',\\n`, 'muted'));\n w(colorize(` description: 'Faz algo útil',\\n`, 'muted'));\n w(colorize(` inputSchema: {\\n`, 'muted'));\n w(colorize(` type: 'object',\\n`, 'muted'));\n w(colorize(` properties: { nome: { type: 'string' } },\\n`, 'muted'));\n w(colorize(` required: ['nome']\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(colorize(` }]\\n`, 'muted'));\n w(colorize(` }));\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` server.setRequestHandler(CallToolRequestSchema, async (req) => {\\n`, 'muted'));\n w(colorize(` const args = req.params.arguments;\\n`, 'muted'));\n w(colorize(` return { content: [{ type: 'text', text: 'Resultado!' }] };\\n`, 'muted'));\n w(colorize(` });\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` const transport = new StdioServerTransport();\\n`, 'muted'));\n w(colorize(` await server.connect(transport);\\n`, 'muted'));\n w(`\\n`);\n\n w(`${colorize('Opção 2: Python', 'bold')}\\n\\n`);\n w(` ${colorize('pip install mcp', 'muted')}\\n\\n`);\n w(` Veja: ${colorize('https://github.com/modelcontextprotocol/python-sdk', 'accent')}\\n\\n`);\n\n w(`${colorize('3.', 'primary')} Publique no npm (opcional):\\n`);\n w(` Outros poderão usar: ${colorize('npx -y seu-mcp-server', 'muted')}\\n\\n`);\n\n w(`${colorize('Recursos:', 'bold')}\\n`);\n w(` ${colorize('•', 'muted')} Documentação: https://modelcontextprotocol.io\\n`);\n w(` ${colorize('•', 'muted')} SDK TypeScript: @modelcontextprotocol/sdk\\n`);\n w(` ${colorize('•', 'muted')} Exemplos: github.com/modelcontextprotocol/servers\\n\\n`);\n }\n\n private printMcpHelp(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('☁️ MCP - Guia Rápido', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(40), 'subtle')}\\n\\n`);\n\n w(`${colorize('Comandos:', 'bold')}\\n`);\n w(` ${colorize('/mcp', 'cyan')} → Menu interativo\\n`);\n w(` ${colorize('/mcp list', 'cyan')} → Ver servidores\\n`);\n w(` ${colorize('/mcp tools', 'cyan')} → Ver ferramentas\\n`);\n w(` ${colorize('/mcp add', 'cyan')} → Adicionar servidor\\n`);\n w(` ${colorize('/mcp remove', 'cyan')} → Remover servidor\\n`);\n w(` ${colorize('/mcp what', 'cyan')} → O que é MCP?\\n\\n`);\n\n w(`${colorize('Servidores populares:', 'bold')}\\n`);\n w(` ${colorize('@modelcontextprotocol/server-github', 'muted')}\\n`);\n w(` Acesse repositórios, issues, PRs\\n\\n`);\n w(` ${colorize('@figma/mcp-server (HTTP)', 'muted')}\\n`);\n w(` Acesse designs e componentes (requer OAuth)\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-filesystem', 'muted')}\\n`);\n w(` Leia/escrita de arquivos locais\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-postgres', 'muted')}\\n`);\n w(` Consulte bancos PostgreSQL\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-brave-search', 'muted')}\\n`);\n w(` Busca na web via Brave\\n\\n`);\n\n w(`${colorize('Servidores HTTP (OAuth):', 'bold')}\\n`);\n w(` Alguns servidores como Figma usam HTTP + OAuth.\\n`);\n w(` Após adicionar, a autenticação será solicitada.\\n\\n`);\n\n w(`${colorize('Configuração manual:', 'bold')}\\n`);\n w(` Crie: ${colorize('.cast/mcp/nome.json', 'cyan')}\\n\\n`);\n w(colorize(` {\\n`, 'muted'));\n w(colorize(` \"meu-mcp\": {\\n`, 'muted'));\n w(colorize(` \"type\": \"stdio\",\\n`, 'muted'));\n w(colorize(` \"command\": \"npx\",\\n`, 'muted'));\n w(colorize(` \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"],\\n`, 'muted'));\n w(colorize(` \"env\": { \"GITHUB_TOKEN\": \"...\" }\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(`\\n`);\n }\n}\n"],"names":["McpCommandsService","cmdMcp","args","smartInput","sub","showMcpMenu","error","CancelledPromptError","name","console","log","colorize","pause","listServers","listTools","addMcpWizard","removeMcpWizard","testMcpTool","printWhatIsMcp","printMcpHelp","resume","w","s","process","stdout","write","Box","horizontal","repeat","summaries","mcpRegistry","getServerSummaries","totalTools","reduce","sum","toolCount","length","action","withEsc","askChoice","key","label","description","connectServers","question","fn","Icons","cloud","results","connectAll","ok","entries","icon","status","config","getConfig","type","template","getTemplate","credentials","missing","filter","cred","isArg","env","envVar","mcpDir","path","join","cwd","filePath","updatedConfig","JSON","parse","stringify","value","placeholder","trim","fs","writeFileSync","registerMcp","retryOk","connectMcp","retryIcon","retryStatus","finalResults","connected","values","Boolean","size","statusIcon","statusText","transport","toolNames","toolDescriptions","slice","map","t","split","pop","more","tool","server","td","shortName","replace","desc","existsSync","mkdirSync","recursive","category","selectWithEsc","message","choices","templates","getTemplatesByCategory","templateId","id","required","push","nameInput","inputWithEsc","typeChoice","command","argsInput","a","hasEnv","confirmWithEsc","default","endpoint","toLowerCase","files","readdirSync","f","endsWith","toRemove","select","confirmRemove","confirm","unlinkSync","printHowToCreate","mcpClient"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/modules/repl/services/commands/mcp-commands.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { Colors, colorize, Box, Icons } from '../../utils/theme';\nimport { McpRegistryService } from '../../../mcp/services/mcp-registry.service';\nimport { McpClientService } from '../../../mcp/services/mcp-client.service';\nimport {\n selectWithEsc,\n inputWithEsc,\n confirmWithEsc,\n CancelledPromptError,\n} from '../../utils/prompts-with-esc';\nimport { getAllTemplates, getTemplatesByCategory, getTemplate, McpCategory } from '../../../mcp/catalog/mcp-templates';\n\ninterface SmartInput {\n askChoice: (question: string, choices: { key: string; label: string; description: string }[]) => Promise<string>;\n question: (prompt: string) => Promise<string>;\n}\n\n@Injectable()\nexport class McpCommandsService {\n constructor(\n private readonly mcpRegistry: McpRegistryService,\n private readonly mcpClient: McpClientService,\n ) {}\n\n async cmdMcp(args: string[], smartInput: SmartInput & { pause: () => void; resume: () => void }): Promise<void> {\n const sub = args[0] || 'menu';\n\n if (sub === 'menu') {\n try {\n await this.showMcpMenu(smartInput);\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error?.name === 'CancelledPromptError') {\n console.log(colorize('\\n❌ Cancelado. Voltando ao chat...\\n', 'warning'));\n } else {\n throw error;\n }\n }\n return;\n }\n\n smartInput.pause();\n try {\n switch (sub) {\n case 'list':\n await this.listServers();\n break;\n case 'tools':\n await this.listTools();\n break;\n case 'add':\n await this.addMcpWizard(smartInput);\n break;\n case 'remove':\n await this.removeMcpWizard(smartInput);\n break;\n case 'test':\n await this.testMcpTool(smartInput);\n break;\n case 'what':\n case 'about':\n this.printWhatIsMcp();\n break;\n case 'help':\n default:\n this.printMcpHelp();\n break;\n }\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error?.name === 'CancelledPromptError') {\n console.log(colorize('\\n❌ Cancelado. Voltando ao chat...\\n', 'warning'));\n return;\n }\n throw error;\n } finally {\n smartInput.resume();\n }\n }\n\n private async showMcpMenu(smartInput: SmartInput): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n\n while (true) {\n w(`\\n${colorize('☁️ MCP Hub', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(30), 'subtle')}\\n\\n`);\n\n const summaries = this.mcpRegistry.getServerSummaries();\n const totalTools = summaries.reduce((sum, s) => sum + s.toolCount, 0);\n\n w(`${colorize('Servidores:', 'muted')} ${summaries.length} `);\n w(`${colorize('Ferramentas:', 'muted')} ${totalTools}\\n\\n`);\n\n console.log(colorize('(pressione ESC para voltar ao chat)\\n', 'muted'));\n\n const action = await this.withEsc(() => smartInput.askChoice('O que deseja fazer?', [\n { key: '1', label: 'Ver servidores', description: 'Listar MCPs configurados' },\n { key: '2', label: 'Ver ferramentas', description: 'Todas as tools disponíveis' },\n { key: '3', label: 'Conectar servidores', description: 'Conectar/reconectar MCPs configurados' },\n { key: '4', label: 'Adicionar servidor', description: 'Configurar novo MCP' },\n { key: '5', label: 'Remover servidor', description: 'Desconectar MCP' },\n { key: '6', label: 'O que é MCP?', description: 'Entenda o protocolo' },\n { key: 'q', label: 'Voltar', description: 'Sair do MCP Hub' },\n ]));\n\n if (action === null) {\n console.log(colorize('\\nSaindo do MCP Hub...\\n', 'muted'));\n return;\n }\n\n let pause = true;\n switch (action) {\n case '1':\n await this.listServers();\n break;\n case '2':\n await this.listTools();\n break;\n case '3':\n await this.connectServers(smartInput as any);\n break;\n case '4':\n await this.addMcpWizard(smartInput);\n pause = false;\n break;\n case '5':\n await this.removeMcpWizard(smartInput);\n pause = false;\n break;\n case '6':\n this.printWhatIsMcp();\n break;\n case 'q':\n return;\n }\n\n if (pause) {\n await smartInput.question(colorize('\\nEnter para continuar...', 'muted'));\n }\n }\n }\n\n private async withEsc<T>(fn: () => Promise<T>): Promise<T | null> {\n try {\n return await fn();\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error.name === 'CancelledPromptError') {\n return null;\n }\n throw error;\n }\n }\n\n private async connectServers(smartInput?: SmartInput & { pause: () => void; resume: () => void }): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Conectar Servidores MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n\\n');\n\n if (summaries.length === 0) {\n w(` ${colorize('Nenhum servidor configurado. Use a opção Adicionar servidor.', 'muted')}\\r\\n\\n`);\n return;\n }\n\n w(` ${colorize('Conectando ' + summaries.length + ' servidor(es)...', 'muted')}\\r\\n\\n`);\n\n const results = await this.mcpRegistry.connectAll();\n\n for (const [name, ok] of results.entries()) {\n const icon = ok ? colorize('●', 'success') : colorize('○', 'error');\n const status = ok ? colorize('conectado', 'success') : colorize('falhou', 'error');\n w(` ${icon} ${colorize(name, 'cyan')} — ${status}\\r\\n`);\n\n if (!ok) {\n const config = this.mcpRegistry.getConfig(name);\n\n if (config?.type === 'http') {\n w(`\\r\\n ${colorize('⚠️ ' + name + ': OAuth bloqueado pelo servidor', 'warning')}\\r\\n`);\n w(` Este servidor só aceita clientes pré-aprovados (ex: VS Code, Cursor).\\r\\n`);\n w(` Alternativa: use o proxy mcp-remote para redirecionar via cliente aprovado.\\r\\n\\r\\n`);\n\n } else if (config?.type === 'stdio' && smartInput) {\n const template = getTemplate(name);\n if (template?.credentials?.length) {\n const missing = template.credentials.filter(cred => {\n if (cred.isArg) return false; \n return !config.env?.[cred.envVar];\n });\n\n if (missing.length > 0) {\n w(`\\r\\n ${colorize('🔑 Credenciais necessárias para ' + name, 'warning')}\\r\\n\\r\\n`);\n\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n const filePath = path.join(mcpDir, `${name}.json`);\n const updatedConfig = JSON.parse(JSON.stringify(config));\n if (!updatedConfig.env) updatedConfig.env = {};\n\n for (const cred of missing) {\n const value = await smartInput.question(\n colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'),\n );\n if (value.trim()) {\n updatedConfig.env[cred.envVar] = value.trim();\n }\n }\n\n fs.writeFileSync(filePath, JSON.stringify({ [name]: updatedConfig }, null, 2));\n this.mcpRegistry.registerMcp(name, updatedConfig);\n\n w(`\\r\\n ${colorize('Reconectando ' + name + '...', 'muted')}\\r\\n`);\n const retryOk = await this.mcpRegistry.connectMcp(name);\n const retryIcon = retryOk ? colorize('●', 'success') : colorize('○', 'error');\n const retryStatus = retryOk ? colorize('conectado', 'success') : colorize('falhou — verifique a credencial', 'error');\n w(` ${retryIcon} ${colorize(name, 'cyan')} — ${retryStatus}\\r\\n\\r\\n`);\n } else {\n w(` ${colorize('Verifique se o servidor está disponível e tente novamente.', 'muted')}\\r\\n\\r\\n`);\n }\n }\n }\n }\n }\n\n const finalResults = await this.mcpRegistry.connectAll();\n const connected = [...finalResults.values()].filter(Boolean).length;\n w(` ${colorize(`${connected}/${finalResults.size} conectado(s)`, connected === finalResults.size ? 'success' : 'warning')}\\r\\n\\r\\n`);\n }\n\n private async listServers(): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('MCP Servers', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n\\n');\n\n if (summaries.length === 0) {\n w(` ${colorize('Nenhum servidor MCP configurado', 'muted')}\\r\\n\\n`);\n w(` ${colorize('O que é MCP?', 'cyan')} → /mcp what\\r\\n`);\n w(` ${colorize('Como adicionar?', 'cyan')} → /mcp add\\r\\n\\n`);\n return;\n }\n\n for (const s of summaries) {\n const statusIcon = s.status === 'connected' ? colorize('●', 'success') : colorize('○', 'error');\n const statusText = s.status === 'connected' ? colorize('conectado', 'success') : colorize(s.status, 'error');\n \n w(` ${statusIcon} ${colorize(s.name, 'cyan')} ${colorize(`(${s.transport})`, 'muted')}\\r\\n`);\n w(` Status: ${statusText} | Ferramentas: ${s.toolCount}\\r\\n`);\n \n if (s.toolCount > 0) {\n const toolNames = s.toolDescriptions.slice(0, 3).map(t => t.name.split('_').pop()).join(', ');\n const more = s.toolCount > 3 ? ` +${s.toolCount - 3} mais` : '';\n w(` Tools: ${colorize(toolNames + more, 'muted')}\\r\\n`);\n }\n w('\\r\\n');\n }\n }\n\n private async listTools(): Promise<void> {\n const w = (s: string) => process.stdout.write(s);\n const summaries = this.mcpRegistry.getServerSummaries();\n const totalTools = summaries.reduce((sum, s) => sum + s.toolCount, 0);\n\n w('\\r\\n');\n w(colorize(Icons.tool + ' ', 'accent') + colorize(`MCP Tools (${totalTools})`, 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(40), 'subtle') + '\\r\\n');\n\n if (totalTools === 0) {\n w(`\\n ${colorize('Nenhuma ferramenta disponível', 'muted')}\\r\\n\\n`);\n return;\n }\n\n for (const server of summaries) {\n if (server.toolCount === 0) continue;\n \n w(`\\n ${colorize(server.name, 'bold')} ${colorize(`(${server.transport}, ${server.status})`, 'muted')}\\r\\n`);\n w(` ${colorize(Box.horizontal.repeat(30), 'subtle')}\\r\\n`);\n \n for (const td of server.toolDescriptions) {\n const shortName = td.name.replace(`${server.name}_`, '');\n w(` ${colorize('•', 'primary')} ${colorize(shortName, 'cyan')}\\r\\n`);\n const desc = td.description.length > 70 \n ? td.description.slice(0, 67) + '...' \n : td.description;\n w(` ${colorize(desc, 'muted')}\\r\\n`);\n }\n }\n w('\\r\\n');\n }\n\n private async addMcpWizard(smartInput: SmartInput): Promise<void> {\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n\n if (!fs.existsSync(mcpDir)) {\n fs.mkdirSync(mcpDir, { recursive: true });\n }\n\n const w = (s: string) => process.stdout.write(s);\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Adicionar Servidor MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(30), 'subtle') + '\\r\\n\\r\\n');\n\n console.log(colorize('(pressione ESC para cancelar a qualquer momento)\\r\\n', 'muted'));\n\n const category = await selectWithEsc<McpCategory | 'custom'>({\n message: 'Escolha uma categoria:',\n choices: [\n { name: '🔧 Dev Tools (GitHub, Linear, Jira, Sentry, Docker)', value: 'dev' as McpCategory },\n { name: '🎨 Design (Figma)', value: 'design' as McpCategory },\n { name: '🗄️ Data (PostgreSQL, MongoDB, Redis, Supabase)', value: 'data' as McpCategory },\n { name: '🔍 Search (Brave, Exa, Perplexity, Context7)', value: 'search' as McpCategory },\n { name: '☁️ Cloud (Vercel, Cloudflare, AWS S3)', value: 'cloud' as McpCategory },\n { name: '📋 Productivity (Slack, Notion, Google Drive, Maps)', value: 'productivity' as McpCategory },\n { name: '💳 Payments (Stripe, Twilio)', value: 'payments' as McpCategory },\n { name: '🌐 Browser (Puppeteer)', value: 'browser' as McpCategory },\n { name: '📁 Filesystem', value: 'filesystem' as McpCategory },\n { name: '➕ Configuração manual', value: 'custom' },\n ],\n });\n\n if (category === null) {\n w(colorize('\\r\\n ❌ Cancelado.\\r\\n\\r\\n', 'warning'));\n return;\n }\n\n let config: Record<string, any> = {};\n let name: string;\n\n if (category !== 'custom') {\n const templates = getTemplatesByCategory(category);\n const templateId = await selectWithEsc<string>({\n message: 'Escolha um servidor:',\n choices: templates.map(t => ({\n name: `${t.name} - ${t.description}`,\n value: t.id,\n })),\n });\n\n if (templateId === null) {\n w(colorize('\\r\\n ❌ Cancelado.\\r\\n\\r\\n', 'warning'));\n return;\n }\n\n const template = getTemplate(templateId);\n if (!template) {\n w(colorize('\\r\\n ❌ Template não encontrado.\\r\\n\\r\\n', 'error'));\n return;\n }\n\n name = template.id;\n config = JSON.parse(JSON.stringify(template.config)); // Deep clone\n\n if (template.credentials.length > 0) {\n w(`\\r\\n${colorize('📝 Configuração:', 'bold')}\\r\\n`);\n\n for (const cred of template.credentials) {\n if (cred.isArg) {\n const value = await smartInput.question(colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'));\n if (!value.trim() && cred.required) {\n w(colorize('\\r\\n ❌ Campo obrigatório!\\r\\n\\r\\n', 'error'));\n return;\n }\n if (value.trim()) {\n config.args.push(value.trim());\n }\n } else {\n const value = await smartInput.question(colorize(` ${cred.name} (${cred.placeholder}): `, 'cyan'));\n if (!value.trim() && cred.required) {\n w(colorize('\\r\\n ❌ Campo obrigatório!\\r\\n\\r\\n', 'error'));\n return;\n }\n if (value.trim()) {\n if (!config.env) config.env = {};\n config.env[cred.envVar] = value.trim();\n }\n }\n }\n }\n\n const filePath = path.join(mcpDir, `${name}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ [name]: config }, null, 2));\n w(`\\r\\n${colorize('✓', 'success')} MCP configurado: ${colorize(filePath, 'accent')}\\r\\n`);\n\n if (name === 'figma') {\n w('\\r\\n');\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w(colorize(' Tutorial — Figma Desktop MCP\\r\\n', 'bold'));\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w('\\r\\n');\n w(colorize(' Passo 1: ', 'accent') + 'Instale o Figma Desktop\\r\\n');\n w(colorize(' https://www.figma.com/downloads/\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 2: ', 'accent') + 'Abra qualquer arquivo de Design no Figma\\r\\n');\n w('\\r\\n');\n w(colorize(' Passo 3: ', 'accent') + 'Ative o Dev Mode\\r\\n');\n w(colorize(' Clique no botão \"<>\" no canto superior direito\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 4: ', 'accent') + 'Habilite o servidor MCP\\r\\n');\n w(colorize(' Painel Inspect → seção MCP\\r\\n', 'muted'));\n w(colorize(' Ative \"Enable desktop MCP server\"\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' Passo 5: ', 'accent') + 'Conecte via Cast\\r\\n');\n w(colorize(' Reinicie o Cast e use /mcp → Conectar servidores\\r\\n', 'muted'));\n w('\\r\\n');\n w(colorize(' ─────────────────────────────────────────\\r\\n', 'subtle'));\n w('\\r\\n');\n } else if (template.config.type === 'http') {\n w(colorize('\\r\\n ⚠️ Servidor HTTP/OAuth detectado!\\r\\n', 'warning'));\n w(colorize(' Autenticação pode ser necessária após conectar.\\r\\n\\r\\n', 'muted'));\n }\n\n w(colorize(' Reinicie o Cast para conectar\\r\\n\\r\\n', 'muted'));\n return;\n }\n\n const nameInput = await inputWithEsc({\n message: colorize(' Nome do servidor: ', 'cyan'),\n });\n if (nameInput === null || !nameInput.trim()) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n name = nameInput;\n\n const typeChoice = await smartInput.askChoice(' Tipo de transporte:', [\n { key: 'stdio', label: 'stdio', description: 'Processo local (npx, node, python)' },\n { key: 'http', label: 'http', description: 'Endpoint HTTP' },\n ]);\n\n config.type = typeChoice;\n\n if (typeChoice === 'stdio') {\n const command = await inputWithEsc({\n message: colorize(' Comando: ', 'cyan'),\n });\n if (command === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n \n const argsInput = await inputWithEsc({\n message: colorize(' Argumentos (separados por vírgula): ', 'cyan'),\n });\n if (argsInput === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n \n config.command = command.trim();\n config.args = argsInput.trim() ? argsInput.split(',').map((a: string) => a.trim()) : [];\n \n const hasEnv = await confirmWithEsc({ message: 'Precisa de variáveis de ambiente?', default: false });\n if (hasEnv === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n if (hasEnv) {\n config.env = {};\n while (true) {\n const key = await inputWithEsc({\n message: colorize(' Nome da variável (ou vazio para parar): ', 'cyan'),\n });\n if (key === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n if (!key) break;\n \n const value = await inputWithEsc({\n message: colorize(` Valor para ${key}: `, 'cyan'),\n });\n if (value === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n config.env[key] = value;\n }\n }\n } else {\n const endpoint = await inputWithEsc({\n message: colorize(' URL do endpoint: ', 'cyan'),\n });\n if (endpoint === null) {\n w(colorize('\\r\\n ❌ Cancelado\\r\\n', 'muted'));\n return;\n }\n config.endpoint = endpoint.trim();\n }\n\n const filePath = path.join(mcpDir, `${name.trim().toLowerCase()}.json`);\n fs.writeFileSync(filePath, JSON.stringify({ [name.trim()]: config }, null, 2));\n\n w(`\\r\\n${colorize('✓', 'success')} Config salva: ${colorize(filePath, 'accent')}\\r\\n`);\n w(colorize(' Reinicie o Cast para conectar\\r\\n\\r\\n', 'muted'));\n }\n\n private async removeMcpWizard(smartInput: SmartInput): Promise<void> {\n const mcpDir = path.join(process.cwd(), '.cast', 'mcp');\n\n if (!fs.existsSync(mcpDir)) {\n console.log(colorize('\\nNenhum MCP configurado\\n', 'muted'));\n return;\n }\n\n const files = fs.readdirSync(mcpDir).filter((f: string) => f.endsWith('.json'));\n if (files.length === 0) {\n console.log(colorize('\\nNenhum MCP configurado\\n', 'muted'));\n return;\n }\n\n const w = (s: string) => process.stdout.write(s);\n w('\\r\\n');\n w(colorize(Icons.cloud + ' ', 'accent') + colorize('Remover Servidor MCP', 'bold') + '\\r\\n');\n w(colorize(Box.horizontal.repeat(25), 'subtle') + '\\r\\n\\n');\n\n const toRemove = await select<string>({\n message: 'Qual servidor remover?',\n choices: files.map((f: string) => ({ \n name: f.replace('.json', ''), \n value: f \n })),\n });\n\n const confirmRemove = await confirm({\n message: `Tem certeza que deseja remover \"${toRemove.replace('.json', '')}\"?`,\n default: false,\n });\n\n if (confirmRemove) {\n fs.unlinkSync(path.join(mcpDir, toRemove));\n console.log(colorize(`\\n✓ Servidor removido\\n`, 'success'));\n }\n }\n\n private async testMcpTool(smartInput: SmartInput): Promise<void> {\n console.log(colorize('\\nEm breve!\\n', 'muted'));\n }\n\n private printWhatIsMcp(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('☁️ O que é MCP?', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(50), 'subtle')}\\n\\n`);\n\n w(`${colorize('Model Context Protocol (MCP)', 'cyan')} é um protocolo aberto\\n`);\n w(`que permite que assistentes de IA se conectem a fontes de dados\\n`);\n w(`e ferramentas externas de forma padronizada.\\n\\n`);\n\n w(`${colorize('Como funciona:', 'bold')}\\n`);\n w(` ${colorize('1.', 'primary')} Um servidor MCP expõe ferramentas (tools)\\n`);\n w(` ${colorize('2.', 'primary')} O Cast se conecta a esse servidor\\n`);\n w(` ${colorize('3.', 'primary')} A IA pode chamar essas ferramentas automaticamente\\n\\n`);\n\n w(`${colorize('Exemplos de uso:', 'bold')}\\n`);\n w(` ${colorize('•', 'muted')} GitHub: criar issues, ler PRs, fazer commits\\n`);\n w(` ${colorize('•', 'muted')} Filesystem: acessar arquivos fora do projeto\\n`);\n w(` ${colorize('•', 'muted')} PostgreSQL: consultar bancos de dados\\n`);\n w(` ${colorize('•', 'muted')} Brave: buscar informações atualizadas na web\\n\\n`);\n\n w(`${colorize('Vantagens:', 'bold')}\\n`);\n w(` ${colorize('✓', 'success')} Segurança: o usuário controla o acesso\\n`);\n w(` ${colorize('✓', 'success')} Flexibilidade: qualquer linguagem/framework\\n`);\n w(` ${colorize('✓', 'success')} Padrão aberto: não é vendor lock-in\\n\\n`);\n\n w(`${colorize('Quer criar seu próprio MCP?', 'accent')}\\n`);\n w(` → /mcp help (guia completo)\\n`);\n w(` → https://modelcontextprotocol.io\\n\\n`);\n }\n\n private printHowToCreate(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('🛠️ Como Criar um Servidor MCP', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(50), 'subtle')}\\n\\n`);\n\n w(`${colorize('Opção 1: TypeScript/JavaScript (mais fácil)', 'bold')}\\n\\n`);\n w(`${colorize('1.', 'primary')} Crie um projeto:\\n`);\n w(` ${colorize('mkdir meu-mcp && cd meu-mcp', 'muted')}\\n`);\n w(` ${colorize('npm init -y', 'muted')}\\n`);\n w(` ${colorize('npm install @modelcontextprotocol/sdk zod', 'muted')}\\n\\n`);\n\n w(`${colorize('2.', 'primary')} Crie o servidor (index.ts):\\n`);\n w(colorize(` import { Server } from '@modelcontextprotocol/sdk/server/index.js';\\n`, 'muted'));\n w(colorize(` import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` const server = new Server(\\n`, 'muted'));\n w(colorize(` { name: 'meu-mcp', version: '1.0.0' },\\n`, 'muted'));\n w(colorize(` { capabilities: { tools: {} } }\\n`, 'muted'));\n w(colorize(` );\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` server.setRequestHandler(ListToolsRequestSchema, async () => ({\\n`, 'muted'));\n w(colorize(` tools: [{\\n`, 'muted'));\n w(colorize(` name: 'minha_tool',\\n`, 'muted'));\n w(colorize(` description: 'Faz algo útil',\\n`, 'muted'));\n w(colorize(` inputSchema: {\\n`, 'muted'));\n w(colorize(` type: 'object',\\n`, 'muted'));\n w(colorize(` properties: { nome: { type: 'string' } },\\n`, 'muted'));\n w(colorize(` required: ['nome']\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(colorize(` }]\\n`, 'muted'));\n w(colorize(` }));\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` server.setRequestHandler(CallToolRequestSchema, async (req) => {\\n`, 'muted'));\n w(colorize(` const args = req.params.arguments;\\n`, 'muted'));\n w(colorize(` return { content: [{ type: 'text', text: 'Resultado!' }] };\\n`, 'muted'));\n w(colorize(` });\\n`, 'muted'));\n w(colorize(`\\n`, 'muted'));\n w(colorize(` const transport = new StdioServerTransport();\\n`, 'muted'));\n w(colorize(` await server.connect(transport);\\n`, 'muted'));\n w(`\\n`);\n\n w(`${colorize('Opção 2: Python', 'bold')}\\n\\n`);\n w(` ${colorize('pip install mcp', 'muted')}\\n\\n`);\n w(` Veja: ${colorize('https://github.com/modelcontextprotocol/python-sdk', 'accent')}\\n\\n`);\n\n w(`${colorize('3.', 'primary')} Publique no npm (opcional):\\n`);\n w(` Outros poderão usar: ${colorize('npx -y seu-mcp-server', 'muted')}\\n\\n`);\n\n w(`${colorize('Recursos:', 'bold')}\\n`);\n w(` ${colorize('•', 'muted')} Documentação: https://modelcontextprotocol.io\\n`);\n w(` ${colorize('•', 'muted')} SDK TypeScript: @modelcontextprotocol/sdk\\n`);\n w(` ${colorize('•', 'muted')} Exemplos: github.com/modelcontextprotocol/servers\\n\\n`);\n }\n\n private printMcpHelp(): void {\n const w = (s: string) => process.stdout.write(s);\n\n w(`\\n${colorize('☁️ MCP - Guia Rápido', 'bold')}\\n`);\n w(`${colorize(Box.horizontal.repeat(40), 'subtle')}\\n\\n`);\n\n w(`${colorize('Comandos:', 'bold')}\\n`);\n w(` ${colorize('/mcp', 'cyan')} → Menu interativo\\n`);\n w(` ${colorize('/mcp list', 'cyan')} → Ver servidores\\n`);\n w(` ${colorize('/mcp tools', 'cyan')} → Ver ferramentas\\n`);\n w(` ${colorize('/mcp add', 'cyan')} → Adicionar servidor\\n`);\n w(` ${colorize('/mcp remove', 'cyan')} → Remover servidor\\n`);\n w(` ${colorize('/mcp what', 'cyan')} → O que é MCP?\\n\\n`);\n\n w(`${colorize('Servidores populares:', 'bold')}\\n`);\n w(` ${colorize('@modelcontextprotocol/server-github', 'muted')}\\n`);\n w(` Acesse repositórios, issues, PRs\\n\\n`);\n w(` ${colorize('@figma/mcp-server (HTTP)', 'muted')}\\n`);\n w(` Acesse designs e componentes (requer OAuth)\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-filesystem', 'muted')}\\n`);\n w(` Leia/escrita de arquivos locais\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-postgres', 'muted')}\\n`);\n w(` Consulte bancos PostgreSQL\\n\\n`);\n w(` ${colorize('@modelcontextprotocol/server-brave-search', 'muted')}\\n`);\n w(` Busca na web via Brave\\n\\n`);\n\n w(`${colorize('Servidores HTTP (OAuth):', 'bold')}\\n`);\n w(` Alguns servidores como Figma usam HTTP + OAuth.\\n`);\n w(` Após adicionar, a autenticação será solicitada.\\n\\n`);\n\n w(`${colorize('Configuração manual:', 'bold')}\\n`);\n w(` Crie: ${colorize('.cast/mcp/nome.json', 'cyan')}\\n\\n`);\n w(colorize(` {\\n`, 'muted'));\n w(colorize(` \"meu-mcp\": {\\n`, 'muted'));\n w(colorize(` \"type\": \"stdio\",\\n`, 'muted'));\n w(colorize(` \"command\": \"npx\",\\n`, 'muted'));\n w(colorize(` \"args\": [\"-y\", \"@modelcontextprotocol/server-github\"],\\n`, 'muted'));\n w(colorize(` \"env\": { \"GITHUB_TOKEN\": \"...\" }\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(colorize(` }\\n`, 'muted'));\n w(`\\n`);\n }\n}\n"],"names":["McpCommandsService","cmdMcp","args","smartInput","sub","showMcpMenu","error","CancelledPromptError","name","console","log","colorize","pause","listServers","listTools","addMcpWizard","removeMcpWizard","testMcpTool","printWhatIsMcp","printMcpHelp","resume","w","s","process","stdout","write","Box","horizontal","repeat","summaries","mcpRegistry","getServerSummaries","totalTools","reduce","sum","toolCount","length","action","withEsc","askChoice","key","label","description","connectServers","question","fn","Icons","cloud","results","connectAll","ok","entries","icon","status","config","getConfig","type","template","getTemplate","credentials","missing","filter","cred","isArg","env","envVar","mcpDir","path","join","cwd","filePath","updatedConfig","JSON","parse","stringify","value","placeholder","trim","fs","writeFileSync","registerMcp","retryOk","connectMcp","retryIcon","retryStatus","finalResults","connected","values","Boolean","size","statusIcon","statusText","transport","toolNames","toolDescriptions","slice","map","t","split","pop","more","tool","server","td","shortName","replace","desc","existsSync","mkdirSync","recursive","category","selectWithEsc","message","choices","templates","getTemplatesByCategory","templateId","id","required","push","nameInput","inputWithEsc","typeChoice","command","argsInput","a","hasEnv","confirmWithEsc","default","endpoint","toLowerCase","files","readdirSync","f","endsWith","toRemove","select","confirmRemove","confirm","unlinkSync","printHowToCreate","mcpClient"],"mappings":"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"}
|
|
@@ -321,6 +321,8 @@ let ReplService = class ReplService {
|
|
|
321
321
|
break;
|
|
322
322
|
case 'config':
|
|
323
323
|
await this.configCommands.handleConfigCommand(args, this.smartInput);
|
|
324
|
+
await this.configManager.loadConfig();
|
|
325
|
+
await this.deepAgent.reinitializeModel();
|
|
324
326
|
break;
|
|
325
327
|
case 'model':
|
|
326
328
|
this.replCommands.cmdModel(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/repl/services/repl.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { DeepAgentService } from '../../core/services/deep-agent.service';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { ConfigManagerService } from '../../config/services/config-manager.service';\nimport { MentionsService } from '../../mentions/services/mentions.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { PlanModeService } from '../../core/services/plan-mode.service';\nimport { SmartInput } from './smart-input';\nimport { WelcomeScreenService } from './welcome-screen.service';\nimport { ReplCommandsService } from './commands/repl-commands.service';\nimport { GitCommandsService } from './commands/git-commands.service';\nimport { AgentCommandsService } from './commands/agent-commands.service';\nimport { McpCommandsService } from './commands/mcp-commands.service';\nimport { ConfigCommandsService } from '../../config/services/config-commands.service';\nimport { ProjectCommandsService } from './commands/project-commands.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { Colors, Icons } from '../utils/theme';\n\n@Injectable()\nexport class ReplService {\n private smartInput: SmartInput | null = null;\n private abortController: AbortController | null = null;\n private isProcessing = false;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly deepAgent: DeepAgentService,\n private readonly configService: ConfigService,\n private readonly configManager: ConfigManagerService,\n private readonly mentionsService: MentionsService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly welcomeScreen: WelcomeScreenService,\n private readonly planMode: PlanModeService,\n private readonly replCommands: ReplCommandsService,\n private readonly gitCommands: GitCommandsService,\n private readonly agentCommands: AgentCommandsService,\n private readonly mcpCommands: McpCommandsService,\n private readonly configCommands: ConfigCommandsService,\n private readonly projectCommands: ProjectCommandsService,\n private readonly toolsRegistry: ToolsRegistryService,\n ) {}\n\n async start(): Promise<void> {\n const initResult = await this.deepAgent.initialize();\n const agentCount = this.agentRegistry.resolveAllAgents().length;\n\n this.welcomeScreen.printWelcomeScreen({\n projectPath: initResult.projectPath || undefined,\n model: this.getModelDisplayName(),\n toolCount: initResult.toolCount,\n agentCount,\n });\n\n this.smartInput = new SmartInput({\n prompt: `${Colors.cyan}${Colors.bold}>${Colors.reset} `,\n promptVisibleLen: 2,\n getCommandSuggestions: (input) => this.getCommandSuggestions(input),\n getMentionSuggestions: (partial) => this.getMentionSuggestions(partial),\n onSubmit: (line) => this.handleLine(line),\n onCancel: () => this.handleCancel(),\n onExit: () => this.handleExit(),\n });\n\n this.smartInput.start();\n }\n\n private getCommandSuggestions(input: string): Array<{ text: string; display: string; description: string }> {\n const commands = [\n { text: '/help', display: '/help', description: 'Show help' },\n { text: '/clear', display: '/clear', description: 'Clear conversation' },\n { text: '/compact', display: '/compact', description: 'Compact history' },\n { text: '/exit', display: '/exit', description: 'Exit' },\n { text: '/status', display: '/status', description: 'Git status' },\n { text: '/diff', display: '/diff', description: 'Git diff' },\n { text: '/log', display: '/log', description: 'Git log' },\n { text: '/commit', display: '/commit', description: 'Commit changes' },\n { text: '/up', display: '/up', description: 'Smart commit & push' },\n { text: '/split-up', display: '/split-up', description: 'Split commits' },\n { text: '/pr', display: '/pr', description: 'Create Pull Request' },\n { text: '/review', display: '/review', description: 'Code review' },\n { text: '/fix', display: '/fix', description: 'Auto-fix code' },\n { text: '/ident', display: '/ident', description: 'Format code' },\n { text: '/release', display: '/release', description: 'Release notes' },\n { text: '/tools', display: '/tools', description: 'List tools' },\n { text: '/agents', display: '/agents', description: 'List agents' },\n { text: '/skills', display: '/skills', description: 'List skills' },\n { text: '/context', display: '/context', description: 'Session info' },\n { text: '/mentions', display: '/mentions', description: 'Mentions help' },\n { text: '/model', display: '/model', description: 'Show model' },\n { text: '/config', display: '/config', description: 'Configuration' },\n { text: '/project', display: '/project', description: 'Project context' },\n { text: '/project-deep', display: '/project-deep', description: 'Deep project analysis' },\n { text: '/init', display: '/init', description: 'Analyze project and generate context' },\n { text: '/mcp', display: '/mcp', description: 'MCP servers' },\n ];\n\n return commands.filter(c => c.text.startsWith(input));\n }\n\n private getMentionSuggestions(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n const gitOpts = [\n { text: '@git:status', display: '@git:status', description: 'Git status' },\n { text: '@git:diff', display: '@git:diff', description: 'Git diff' },\n { text: '@git:log', display: '@git:log', description: 'Git log' },\n { text: '@git:branch', display: '@git:branch', description: 'Branches' },\n ];\n\n if (partial === '') return [...gitOpts, ...this.getFileEntries('')];\n if (partial.startsWith('git:')) return gitOpts.filter(o => o.text.startsWith('@' + partial));\n\n return [...gitOpts.filter(o => o.text.startsWith('@' + partial)), ...this.getFileEntries(partial)].slice(0, 30);\n }\n\n private getFileEntries(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n try {\n let dir: string;\n let prefix: string;\n\n if (partial.endsWith('/')) {\n dir = partial.slice(0, -1) || '.';\n prefix = '';\n } else if (partial.includes('/')) {\n dir = path.dirname(partial);\n prefix = path.basename(partial);\n } else {\n dir = '.';\n prefix = partial;\n }\n\n const resolved = path.resolve(process.cwd(), dir);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) return [];\n\n const entries = fs.readdirSync(resolved, { withFileTypes: true });\n const ignore = ['node_modules', '.git', 'dist', 'coverage', '.next', '__pycache__'];\n\n return entries\n .filter(e => !ignore.includes(e.name))\n .filter(e => !e.name.startsWith('.') || prefix.startsWith('.'))\n .filter(e => prefix === '' || e.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .map(e => {\n const relDir = dir === '.' ? '' : dir + '/';\n const isDir = e.isDirectory();\n return {\n text: '@' + relDir + e.name + (isDir ? '/' : ''),\n display: '@' + relDir + e.name + (isDir ? '/' : ''),\n description: isDir ? 'dir' : '',\n };\n })\n .slice(0, 20);\n } catch {\n return [];\n }\n }\n\n private handleCancel(): void {\n if (this.isProcessing && this.abortController) {\n this.abortController.abort();\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.yellow} Cancelled${Colors.reset}\\r\\n\\r\\n`);\n this.isProcessing = false;\n } else {\n process.stdout.write(`${Colors.dim} (Use /exit to quit)${Colors.reset}\\r\\n`);\n this.smartInput?.showPrompt();\n }\n }\n\n private handleExit(): void {\n process.stdout.write(`${Colors.dim} Goodbye!${Colors.reset}\\r\\n`);\n this.stop();\n process.exit(0);\n }\n\n private async handleLine(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n this.smartInput?.showPrompt();\n return;\n }\n\n if (trimmed.startsWith('/')) {\n await this.handleCommand(trimmed);\n } else {\n await this.handleMessage(trimmed);\n }\n\n this.smartInput?.showPrompt();\n }\n\n private async handleCommand(command: string): Promise<void> {\n const parts = command.slice(1).split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (cmd) {\n case 'help': this.replCommands.printHelp(); break;\n case 'clear': this.replCommands.cmdClear(this.welcomeScreen); break;\n case 'exit':\n case 'quit': this.handleExit(); return;\n case 'compact': await this.handleCompact(); break;\n case 'context': this.replCommands.cmdContext(); break;\n case 'config': \n await this.configCommands.handleConfigCommand(args, this.smartInput!); \n break;\n case 'model': this.replCommands.cmdModel(args); break;\n case 'init':\n await this.projectCommands.cmdProject(['analyze'], this.smartInput!);\n break;\n case 'mentions': this.replCommands.cmdMentionsHelp(); break;\n case 'tools': this.cmdTools(); break;\n\n case 'status': this.gitCommands.runGit('git status'); break;\n case 'diff': this.gitCommands.runGit(args.length ? `git diff ${args.join(' ')}` : 'git diff'); break;\n case 'log': this.gitCommands.runGit('git log --oneline -15'); break;\n case 'commit': \n await this.gitCommands.cmdCommit(args, this.smartInput!); \n break;\n case 'up': \n await this.gitCommands.cmdUp(this.smartInput!); \n break;\n case 'split-up': \n await this.gitCommands.cmdSplitUp(this.smartInput!); \n break;\n case 'pr': \n await this.gitCommands.cmdPr(this.smartInput!); \n break;\n case 'review': await this.gitCommands.cmdReview(args); break;\n case 'fix': await this.gitCommands.cmdFix(args); break;\n case 'ident': await this.gitCommands.cmdIdent(); break;\n case 'release': await this.gitCommands.cmdRelease(args); break;\n\n case 'agents': \n await this.agentCommands.cmdAgents(args, this.smartInput!); \n break;\n case 'skills': \n await this.agentCommands.cmdSkills(args, this.smartInput!); \n break;\n\n case 'mcp': \n await this.mcpCommands.cmdMcp(args, this.smartInput!); \n break;\n\n case 'project':\n await this.projectCommands.cmdProject(args, this.smartInput!);\n break;\n case 'project-deep':\n await this.projectCommands.cmdProject(['deep'], this.smartInput!);\n break;\n\n default:\n process.stdout.write(`${Colors.red} Unknown: /${cmd}${Colors.reset} ${Colors.dim}Try /help${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleCompact(): Promise<void> {\n const msgCount = this.deepAgent.getMessageCount();\n if (msgCount < 4) {\n process.stdout.write(`${Colors.dim} Nothing to compact (${msgCount} messages)${Colors.reset}\\r\\n`);\n return;\n }\n process.stdout.write(`${Colors.dim} Summarizing ${msgCount} messages...${Colors.reset}\\r\\n`);\n const result = await this.deepAgent.compactHistory();\n if (result.compacted) {\n process.stdout.write(`${Colors.green} Compacted: ${result.messagesBefore} → ${result.messagesAfter} messages${Colors.reset}\\r\\n`);\n } else {\n process.stdout.write(`${Colors.yellow} Could not compact (summarization failed)${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleMessage(message: string): Promise<void> {\n this.isProcessing = true;\n this.abortController = new AbortController();\n this.smartInput?.enterPassiveMode();\n\n try {\n let messageToProcess = message;\n\n const planCheck = await this.planMode.shouldEnterPlanMode(message);\n if (planCheck.shouldPlan) {\n const usePlan = await this.smartInput!.askChoice(\n '📝 Complex task. Create a plan?',\n [\n { key: 'y', label: 'yes', description: 'Create structured plan' },\n { key: 'n', label: 'no', description: 'Proceed without plan' },\n ]\n );\n \n if (usePlan === 'y') {\n const plannedMessage = await this.runInteractivePlanMode(message);\n if (!plannedMessage) {\n this.isProcessing = false;\n this.smartInput?.exitPassiveMode();\n return;\n }\n messageToProcess = plannedMessage;\n }\n }\n\n const mentionResult = await this.mentionsService.processMessage(messageToProcess);\n if (mentionResult.mentions.length > 0) {\n const summary = this.mentionsService.getMentionsSummary(mentionResult.mentions);\n for (const line of summary) {\n process.stdout.write(`${Colors.dim}${line}${Colors.reset}\\r\\n`);\n }\n process.stdout.write('\\r\\n');\n }\n\n this.startSpinner('Thinking');\n\n let firstChunk = true;\n let fullResponse = '';\n\n for await (const chunk of this.deepAgent.chat(mentionResult.expandedMessage)) {\n if (this.abortController?.signal.aborted) break;\n\n const isToolOutput = chunk.includes('\\x1b[') && (\n chunk.includes('⏿') ||\n chunk.includes('tokens:') ||\n chunk.includes('conversation compacted')\n );\n\n if (firstChunk && !isToolOutput) {\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.magenta}${Colors.bold}${Icons.chestnut} Cast${Colors.reset}\\r\\n`);\n firstChunk = false;\n }\n\n if (!isToolOutput) {\n fullResponse += chunk;\n }\n process.stdout.write(chunk);\n }\n\n if (!firstChunk) {\n process.stdout.write('\\r\\n');\n } else {\n this.stopSpinner();\n }\n } catch (error) {\n this.stopSpinner();\n const msg = (error as Error).message;\n if (!msg.includes('abort')) {\n process.stdout.write(`\\r\\n${Colors.red} Error: ${msg}${Colors.reset}\\r\\n\\r\\n`);\n }\n } finally {\n this.isProcessing = false;\n this.abortController = null;\n this.smartInput?.exitPassiveMode();\n }\n }\n\n private async runInteractivePlanMode(userMessage: string): Promise<string | null> {\n process.stdout.write(`\\r\\n${Colors.cyan}${Colors.bold}📋 PLAN MODE${Colors.reset}\\r\\n`);\n process.stdout.write(`${Colors.dim}Build plan first, execute after approval${Colors.reset}\\r\\n\\r\\n`);\n\n const clarifyingQuestions = await this.planMode.generateClarifyingQuestions(userMessage);\n const answers: string[] = [];\n\n if (clarifyingQuestions.length > 0) {\n process.stdout.write(`${Colors.dim}I need a few quick clarifications:${Colors.reset}\\r\\n`);\n for (let i = 0; i < clarifyingQuestions.length; i++) {\n const q = clarifyingQuestions[i];\n const answer = await this.smartInput!.question(`${Colors.yellow}Q${i + 1}:${Colors.reset} ${q} `);\n if (answer.trim()) {\n answers.push(`- ${q} => ${answer.trim()}`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n const context = answers.length > 0 ? `User clarifications:\\n${answers.join('\\n')}` : undefined;\n let plan = await this.planMode.generatePlan(userMessage, context);\n\n while (true) {\n process.stdout.write(this.planMode.formatPlanForDisplay(plan));\n\n const action = await this.smartInput!.askChoice('Plan options', [\n { key: 'a', label: 'accept', description: 'Use this plan and continue' },\n { key: 'r', label: 'refine', description: 'Refine plan with extra feedback' },\n { key: 'c', label: 'cancel', description: 'Cancel and return to prompt' },\n ]);\n\n if (action === 'c') {\n process.stdout.write(`${Colors.dim} Plan cancelled${Colors.reset}\\r\\n\\r\\n`);\n return null;\n }\n\n if (action === 'r') {\n const feedback = await this.smartInput!.question(`${Colors.cyan}Refinement feedback:${Colors.reset} `);\n if (!feedback.trim()) {\n process.stdout.write(`${Colors.dim} No feedback provided. Keeping current plan.${Colors.reset}\\r\\n\\r\\n`);\n continue;\n }\n plan = await this.planMode.refinePlan(plan, feedback.trim());\n continue;\n }\n\n return this.buildPlanExecutionPrompt(userMessage, plan, answers);\n }\n }\n\n private buildPlanExecutionPrompt(userMessage: string, plan: { title: string; overview: string; steps: Array<{ id: number; description: string; files: string[] }> }, clarifications: string[]): string {\n const lines: string[] = [];\n lines.push(userMessage);\n lines.push('');\n lines.push('Approved execution plan:');\n lines.push(`Title: ${plan.title}`);\n lines.push(`Overview: ${plan.overview}`);\n lines.push('Steps:');\n for (const step of plan.steps) {\n const files = step.files.length > 0 ? ` | files: ${step.files.join(', ')}` : '';\n lines.push(`${step.id}. ${step.description}${files}`);\n }\n if (clarifications.length > 0) {\n lines.push('');\n lines.push('User clarifications:');\n lines.push(...clarifications);\n }\n lines.push('');\n lines.push('Execute the task following this approved plan and report progress by step.');\n return lines.join('\\n');\n }\n\n private startSpinner(label: string): void {\n let i = 0;\n this.spinnerTimer = setInterval(() => {\n process.stdout.write(`\\r${Colors.cyan}${Icons.thinkingChestnut[i++ % Icons.thinkingChestnut.length]}${Colors.reset} ${Colors.dim}${label}...${Colors.reset}`);\n }, 80);\n }\n\n private stopSpinner(): void {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n process.stdout.write('\\r\\x1b[K');\n }\n }\n\n private cmdTools(): void {\n const allTools = this.toolsRegistry.getAllTools();\n const tools: [string, string][] = allTools.map(t => [t.name, t.description.slice(0, 60)]);\n\n if (tools.length > 0) {\n const maxLen = Math.max(...tools.map(([n]) => n.length));\n\n process.stdout.write('\\r\\n');\n process.stdout.write(`${Colors.bold}Built-in Tools (${tools.length}):${Colors.reset}\\r\\n`);\n for (const [name, desc] of tools) {\n process.stdout.write(` ${Colors.cyan}${name.padEnd(maxLen)}${Colors.reset} ${Colors.dim}${desc}${Colors.reset}\\r\\n`);\n }\n }\n\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n if (mcpTools.length > 0) {\n process.stdout.write(`\\r\\n${Colors.bold}MCP Tools (${mcpTools.length}):${Colors.reset}\\r\\n`);\n for (const t of mcpTools.slice(0, 10)) {\n process.stdout.write(` ${Colors.cyan}${t.name}${Colors.reset} ${Colors.dim}${t.description.slice(0, 50)}${Colors.reset}\\r\\n`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n private getModelDisplayName(): string {\n try {\n const modelConfig = this.configManager.getModelConfig('default');\n if (modelConfig) {\n return `${modelConfig.provider}/${modelConfig.model}`;\n }\n } catch {\n }\n return `${this.configService.getProvider()}/${this.configService.getModel()}`;\n }\n\n stop(): void {\n this.stopSpinner();\n this.smartInput?.destroy();\n }\n}\n"],"names":["ReplService","start","initResult","deepAgent","initialize","agentCount","agentRegistry","resolveAllAgents","length","welcomeScreen","printWelcomeScreen","projectPath","undefined","model","getModelDisplayName","toolCount","smartInput","SmartInput","prompt","Colors","cyan","bold","reset","promptVisibleLen","getCommandSuggestions","input","getMentionSuggestions","partial","onSubmit","line","handleLine","onCancel","handleCancel","onExit","handleExit","commands","text","display","description","filter","c","startsWith","fs","require","path","gitOpts","getFileEntries","o","slice","dir","prefix","endsWith","includes","dirname","basename","resolved","resolve","process","cwd","existsSync","statSync","isDirectory","entries","readdirSync","withFileTypes","ignore","e","name","toLowerCase","map","relDir","isDir","isProcessing","abortController","abort","stopSpinner","stdout","write","yellow","dim","showPrompt","stop","exit","trimmed","trim","handleCommand","handleMessage","command","parts","split","cmd","args","replCommands","printHelp","cmdClear","handleCompact","cmdContext","configCommands","handleConfigCommand","cmdModel","projectCommands","cmdProject","cmdMentionsHelp","cmdTools","gitCommands","runGit","join","cmdCommit","cmdUp","cmdSplitUp","cmdPr","cmdReview","cmdFix","cmdIdent","cmdRelease","agentCommands","cmdAgents","cmdSkills","mcpCommands","cmdMcp","red","msgCount","getMessageCount","result","compactHistory","compacted","green","messagesBefore","messagesAfter","message","AbortController","enterPassiveMode","messageToProcess","planCheck","planMode","shouldEnterPlanMode","shouldPlan","usePlan","askChoice","key","label","plannedMessage","runInteractivePlanMode","exitPassiveMode","mentionResult","mentionsService","processMessage","mentions","summary","getMentionsSummary","startSpinner","firstChunk","fullResponse","chunk","chat","expandedMessage","signal","aborted","isToolOutput","magenta","Icons","chestnut","error","msg","userMessage","clarifyingQuestions","generateClarifyingQuestions","answers","i","q","answer","question","push","context","plan","generatePlan","formatPlanForDisplay","action","feedback","refinePlan","buildPlanExecutionPrompt","clarifications","lines","title","overview","step","steps","files","id","spinnerTimer","setInterval","thinkingChestnut","clearInterval","allTools","toolsRegistry","getAllTools","tools","t","maxLen","Math","max","n","desc","padEnd","mcpTools","mcpRegistry","getAllMcpTools","modelConfig","configManager","getModelConfig","provider","configService","getProvider","getModel","destroy","skillRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/repl/services/repl.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { DeepAgentService } from '../../core/services/deep-agent.service';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { ConfigManagerService } from '../../config/services/config-manager.service';\nimport { MentionsService } from '../../mentions/services/mentions.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { PlanModeService } from '../../core/services/plan-mode.service';\nimport { SmartInput } from './smart-input';\nimport { WelcomeScreenService } from './welcome-screen.service';\nimport { ReplCommandsService } from './commands/repl-commands.service';\nimport { GitCommandsService } from './commands/git-commands.service';\nimport { AgentCommandsService } from './commands/agent-commands.service';\nimport { McpCommandsService } from './commands/mcp-commands.service';\nimport { ConfigCommandsService } from '../../config/services/config-commands.service';\nimport { ProjectCommandsService } from './commands/project-commands.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { Colors, Icons } from '../utils/theme';\n\n@Injectable()\nexport class ReplService {\n private smartInput: SmartInput | null = null;\n private abortController: AbortController | null = null;\n private isProcessing = false;\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly deepAgent: DeepAgentService,\n private readonly configService: ConfigService,\n private readonly configManager: ConfigManagerService,\n private readonly mentionsService: MentionsService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly welcomeScreen: WelcomeScreenService,\n private readonly planMode: PlanModeService,\n private readonly replCommands: ReplCommandsService,\n private readonly gitCommands: GitCommandsService,\n private readonly agentCommands: AgentCommandsService,\n private readonly mcpCommands: McpCommandsService,\n private readonly configCommands: ConfigCommandsService,\n private readonly projectCommands: ProjectCommandsService,\n private readonly toolsRegistry: ToolsRegistryService,\n ) {}\n\n async start(): Promise<void> {\n const initResult = await this.deepAgent.initialize();\n const agentCount = this.agentRegistry.resolveAllAgents().length;\n\n this.welcomeScreen.printWelcomeScreen({\n projectPath: initResult.projectPath || undefined,\n model: this.getModelDisplayName(),\n toolCount: initResult.toolCount,\n agentCount,\n });\n\n this.smartInput = new SmartInput({\n prompt: `${Colors.cyan}${Colors.bold}>${Colors.reset} `,\n promptVisibleLen: 2,\n getCommandSuggestions: (input) => this.getCommandSuggestions(input),\n getMentionSuggestions: (partial) => this.getMentionSuggestions(partial),\n onSubmit: (line) => this.handleLine(line),\n onCancel: () => this.handleCancel(),\n onExit: () => this.handleExit(),\n });\n\n this.smartInput.start();\n }\n\n private getCommandSuggestions(input: string): Array<{ text: string; display: string; description: string }> {\n const commands = [\n { text: '/help', display: '/help', description: 'Show help' },\n { text: '/clear', display: '/clear', description: 'Clear conversation' },\n { text: '/compact', display: '/compact', description: 'Compact history' },\n { text: '/exit', display: '/exit', description: 'Exit' },\n { text: '/status', display: '/status', description: 'Git status' },\n { text: '/diff', display: '/diff', description: 'Git diff' },\n { text: '/log', display: '/log', description: 'Git log' },\n { text: '/commit', display: '/commit', description: 'Commit changes' },\n { text: '/up', display: '/up', description: 'Smart commit & push' },\n { text: '/split-up', display: '/split-up', description: 'Split commits' },\n { text: '/pr', display: '/pr', description: 'Create Pull Request' },\n { text: '/review', display: '/review', description: 'Code review' },\n { text: '/fix', display: '/fix', description: 'Auto-fix code' },\n { text: '/ident', display: '/ident', description: 'Format code' },\n { text: '/release', display: '/release', description: 'Release notes' },\n { text: '/tools', display: '/tools', description: 'List tools' },\n { text: '/agents', display: '/agents', description: 'List agents' },\n { text: '/skills', display: '/skills', description: 'List skills' },\n { text: '/context', display: '/context', description: 'Session info' },\n { text: '/mentions', display: '/mentions', description: 'Mentions help' },\n { text: '/model', display: '/model', description: 'Show model' },\n { text: '/config', display: '/config', description: 'Configuration' },\n { text: '/project', display: '/project', description: 'Project context' },\n { text: '/project-deep', display: '/project-deep', description: 'Deep project analysis' },\n { text: '/init', display: '/init', description: 'Analyze project and generate context' },\n { text: '/mcp', display: '/mcp', description: 'MCP servers' },\n ];\n\n return commands.filter(c => c.text.startsWith(input));\n }\n\n private getMentionSuggestions(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n const gitOpts = [\n { text: '@git:status', display: '@git:status', description: 'Git status' },\n { text: '@git:diff', display: '@git:diff', description: 'Git diff' },\n { text: '@git:log', display: '@git:log', description: 'Git log' },\n { text: '@git:branch', display: '@git:branch', description: 'Branches' },\n ];\n\n if (partial === '') return [...gitOpts, ...this.getFileEntries('')];\n if (partial.startsWith('git:')) return gitOpts.filter(o => o.text.startsWith('@' + partial));\n\n return [...gitOpts.filter(o => o.text.startsWith('@' + partial)), ...this.getFileEntries(partial)].slice(0, 30);\n }\n\n private getFileEntries(partial: string): Array<{ text: string; display: string; description: string }> {\n const fs = require('fs');\n const path = require('path');\n\n try {\n let dir: string;\n let prefix: string;\n\n if (partial.endsWith('/')) {\n dir = partial.slice(0, -1) || '.';\n prefix = '';\n } else if (partial.includes('/')) {\n dir = path.dirname(partial);\n prefix = path.basename(partial);\n } else {\n dir = '.';\n prefix = partial;\n }\n\n const resolved = path.resolve(process.cwd(), dir);\n if (!fs.existsSync(resolved) || !fs.statSync(resolved).isDirectory()) return [];\n\n const entries = fs.readdirSync(resolved, { withFileTypes: true });\n const ignore = ['node_modules', '.git', 'dist', 'coverage', '.next', '__pycache__'];\n\n return entries\n .filter(e => !ignore.includes(e.name))\n .filter(e => !e.name.startsWith('.') || prefix.startsWith('.'))\n .filter(e => prefix === '' || e.name.toLowerCase().startsWith(prefix.toLowerCase()))\n .map(e => {\n const relDir = dir === '.' ? '' : dir + '/';\n const isDir = e.isDirectory();\n return {\n text: '@' + relDir + e.name + (isDir ? '/' : ''),\n display: '@' + relDir + e.name + (isDir ? '/' : ''),\n description: isDir ? 'dir' : '',\n };\n })\n .slice(0, 20);\n } catch {\n return [];\n }\n }\n\n private handleCancel(): void {\n if (this.isProcessing && this.abortController) {\n this.abortController.abort();\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.yellow} Cancelled${Colors.reset}\\r\\n\\r\\n`);\n this.isProcessing = false;\n } else {\n process.stdout.write(`${Colors.dim} (Use /exit to quit)${Colors.reset}\\r\\n`);\n this.smartInput?.showPrompt();\n }\n }\n\n private handleExit(): void {\n process.stdout.write(`${Colors.dim} Goodbye!${Colors.reset}\\r\\n`);\n this.stop();\n process.exit(0);\n }\n\n private async handleLine(input: string): Promise<void> {\n const trimmed = input.trim();\n\n if (!trimmed) {\n this.smartInput?.showPrompt();\n return;\n }\n\n if (trimmed.startsWith('/')) {\n await this.handleCommand(trimmed);\n } else {\n await this.handleMessage(trimmed);\n }\n\n this.smartInput?.showPrompt();\n }\n\n private async handleCommand(command: string): Promise<void> {\n const parts = command.slice(1).split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n const args = parts.slice(1);\n\n switch (cmd) {\n case 'help': this.replCommands.printHelp(); break;\n case 'clear': this.replCommands.cmdClear(this.welcomeScreen); break;\n case 'exit':\n case 'quit': this.handleExit(); return;\n case 'compact': await this.handleCompact(); break;\n case 'context': this.replCommands.cmdContext(); break;\n case 'config':\n await this.configCommands.handleConfigCommand(args, this.smartInput!);\n await this.configManager.loadConfig();\n await this.deepAgent.reinitializeModel();\n break;\n case 'model': this.replCommands.cmdModel(args); break;\n case 'init':\n await this.projectCommands.cmdProject(['analyze'], this.smartInput!);\n break;\n case 'mentions': this.replCommands.cmdMentionsHelp(); break;\n case 'tools': this.cmdTools(); break;\n\n case 'status': this.gitCommands.runGit('git status'); break;\n case 'diff': this.gitCommands.runGit(args.length ? `git diff ${args.join(' ')}` : 'git diff'); break;\n case 'log': this.gitCommands.runGit('git log --oneline -15'); break;\n case 'commit': \n await this.gitCommands.cmdCommit(args, this.smartInput!); \n break;\n case 'up': \n await this.gitCommands.cmdUp(this.smartInput!); \n break;\n case 'split-up': \n await this.gitCommands.cmdSplitUp(this.smartInput!); \n break;\n case 'pr': \n await this.gitCommands.cmdPr(this.smartInput!); \n break;\n case 'review': await this.gitCommands.cmdReview(args); break;\n case 'fix': await this.gitCommands.cmdFix(args); break;\n case 'ident': await this.gitCommands.cmdIdent(); break;\n case 'release': await this.gitCommands.cmdRelease(args); break;\n\n case 'agents': \n await this.agentCommands.cmdAgents(args, this.smartInput!); \n break;\n case 'skills': \n await this.agentCommands.cmdSkills(args, this.smartInput!); \n break;\n\n case 'mcp': \n await this.mcpCommands.cmdMcp(args, this.smartInput!); \n break;\n\n case 'project':\n await this.projectCommands.cmdProject(args, this.smartInput!);\n break;\n case 'project-deep':\n await this.projectCommands.cmdProject(['deep'], this.smartInput!);\n break;\n\n default:\n process.stdout.write(`${Colors.red} Unknown: /${cmd}${Colors.reset} ${Colors.dim}Try /help${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleCompact(): Promise<void> {\n const msgCount = this.deepAgent.getMessageCount();\n if (msgCount < 4) {\n process.stdout.write(`${Colors.dim} Nothing to compact (${msgCount} messages)${Colors.reset}\\r\\n`);\n return;\n }\n process.stdout.write(`${Colors.dim} Summarizing ${msgCount} messages...${Colors.reset}\\r\\n`);\n const result = await this.deepAgent.compactHistory();\n if (result.compacted) {\n process.stdout.write(`${Colors.green} Compacted: ${result.messagesBefore} → ${result.messagesAfter} messages${Colors.reset}\\r\\n`);\n } else {\n process.stdout.write(`${Colors.yellow} Could not compact (summarization failed)${Colors.reset}\\r\\n`);\n }\n }\n\n private async handleMessage(message: string): Promise<void> {\n this.isProcessing = true;\n this.abortController = new AbortController();\n this.smartInput?.enterPassiveMode();\n\n try {\n let messageToProcess = message;\n\n const planCheck = await this.planMode.shouldEnterPlanMode(message);\n if (planCheck.shouldPlan) {\n const usePlan = await this.smartInput!.askChoice(\n '📝 Complex task. Create a plan?',\n [\n { key: 'y', label: 'yes', description: 'Create structured plan' },\n { key: 'n', label: 'no', description: 'Proceed without plan' },\n ]\n );\n \n if (usePlan === 'y') {\n const plannedMessage = await this.runInteractivePlanMode(message);\n if (!plannedMessage) {\n this.isProcessing = false;\n this.smartInput?.exitPassiveMode();\n return;\n }\n messageToProcess = plannedMessage;\n }\n }\n\n const mentionResult = await this.mentionsService.processMessage(messageToProcess);\n if (mentionResult.mentions.length > 0) {\n const summary = this.mentionsService.getMentionsSummary(mentionResult.mentions);\n for (const line of summary) {\n process.stdout.write(`${Colors.dim}${line}${Colors.reset}\\r\\n`);\n }\n process.stdout.write('\\r\\n');\n }\n\n this.startSpinner('Thinking');\n\n let firstChunk = true;\n let fullResponse = '';\n\n for await (const chunk of this.deepAgent.chat(mentionResult.expandedMessage)) {\n if (this.abortController?.signal.aborted) break;\n\n const isToolOutput = chunk.includes('\\x1b[') && (\n chunk.includes('⏿') ||\n chunk.includes('tokens:') ||\n chunk.includes('conversation compacted')\n );\n\n if (firstChunk && !isToolOutput) {\n this.stopSpinner();\n process.stdout.write(`\\r\\n${Colors.magenta}${Colors.bold}${Icons.chestnut} Cast${Colors.reset}\\r\\n`);\n firstChunk = false;\n }\n\n if (!isToolOutput) {\n fullResponse += chunk;\n }\n process.stdout.write(chunk);\n }\n\n if (!firstChunk) {\n process.stdout.write('\\r\\n');\n } else {\n this.stopSpinner();\n }\n } catch (error) {\n this.stopSpinner();\n const msg = (error as Error).message;\n if (!msg.includes('abort')) {\n process.stdout.write(`\\r\\n${Colors.red} Error: ${msg}${Colors.reset}\\r\\n\\r\\n`);\n }\n } finally {\n this.isProcessing = false;\n this.abortController = null;\n this.smartInput?.exitPassiveMode();\n }\n }\n\n private async runInteractivePlanMode(userMessage: string): Promise<string | null> {\n process.stdout.write(`\\r\\n${Colors.cyan}${Colors.bold}📋 PLAN MODE${Colors.reset}\\r\\n`);\n process.stdout.write(`${Colors.dim}Build plan first, execute after approval${Colors.reset}\\r\\n\\r\\n`);\n\n const clarifyingQuestions = await this.planMode.generateClarifyingQuestions(userMessage);\n const answers: string[] = [];\n\n if (clarifyingQuestions.length > 0) {\n process.stdout.write(`${Colors.dim}I need a few quick clarifications:${Colors.reset}\\r\\n`);\n for (let i = 0; i < clarifyingQuestions.length; i++) {\n const q = clarifyingQuestions[i];\n const answer = await this.smartInput!.question(`${Colors.yellow}Q${i + 1}:${Colors.reset} ${q} `);\n if (answer.trim()) {\n answers.push(`- ${q} => ${answer.trim()}`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n const context = answers.length > 0 ? `User clarifications:\\n${answers.join('\\n')}` : undefined;\n let plan = await this.planMode.generatePlan(userMessage, context);\n\n while (true) {\n process.stdout.write(this.planMode.formatPlanForDisplay(plan));\n\n const action = await this.smartInput!.askChoice('Plan options', [\n { key: 'a', label: 'accept', description: 'Use this plan and continue' },\n { key: 'r', label: 'refine', description: 'Refine plan with extra feedback' },\n { key: 'c', label: 'cancel', description: 'Cancel and return to prompt' },\n ]);\n\n if (action === 'c') {\n process.stdout.write(`${Colors.dim} Plan cancelled${Colors.reset}\\r\\n\\r\\n`);\n return null;\n }\n\n if (action === 'r') {\n const feedback = await this.smartInput!.question(`${Colors.cyan}Refinement feedback:${Colors.reset} `);\n if (!feedback.trim()) {\n process.stdout.write(`${Colors.dim} No feedback provided. Keeping current plan.${Colors.reset}\\r\\n\\r\\n`);\n continue;\n }\n plan = await this.planMode.refinePlan(plan, feedback.trim());\n continue;\n }\n\n return this.buildPlanExecutionPrompt(userMessage, plan, answers);\n }\n }\n\n private buildPlanExecutionPrompt(userMessage: string, plan: { title: string; overview: string; steps: Array<{ id: number; description: string; files: string[] }> }, clarifications: string[]): string {\n const lines: string[] = [];\n lines.push(userMessage);\n lines.push('');\n lines.push('Approved execution plan:');\n lines.push(`Title: ${plan.title}`);\n lines.push(`Overview: ${plan.overview}`);\n lines.push('Steps:');\n for (const step of plan.steps) {\n const files = step.files.length > 0 ? ` | files: ${step.files.join(', ')}` : '';\n lines.push(`${step.id}. ${step.description}${files}`);\n }\n if (clarifications.length > 0) {\n lines.push('');\n lines.push('User clarifications:');\n lines.push(...clarifications);\n }\n lines.push('');\n lines.push('Execute the task following this approved plan and report progress by step.');\n return lines.join('\\n');\n }\n\n private startSpinner(label: string): void {\n let i = 0;\n this.spinnerTimer = setInterval(() => {\n process.stdout.write(`\\r${Colors.cyan}${Icons.thinkingChestnut[i++ % Icons.thinkingChestnut.length]}${Colors.reset} ${Colors.dim}${label}...${Colors.reset}`);\n }, 80);\n }\n\n private stopSpinner(): void {\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n process.stdout.write('\\r\\x1b[K');\n }\n }\n\n private cmdTools(): void {\n const allTools = this.toolsRegistry.getAllTools();\n const tools: [string, string][] = allTools.map(t => [t.name, t.description.slice(0, 60)]);\n\n if (tools.length > 0) {\n const maxLen = Math.max(...tools.map(([n]) => n.length));\n\n process.stdout.write('\\r\\n');\n process.stdout.write(`${Colors.bold}Built-in Tools (${tools.length}):${Colors.reset}\\r\\n`);\n for (const [name, desc] of tools) {\n process.stdout.write(` ${Colors.cyan}${name.padEnd(maxLen)}${Colors.reset} ${Colors.dim}${desc}${Colors.reset}\\r\\n`);\n }\n }\n\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n if (mcpTools.length > 0) {\n process.stdout.write(`\\r\\n${Colors.bold}MCP Tools (${mcpTools.length}):${Colors.reset}\\r\\n`);\n for (const t of mcpTools.slice(0, 10)) {\n process.stdout.write(` ${Colors.cyan}${t.name}${Colors.reset} ${Colors.dim}${t.description.slice(0, 50)}${Colors.reset}\\r\\n`);\n }\n }\n process.stdout.write('\\r\\n');\n }\n\n private getModelDisplayName(): string {\n try {\n const modelConfig = this.configManager.getModelConfig('default');\n if (modelConfig) {\n return `${modelConfig.provider}/${modelConfig.model}`;\n }\n } catch {\n }\n return `${this.configService.getProvider()}/${this.configService.getModel()}`;\n }\n\n stop(): void {\n this.stopSpinner();\n this.smartInput?.destroy();\n }\n}\n"],"names":["ReplService","start","initResult","deepAgent","initialize","agentCount","agentRegistry","resolveAllAgents","length","welcomeScreen","printWelcomeScreen","projectPath","undefined","model","getModelDisplayName","toolCount","smartInput","SmartInput","prompt","Colors","cyan","bold","reset","promptVisibleLen","getCommandSuggestions","input","getMentionSuggestions","partial","onSubmit","line","handleLine","onCancel","handleCancel","onExit","handleExit","commands","text","display","description","filter","c","startsWith","fs","require","path","gitOpts","getFileEntries","o","slice","dir","prefix","endsWith","includes","dirname","basename","resolved","resolve","process","cwd","existsSync","statSync","isDirectory","entries","readdirSync","withFileTypes","ignore","e","name","toLowerCase","map","relDir","isDir","isProcessing","abortController","abort","stopSpinner","stdout","write","yellow","dim","showPrompt","stop","exit","trimmed","trim","handleCommand","handleMessage","command","parts","split","cmd","args","replCommands","printHelp","cmdClear","handleCompact","cmdContext","configCommands","handleConfigCommand","configManager","loadConfig","reinitializeModel","cmdModel","projectCommands","cmdProject","cmdMentionsHelp","cmdTools","gitCommands","runGit","join","cmdCommit","cmdUp","cmdSplitUp","cmdPr","cmdReview","cmdFix","cmdIdent","cmdRelease","agentCommands","cmdAgents","cmdSkills","mcpCommands","cmdMcp","red","msgCount","getMessageCount","result","compactHistory","compacted","green","messagesBefore","messagesAfter","message","AbortController","enterPassiveMode","messageToProcess","planCheck","planMode","shouldEnterPlanMode","shouldPlan","usePlan","askChoice","key","label","plannedMessage","runInteractivePlanMode","exitPassiveMode","mentionResult","mentionsService","processMessage","mentions","summary","getMentionsSummary","startSpinner","firstChunk","fullResponse","chunk","chat","expandedMessage","signal","aborted","isToolOutput","magenta","Icons","chestnut","error","msg","userMessage","clarifyingQuestions","generateClarifyingQuestions","answers","i","q","answer","question","push","context","plan","generatePlan","formatPlanForDisplay","action","feedback","refinePlan","buildPlanExecutionPrompt","clarifications","lines","title","overview","step","steps","files","id","spinnerTimer","setInterval","thinkingChestnut","clearInterval","allTools","toolsRegistry","getAllTools","tools","t","maxLen","Math","max","n","desc","padEnd","mcpTools","mcpRegistry","getAllMcpTools","modelConfig","getModelConfig","provider","configService","getProvider","getModel","destroy","skillRegistry"],"mappings":";;;;+BAqBaA;;;eAAAA;;;wBArBc;kCACM;+BACH;sCACO;iCACL;oCACG;sCACE;sCACA;iCACL;4BACL;sCACU;qCACD;oCACD;sCACE;oCACF;uCACG;wCACC;sCACF;uBACP;;;;;;;;;;AAGvB,IAAA,AAAMA,cAAN,MAAMA;IAyBX,MAAMC,QAAuB;QAC3B,MAAMC,aAAa,MAAM,IAAI,CAACC,SAAS,CAACC,UAAU;QAClD,MAAMC,aAAa,IAAI,CAACC,aAAa,CAACC,gBAAgB,GAAGC,MAAM;QAE/D,IAAI,CAACC,aAAa,CAACC,kBAAkB,CAAC;YACpCC,aAAaT,WAAWS,WAAW,IAAIC;YACvCC,OAAO,IAAI,CAACC,mBAAmB;YAC/BC,WAAWb,WAAWa,SAAS;YAC/BV;QACF;QAEA,IAAI,CAACW,UAAU,GAAG,IAAIC,sBAAU,CAAC;YAC/BC,QAAQ,GAAGC,aAAM,CAACC,IAAI,GAAGD,aAAM,CAACE,IAAI,CAAC,CAAC,EAAEF,aAAM,CAACG,KAAK,CAAC,CAAC,CAAC;YACvDC,kBAAkB;YAClBC,uBAAuB,CAACC,QAAU,IAAI,CAACD,qBAAqB,CAACC;YAC7DC,uBAAuB,CAACC,UAAY,IAAI,CAACD,qBAAqB,CAACC;YAC/DC,UAAU,CAACC,OAAS,IAAI,CAACC,UAAU,CAACD;YACpCE,UAAU,IAAM,IAAI,CAACC,YAAY;YACjCC,QAAQ,IAAM,IAAI,CAACC,UAAU;QAC/B;QAEA,IAAI,CAAClB,UAAU,CAACf,KAAK;IACvB;IAEQuB,sBAAsBC,KAAa,EAAiE;QAC1G,MAAMU,WAAW;YACf;gBAAEC,MAAM;gBAASC,SAAS;gBAASC,aAAa;YAAY;YAC5D;gBAAEF,MAAM;gBAAUC,SAAS;gBAAUC,aAAa;YAAqB;YACvE;gBAAEF,MAAM;gBAAYC,SAAS;gBAAYC,aAAa;YAAkB;YACxE;gBAAEF,MAAM;gBAASC,SAAS;gBAASC,aAAa;YAAO;YACvD;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAa;YACjE;gBAAEF,MAAM;gBAASC,SAAS;gBAASC,aAAa;YAAW;YAC3D;gBAAEF,MAAM;gBAAQC,SAAS;gBAAQC,aAAa;YAAU;YACxD;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAiB;YACrE;gBAAEF,MAAM;gBAAOC,SAAS;gBAAOC,aAAa;YAAsB;YAClE;gBAAEF,MAAM;gBAAaC,SAAS;gBAAaC,aAAa;YAAgB;YACxE;gBAAEF,MAAM;gBAAOC,SAAS;gBAAOC,aAAa;YAAsB;YAClE;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAc;YAClE;gBAAEF,MAAM;gBAAQC,SAAS;gBAAQC,aAAa;YAAgB;YAC9D;gBAAEF,MAAM;gBAAUC,SAAS;gBAAUC,aAAa;YAAc;YAChE;gBAAEF,MAAM;gBAAYC,SAAS;gBAAYC,aAAa;YAAgB;YACtE;gBAAEF,MAAM;gBAAUC,SAAS;gBAAUC,aAAa;YAAa;YAC/D;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAc;YAClE;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAc;YAClE;gBAAEF,MAAM;gBAAYC,SAAS;gBAAYC,aAAa;YAAe;YACrE;gBAAEF,MAAM;gBAAaC,SAAS;gBAAaC,aAAa;YAAgB;YACxE;gBAAEF,MAAM;gBAAUC,SAAS;gBAAUC,aAAa;YAAa;YAC/D;gBAAEF,MAAM;gBAAWC,SAAS;gBAAWC,aAAa;YAAgB;YACpE;gBAAEF,MAAM;gBAAYC,SAAS;gBAAYC,aAAa;YAAkB;YACxE;gBAAEF,MAAM;gBAAiBC,SAAS;gBAAiBC,aAAa;YAAwB;YACxF;gBAAEF,MAAM;gBAASC,SAAS;gBAASC,aAAa;YAAuC;YACvF;gBAAEF,MAAM;gBAAQC,SAAS;gBAAQC,aAAa;YAAc;SAC7D;QAED,OAAOH,SAASI,MAAM,CAACC,CAAAA,IAAKA,EAAEJ,IAAI,CAACK,UAAU,CAAChB;IAChD;IAEQC,sBAAsBC,OAAe,EAAiE;QAC5G,MAAMe,KAAKC,QAAQ;QACnB,MAAMC,OAAOD,QAAQ;QAErB,MAAME,UAAU;YACd;gBAAET,MAAM;gBAAeC,SAAS;gBAAeC,aAAa;YAAa;YACzE;gBAAEF,MAAM;gBAAaC,SAAS;gBAAaC,aAAa;YAAW;YACnE;gBAAEF,MAAM;gBAAYC,SAAS;gBAAYC,aAAa;YAAU;YAChE;gBAAEF,MAAM;gBAAeC,SAAS;gBAAeC,aAAa;YAAW;SACxE;QAED,IAAIX,YAAY,IAAI,OAAO;eAAIkB;eAAY,IAAI,CAACC,cAAc,CAAC;SAAI;QACnE,IAAInB,QAAQc,UAAU,CAAC,SAAS,OAAOI,QAAQN,MAAM,CAACQ,CAAAA,IAAKA,EAAEX,IAAI,CAACK,UAAU,CAAC,MAAMd;QAEnF,OAAO;eAAIkB,QAAQN,MAAM,CAACQ,CAAAA,IAAKA,EAAEX,IAAI,CAACK,UAAU,CAAC,MAAMd;eAAc,IAAI,CAACmB,cAAc,CAACnB;SAAS,CAACqB,KAAK,CAAC,GAAG;IAC9G;IAEQF,eAAenB,OAAe,EAAiE;QACrG,MAAMe,KAAKC,QAAQ;QACnB,MAAMC,OAAOD,QAAQ;QAErB,IAAI;YACF,IAAIM;YACJ,IAAIC;YAEJ,IAAIvB,QAAQwB,QAAQ,CAAC,MAAM;gBACzBF,MAAMtB,QAAQqB,KAAK,CAAC,GAAG,CAAC,MAAM;gBAC9BE,SAAS;YACX,OAAO,IAAIvB,QAAQyB,QAAQ,CAAC,MAAM;gBAChCH,MAAML,KAAKS,OAAO,CAAC1B;gBACnBuB,SAASN,KAAKU,QAAQ,CAAC3B;YACzB,OAAO;gBACLsB,MAAM;gBACNC,SAASvB;YACX;YAEA,MAAM4B,WAAWX,KAAKY,OAAO,CAACC,QAAQC,GAAG,IAAIT;YAC7C,IAAI,CAACP,GAAGiB,UAAU,CAACJ,aAAa,CAACb,GAAGkB,QAAQ,CAACL,UAAUM,WAAW,IAAI,OAAO,EAAE;YAE/E,MAAMC,UAAUpB,GAAGqB,WAAW,CAACR,UAAU;gBAAES,eAAe;YAAK;YAC/D,MAAMC,SAAS;gBAAC;gBAAgB;gBAAQ;gBAAQ;gBAAY;gBAAS;aAAc;YAEnF,OAAOH,QACJvB,MAAM,CAAC2B,CAAAA,IAAK,CAACD,OAAOb,QAAQ,CAACc,EAAEC,IAAI,GACnC5B,MAAM,CAAC2B,CAAAA,IAAK,CAACA,EAAEC,IAAI,CAAC1B,UAAU,CAAC,QAAQS,OAAOT,UAAU,CAAC,MACzDF,MAAM,CAAC2B,CAAAA,IAAKhB,WAAW,MAAMgB,EAAEC,IAAI,CAACC,WAAW,GAAG3B,UAAU,CAACS,OAAOkB,WAAW,KAC/EC,GAAG,CAACH,CAAAA;gBACH,MAAMI,SAASrB,QAAQ,MAAM,KAAKA,MAAM;gBACxC,MAAMsB,QAAQL,EAAEL,WAAW;gBAC3B,OAAO;oBACLzB,MAAM,MAAMkC,SAASJ,EAAEC,IAAI,GAAII,CAAAA,QAAQ,MAAM,EAAC;oBAC9ClC,SAAS,MAAMiC,SAASJ,EAAEC,IAAI,GAAII,CAAAA,QAAQ,MAAM,EAAC;oBACjDjC,aAAaiC,QAAQ,QAAQ;gBAC/B;YACF,GACCvB,KAAK,CAAC,GAAG;QACd,EAAE,OAAM;YACN,OAAO,EAAE;QACX;IACF;IAEQhB,eAAqB;QAC3B,IAAI,IAAI,CAACwC,YAAY,IAAI,IAAI,CAACC,eAAe,EAAE;YAC7C,IAAI,CAACA,eAAe,CAACC,KAAK;YAC1B,IAAI,CAACC,WAAW;YAChBlB,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE1D,aAAM,CAAC2D,MAAM,CAAC,WAAW,EAAE3D,aAAM,CAACG,KAAK,CAAC,QAAQ,CAAC;YAC7E,IAAI,CAACkD,YAAY,GAAG;QACtB,OAAO;YACLf,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,qBAAqB,EAAE5D,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YAC5E,IAAI,CAACN,UAAU,EAAEgE;QACnB;IACF;IAEQ9C,aAAmB;QACzBuB,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,UAAU,EAAE5D,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QACjE,IAAI,CAAC2D,IAAI;QACTxB,QAAQyB,IAAI,CAAC;IACf;IAEA,MAAcpD,WAAWL,KAAa,EAAiB;QACrD,MAAM0D,UAAU1D,MAAM2D,IAAI;QAE1B,IAAI,CAACD,SAAS;YACZ,IAAI,CAACnE,UAAU,EAAEgE;YACjB;QACF;QAEA,IAAIG,QAAQ1C,UAAU,CAAC,MAAM;YAC3B,MAAM,IAAI,CAAC4C,aAAa,CAACF;QAC3B,OAAO;YACL,MAAM,IAAI,CAACG,aAAa,CAACH;QAC3B;QAEA,IAAI,CAACnE,UAAU,EAAEgE;IACnB;IAEA,MAAcK,cAAcE,OAAe,EAAiB;QAC1D,MAAMC,QAAQD,QAAQvC,KAAK,CAAC,GAAGyC,KAAK,CAAC;QACrC,MAAMC,MAAMF,KAAK,CAAC,EAAE,CAACpB,WAAW;QAChC,MAAMuB,OAAOH,MAAMxC,KAAK,CAAC;QAEzB,OAAQ0C;YACN,KAAK;gBAAQ,IAAI,CAACE,YAAY,CAACC,SAAS;gBAAI;YAC5C,KAAK;gBAAS,IAAI,CAACD,YAAY,CAACE,QAAQ,CAAC,IAAI,CAACrF,aAAa;gBAAG;YAC9D,KAAK;YACL,KAAK;gBAAQ,IAAI,CAACyB,UAAU;gBAAI;YAChC,KAAK;gBAAW,MAAM,IAAI,CAAC6D,aAAa;gBAAI;YAC5C,KAAK;gBAAW,IAAI,CAACH,YAAY,CAACI,UAAU;gBAAI;YAChD,KAAK;gBACH,MAAM,IAAI,CAACC,cAAc,CAACC,mBAAmB,CAACP,MAAM,IAAI,CAAC3E,UAAU;gBACnE,MAAM,IAAI,CAACmF,aAAa,CAACC,UAAU;gBACnC,MAAM,IAAI,CAACjG,SAAS,CAACkG,iBAAiB;gBACtC;YACF,KAAK;gBAAS,IAAI,CAACT,YAAY,CAACU,QAAQ,CAACX;gBAAO;YAChD,KAAK;gBACH,MAAM,IAAI,CAACY,eAAe,CAACC,UAAU,CAAC;oBAAC;iBAAU,EAAE,IAAI,CAACxF,UAAU;gBAClE;YACF,KAAK;gBAAY,IAAI,CAAC4E,YAAY,CAACa,eAAe;gBAAI;YACtD,KAAK;gBAAS,IAAI,CAACC,QAAQ;gBAAI;YAE/B,KAAK;gBAAU,IAAI,CAACC,WAAW,CAACC,MAAM,CAAC;gBAAe;YACtD,KAAK;gBAAQ,IAAI,CAACD,WAAW,CAACC,MAAM,CAACjB,KAAKnF,MAAM,GAAG,CAAC,SAAS,EAAEmF,KAAKkB,IAAI,CAAC,MAAM,GAAG;gBAAa;YAC/F,KAAK;gBAAO,IAAI,CAACF,WAAW,CAACC,MAAM,CAAC;gBAA0B;YAC9D,KAAK;gBACH,MAAM,IAAI,CAACD,WAAW,CAACG,SAAS,CAACnB,MAAM,IAAI,CAAC3E,UAAU;gBACtD;YACF,KAAK;gBACH,MAAM,IAAI,CAAC2F,WAAW,CAACI,KAAK,CAAC,IAAI,CAAC/F,UAAU;gBAC5C;YACF,KAAK;gBACH,MAAM,IAAI,CAAC2F,WAAW,CAACK,UAAU,CAAC,IAAI,CAAChG,UAAU;gBACjD;YACF,KAAK;gBACH,MAAM,IAAI,CAAC2F,WAAW,CAACM,KAAK,CAAC,IAAI,CAACjG,UAAU;gBAC5C;YACF,KAAK;gBAAU,MAAM,IAAI,CAAC2F,WAAW,CAACO,SAAS,CAACvB;gBAAO;YACvD,KAAK;gBAAO,MAAM,IAAI,CAACgB,WAAW,CAACQ,MAAM,CAACxB;gBAAO;YACjD,KAAK;gBAAS,MAAM,IAAI,CAACgB,WAAW,CAACS,QAAQ;gBAAI;YACjD,KAAK;gBAAW,MAAM,IAAI,CAACT,WAAW,CAACU,UAAU,CAAC1B;gBAAO;YAEzD,KAAK;gBACH,MAAM,IAAI,CAAC2B,aAAa,CAACC,SAAS,CAAC5B,MAAM,IAAI,CAAC3E,UAAU;gBACxD;YACF,KAAK;gBACH,MAAM,IAAI,CAACsG,aAAa,CAACE,SAAS,CAAC7B,MAAM,IAAI,CAAC3E,UAAU;gBACxD;YAEF,KAAK;gBACH,MAAM,IAAI,CAACyG,WAAW,CAACC,MAAM,CAAC/B,MAAM,IAAI,CAAC3E,UAAU;gBACnD;YAEF,KAAK;gBACH,MAAM,IAAI,CAACuF,eAAe,CAACC,UAAU,CAACb,MAAM,IAAI,CAAC3E,UAAU;gBAC3D;YACF,KAAK;gBACH,MAAM,IAAI,CAACuF,eAAe,CAACC,UAAU,CAAC;oBAAC;iBAAO,EAAE,IAAI,CAACxF,UAAU;gBAC/D;YAEF;gBACEyC,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAACwG,GAAG,CAAC,YAAY,EAAEjC,MAAMvE,aAAM,CAACG,KAAK,CAAC,EAAE,EAAEH,aAAM,CAAC4D,GAAG,CAAC,SAAS,EAAE5D,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QACpH;IACF;IAEA,MAAcyE,gBAA+B;QAC3C,MAAM6B,WAAW,IAAI,CAACzH,SAAS,CAAC0H,eAAe;QAC/C,IAAID,WAAW,GAAG;YAChBnE,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,sBAAsB,EAAE6C,SAAS,UAAU,EAAEzG,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YAClG;QACF;QACAmC,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,cAAc,EAAE6C,SAAS,YAAY,EAAEzG,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QAC5F,MAAMwG,SAAS,MAAM,IAAI,CAAC3H,SAAS,CAAC4H,cAAc;QAClD,IAAID,OAAOE,SAAS,EAAE;YACpBvE,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC8G,KAAK,CAAC,aAAa,EAAEH,OAAOI,cAAc,CAAC,GAAG,EAAEJ,OAAOK,aAAa,CAAC,SAAS,EAAEhH,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QACnI,OAAO;YACLmC,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC2D,MAAM,CAAC,0CAA0C,EAAE3D,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QACtG;IACF;IAEA,MAAcgE,cAAc8C,OAAe,EAAiB;QAC1D,IAAI,CAAC5D,YAAY,GAAG;QACpB,IAAI,CAACC,eAAe,GAAG,IAAI4D;QAC3B,IAAI,CAACrH,UAAU,EAAEsH;QAEjB,IAAI;YACF,IAAIC,mBAAmBH;YAEvB,MAAMI,YAAY,MAAM,IAAI,CAACC,QAAQ,CAACC,mBAAmB,CAACN;YAC1D,IAAII,UAAUG,UAAU,EAAE;gBACxB,MAAMC,UAAU,MAAM,IAAI,CAAC5H,UAAU,CAAE6H,SAAS,CAC9C,mCACA;oBACE;wBAAEC,KAAK;wBAAKC,OAAO;wBAAOzG,aAAa;oBAAyB;oBAChE;wBAAEwG,KAAK;wBAAKC,OAAO;wBAAMzG,aAAa;oBAAuB;iBAC9D;gBAGH,IAAIsG,YAAY,KAAK;oBACnB,MAAMI,iBAAiB,MAAM,IAAI,CAACC,sBAAsB,CAACb;oBACzD,IAAI,CAACY,gBAAgB;wBACnB,IAAI,CAACxE,YAAY,GAAG;wBACpB,IAAI,CAACxD,UAAU,EAAEkI;wBACjB;oBACF;oBACAX,mBAAmBS;gBACrB;YACF;YAEA,MAAMG,gBAAgB,MAAM,IAAI,CAACC,eAAe,CAACC,cAAc,CAACd;YAChE,IAAIY,cAAcG,QAAQ,CAAC9I,MAAM,GAAG,GAAG;gBACrC,MAAM+I,UAAU,IAAI,CAACH,eAAe,CAACI,kBAAkB,CAACL,cAAcG,QAAQ;gBAC9E,KAAK,MAAMzH,QAAQ0H,QAAS;oBAC1B9F,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,GAAGlD,OAAOV,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;gBAChE;gBACAmC,QAAQmB,MAAM,CAACC,KAAK,CAAC;YACvB;YAEA,IAAI,CAAC4E,YAAY,CAAC;YAElB,IAAIC,aAAa;YACjB,IAAIC,eAAe;YAEnB,WAAW,MAAMC,SAAS,IAAI,CAACzJ,SAAS,CAAC0J,IAAI,CAACV,cAAcW,eAAe,EAAG;gBAC5E,IAAI,IAAI,CAACrF,eAAe,EAAEsF,OAAOC,SAAS;gBAE1C,MAAMC,eAAeL,MAAMxG,QAAQ,CAAC,YAClCwG,CAAAA,MAAMxG,QAAQ,CAAC,QACfwG,MAAMxG,QAAQ,CAAC,cACfwG,MAAMxG,QAAQ,CAAC,yBAAwB;gBAGzC,IAAIsG,cAAc,CAACO,cAAc;oBAC/B,IAAI,CAACtF,WAAW;oBAChBlB,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE1D,aAAM,CAAC+I,OAAO,GAAG/I,aAAM,CAACE,IAAI,GAAG8I,YAAK,CAACC,QAAQ,CAAC,KAAK,EAAEjJ,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;oBACnGoI,aAAa;gBACf;gBAEA,IAAI,CAACO,cAAc;oBACjBN,gBAAgBC;gBAClB;gBACAnG,QAAQmB,MAAM,CAACC,KAAK,CAAC+E;YACvB;YAEA,IAAI,CAACF,YAAY;gBACfjG,QAAQmB,MAAM,CAACC,KAAK,CAAC;YACvB,OAAO;gBACL,IAAI,CAACF,WAAW;YAClB;QACF,EAAE,OAAO0F,OAAO;YACd,IAAI,CAAC1F,WAAW;YAChB,MAAM2F,MAAM,AAACD,MAAgBjC,OAAO;YACpC,IAAI,CAACkC,IAAIlH,QAAQ,CAAC,UAAU;gBAC1BK,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE1D,aAAM,CAACwG,GAAG,CAAC,SAAS,EAAE2C,MAAMnJ,aAAM,CAACG,KAAK,CAAC,QAAQ,CAAC;YAChF;QACF,SAAU;YACR,IAAI,CAACkD,YAAY,GAAG;YACpB,IAAI,CAACC,eAAe,GAAG;YACvB,IAAI,CAACzD,UAAU,EAAEkI;QACnB;IACF;IAEA,MAAcD,uBAAuBsB,WAAmB,EAA0B;QAChF9G,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE1D,aAAM,CAACC,IAAI,GAAGD,aAAM,CAACE,IAAI,CAAC,YAAY,EAAEF,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;QACtFmC,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,wCAAwC,EAAE5D,aAAM,CAACG,KAAK,CAAC,QAAQ,CAAC;QAEnG,MAAMkJ,sBAAsB,MAAM,IAAI,CAAC/B,QAAQ,CAACgC,2BAA2B,CAACF;QAC5E,MAAMG,UAAoB,EAAE;QAE5B,IAAIF,oBAAoBhK,MAAM,GAAG,GAAG;YAClCiD,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,kCAAkC,EAAE5D,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YACzF,IAAK,IAAIqJ,IAAI,GAAGA,IAAIH,oBAAoBhK,MAAM,EAAEmK,IAAK;gBACnD,MAAMC,IAAIJ,mBAAmB,CAACG,EAAE;gBAChC,MAAME,SAAS,MAAM,IAAI,CAAC7J,UAAU,CAAE8J,QAAQ,CAAC,GAAG3J,aAAM,CAAC2D,MAAM,CAAC,CAAC,EAAE6F,IAAI,EAAE,CAAC,EAAExJ,aAAM,CAACG,KAAK,CAAC,CAAC,EAAEsJ,EAAE,CAAC,CAAC;gBAChG,IAAIC,OAAOzF,IAAI,IAAI;oBACjBsF,QAAQK,IAAI,CAAC,CAAC,EAAE,EAAEH,EAAE,IAAI,EAAEC,OAAOzF,IAAI,IAAI;gBAC3C;YACF;YACA3B,QAAQmB,MAAM,CAACC,KAAK,CAAC;QACvB;QAEA,MAAMmG,UAAUN,QAAQlK,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAEkK,QAAQ7D,IAAI,CAAC,OAAO,GAAGjG;QACrF,IAAIqK,OAAO,MAAM,IAAI,CAACxC,QAAQ,CAACyC,YAAY,CAACX,aAAaS;QAEzD,MAAO,KAAM;YACXvH,QAAQmB,MAAM,CAACC,KAAK,CAAC,IAAI,CAAC4D,QAAQ,CAAC0C,oBAAoB,CAACF;YAExD,MAAMG,SAAS,MAAM,IAAI,CAACpK,UAAU,CAAE6H,SAAS,CAAC,gBAAgB;gBAC9D;oBAAEC,KAAK;oBAAKC,OAAO;oBAAUzG,aAAa;gBAA6B;gBACvE;oBAAEwG,KAAK;oBAAKC,OAAO;oBAAUzG,aAAa;gBAAkC;gBAC5E;oBAAEwG,KAAK;oBAAKC,OAAO;oBAAUzG,aAAa;gBAA8B;aACzE;YAED,IAAI8I,WAAW,KAAK;gBAClB3H,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,gBAAgB,EAAE5D,aAAM,CAACG,KAAK,CAAC,QAAQ,CAAC;gBAC3E,OAAO;YACT;YAEA,IAAI8J,WAAW,KAAK;gBAClB,MAAMC,WAAW,MAAM,IAAI,CAACrK,UAAU,CAAE8J,QAAQ,CAAC,GAAG3J,aAAM,CAACC,IAAI,CAAC,oBAAoB,EAAED,aAAM,CAACG,KAAK,CAAC,CAAC,CAAC;gBACrG,IAAI,CAAC+J,SAASjG,IAAI,IAAI;oBACpB3B,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAAC4D,GAAG,CAAC,6CAA6C,EAAE5D,aAAM,CAACG,KAAK,CAAC,QAAQ,CAAC;oBACxG;gBACF;gBACA2J,OAAO,MAAM,IAAI,CAACxC,QAAQ,CAAC6C,UAAU,CAACL,MAAMI,SAASjG,IAAI;gBACzD;YACF;YAEA,OAAO,IAAI,CAACmG,wBAAwB,CAAChB,aAAaU,MAAMP;QAC1D;IACF;IAEQa,yBAAyBhB,WAAmB,EAAEU,IAA6G,EAAEO,cAAwB,EAAU;QACrM,MAAMC,QAAkB,EAAE;QAC1BA,MAAMV,IAAI,CAACR;QACXkB,MAAMV,IAAI,CAAC;QACXU,MAAMV,IAAI,CAAC;QACXU,MAAMV,IAAI,CAAC,CAAC,OAAO,EAAEE,KAAKS,KAAK,EAAE;QACjCD,MAAMV,IAAI,CAAC,CAAC,UAAU,EAAEE,KAAKU,QAAQ,EAAE;QACvCF,MAAMV,IAAI,CAAC;QACX,KAAK,MAAMa,QAAQX,KAAKY,KAAK,CAAE;YAC7B,MAAMC,QAAQF,KAAKE,KAAK,CAACtL,MAAM,GAAG,IAAI,CAAC,UAAU,EAAEoL,KAAKE,KAAK,CAACjF,IAAI,CAAC,OAAO,GAAG;YAC7E4E,MAAMV,IAAI,CAAC,GAAGa,KAAKG,EAAE,CAAC,EAAE,EAAEH,KAAKtJ,WAAW,GAAGwJ,OAAO;QACtD;QACA,IAAIN,eAAehL,MAAM,GAAG,GAAG;YAC7BiL,MAAMV,IAAI,CAAC;YACXU,MAAMV,IAAI,CAAC;YACXU,MAAMV,IAAI,IAAIS;QAChB;QACAC,MAAMV,IAAI,CAAC;QACXU,MAAMV,IAAI,CAAC;QACX,OAAOU,MAAM5E,IAAI,CAAC;IACpB;IAEQ4C,aAAaV,KAAa,EAAQ;QACxC,IAAI4B,IAAI;QACR,IAAI,CAACqB,YAAY,GAAGC,YAAY;YAC9BxI,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE1D,aAAM,CAACC,IAAI,GAAG+I,YAAK,CAAC+B,gBAAgB,CAACvB,MAAMR,YAAK,CAAC+B,gBAAgB,CAAC1L,MAAM,CAAC,GAAGW,aAAM,CAACG,KAAK,CAAC,CAAC,EAAEH,aAAM,CAAC4D,GAAG,GAAGgE,MAAM,GAAG,EAAE5H,aAAM,CAACG,KAAK,EAAE;QAC9J,GAAG;IACL;IAEQqD,cAAoB;QAC1B,IAAI,IAAI,CAACqH,YAAY,EAAE;YACrBG,cAAc,IAAI,CAACH,YAAY;YAC/B,IAAI,CAACA,YAAY,GAAG;YACpBvI,QAAQmB,MAAM,CAACC,KAAK,CAAC;QACvB;IACF;IAEQ6B,WAAiB;QACvB,MAAM0F,WAAW,IAAI,CAACC,aAAa,CAACC,WAAW;QAC/C,MAAMC,QAA4BH,SAAS/H,GAAG,CAACmI,CAAAA,IAAK;gBAACA,EAAErI,IAAI;gBAAEqI,EAAElK,WAAW,CAACU,KAAK,CAAC,GAAG;aAAI;QAExF,IAAIuJ,MAAM/L,MAAM,GAAG,GAAG;YACpB,MAAMiM,SAASC,KAAKC,GAAG,IAAIJ,MAAMlI,GAAG,CAAC,CAAC,CAACuI,EAAE,GAAKA,EAAEpM,MAAM;YAEtDiD,QAAQmB,MAAM,CAACC,KAAK,CAAC;YACrBpB,QAAQmB,MAAM,CAACC,KAAK,CAAC,GAAG1D,aAAM,CAACE,IAAI,CAAC,gBAAgB,EAAEkL,MAAM/L,MAAM,CAAC,EAAE,EAAEW,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YACzF,KAAK,MAAM,CAAC6C,MAAM0I,KAAK,IAAIN,MAAO;gBAChC9I,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE1D,aAAM,CAACC,IAAI,GAAG+C,KAAK2I,MAAM,CAACL,UAAUtL,aAAM,CAACG,KAAK,CAAC,EAAE,EAAEH,aAAM,CAAC4D,GAAG,GAAG8H,OAAO1L,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YACvH;QACF;QAEA,MAAMyL,WAAW,IAAI,CAACC,WAAW,CAACC,cAAc;QAChD,IAAIF,SAASvM,MAAM,GAAG,GAAG;YACvBiD,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,IAAI,EAAE1D,aAAM,CAACE,IAAI,CAAC,WAAW,EAAE0L,SAASvM,MAAM,CAAC,EAAE,EAAEW,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YAC3F,KAAK,MAAMkL,KAAKO,SAAS/J,KAAK,CAAC,GAAG,IAAK;gBACrCS,QAAQmB,MAAM,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE1D,aAAM,CAACC,IAAI,GAAGoL,EAAErI,IAAI,GAAGhD,aAAM,CAACG,KAAK,CAAC,EAAE,EAAEH,aAAM,CAAC4D,GAAG,GAAGyH,EAAElK,WAAW,CAACU,KAAK,CAAC,GAAG,MAAM7B,aAAM,CAACG,KAAK,CAAC,IAAI,CAAC;YAChI;QACF;QACAmC,QAAQmB,MAAM,CAACC,KAAK,CAAC;IACvB;IAEQ/D,sBAA8B;QACpC,IAAI;YACF,MAAMoM,cAAc,IAAI,CAAC/G,aAAa,CAACgH,cAAc,CAAC;YACtD,IAAID,aAAa;gBACf,OAAO,GAAGA,YAAYE,QAAQ,CAAC,CAAC,EAAEF,YAAYrM,KAAK,EAAE;YACvD;QACF,EAAE,OAAM,CACR;QACA,OAAO,GAAG,IAAI,CAACwM,aAAa,CAACC,WAAW,GAAG,CAAC,EAAE,IAAI,CAACD,aAAa,CAACE,QAAQ,IAAI;IAC/E;IAEAtI,OAAa;QACX,IAAI,CAACN,WAAW;QAChB,IAAI,CAAC3D,UAAU,EAAEwM;IACnB;IA7cA,YACE,AAAiBrN,SAA2B,EAC5C,AAAiBkN,aAA4B,EAC7C,AAAiBlH,aAAmC,EACpD,AAAiBiD,eAAgC,EACjD,AAAiB4D,WAA+B,EAChD,AAAiB1M,aAAmC,EACpD,AAAiBmN,aAAmC,EACpD,AAAiBhN,aAAmC,EACpD,AAAiBgI,QAAyB,EAC1C,AAAiB7C,YAAiC,EAClD,AAAiBe,WAA+B,EAChD,AAAiBW,aAAmC,EACpD,AAAiBG,WAA+B,EAChD,AAAiBxB,cAAqC,EACtD,AAAiBM,eAAuC,EACxD,AAAiB8F,aAAmC,CACpD;aAhBiBlM,YAAAA;aACAkN,gBAAAA;aACAlH,gBAAAA;aACAiD,kBAAAA;aACA4D,cAAAA;aACA1M,gBAAAA;aACAmN,gBAAAA;aACAhN,gBAAAA;aACAgI,WAAAA;aACA7C,eAAAA;aACAe,cAAAA;aACAW,gBAAAA;aACAG,cAAAA;aACAxB,iBAAAA;aACAM,kBAAAA;aACA8F,gBAAAA;aArBXrL,aAAgC;aAChCyD,kBAA0C;aAC1CD,eAAe;aACfwH,eAAsD;IAmB3D;AA6bL"}
|
|
@@ -38,6 +38,7 @@ let SmartInput = class SmartInput {
|
|
|
38
38
|
this.cursor = 0;
|
|
39
39
|
this.suggestions = [];
|
|
40
40
|
this.selectedIndex = -1;
|
|
41
|
+
this.cursorRow = 0;
|
|
41
42
|
this.mode = 'input';
|
|
42
43
|
this.render();
|
|
43
44
|
}
|
|
@@ -442,30 +443,25 @@ let SmartInput = class SmartInput {
|
|
|
442
443
|
}
|
|
443
444
|
render() {
|
|
444
445
|
const write = (s)=>process.stdout.write(s);
|
|
445
|
-
// Calcular quantas linhas o buffer atual ocupa
|
|
446
446
|
const totalLength = this.promptLen + this.buffer.length;
|
|
447
|
-
const linesUsed = Math.ceil(totalLength / this.terminalWidth);
|
|
448
|
-
|
|
449
|
-
if (
|
|
450
|
-
write(`\x1b[${
|
|
447
|
+
const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));
|
|
448
|
+
const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;
|
|
449
|
+
if (this.cursorRow > 0) {
|
|
450
|
+
write(`\x1b[${this.cursorRow}A`);
|
|
451
451
|
}
|
|
452
|
-
write('\r');
|
|
453
|
-
|
|
454
|
-
for(let i = 0; i <
|
|
455
|
-
write('\x1b[K');
|
|
456
|
-
if (i <
|
|
452
|
+
write('\r');
|
|
453
|
+
const linesToClear = linesUsed + (exactWrap ? 1 : 0);
|
|
454
|
+
for(let i = 0; i < linesToClear; i++){
|
|
455
|
+
write('\x1b[K');
|
|
456
|
+
if (i < linesToClear - 1) write('\n');
|
|
457
457
|
}
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
write(`\x1b[${linesUsed - 1}A`);
|
|
458
|
+
if (linesToClear > 1) {
|
|
459
|
+
write(`\x1b[${linesToClear - 1}A`);
|
|
461
460
|
}
|
|
462
461
|
write('\r');
|
|
463
|
-
// Escrever prompt + buffer
|
|
464
462
|
write(this.prompt + this.buffer);
|
|
465
|
-
// Limpar resto da tela (para sugestões antigas)
|
|
466
463
|
write('\x1b[J');
|
|
467
464
|
this.renderedLines = 0;
|
|
468
|
-
// Renderizar sugestões
|
|
469
465
|
if (this.suggestions.length > 0) {
|
|
470
466
|
const maxVisible = 10;
|
|
471
467
|
const total = this.suggestions.length;
|
|
@@ -497,25 +493,28 @@ let SmartInput = class SmartInput {
|
|
|
497
493
|
this.renderedLines++;
|
|
498
494
|
}
|
|
499
495
|
}
|
|
500
|
-
// Voltar para linha do input se renderizou sugestões
|
|
501
496
|
if (this.renderedLines > 0) {
|
|
502
497
|
write(`\x1b[${this.renderedLines}A`);
|
|
503
498
|
}
|
|
504
|
-
|
|
505
|
-
const
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
}
|
|
509
|
-
write(`\x1b[${
|
|
499
|
+
const { row: targetRow, col: targetCol } = this.calculateCursorPosition();
|
|
500
|
+
const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;
|
|
501
|
+
const delta = targetRow - afterWriteRow;
|
|
502
|
+
if (delta > 0) write(`\x1b[${delta}B`);
|
|
503
|
+
else if (delta < 0) write(`\x1b[${-delta}A`);
|
|
504
|
+
write(`\x1b[${targetCol}G`);
|
|
505
|
+
this.cursorRow = targetRow;
|
|
510
506
|
}
|
|
511
507
|
clearSuggestions() {
|
|
512
508
|
if (this.renderedLines > 0) {
|
|
513
|
-
const
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
509
|
+
const totalLength = this.promptLen + this.buffer.length;
|
|
510
|
+
const linesUsed = Math.max(1, Math.ceil(totalLength / this.terminalWidth));
|
|
511
|
+
const exactWrap = totalLength > 0 && totalLength % this.terminalWidth === 0;
|
|
512
|
+
const afterWriteRow = exactWrap ? linesUsed : linesUsed - 1;
|
|
513
|
+
const afterWriteCol = exactWrap ? 1 : totalLength % this.terminalWidth + 1;
|
|
514
|
+
const delta = afterWriteRow - this.cursorRow;
|
|
515
|
+
if (delta > 0) process.stdout.write(`\x1b[${delta}B`);
|
|
516
|
+
else if (delta < 0) process.stdout.write(`\x1b[${-delta}A`);
|
|
517
|
+
process.stdout.write(`\x1b[${afterWriteCol}G\x1b[J`);
|
|
519
518
|
this.renderedLines = 0;
|
|
520
519
|
}
|
|
521
520
|
}
|
|
@@ -532,8 +531,9 @@ let SmartInput = class SmartInput {
|
|
|
532
531
|
this.questionResolve = null;
|
|
533
532
|
this.questionBuffer = '';
|
|
534
533
|
this.dataHandler = null;
|
|
535
|
-
this.terminalWidth = 80;
|
|
534
|
+
this.terminalWidth = 80;
|
|
536
535
|
this.isPaused = false;
|
|
536
|
+
this.cursorRow = 0;
|
|
537
537
|
this.lastCtrlCTime = 0;
|
|
538
538
|
this.opts = opts;
|
|
539
539
|
this.prompt = opts.prompt;
|