cast-code 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/package.json +1 -1
|
@@ -113,7 +113,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
113
113
|
const headers = {
|
|
114
114
|
'Content-Type': 'application/json'
|
|
115
115
|
};
|
|
116
|
-
// Restore cached Bearer token if available (avoids re-running OAuth on reconnect)
|
|
117
116
|
const provider = new _castoauthprovider.CastOAuthProvider(name);
|
|
118
117
|
const cachedTokens = provider.tokens();
|
|
119
118
|
if (cachedTokens?.access_token) {
|
|
@@ -147,7 +146,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
147
146
|
}
|
|
148
147
|
};
|
|
149
148
|
let initResponse = await doFetch(initBody);
|
|
150
|
-
// If 401: run full OAuth flow, then retry once with the new token
|
|
151
149
|
if (initResponse.status === 401) {
|
|
152
150
|
provider.invalidateCredentials('tokens');
|
|
153
151
|
let authResult = await (0, _auth.auth)(provider, {
|
|
@@ -233,7 +231,6 @@ let McpClientService = class McpClientService extends _events.EventEmitter {
|
|
|
233
231
|
}
|
|
234
232
|
if (connection.config.type === 'http') {
|
|
235
233
|
const endpoint = connection.config.endpoint;
|
|
236
|
-
// Use headers stored during connectHttp (includes Bearer token + session ID)
|
|
237
234
|
const headers = connection._httpHeaders ?? {
|
|
238
235
|
'Content-Type': 'application/json'
|
|
239
236
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/mcp/services/mcp-client.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { EventEmitter } from 'events';\nimport { spawn, ChildProcess } from 'child_process';\nimport { McpConfig, McpTool, McpConnection } from '../types';\nimport { auth } from '@modelcontextprotocol/sdk/client/auth.js';\nimport { CastOAuthProvider } from './cast-oauth-provider';\n\n@Injectable()\nexport class McpClientService extends EventEmitter {\n private connections: Map<string, McpConnection> = new Map();\n private stdioBuffers: Map<string, string> = new Map();\n private requestIdCounter = 0;\n\n async connect(name: string, config: McpConfig): Promise<boolean> {\n if (this.connections.has(name)) {\n const existing = this.connections.get(name)!;\n if (existing.status === 'connected') {\n return true;\n }\n }\n\n const connection: McpConnection = {\n config,\n tools: [],\n status: 'connecting',\n };\n\n this.connections.set(name, connection);\n\n try {\n if (config.type === 'stdio' && config.command) {\n await this.connectStdio(name, connection);\n } else if (config.type === 'sse' && config.endpoint) {\n throw new Error('SSE transport not yet supported. Use stdio or http instead.');\n } else if (config.type === 'http' && config.endpoint) {\n await this.connectHttp(name, connection);\n }\n\n connection.status = 'connected';\n return true;\n } catch (error) {\n connection.status = 'error';\n return false;\n }\n }\n\n private async connectStdio(name: string, connection: McpConnection): Promise<void> {\n const { command, args = [], env = {} } = connection.config;\n\n const proc = spawn(command!, args, {\n env: { ...process.env, ...env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n connection.process = proc;\n this.stdioBuffers.set(name, '');\n\n proc.stdout?.on('data', (data: Buffer) => {\n const buffer = (this.stdioBuffers.get(name) || '') + data.toString();\n const lines = buffer.split('\\n');\n\n this.stdioBuffers.set(name, lines.pop() || '');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n this.emit(`response:${name}`, parsed);\n } catch {\n }\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && !msg.startsWith('Debugger') && !msg.startsWith('Warning')) {\n console.error(`MCP ${name} stderr:`, msg);\n }\n });\n\n proc.on('close', (code) => {\n connection.status = 'disconnected';\n this.stdioBuffers.delete(name);\n this.emit('disconnected', name);\n\n if (code !== null && code !== 0) {\n setTimeout(() => {\n this.reconnect(name).catch(() => {});\n }, 3000);\n }\n });\n\n await this.sendRequest(name, 'initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n });\n\n const toolsResponse = await this.sendRequest(name, 'tools/list', {});\n connection.tools = toolsResponse?.tools || [];\n }\n\n private async connectHttp(name: string, connection: McpConnection): Promise<void> {\n const endpoint = connection.config.endpoint!;\n\n try {\n new URL(endpoint);\n } catch {\n throw new Error(`Invalid MCP HTTP endpoint: ${endpoint}`);\n }\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Restore cached Bearer token if available (avoids re-running OAuth on reconnect)\n const provider = new CastOAuthProvider(name);\n const cachedTokens = provider.tokens();\n if (cachedTokens?.access_token) {\n headers['Authorization'] = `Bearer ${cachedTokens.access_token}`;\n }\n\n const doFetch = async (body: object, hdrs = headers, timeoutMs = 15000): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(endpoint, {\n method: 'POST',\n headers: hdrs,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n };\n\n const initBody = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n },\n };\n\n let initResponse = await doFetch(initBody);\n\n // If 401: run full OAuth flow, then retry once with the new token\n if (initResponse.status === 401) {\n provider.invalidateCredentials('tokens');\n\n let authResult = await auth(provider, { serverUrl: endpoint });\n\n if (authResult === 'REDIRECT') {\n this.emit('oauth:browser-opened', name, provider.redirectUrl);\n const code = await provider.waitForCallback();\n authResult = await auth(provider, { serverUrl: endpoint, authorizationCode: code });\n }\n\n if (authResult !== 'AUTHORIZED') {\n throw new Error(`OAuth failed for ${name}`);\n }\n\n const tokens = provider.tokens();\n if (!tokens?.access_token) {\n throw new Error(`No access token for ${name} after OAuth`);\n }\n\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n initResponse = await doFetch(initBody);\n }\n\n if (!initResponse.ok) {\n throw new Error(`HTTP MCP init failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('mcp-session-id');\n if (sessionId) headers['Mcp-Session-Id'] = sessionId;\n\n const toolsResponse = await doFetch({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/list',\n params: {},\n });\n\n if (toolsResponse.ok) {\n const data = await toolsResponse.json();\n connection.tools = data.result?.tools || data.tools || [];\n }\n\n (connection as any)._httpHeaders = headers;\n }\n\n private sendRequest(\n name: string,\n method: string,\n params: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(name);\n\n if (!connection?.process) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n const id = this.nextId();\n const request = JSON.stringify({ jsonrpc: '2.0', id, method, params });\n let resolved = false;\n\n const handler = (response: any) => {\n if (response.id === id && !resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(response.result);\n }\n };\n\n this.on(`response:${name}`, handler);\n (connection.process as ChildProcess).stdin?.write(request + '\\n');\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(null);\n }\n }, 15000);\n });\n }\n\n async callTool(\n mcpName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(mcpName);\n\n if (!connection || connection.status !== 'connected') {\n throw new Error(`MCP ${mcpName} not connected`);\n }\n\n if (connection.config.type === 'stdio') {\n return this.sendRequest(mcpName, 'tools/call', { name: toolName, arguments: args });\n }\n\n if (connection.config.type === 'http') {\n const endpoint = connection.config.endpoint!;\n // Use headers stored during connectHttp (includes Bearer token + session ID)\n const headers: Record<string, string> = (connection as any)._httpHeaders ?? {\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n }),\n });\n\n const data = await response.json();\n return data.result || data;\n }\n\n return null;\n }\n\n getTools(name: string): McpTool[] {\n return this.connections.get(name)?.tools || [];\n }\n\n getStatus(name: string): string {\n return this.connections.get(name)?.status || 'unknown';\n }\n\n getAuthUrl(name: string): string | undefined {\n return this.connections.get(name)?.authUrl;\n }\n\n getAllStatuses(): Map<string, string> {\n const statuses = new Map<string, string>();\n for (const [name, conn] of this.connections) {\n statuses.set(name, conn.status);\n }\n return statuses;\n }\n\n private async reconnect(name: string): Promise<boolean> {\n const connection = this.connections.get(name);\n if (!connection) return false;\n\n if (connection.process) {\n try {\n (connection.process as ChildProcess).kill();\n } catch {}\n }\n\n connection.status = 'connecting';\n try {\n if (connection.config.type === 'stdio') {\n await this.connectStdio(name, connection);\n } else if (connection.config.type === 'http') {\n await this.connectHttp(name, connection);\n }\n connection.status = 'connected';\n this.emit('reconnected', name);\n return true;\n } catch {\n connection.status = 'error';\n return false;\n }\n }\n\n disconnect(name: string) {\n const connection = this.connections.get(name);\n\n if (connection?.process) {\n (connection.process as ChildProcess).kill();\n }\n\n this.stdioBuffers.delete(name);\n this.connections.delete(name);\n }\n\n disconnectAll() {\n for (const name of this.connections.keys()) {\n this.disconnect(name);\n }\n }\n\n private nextId(): string {\n return `${++this.requestIdCounter}`;\n }\n}\n"],"names":["McpClientService","EventEmitter","connect","name","config","connections","has","existing","get","status","connection","tools","set","type","command","connectStdio","endpoint","Error","connectHttp","error","args","env","proc","spawn","process","stdio","stdioBuffers","stdout","on","data","buffer","toString","lines","split","pop","line","trimmed","trim","parsed","JSON","parse","emit","stderr","msg","startsWith","console","code","delete","setTimeout","reconnect","catch","sendRequest","protocolVersion","capabilities","clientInfo","version","toolsResponse","URL","headers","provider","CastOAuthProvider","cachedTokens","tokens","access_token","doFetch","body","hdrs","timeoutMs","controller","AbortController","timer","abort","fetch","method","stringify","signal","clearTimeout","initBody","jsonrpc","id","nextId","params","initResponse","invalidateCredentials","authResult","auth","serverUrl","redirectUrl","waitForCallback","authorizationCode","ok","statusText","sessionId","json","result","_httpHeaders","Promise","resolve","request","resolved","handler","response","off","stdin","write","callTool","mcpName","toolName","arguments","getTools","getStatus","getAuthUrl","authUrl","getAllStatuses","statuses","Map","conn","kill","disconnect","disconnectAll","keys","requestIdCounter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/mcp/services/mcp-client.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { EventEmitter } from 'events';\nimport { spawn, ChildProcess } from 'child_process';\nimport { McpConfig, McpTool, McpConnection } from '../types';\nimport { auth } from '@modelcontextprotocol/sdk/client/auth.js';\nimport { CastOAuthProvider } from './cast-oauth-provider';\n\n@Injectable()\nexport class McpClientService extends EventEmitter {\n private connections: Map<string, McpConnection> = new Map();\n private stdioBuffers: Map<string, string> = new Map();\n private requestIdCounter = 0;\n\n async connect(name: string, config: McpConfig): Promise<boolean> {\n if (this.connections.has(name)) {\n const existing = this.connections.get(name)!;\n if (existing.status === 'connected') {\n return true;\n }\n }\n\n const connection: McpConnection = {\n config,\n tools: [],\n status: 'connecting',\n };\n\n this.connections.set(name, connection);\n\n try {\n if (config.type === 'stdio' && config.command) {\n await this.connectStdio(name, connection);\n } else if (config.type === 'sse' && config.endpoint) {\n throw new Error('SSE transport not yet supported. Use stdio or http instead.');\n } else if (config.type === 'http' && config.endpoint) {\n await this.connectHttp(name, connection);\n }\n\n connection.status = 'connected';\n return true;\n } catch (error) {\n connection.status = 'error';\n return false;\n }\n }\n\n private async connectStdio(name: string, connection: McpConnection): Promise<void> {\n const { command, args = [], env = {} } = connection.config;\n\n const proc = spawn(command!, args, {\n env: { ...process.env, ...env },\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n connection.process = proc;\n this.stdioBuffers.set(name, '');\n\n proc.stdout?.on('data', (data: Buffer) => {\n const buffer = (this.stdioBuffers.get(name) || '') + data.toString();\n const lines = buffer.split('\\n');\n\n this.stdioBuffers.set(name, lines.pop() || '');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed);\n this.emit(`response:${name}`, parsed);\n } catch {\n }\n }\n });\n\n proc.stderr?.on('data', (data: Buffer) => {\n const msg = data.toString().trim();\n if (msg && !msg.startsWith('Debugger') && !msg.startsWith('Warning')) {\n console.error(`MCP ${name} stderr:`, msg);\n }\n });\n\n proc.on('close', (code) => {\n connection.status = 'disconnected';\n this.stdioBuffers.delete(name);\n this.emit('disconnected', name);\n\n if (code !== null && code !== 0) {\n setTimeout(() => {\n this.reconnect(name).catch(() => {});\n }, 3000);\n }\n });\n\n await this.sendRequest(name, 'initialize', {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n });\n\n const toolsResponse = await this.sendRequest(name, 'tools/list', {});\n connection.tools = toolsResponse?.tools || [];\n }\n\n private async connectHttp(name: string, connection: McpConnection): Promise<void> {\n const endpoint = connection.config.endpoint!;\n\n try {\n new URL(endpoint);\n } catch {\n throw new Error(`Invalid MCP HTTP endpoint: ${endpoint}`);\n }\n\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n const provider = new CastOAuthProvider(name);\n const cachedTokens = provider.tokens();\n if (cachedTokens?.access_token) {\n headers['Authorization'] = `Bearer ${cachedTokens.access_token}`;\n }\n\n const doFetch = async (body: object, hdrs = headers, timeoutMs = 15000): Promise<Response> => {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(endpoint, {\n method: 'POST',\n headers: hdrs,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n };\n\n const initBody = {\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'initialize',\n params: {\n protocolVersion: '2024-11-05',\n capabilities: {},\n clientInfo: { name: 'cast-code', version: '1.0.0' },\n },\n };\n\n let initResponse = await doFetch(initBody);\n\n if (initResponse.status === 401) {\n provider.invalidateCredentials('tokens');\n\n let authResult = await auth(provider, { serverUrl: endpoint });\n\n if (authResult === 'REDIRECT') {\n this.emit('oauth:browser-opened', name, provider.redirectUrl);\n const code = await provider.waitForCallback();\n authResult = await auth(provider, { serverUrl: endpoint, authorizationCode: code });\n }\n\n if (authResult !== 'AUTHORIZED') {\n throw new Error(`OAuth failed for ${name}`);\n }\n\n const tokens = provider.tokens();\n if (!tokens?.access_token) {\n throw new Error(`No access token for ${name} after OAuth`);\n }\n\n headers['Authorization'] = `Bearer ${tokens.access_token}`;\n initResponse = await doFetch(initBody);\n }\n\n if (!initResponse.ok) {\n throw new Error(`HTTP MCP init failed: ${initResponse.status} ${initResponse.statusText}`);\n }\n\n const sessionId = initResponse.headers.get('mcp-session-id');\n if (sessionId) headers['Mcp-Session-Id'] = sessionId;\n\n const toolsResponse = await doFetch({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/list',\n params: {},\n });\n\n if (toolsResponse.ok) {\n const data = await toolsResponse.json();\n connection.tools = data.result?.tools || data.tools || [];\n }\n\n (connection as any)._httpHeaders = headers;\n }\n\n private sendRequest(\n name: string,\n method: string,\n params: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(name);\n\n if (!connection?.process) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n const id = this.nextId();\n const request = JSON.stringify({ jsonrpc: '2.0', id, method, params });\n let resolved = false;\n\n const handler = (response: any) => {\n if (response.id === id && !resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(response.result);\n }\n };\n\n this.on(`response:${name}`, handler);\n (connection.process as ChildProcess).stdin?.write(request + '\\n');\n\n setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.off(`response:${name}`, handler);\n resolve(null);\n }\n }, 15000);\n });\n }\n\n async callTool(\n mcpName: string,\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<any> {\n const connection = this.connections.get(mcpName);\n\n if (!connection || connection.status !== 'connected') {\n throw new Error(`MCP ${mcpName} not connected`);\n }\n\n if (connection.config.type === 'stdio') {\n return this.sendRequest(mcpName, 'tools/call', { name: toolName, arguments: args });\n }\n\n if (connection.config.type === 'http') {\n const endpoint = connection.config.endpoint!;\n const headers: Record<string, string> = (connection as any)._httpHeaders ?? {\n 'Content-Type': 'application/json',\n };\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: this.nextId(),\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n }),\n });\n\n const data = await response.json();\n return data.result || data;\n }\n\n return null;\n }\n\n getTools(name: string): McpTool[] {\n return this.connections.get(name)?.tools || [];\n }\n\n getStatus(name: string): string {\n return this.connections.get(name)?.status || 'unknown';\n }\n\n getAuthUrl(name: string): string | undefined {\n return this.connections.get(name)?.authUrl;\n }\n\n getAllStatuses(): Map<string, string> {\n const statuses = new Map<string, string>();\n for (const [name, conn] of this.connections) {\n statuses.set(name, conn.status);\n }\n return statuses;\n }\n\n private async reconnect(name: string): Promise<boolean> {\n const connection = this.connections.get(name);\n if (!connection) return false;\n\n if (connection.process) {\n try {\n (connection.process as ChildProcess).kill();\n } catch {}\n }\n\n connection.status = 'connecting';\n try {\n if (connection.config.type === 'stdio') {\n await this.connectStdio(name, connection);\n } else if (connection.config.type === 'http') {\n await this.connectHttp(name, connection);\n }\n connection.status = 'connected';\n this.emit('reconnected', name);\n return true;\n } catch {\n connection.status = 'error';\n return false;\n }\n }\n\n disconnect(name: string) {\n const connection = this.connections.get(name);\n\n if (connection?.process) {\n (connection.process as ChildProcess).kill();\n }\n\n this.stdioBuffers.delete(name);\n this.connections.delete(name);\n }\n\n disconnectAll() {\n for (const name of this.connections.keys()) {\n this.disconnect(name);\n }\n }\n\n private nextId(): string {\n return `${++this.requestIdCounter}`;\n }\n}\n"],"names":["McpClientService","EventEmitter","connect","name","config","connections","has","existing","get","status","connection","tools","set","type","command","connectStdio","endpoint","Error","connectHttp","error","args","env","proc","spawn","process","stdio","stdioBuffers","stdout","on","data","buffer","toString","lines","split","pop","line","trimmed","trim","parsed","JSON","parse","emit","stderr","msg","startsWith","console","code","delete","setTimeout","reconnect","catch","sendRequest","protocolVersion","capabilities","clientInfo","version","toolsResponse","URL","headers","provider","CastOAuthProvider","cachedTokens","tokens","access_token","doFetch","body","hdrs","timeoutMs","controller","AbortController","timer","abort","fetch","method","stringify","signal","clearTimeout","initBody","jsonrpc","id","nextId","params","initResponse","invalidateCredentials","authResult","auth","serverUrl","redirectUrl","waitForCallback","authorizationCode","ok","statusText","sessionId","json","result","_httpHeaders","Promise","resolve","request","resolved","handler","response","off","stdin","write","callTool","mcpName","toolName","arguments","getTools","getStatus","getAuthUrl","authUrl","getAllStatuses","statuses","Map","conn","kill","disconnect","disconnectAll","keys","requestIdCounter"],"mappings":"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"}
|
|
@@ -69,7 +69,6 @@ function _ts_metadata(k, v) {
|
|
|
69
69
|
let McpCommandsService = class McpCommandsService {
|
|
70
70
|
async cmdMcp(args, smartInput) {
|
|
71
71
|
const sub = args[0] || 'menu';
|
|
72
|
-
// 'menu' uses SmartInput directly — must NOT pause before it
|
|
73
72
|
if (sub === 'menu') {
|
|
74
73
|
try {
|
|
75
74
|
await this.showMcpMenu(smartInput);
|
|
@@ -82,7 +81,6 @@ let McpCommandsService = class McpCommandsService {
|
|
|
82
81
|
}
|
|
83
82
|
return;
|
|
84
83
|
}
|
|
85
|
-
// Other sub-commands use inquirer and need pause/resume
|
|
86
84
|
smartInput.pause();
|
|
87
85
|
try {
|
|
88
86
|
switch(sub){
|
|
@@ -229,17 +227,15 @@ let McpCommandsService = class McpCommandsService {
|
|
|
229
227
|
w(` ${icon} ${(0, _theme.colorize)(name, 'cyan')} — ${status}\r\n`);
|
|
230
228
|
if (!ok) {
|
|
231
229
|
const config = this.mcpRegistry.getConfig(name);
|
|
232
|
-
// OAuth/HTTP: the SDK already ran the full flow. Failure = server blocked DCR
|
|
233
230
|
if (config?.type === 'http') {
|
|
234
231
|
w(`\r\n ${(0, _theme.colorize)('⚠️ ' + name + ': OAuth bloqueado pelo servidor', 'warning')}\r\n`);
|
|
235
232
|
w(` Este servidor só aceita clientes pré-aprovados (ex: VS Code, Cursor).\r\n`);
|
|
236
233
|
w(` Alternativa: use o proxy mcp-remote para redirecionar via cliente aprovado.\r\n\r\n`);
|
|
237
|
-
// stdio server — check for missing credentials
|
|
238
234
|
} else if (config?.type === 'stdio' && smartInput) {
|
|
239
235
|
const template = (0, _mcptemplates.getTemplate)(name);
|
|
240
236
|
if (template?.credentials?.length) {
|
|
241
237
|
const missing = template.credentials.filter((cred)=>{
|
|
242
|
-
if (cred.isArg) return false;
|
|
238
|
+
if (cred.isArg) return false;
|
|
243
239
|
return !config.env?.[cred.envVar];
|
|
244
240
|
});
|
|
245
241
|
if (missing.length > 0) {
|
|
@@ -254,12 +250,10 @@ let McpCommandsService = class McpCommandsService {
|
|
|
254
250
|
updatedConfig.env[cred.envVar] = value.trim();
|
|
255
251
|
}
|
|
256
252
|
}
|
|
257
|
-
// Save updated config
|
|
258
253
|
_fs.writeFileSync(filePath, JSON.stringify({
|
|
259
254
|
[name]: updatedConfig
|
|
260
255
|
}, null, 2));
|
|
261
256
|
this.mcpRegistry.registerMcp(name, updatedConfig);
|
|
262
|
-
// Retry connection
|
|
263
257
|
w(`\r\n ${(0, _theme.colorize)('Reconectando ' + name + '...', 'muted')}\r\n`);
|
|
264
258
|
const retryOk = await this.mcpRegistry.connectMcp(name);
|
|
265
259
|
const retryIcon = retryOk ? (0, _theme.colorize)('●', 'success') : (0, _theme.colorize)('○', 'error');
|
|
@@ -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":";;;;+BAoBaA;;;eAAAA;;;wBApBc;4DACP;8DACE;uBACuB;oCACV;kCACF;gCAM1B;8BAC2E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQ3E,IAAA,AAAMA,qBAAN,MAAMA;IAMX,MAAMC,OAAOC,IAAc,EAAEC,UAAkE,EAAiB;QAC9G,MAAMC,MAAMF,IAAI,CAAC,EAAE,IAAI;QAEvB,6DAA6D;QAC7D,IAAIE,QAAQ,QAAQ;YAClB,IAAI;gBACF,MAAM,IAAI,CAACC,WAAW,CAACF;YACzB,EAAE,OAAOG,OAAY;gBACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,OAAOE,SAAS,wBAAwB;oBACnFC,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wCAAwC;gBAC/D,OAAO;oBACL,MAAML;gBACR;YACF;YACA;QACF;QAEA,wDAAwD;QACxDH,WAAWS,KAAK;QAChB,IAAI;YACF,OAAQR;gBACN,KAAK;oBACH,MAAM,IAAI,CAACS,WAAW;oBACtB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,SAAS;oBACpB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,YAAY,CAACZ;oBACxB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACa,eAAe,CAACb;oBAC3B;gBACF,KAAK;oBACH,MAAM,IAAI,CAACc,WAAW,CAACd;oBACvB;gBACF,KAAK;gBACL,KAAK;oBACH,IAAI,CAACe,cAAc;oBACnB;gBACF,KAAK;gBACL;oBACE,IAAI,CAACC,YAAY;oBACjB;YACJ;QACF,EAAE,OAAOb,OAAY;YACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,OAAOE,SAAS,wBAAwB;gBACnFC,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wCAAwC;gBAC7D;YACF;YACA,MAAML;QACR,SAAU;YACRH,WAAWiB,MAAM;QACnB;IACF;IAEA,MAAcf,YAAYF,UAAsB,EAAiB;QAC/D,MAAMkB,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9C,MAAO,KAAM;YACXD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,eAAe,QAAQ,EAAE,CAAC;YAC1CU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;YAExD,MAAMC,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;YACrD,MAAMC,aAAaH,UAAUI,MAAM,CAAC,CAACC,KAAKZ,IAAMY,MAAMZ,EAAEa,SAAS,EAAE;YAEnEd,EAAE,GAAGV,IAAAA,eAAQ,EAAC,eAAe,SAAS,CAAC,EAAEkB,UAAUO,MAAM,CAAC,EAAE,CAAC;YAC7Df,EAAE,GAAGV,IAAAA,eAAQ,EAAC,gBAAgB,SAAS,CAAC,EAAEqB,WAAW,IAAI,CAAC;YAE1DvB,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,yCAAyC;YAE9D,MAAM0B,SAAS,MAAM,IAAI,CAACC,OAAO,CAAC,IAAMnC,WAAWoC,SAAS,CAAC,uBAAuB;oBAClF;wBAAEC,KAAK;wBAAKC,OAAO;wBAAkBC,aAAa;oBAA2B;oBAC7E;wBAAEF,KAAK;wBAAKC,OAAO;wBAAmBC,aAAa;oBAA6B;oBAChF;wBAAEF,KAAK;wBAAKC,OAAO;wBAAuBC,aAAa;oBAAwC;oBAC/F;wBAAEF,KAAK;wBAAKC,OAAO;wBAAsBC,aAAa;oBAAsB;oBAC5E;wBAAEF,KAAK;wBAAKC,OAAO;wBAAoBC,aAAa;oBAAkB;oBACtE;wBAAEF,KAAK;wBAAKC,OAAO;wBAAgBC,aAAa;oBAAsB;oBACtE;wBAAEF,KAAK;wBAAKC,OAAO;wBAAUC,aAAa;oBAAkB;iBAC7D;YAED,IAAIL,WAAW,MAAM;gBACnB5B,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,4BAA4B;gBACjD;YACF;YAEA,IAAIC,QAAQ;YACZ,OAAQyB;gBACN,KAAK;oBACH,MAAM,IAAI,CAACxB,WAAW;oBACtB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,SAAS;oBACpB;gBACF,KAAK;oBACH,MAAM,IAAI,CAAC6B,cAAc,CAACxC;oBAC1B;gBACF,KAAK;oBACH,MAAM,IAAI,CAACY,YAAY,CAACZ;oBACxBS,QAAQ;oBACR;gBACF,KAAK;oBACH,MAAM,IAAI,CAACI,eAAe,CAACb;oBAC3BS,QAAQ;oBACR;gBACF,KAAK;oBACH,IAAI,CAACM,cAAc;oBACnB;gBACF,KAAK;oBACH;YACJ;YAEA,IAAIN,OAAO;gBACT,MAAMT,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,6BAA6B;YAClE;QACF;IACF;IAEA,MAAc2B,QAAWO,EAAoB,EAAqB;QAChE,IAAI;YACF,OAAO,MAAMA;QACf,EAAE,OAAOvC,OAAY;YACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,MAAME,IAAI,KAAK,wBAAwB;gBAClF,OAAO;YACT;YACA,MAAMF;QACR;IACF;IAEA,MAAcqC,eAAexC,UAAmE,EAAiB;QAC/G,MAAMkB,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QAErDV,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,2BAA2B,UAAU;QACxFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAIC,UAAUO,MAAM,KAAK,GAAG;YAC1Bf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gEAAgE,SAAS,MAAM,CAAC;YAChG;QACF;QAEAU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gBAAgBkB,UAAUO,MAAM,GAAG,oBAAoB,SAAS,MAAM,CAAC;QAEvF,MAAMY,UAAU,MAAM,IAAI,CAAClB,WAAW,CAACmB,UAAU;QAEjD,KAAK,MAAM,CAACzC,MAAM0C,GAAG,IAAIF,QAAQG,OAAO,GAAI;YAC1C,MAAMC,OAAOF,KAAKvC,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;YAC3D,MAAM0C,SAASH,KAAKvC,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAAC,UAAU;YAC1EU,EAAE,CAAC,EAAE,EAAE+B,KAAK,CAAC,EAAEzC,IAAAA,eAAQ,EAACH,MAAM,QAAQ,GAAG,EAAE6C,OAAO,IAAI,CAAC;YAEvD,IAAI,CAACH,IAAI;gBACP,MAAMI,SAAS,IAAI,CAACxB,WAAW,CAACyB,SAAS,CAAC/C;gBAE1C,8EAA8E;gBAC9E,IAAI8C,QAAQE,SAAS,QAAQ;oBAC3BnC,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,SAASH,OAAO,mCAAmC,WAAW,IAAI,CAAC;oBACvFa,EAAE,CAAC,8EAA8E,CAAC;oBAClFA,EAAE,CAAC,wFAAwF,CAAC;gBAE9F,+CAA+C;gBAC/C,OAAO,IAAIiC,QAAQE,SAAS,WAAWrD,YAAY;oBACjD,MAAMsD,WAAWC,IAAAA,yBAAW,EAAClD;oBAC7B,IAAIiD,UAAUE,aAAavB,QAAQ;wBACjC,MAAMwB,UAAUH,SAASE,WAAW,CAACE,MAAM,CAACC,CAAAA;4BAC1C,IAAIA,KAAKC,KAAK,EAAE,OAAO,OAAO,2BAA2B;4BACzD,OAAO,CAACT,OAAOU,GAAG,EAAE,CAACF,KAAKG,MAAM,CAAC;wBACnC;wBAEA,IAAIL,QAAQxB,MAAM,GAAG,GAAG;4BACtBf,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,qCAAqCH,MAAM,WAAW,QAAQ,CAAC;4BAEnF,MAAM0D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;4BACjD,MAAMC,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAK,KAAK,CAAC;4BACjD,MAAM+D,gBAAgBC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACpB;4BAChD,IAAI,CAACiB,cAAcP,GAAG,EAAEO,cAAcP,GAAG,GAAG,CAAC;4BAE7C,KAAK,MAAMF,QAAQF,QAAS;gCAC1B,MAAMe,QAAQ,MAAMxE,WAAWyC,QAAQ,CACrCjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;gCAErD,IAAID,MAAME,IAAI,IAAI;oCAChBN,cAAcP,GAAG,CAACF,KAAKG,MAAM,CAAC,GAAGU,MAAME,IAAI;gCAC7C;4BACF;4BAEA,sBAAsB;4BACtBC,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;gCAAE,CAAClE,KAAK,EAAE+D;4BAAc,GAAG,MAAM;4BAC3E,IAAI,CAACzC,WAAW,CAACkD,WAAW,CAACxE,MAAM+D;4BAEnC,mBAAmB;4BACnBlD,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,kBAAkBH,OAAO,OAAO,SAAS,IAAI,CAAC;4BAClE,MAAMyE,UAAU,MAAM,IAAI,CAACnD,WAAW,CAACoD,UAAU,CAAC1E;4BAClD,MAAM2E,YAAYF,UAAUtE,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;4BACrE,MAAMyE,cAAcH,UAAUtE,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAAC,mCAAmC;4BAC7GU,EAAE,CAAC,EAAE,EAAE8D,UAAU,CAAC,EAAExE,IAAAA,eAAQ,EAACH,MAAM,QAAQ,GAAG,EAAE4E,YAAY,QAAQ,CAAC;wBACvE,OAAO;4BACL/D,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,8DAA8D,SAAS,QAAQ,CAAC;wBAClG;oBACF;gBACF;YACF;QACF;QAEA,MAAM0E,eAAe,MAAM,IAAI,CAACvD,WAAW,CAACmB,UAAU;QACtD,MAAMqC,YAAY;eAAID,aAAaE,MAAM;SAAG,CAAC1B,MAAM,CAAC2B,SAASpD,MAAM;QACnEf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,GAAG2E,UAAU,CAAC,EAAED,aAAaI,IAAI,CAAC,aAAa,CAAC,EAAEH,cAAcD,aAAaI,IAAI,GAAG,YAAY,WAAW,QAAQ,CAAC;IACtI;IAEA,MAAc5E,cAA6B;QACzC,MAAMQ,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QAErDV,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,eAAe,UAAU;QAC5EU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAIC,UAAUO,MAAM,KAAK,GAAG;YAC1Bf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mCAAmC,SAAS,MAAM,CAAC;YACnEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gBAAgB,QAAQ,gBAAgB,CAAC;YACzDU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mBAAmB,QAAQ,iBAAiB,CAAC;YAC7D;QACF;QAEA,KAAK,MAAMW,KAAKO,UAAW;YACzB,MAAM6D,aAAapE,EAAE+B,MAAM,KAAK,cAAc1C,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;YACvF,MAAMgF,aAAarE,EAAE+B,MAAM,KAAK,cAAc1C,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAACW,EAAE+B,MAAM,EAAE;YAEpGhC,EAAE,CAAC,EAAE,EAAEqE,WAAW,CAAC,EAAE/E,IAAAA,eAAQ,EAACW,EAAEd,IAAI,EAAE,QAAQ,CAAC,EAAEG,IAAAA,eAAQ,EAAC,CAAC,CAAC,EAAEW,EAAEsE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC;YAC5FvE,EAAE,CAAC,YAAY,EAAEsE,WAAW,gBAAgB,EAAErE,EAAEa,SAAS,CAAC,IAAI,CAAC;YAE/D,IAAIb,EAAEa,SAAS,GAAG,GAAG;gBACnB,MAAM0D,YAAYvE,EAAEwE,gBAAgB,CAACC,KAAK,CAAC,GAAG,GAAGC,GAAG,CAACC,CAAAA,IAAKA,EAAEzF,IAAI,CAAC0F,KAAK,CAAC,KAAKC,GAAG,IAAI/B,IAAI,CAAC;gBACxF,MAAMgC,OAAO9E,EAAEa,SAAS,GAAG,IAAI,CAAC,EAAE,EAAEb,EAAEa,SAAS,GAAG,EAAE,KAAK,CAAC,GAAG;gBAC7Dd,EAAE,CAAC,WAAW,EAAEV,IAAAA,eAAQ,EAACkF,YAAYO,MAAM,SAAS,IAAI,CAAC;YAC3D;YACA/E,EAAE;QACJ;IACF;IAEA,MAAcP,YAA2B;QACvC,MAAMO,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QACrD,MAAMC,aAAaH,UAAUI,MAAM,CAAC,CAACC,KAAKZ,IAAMY,MAAMZ,EAAEa,SAAS,EAAE;QAEnEd,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACuD,IAAI,GAAG,KAAK,YAAY1F,IAAAA,eAAQ,EAAC,CAAC,WAAW,EAAEqB,WAAW,CAAC,CAAC,EAAE,UAAU;QACzFX,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAII,eAAe,GAAG;YACpBX,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,iCAAiC,SAAS,MAAM,CAAC;YACnE;QACF;QAEA,KAAK,MAAM2F,UAAUzE,UAAW;YAC9B,IAAIyE,OAAOnE,SAAS,KAAK,GAAG;YAE5Bd,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC2F,OAAO9F,IAAI,EAAE,QAAQ,CAAC,EAAEG,IAAAA,eAAQ,EAAC,CAAC,CAAC,EAAE2F,OAAOV,SAAS,CAAC,EAAE,EAAEU,OAAOjD,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC;YAC5GhC,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;YAE1D,KAAK,MAAM2E,MAAMD,OAAOR,gBAAgB,CAAE;gBACxC,MAAMU,YAAYD,GAAG/F,IAAI,CAACiG,OAAO,CAAC,GAAGH,OAAO9F,IAAI,CAAC,CAAC,CAAC,EAAE;gBACrDa,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,CAAC,EAAEA,IAAAA,eAAQ,EAAC6F,WAAW,QAAQ,IAAI,CAAC;gBACtE,MAAME,OAAOH,GAAG7D,WAAW,CAACN,MAAM,GAAG,KACjCmE,GAAG7D,WAAW,CAACqD,KAAK,CAAC,GAAG,MAAM,QAC9BQ,GAAG7D,WAAW;gBAClBrB,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC+F,MAAM,SAAS,IAAI,CAAC;YAC1C;QACF;QACArF,EAAE;IACJ;IAEA,MAAcN,aAAaZ,UAAsB,EAAiB;QAChE,MAAM+D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;QAEjD,IAAI,CAACS,IAAG6B,UAAU,CAACzC,SAAS;YAC1BY,IAAG8B,SAAS,CAAC1C,QAAQ;gBAAE2C,WAAW;YAAK;QACzC;QAEA,MAAMxF,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9CD,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,0BAA0B,UAAU;QACvFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElDnB,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wDAAwD;QAE7E,MAAMmG,WAAW,MAAMC,IAAAA,6BAAa,EAAyB;YAC3DC,SAAS;YACTC,SAAS;gBACP;oBAAEzG,MAAM;oBAAuDmE,OAAO;gBAAqB;gBAC3F;oBAAEnE,MAAM;oBAAqBmE,OAAO;gBAAwB;gBAC5D;oBAAEnE,MAAM;oBAAoDmE,OAAO;gBAAsB;gBACzF;oBAAEnE,MAAM;oBAAgDmE,OAAO;gBAAwB;gBACvF;oBAAEnE,MAAM;oBAA0CmE,OAAO;gBAAuB;gBAChF;oBAAEnE,MAAM;oBAAuDmE,OAAO;gBAA8B;gBACpG;oBAAEnE,MAAM;oBAAgCmE,OAAO;gBAA0B;gBACzE;oBAAEnE,MAAM;oBAA0BmE,OAAO;gBAAyB;gBAClE;oBAAEnE,MAAM;oBAAiBmE,OAAO;gBAA4B;gBAC5D;oBAAEnE,MAAM;oBAAyBmE,OAAO;gBAAS;aAClD;QACH;QAEA,IAAImC,aAAa,MAAM;YACrBzF,EAAEV,IAAAA,eAAQ,EAAC,8BAA8B;YACzC;QACF;QAEA,IAAI2C,SAA8B,CAAC;QACnC,IAAI9C;QAEJ,IAAIsG,aAAa,UAAU;YACzB,MAAMI,YAAYC,IAAAA,oCAAsB,EAACL;YACzC,MAAMM,aAAa,MAAML,IAAAA,6BAAa,EAAS;gBAC7CC,SAAS;gBACTC,SAASC,UAAUlB,GAAG,CAACC,CAAAA,IAAM,CAAA;wBAC3BzF,MAAM,GAAGyF,EAAEzF,IAAI,CAAC,GAAG,EAAEyF,EAAEvD,WAAW,EAAE;wBACpCiC,OAAOsB,EAAEoB,EAAE;oBACb,CAAA;YACF;YAEA,IAAID,eAAe,MAAM;gBACvB/F,EAAEV,IAAAA,eAAQ,EAAC,8BAA8B;gBACzC;YACF;YAEA,MAAM8C,WAAWC,IAAAA,yBAAW,EAAC0D;YAC7B,IAAI,CAAC3D,UAAU;gBACbpC,EAAEV,IAAAA,eAAQ,EAAC,4CAA4C;gBACvD;YACF;YAEAH,OAAOiD,SAAS4D,EAAE;YAClB/D,SAASkB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACjB,SAASH,MAAM,IAAI,aAAa;YAEnE,IAAIG,SAASE,WAAW,CAACvB,MAAM,GAAG,GAAG;gBACnCf,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,IAAI,CAAC;gBAEnD,KAAK,MAAMmD,QAAQL,SAASE,WAAW,CAAE;oBACvC,IAAIG,KAAKC,KAAK,EAAE;wBACd,MAAMY,QAAQ,MAAMxE,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;wBAC3F,IAAI,CAACD,MAAME,IAAI,MAAMf,KAAKwD,QAAQ,EAAE;4BAClCjG,EAAEV,IAAAA,eAAQ,EAAC,sCAAsC;4BACjD;wBACF;wBACA,IAAIgE,MAAME,IAAI,IAAI;4BAChBvB,OAAOpD,IAAI,CAACqH,IAAI,CAAC5C,MAAME,IAAI;wBAC7B;oBACF,OAAO;wBACL,MAAMF,QAAQ,MAAMxE,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;wBAC3F,IAAI,CAACD,MAAME,IAAI,MAAMf,KAAKwD,QAAQ,EAAE;4BAClCjG,EAAEV,IAAAA,eAAQ,EAAC,sCAAsC;4BACjD;wBACF;wBACA,IAAIgE,MAAME,IAAI,IAAI;4BAChB,IAAI,CAACvB,OAAOU,GAAG,EAAEV,OAAOU,GAAG,GAAG,CAAC;4BAC/BV,OAAOU,GAAG,CAACF,KAAKG,MAAM,CAAC,GAAGU,MAAME,IAAI;wBACtC;oBACF;gBACF;YACF;YAEA,MAAMP,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAK,KAAK,CAAC;YACjDsE,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;gBAAE,CAAClE,KAAK,EAAE8C;YAAO,GAAG,MAAM;YACpEjC,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,kBAAkB,EAAEA,IAAAA,eAAQ,EAAC2D,UAAU,UAAU,IAAI,CAAC;YAExF,IAAI9D,SAAS,SAAS;gBACpBa,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAEV,IAAAA,eAAQ,EAAC,uCAAuC;gBAClDU,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,iEAAiE;gBAC5EU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C;gBACxDU,EAAEV,IAAAA,eAAQ,EAAC,oDAAoD;gBAC/DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,mEAAmE;gBAC9EU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;YACJ,OAAO,IAAIoC,SAASH,MAAM,CAACE,IAAI,KAAK,QAAQ;gBAC1CnC,EAAEV,IAAAA,eAAQ,EAAC,gDAAgD;gBAC3DU,EAAEV,IAAAA,eAAQ,EAAC,gEAAgE;YAC7E;YAEAU,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C;YACtD;QACF;QAEA,MAAM6G,YAAY,MAAMC,IAAAA,4BAAY,EAAC;YACnCT,SAASrG,IAAAA,eAAQ,EAAC,wBAAwB;QAC5C;QACA,IAAI6G,cAAc,QAAQ,CAACA,UAAU3C,IAAI,IAAI;YAC3CxD,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;YACpC;QACF;QACAH,OAAOgH;QAEP,MAAME,aAAa,MAAMvH,WAAWoC,SAAS,CAAC,yBAAyB;YACrE;gBAAEC,KAAK;gBAASC,OAAO;gBAASC,aAAa;YAAqC;YAClF;gBAAEF,KAAK;gBAAQC,OAAO;gBAAQC,aAAa;YAAgB;SAC5D;QAEDY,OAAOE,IAAI,GAAGkE;QAEd,IAAIA,eAAe,SAAS;YAC1B,MAAMC,UAAU,MAAMF,IAAAA,4BAAY,EAAC;gBACjCT,SAASrG,IAAAA,eAAQ,EAAC,eAAe;YACnC;YACA,IAAIgH,YAAY,MAAM;gBACpBtG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YAEA,MAAMiH,YAAY,MAAMH,IAAAA,4BAAY,EAAC;gBACnCT,SAASrG,IAAAA,eAAQ,EAAC,0CAA0C;YAC9D;YACA,IAAIiH,cAAc,MAAM;gBACtBvG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YAEA2C,OAAOqE,OAAO,GAAGA,QAAQ9C,IAAI;YAC7BvB,OAAOpD,IAAI,GAAG0H,UAAU/C,IAAI,KAAK+C,UAAU1B,KAAK,CAAC,KAAKF,GAAG,CAAC,CAAC6B,IAAcA,EAAEhD,IAAI,MAAM,EAAE;YAEvF,MAAMiD,SAAS,MAAMC,IAAAA,8BAAc,EAAC;gBAAEf,SAAS;gBAAqCgB,SAAS;YAAM;YACnG,IAAIF,WAAW,MAAM;gBACnBzG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YACA,IAAImH,QAAQ;gBACVxE,OAAOU,GAAG,GAAG,CAAC;gBACd,MAAO,KAAM;oBACX,MAAMxB,MAAM,MAAMiF,IAAAA,4BAAY,EAAC;wBAC7BT,SAASrG,IAAAA,eAAQ,EAAC,8CAA8C;oBAClE;oBACA,IAAI6B,QAAQ,MAAM;wBAChBnB,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;wBACpC;oBACF;oBACA,IAAI,CAAC6B,KAAK;oBAEV,MAAMmC,QAAQ,MAAM8C,IAAAA,4BAAY,EAAC;wBAC/BT,SAASrG,IAAAA,eAAQ,EAAC,CAAC,aAAa,EAAE6B,IAAI,EAAE,CAAC,EAAE;oBAC7C;oBACA,IAAImC,UAAU,MAAM;wBAClBtD,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;wBACpC;oBACF;oBACA2C,OAAOU,GAAG,CAACxB,IAAI,GAAGmC;gBACpB;YACF;QACF,OAAO;YACL,MAAMsD,WAAW,MAAMR,IAAAA,4BAAY,EAAC;gBAClCT,SAASrG,IAAAA,eAAQ,EAAC,uBAAuB;YAC3C;YACA,IAAIsH,aAAa,MAAM;gBACrB5G,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YACA2C,OAAO2E,QAAQ,GAAGA,SAASpD,IAAI;QACjC;QAEA,MAAMP,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAKqE,IAAI,GAAGqD,WAAW,GAAG,KAAK,CAAC;QACtEpD,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;YAAE,CAAClE,KAAKqE,IAAI,GAAG,EAAEvB;QAAO,GAAG,MAAM;QAE3EjC,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,eAAe,EAAEA,IAAAA,eAAQ,EAAC2D,UAAU,UAAU,IAAI,CAAC;QACrFjD,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C;IACxD;IAEA,MAAcK,gBAAgBb,UAAsB,EAAiB;QACnE,MAAM+D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;QAEjD,IAAI,CAACS,IAAG6B,UAAU,CAACzC,SAAS;YAC1BzD,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,8BAA8B;YACnD;QACF;QAEA,MAAMwH,QAAQrD,IAAGsD,WAAW,CAAClE,QAAQL,MAAM,CAAC,CAACwE,IAAcA,EAAEC,QAAQ,CAAC;QACtE,IAAIH,MAAM/F,MAAM,KAAK,GAAG;YACtB3B,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,8BAA8B;YACnD;QACF;QAEA,MAAMU,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9CD,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,wBAAwB,UAAU;QACrFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,MAAM2G,WAAW,MAAMC,OAAe;YACpCxB,SAAS;YACTC,SAASkB,MAAMnC,GAAG,CAAC,CAACqC,IAAe,CAAA;oBACjC7H,MAAM6H,EAAE5B,OAAO,CAAC,SAAS;oBACzB9B,OAAO0D;gBACT,CAAA;QACF;QAEA,MAAMI,gBAAgB,MAAMC,QAAQ;YAClC1B,SAAS,CAAC,gCAAgC,EAAEuB,SAAS9B,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;YAC7EuB,SAAS;QACX;QAEA,IAAIS,eAAe;YACjB3D,IAAG6D,UAAU,CAACxE,MAAKC,IAAI,CAACF,QAAQqE;YAChC9H,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,CAAC,uBAAuB,CAAC,EAAE;QAClD;IACF;IAEA,MAAcM,YAAYd,UAAsB,EAAiB;QAC/DM,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,iBAAiB;IACxC;IAEQO,iBAAuB;QAC7B,MAAMG,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,EAAE,CAAC;QAC/CU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,gCAAgC,QAAQ,wBAAwB,CAAC;QAC/EU,EAAE,CAAC,iEAAiE,CAAC;QACrEA,EAAE,CAAC,gDAAgD,CAAC;QAEpDA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,kBAAkB,QAAQ,EAAE,CAAC;QAC3CU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,4CAA4C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,oCAAoC,CAAC;QACtEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,uDAAuD,CAAC;QAEzFU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,EAAE,CAAC;QAC7CU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,+CAA+C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,+CAA+C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,wCAAwC,CAAC;QACvEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,iDAAiD,CAAC;QAEhFU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,cAAc,QAAQ,EAAE,CAAC;QACvCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,yCAAyC,CAAC;QAC1EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,8CAA8C,CAAC;QAC/EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,wCAAwC,CAAC;QAEzEU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,+BAA+B,UAAU,EAAE,CAAC;QAC1DU,EAAE,CAAC,+BAA+B,CAAC;QACnCA,EAAE,CAAC,uCAAuC,CAAC;IAC7C;IAEQuH,mBAAyB;QAC/B,MAAMvH,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mCAAmC,QAAQ,EAAE,CAAC;QAC9DU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,+CAA+C,QAAQ,IAAI,CAAC;QAC1EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,mBAAmB,CAAC;QACnDU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,+BAA+B,SAAS,EAAE,CAAC;QAC5DU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,eAAe,SAAS,EAAE,CAAC;QAC5CU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C,SAAS,IAAI,CAAC;QAE5EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,8BAA8B,CAAC;QAC9DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wEAAwE,CAAC,EAAE;QACvFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sFAAsF,CAAC,EAAE;QACrGU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,+BAA+B,CAAC,EAAE;QAC9CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,6CAA6C,CAAC,EAAE;QAC5DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sCAAsC,CAAC,EAAE;QACrDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,OAAO,CAAC,EAAE;QACtBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,oEAAoE,CAAC,EAAE;QACnFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,gBAAgB,CAAC,EAAE;QAC/BU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,4BAA4B,CAAC,EAAE;QAC3CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sCAAsC,CAAC,EAAE;QACrDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,uBAAuB,CAAC,EAAE;QACtCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,0BAA0B,CAAC,EAAE;QACzCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,oDAAoD,CAAC,EAAE;QACnEU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,6BAA6B,CAAC,EAAE;QAC5CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,UAAU,CAAC,EAAE;QACzBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,SAAS,CAAC,EAAE;QACxBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,SAAS,CAAC,EAAE;QACxBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,qEAAqE,CAAC,EAAE;QACpFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,yCAAyC,CAAC,EAAE;QACxDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kEAAkE,CAAC,EAAE;QACjFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,QAAQ,CAAC,EAAE;QACvBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kDAAkD,CAAC,EAAE;QACjEU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,qCAAqC,CAAC,EAAE;QACpDU,EAAE,CAAC,EAAE,CAAC;QAENA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,mBAAmB,QAAQ,IAAI,CAAC;QAC9CU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,mBAAmB,SAAS,IAAI,CAAC;QAClDU,EAAE,CAAC,SAAS,EAAEV,IAAAA,eAAQ,EAAC,sDAAsD,UAAU,IAAI,CAAC;QAE5FU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,8BAA8B,CAAC;QAC9DU,EAAE,CAAC,wBAAwB,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB,SAAS,IAAI,CAAC;QAE7EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,EAAE,CAAC;QACtCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,gDAAgD,CAAC;QAC/EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,4CAA4C,CAAC;QAC3EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,sDAAsD,CAAC;IACvF;IAEQQ,eAAqB;QAC3B,MAAME,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB,QAAQ,EAAE,CAAC;QACpDU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,EAAE,CAAC;QACtCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,QAAQ,QAAQ,6BAA6B,CAAC;QAC9DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,uBAAuB,CAAC;QAC7DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,cAAc,QAAQ,uBAAuB,CAAC;QAC9DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,YAAY,QAAQ,4BAA4B,CAAC;QACjEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,eAAe,QAAQ,uBAAuB,CAAC;QAC/DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,uBAAuB,CAAC;QAE7DU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,yBAAyB,QAAQ,EAAE,CAAC;QAClDU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,uCAAuC,SAAS,EAAE,CAAC;QACnEU,EAAE,CAAC,wCAAwC,CAAC;QAC5CA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,4BAA4B,SAAS,EAAE,CAAC;QACxDU,EAAE,CAAC,mDAAmD,CAAC;QACvDA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C,SAAS,EAAE,CAAC;QACvEU,EAAE,CAAC,uCAAuC,CAAC;QAC3CA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,yCAAyC,SAAS,EAAE,CAAC;QACrEU,EAAE,CAAC,kCAAkC,CAAC;QACtCA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C,SAAS,EAAE,CAAC;QACzEU,EAAE,CAAC,8BAA8B,CAAC;QAElCA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,4BAA4B,QAAQ,EAAE,CAAC;QACrDU,EAAE,CAAC,mDAAmD,CAAC;QACvDA,EAAE,CAAC,qDAAqD,CAAC;QAEzDA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,wBAAwB,QAAQ,EAAE,CAAC;QACjDU,EAAE,CAAC,QAAQ,EAAEV,IAAAA,eAAQ,EAAC,uBAAuB,QAAQ,IAAI,CAAC;QAC1DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,KAAK,CAAC,EAAE;QACpBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kBAAkB,CAAC,EAAE;QACjCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wBAAwB,CAAC,EAAE;QACvCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,yBAAyB,CAAC,EAAE;QACxCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,8DAA8D,CAAC,EAAE;QAC7EU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wCAAwC,CAAC,EAAE;QACvDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,OAAO,CAAC,EAAE;QACtBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,KAAK,CAAC,EAAE;QACpBU,EAAE,CAAC,EAAE,CAAC;IACR;IA5oBA,YACE,AAAiBS,WAA+B,EAChD,AAAiB+G,SAA2B,CAC5C;aAFiB/G,cAAAA;aACA+G,YAAAA;IAChB;AA0oBL"}
|
|
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":";;;;+BAoBaA;;;eAAAA;;;wBApBc;4DACP;8DACE;uBACuB;oCACV;kCACF;gCAM1B;8BAC2E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQ3E,IAAA,AAAMA,qBAAN,MAAMA;IAMX,MAAMC,OAAOC,IAAc,EAAEC,UAAkE,EAAiB;QAC9G,MAAMC,MAAMF,IAAI,CAAC,EAAE,IAAI;QAEvB,IAAIE,QAAQ,QAAQ;YAClB,IAAI;gBACF,MAAM,IAAI,CAACC,WAAW,CAACF;YACzB,EAAE,OAAOG,OAAY;gBACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,OAAOE,SAAS,wBAAwB;oBACnFC,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wCAAwC;gBAC/D,OAAO;oBACL,MAAML;gBACR;YACF;YACA;QACF;QAEAH,WAAWS,KAAK;QAChB,IAAI;YACF,OAAQR;gBACN,KAAK;oBACH,MAAM,IAAI,CAACS,WAAW;oBACtB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,SAAS;oBACpB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,YAAY,CAACZ;oBACxB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACa,eAAe,CAACb;oBAC3B;gBACF,KAAK;oBACH,MAAM,IAAI,CAACc,WAAW,CAACd;oBACvB;gBACF,KAAK;gBACL,KAAK;oBACH,IAAI,CAACe,cAAc;oBACnB;gBACF,KAAK;gBACL;oBACE,IAAI,CAACC,YAAY;oBACjB;YACJ;QACF,EAAE,OAAOb,OAAY;YACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,OAAOE,SAAS,wBAAwB;gBACnFC,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wCAAwC;gBAC7D;YACF;YACA,MAAML;QACR,SAAU;YACRH,WAAWiB,MAAM;QACnB;IACF;IAEA,MAAcf,YAAYF,UAAsB,EAAiB;QAC/D,MAAMkB,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9C,MAAO,KAAM;YACXD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,eAAe,QAAQ,EAAE,CAAC;YAC1CU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;YAExD,MAAMC,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;YACrD,MAAMC,aAAaH,UAAUI,MAAM,CAAC,CAACC,KAAKZ,IAAMY,MAAMZ,EAAEa,SAAS,EAAE;YAEnEd,EAAE,GAAGV,IAAAA,eAAQ,EAAC,eAAe,SAAS,CAAC,EAAEkB,UAAUO,MAAM,CAAC,EAAE,CAAC;YAC7Df,EAAE,GAAGV,IAAAA,eAAQ,EAAC,gBAAgB,SAAS,CAAC,EAAEqB,WAAW,IAAI,CAAC;YAE1DvB,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,yCAAyC;YAE9D,MAAM0B,SAAS,MAAM,IAAI,CAACC,OAAO,CAAC,IAAMnC,WAAWoC,SAAS,CAAC,uBAAuB;oBAClF;wBAAEC,KAAK;wBAAKC,OAAO;wBAAkBC,aAAa;oBAA2B;oBAC7E;wBAAEF,KAAK;wBAAKC,OAAO;wBAAmBC,aAAa;oBAA6B;oBAChF;wBAAEF,KAAK;wBAAKC,OAAO;wBAAuBC,aAAa;oBAAwC;oBAC/F;wBAAEF,KAAK;wBAAKC,OAAO;wBAAsBC,aAAa;oBAAsB;oBAC5E;wBAAEF,KAAK;wBAAKC,OAAO;wBAAoBC,aAAa;oBAAkB;oBACtE;wBAAEF,KAAK;wBAAKC,OAAO;wBAAgBC,aAAa;oBAAsB;oBACtE;wBAAEF,KAAK;wBAAKC,OAAO;wBAAUC,aAAa;oBAAkB;iBAC7D;YAED,IAAIL,WAAW,MAAM;gBACnB5B,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,4BAA4B;gBACjD;YACF;YAEA,IAAIC,QAAQ;YACZ,OAAQyB;gBACN,KAAK;oBACH,MAAM,IAAI,CAACxB,WAAW;oBACtB;gBACF,KAAK;oBACH,MAAM,IAAI,CAACC,SAAS;oBACpB;gBACF,KAAK;oBACH,MAAM,IAAI,CAAC6B,cAAc,CAACxC;oBAC1B;gBACF,KAAK;oBACH,MAAM,IAAI,CAACY,YAAY,CAACZ;oBACxBS,QAAQ;oBACR;gBACF,KAAK;oBACH,MAAM,IAAI,CAACI,eAAe,CAACb;oBAC3BS,QAAQ;oBACR;gBACF,KAAK;oBACH,IAAI,CAACM,cAAc;oBACnB;gBACF,KAAK;oBACH;YACJ;YAEA,IAAIN,OAAO;gBACT,MAAMT,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,6BAA6B;YAClE;QACF;IACF;IAEA,MAAc2B,QAAWO,EAAoB,EAAqB;QAChE,IAAI;YACF,OAAO,MAAMA;QACf,EAAE,OAAOvC,OAAY;YACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,MAAME,IAAI,KAAK,wBAAwB;gBAClF,OAAO;YACT;YACA,MAAMF;QACR;IACF;IAEA,MAAcqC,eAAexC,UAAmE,EAAiB;QAC/G,MAAMkB,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QAErDV,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,2BAA2B,UAAU;QACxFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAIC,UAAUO,MAAM,KAAK,GAAG;YAC1Bf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gEAAgE,SAAS,MAAM,CAAC;YAChG;QACF;QAEAU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gBAAgBkB,UAAUO,MAAM,GAAG,oBAAoB,SAAS,MAAM,CAAC;QAEvF,MAAMY,UAAU,MAAM,IAAI,CAAClB,WAAW,CAACmB,UAAU;QAEjD,KAAK,MAAM,CAACzC,MAAM0C,GAAG,IAAIF,QAAQG,OAAO,GAAI;YAC1C,MAAMC,OAAOF,KAAKvC,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;YAC3D,MAAM0C,SAASH,KAAKvC,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAAC,UAAU;YAC1EU,EAAE,CAAC,EAAE,EAAE+B,KAAK,CAAC,EAAEzC,IAAAA,eAAQ,EAACH,MAAM,QAAQ,GAAG,EAAE6C,OAAO,IAAI,CAAC;YAEvD,IAAI,CAACH,IAAI;gBACP,MAAMI,SAAS,IAAI,CAACxB,WAAW,CAACyB,SAAS,CAAC/C;gBAE1C,IAAI8C,QAAQE,SAAS,QAAQ;oBAC3BnC,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,SAASH,OAAO,mCAAmC,WAAW,IAAI,CAAC;oBACvFa,EAAE,CAAC,8EAA8E,CAAC;oBAClFA,EAAE,CAAC,wFAAwF,CAAC;gBAE9F,OAAO,IAAIiC,QAAQE,SAAS,WAAWrD,YAAY;oBACjD,MAAMsD,WAAWC,IAAAA,yBAAW,EAAClD;oBAC7B,IAAIiD,UAAUE,aAAavB,QAAQ;wBACjC,MAAMwB,UAAUH,SAASE,WAAW,CAACE,MAAM,CAACC,CAAAA;4BAC1C,IAAIA,KAAKC,KAAK,EAAE,OAAO;4BACvB,OAAO,CAACT,OAAOU,GAAG,EAAE,CAACF,KAAKG,MAAM,CAAC;wBACnC;wBAEA,IAAIL,QAAQxB,MAAM,GAAG,GAAG;4BACtBf,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,qCAAqCH,MAAM,WAAW,QAAQ,CAAC;4BAEnF,MAAM0D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;4BACjD,MAAMC,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAK,KAAK,CAAC;4BACjD,MAAM+D,gBAAgBC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACpB;4BAChD,IAAI,CAACiB,cAAcP,GAAG,EAAEO,cAAcP,GAAG,GAAG,CAAC;4BAE7C,KAAK,MAAMF,QAAQF,QAAS;gCAC1B,MAAMe,QAAQ,MAAMxE,WAAWyC,QAAQ,CACrCjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;gCAErD,IAAID,MAAME,IAAI,IAAI;oCAChBN,cAAcP,GAAG,CAACF,KAAKG,MAAM,CAAC,GAAGU,MAAME,IAAI;gCAC7C;4BACF;4BAEAC,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;gCAAE,CAAClE,KAAK,EAAE+D;4BAAc,GAAG,MAAM;4BAC3E,IAAI,CAACzC,WAAW,CAACkD,WAAW,CAACxE,MAAM+D;4BAEnClD,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC,kBAAkBH,OAAO,OAAO,SAAS,IAAI,CAAC;4BAClE,MAAMyE,UAAU,MAAM,IAAI,CAACnD,WAAW,CAACoD,UAAU,CAAC1E;4BAClD,MAAM2E,YAAYF,UAAUtE,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;4BACrE,MAAMyE,cAAcH,UAAUtE,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAAC,mCAAmC;4BAC7GU,EAAE,CAAC,EAAE,EAAE8D,UAAU,CAAC,EAAExE,IAAAA,eAAQ,EAACH,MAAM,QAAQ,GAAG,EAAE4E,YAAY,QAAQ,CAAC;wBACvE,OAAO;4BACL/D,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,8DAA8D,SAAS,QAAQ,CAAC;wBAClG;oBACF;gBACF;YACF;QACF;QAEA,MAAM0E,eAAe,MAAM,IAAI,CAACvD,WAAW,CAACmB,UAAU;QACtD,MAAMqC,YAAY;eAAID,aAAaE,MAAM;SAAG,CAAC1B,MAAM,CAAC2B,SAASpD,MAAM;QACnEf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,GAAG2E,UAAU,CAAC,EAAED,aAAaI,IAAI,CAAC,aAAa,CAAC,EAAEH,cAAcD,aAAaI,IAAI,GAAG,YAAY,WAAW,QAAQ,CAAC;IACtI;IAEA,MAAc5E,cAA6B;QACzC,MAAMQ,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QAErDV,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,eAAe,UAAU;QAC5EU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAIC,UAAUO,MAAM,KAAK,GAAG;YAC1Bf,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mCAAmC,SAAS,MAAM,CAAC;YACnEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,gBAAgB,QAAQ,gBAAgB,CAAC;YACzDU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mBAAmB,QAAQ,iBAAiB,CAAC;YAC7D;QACF;QAEA,KAAK,MAAMW,KAAKO,UAAW;YACzB,MAAM6D,aAAapE,EAAE+B,MAAM,KAAK,cAAc1C,IAAAA,eAAQ,EAAC,KAAK,aAAaA,IAAAA,eAAQ,EAAC,KAAK;YACvF,MAAMgF,aAAarE,EAAE+B,MAAM,KAAK,cAAc1C,IAAAA,eAAQ,EAAC,aAAa,aAAaA,IAAAA,eAAQ,EAACW,EAAE+B,MAAM,EAAE;YAEpGhC,EAAE,CAAC,EAAE,EAAEqE,WAAW,CAAC,EAAE/E,IAAAA,eAAQ,EAACW,EAAEd,IAAI,EAAE,QAAQ,CAAC,EAAEG,IAAAA,eAAQ,EAAC,CAAC,CAAC,EAAEW,EAAEsE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC;YAC5FvE,EAAE,CAAC,YAAY,EAAEsE,WAAW,gBAAgB,EAAErE,EAAEa,SAAS,CAAC,IAAI,CAAC;YAE/D,IAAIb,EAAEa,SAAS,GAAG,GAAG;gBACnB,MAAM0D,YAAYvE,EAAEwE,gBAAgB,CAACC,KAAK,CAAC,GAAG,GAAGC,GAAG,CAACC,CAAAA,IAAKA,EAAEzF,IAAI,CAAC0F,KAAK,CAAC,KAAKC,GAAG,IAAI/B,IAAI,CAAC;gBACxF,MAAMgC,OAAO9E,EAAEa,SAAS,GAAG,IAAI,CAAC,EAAE,EAAEb,EAAEa,SAAS,GAAG,EAAE,KAAK,CAAC,GAAG;gBAC7Dd,EAAE,CAAC,WAAW,EAAEV,IAAAA,eAAQ,EAACkF,YAAYO,MAAM,SAAS,IAAI,CAAC;YAC3D;YACA/E,EAAE;QACJ;IACF;IAEA,MAAcP,YAA2B;QACvC,MAAMO,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9C,MAAMO,YAAY,IAAI,CAACC,WAAW,CAACC,kBAAkB;QACrD,MAAMC,aAAaH,UAAUI,MAAM,CAAC,CAACC,KAAKZ,IAAMY,MAAMZ,EAAEa,SAAS,EAAE;QAEnEd,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACuD,IAAI,GAAG,KAAK,YAAY1F,IAAAA,eAAQ,EAAC,CAAC,WAAW,EAAEqB,WAAW,CAAC,CAAC,EAAE,UAAU;QACzFX,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,IAAII,eAAe,GAAG;YACpBX,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,iCAAiC,SAAS,MAAM,CAAC;YACnE;QACF;QAEA,KAAK,MAAM2F,UAAUzE,UAAW;YAC9B,IAAIyE,OAAOnE,SAAS,KAAK,GAAG;YAE5Bd,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC2F,OAAO9F,IAAI,EAAE,QAAQ,CAAC,EAAEG,IAAAA,eAAQ,EAAC,CAAC,CAAC,EAAE2F,OAAOV,SAAS,CAAC,EAAE,EAAEU,OAAOjD,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC;YAC5GhC,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;YAE1D,KAAK,MAAM2E,MAAMD,OAAOR,gBAAgB,CAAE;gBACxC,MAAMU,YAAYD,GAAG/F,IAAI,CAACiG,OAAO,CAAC,GAAGH,OAAO9F,IAAI,CAAC,CAAC,CAAC,EAAE;gBACrDa,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,CAAC,EAAEA,IAAAA,eAAQ,EAAC6F,WAAW,QAAQ,IAAI,CAAC;gBACtE,MAAME,OAAOH,GAAG7D,WAAW,CAACN,MAAM,GAAG,KACjCmE,GAAG7D,WAAW,CAACqD,KAAK,CAAC,GAAG,MAAM,QAC9BQ,GAAG7D,WAAW;gBAClBrB,EAAE,CAAC,MAAM,EAAEV,IAAAA,eAAQ,EAAC+F,MAAM,SAAS,IAAI,CAAC;YAC1C;QACF;QACArF,EAAE;IACJ;IAEA,MAAcN,aAAaZ,UAAsB,EAAiB;QAChE,MAAM+D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;QAEjD,IAAI,CAACS,IAAG6B,UAAU,CAACzC,SAAS;YAC1BY,IAAG8B,SAAS,CAAC1C,QAAQ;gBAAE2C,WAAW;YAAK;QACzC;QAEA,MAAMxF,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9CD,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,0BAA0B,UAAU;QACvFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElDnB,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,wDAAwD;QAE7E,MAAMmG,WAAW,MAAMC,IAAAA,6BAAa,EAAyB;YAC3DC,SAAS;YACTC,SAAS;gBACP;oBAAEzG,MAAM;oBAAuDmE,OAAO;gBAAqB;gBAC3F;oBAAEnE,MAAM;oBAAqBmE,OAAO;gBAAwB;gBAC5D;oBAAEnE,MAAM;oBAAoDmE,OAAO;gBAAsB;gBACzF;oBAAEnE,MAAM;oBAAgDmE,OAAO;gBAAwB;gBACvF;oBAAEnE,MAAM;oBAA0CmE,OAAO;gBAAuB;gBAChF;oBAAEnE,MAAM;oBAAuDmE,OAAO;gBAA8B;gBACpG;oBAAEnE,MAAM;oBAAgCmE,OAAO;gBAA0B;gBACzE;oBAAEnE,MAAM;oBAA0BmE,OAAO;gBAAyB;gBAClE;oBAAEnE,MAAM;oBAAiBmE,OAAO;gBAA4B;gBAC5D;oBAAEnE,MAAM;oBAAyBmE,OAAO;gBAAS;aAClD;QACH;QAEA,IAAImC,aAAa,MAAM;YACrBzF,EAAEV,IAAAA,eAAQ,EAAC,8BAA8B;YACzC;QACF;QAEA,IAAI2C,SAA8B,CAAC;QACnC,IAAI9C;QAEJ,IAAIsG,aAAa,UAAU;YACzB,MAAMI,YAAYC,IAAAA,oCAAsB,EAACL;YACzC,MAAMM,aAAa,MAAML,IAAAA,6BAAa,EAAS;gBAC7CC,SAAS;gBACTC,SAASC,UAAUlB,GAAG,CAACC,CAAAA,IAAM,CAAA;wBAC3BzF,MAAM,GAAGyF,EAAEzF,IAAI,CAAC,GAAG,EAAEyF,EAAEvD,WAAW,EAAE;wBACpCiC,OAAOsB,EAAEoB,EAAE;oBACb,CAAA;YACF;YAEA,IAAID,eAAe,MAAM;gBACvB/F,EAAEV,IAAAA,eAAQ,EAAC,8BAA8B;gBACzC;YACF;YAEA,MAAM8C,WAAWC,IAAAA,yBAAW,EAAC0D;YAC7B,IAAI,CAAC3D,UAAU;gBACbpC,EAAEV,IAAAA,eAAQ,EAAC,4CAA4C;gBACvD;YACF;YAEAH,OAAOiD,SAAS4D,EAAE;YAClB/D,SAASkB,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACjB,SAASH,MAAM,IAAI,aAAa;YAEnE,IAAIG,SAASE,WAAW,CAACvB,MAAM,GAAG,GAAG;gBACnCf,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,IAAI,CAAC;gBAEnD,KAAK,MAAMmD,QAAQL,SAASE,WAAW,CAAE;oBACvC,IAAIG,KAAKC,KAAK,EAAE;wBACd,MAAMY,QAAQ,MAAMxE,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;wBAC3F,IAAI,CAACD,MAAME,IAAI,MAAMf,KAAKwD,QAAQ,EAAE;4BAClCjG,EAAEV,IAAAA,eAAQ,EAAC,sCAAsC;4BACjD;wBACF;wBACA,IAAIgE,MAAME,IAAI,IAAI;4BAChBvB,OAAOpD,IAAI,CAACqH,IAAI,CAAC5C,MAAME,IAAI;wBAC7B;oBACF,OAAO;wBACL,MAAMF,QAAQ,MAAMxE,WAAWyC,QAAQ,CAACjC,IAAAA,eAAQ,EAAC,CAAC,EAAE,EAAEmD,KAAKtD,IAAI,CAAC,EAAE,EAAEsD,KAAKc,WAAW,CAAC,GAAG,CAAC,EAAE;wBAC3F,IAAI,CAACD,MAAME,IAAI,MAAMf,KAAKwD,QAAQ,EAAE;4BAClCjG,EAAEV,IAAAA,eAAQ,EAAC,sCAAsC;4BACjD;wBACF;wBACA,IAAIgE,MAAME,IAAI,IAAI;4BAChB,IAAI,CAACvB,OAAOU,GAAG,EAAEV,OAAOU,GAAG,GAAG,CAAC;4BAC/BV,OAAOU,GAAG,CAACF,KAAKG,MAAM,CAAC,GAAGU,MAAME,IAAI;wBACtC;oBACF;gBACF;YACF;YAEA,MAAMP,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAK,KAAK,CAAC;YACjDsE,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;gBAAE,CAAClE,KAAK,EAAE8C;YAAO,GAAG,MAAM;YACpEjC,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,kBAAkB,EAAEA,IAAAA,eAAQ,EAAC2D,UAAU,UAAU,IAAI,CAAC;YAExF,IAAI9D,SAAS,SAAS;gBACpBa,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAEV,IAAAA,eAAQ,EAAC,uCAAuC;gBAClDU,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,iEAAiE;gBAC5EU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C;gBACxDU,EAAEV,IAAAA,eAAQ,EAAC,oDAAoD;gBAC/DU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,eAAe,YAAY;gBACtCU,EAAEV,IAAAA,eAAQ,EAAC,mEAAmE;gBAC9EU,EAAE;gBACFA,EAAEV,IAAAA,eAAQ,EAAC,mDAAmD;gBAC9DU,EAAE;YACJ,OAAO,IAAIoC,SAASH,MAAM,CAACE,IAAI,KAAK,QAAQ;gBAC1CnC,EAAEV,IAAAA,eAAQ,EAAC,gDAAgD;gBAC3DU,EAAEV,IAAAA,eAAQ,EAAC,gEAAgE;YAC7E;YAEAU,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C;YACtD;QACF;QAEA,MAAM6G,YAAY,MAAMC,IAAAA,4BAAY,EAAC;YACnCT,SAASrG,IAAAA,eAAQ,EAAC,wBAAwB;QAC5C;QACA,IAAI6G,cAAc,QAAQ,CAACA,UAAU3C,IAAI,IAAI;YAC3CxD,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;YACpC;QACF;QACAH,OAAOgH;QAEP,MAAME,aAAa,MAAMvH,WAAWoC,SAAS,CAAC,yBAAyB;YACrE;gBAAEC,KAAK;gBAASC,OAAO;gBAASC,aAAa;YAAqC;YAClF;gBAAEF,KAAK;gBAAQC,OAAO;gBAAQC,aAAa;YAAgB;SAC5D;QAEDY,OAAOE,IAAI,GAAGkE;QAEd,IAAIA,eAAe,SAAS;YAC1B,MAAMC,UAAU,MAAMF,IAAAA,4BAAY,EAAC;gBACjCT,SAASrG,IAAAA,eAAQ,EAAC,eAAe;YACnC;YACA,IAAIgH,YAAY,MAAM;gBACpBtG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YAEA,MAAMiH,YAAY,MAAMH,IAAAA,4BAAY,EAAC;gBACnCT,SAASrG,IAAAA,eAAQ,EAAC,0CAA0C;YAC9D;YACA,IAAIiH,cAAc,MAAM;gBACtBvG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YAEA2C,OAAOqE,OAAO,GAAGA,QAAQ9C,IAAI;YAC7BvB,OAAOpD,IAAI,GAAG0H,UAAU/C,IAAI,KAAK+C,UAAU1B,KAAK,CAAC,KAAKF,GAAG,CAAC,CAAC6B,IAAcA,EAAEhD,IAAI,MAAM,EAAE;YAEvF,MAAMiD,SAAS,MAAMC,IAAAA,8BAAc,EAAC;gBAAEf,SAAS;gBAAqCgB,SAAS;YAAM;YACnG,IAAIF,WAAW,MAAM;gBACnBzG,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YACA,IAAImH,QAAQ;gBACVxE,OAAOU,GAAG,GAAG,CAAC;gBACd,MAAO,KAAM;oBACX,MAAMxB,MAAM,MAAMiF,IAAAA,4BAAY,EAAC;wBAC7BT,SAASrG,IAAAA,eAAQ,EAAC,8CAA8C;oBAClE;oBACA,IAAI6B,QAAQ,MAAM;wBAChBnB,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;wBACpC;oBACF;oBACA,IAAI,CAAC6B,KAAK;oBAEV,MAAMmC,QAAQ,MAAM8C,IAAAA,4BAAY,EAAC;wBAC/BT,SAASrG,IAAAA,eAAQ,EAAC,CAAC,aAAa,EAAE6B,IAAI,EAAE,CAAC,EAAE;oBAC7C;oBACA,IAAImC,UAAU,MAAM;wBAClBtD,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;wBACpC;oBACF;oBACA2C,OAAOU,GAAG,CAACxB,IAAI,GAAGmC;gBACpB;YACF;QACF,OAAO;YACL,MAAMsD,WAAW,MAAMR,IAAAA,4BAAY,EAAC;gBAClCT,SAASrG,IAAAA,eAAQ,EAAC,uBAAuB;YAC3C;YACA,IAAIsH,aAAa,MAAM;gBACrB5G,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB;gBACpC;YACF;YACA2C,OAAO2E,QAAQ,GAAGA,SAASpD,IAAI;QACjC;QAEA,MAAMP,WAAWH,MAAKC,IAAI,CAACF,QAAQ,GAAG1D,KAAKqE,IAAI,GAAGqD,WAAW,GAAG,KAAK,CAAC;QACtEpD,IAAGC,aAAa,CAACT,UAAUE,KAAKE,SAAS,CAAC;YAAE,CAAClE,KAAKqE,IAAI,GAAG,EAAEvB;QAAO,GAAG,MAAM;QAE3EjC,EAAE,CAAC,IAAI,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,eAAe,EAAEA,IAAAA,eAAQ,EAAC2D,UAAU,UAAU,IAAI,CAAC;QACrFjD,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C;IACxD;IAEA,MAAcK,gBAAgBb,UAAsB,EAAiB;QACnE,MAAM+D,SAASC,MAAKC,IAAI,CAAC7C,QAAQ8C,GAAG,IAAI,SAAS;QAEjD,IAAI,CAACS,IAAG6B,UAAU,CAACzC,SAAS;YAC1BzD,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,8BAA8B;YACnD;QACF;QAEA,MAAMwH,QAAQrD,IAAGsD,WAAW,CAAClE,QAAQL,MAAM,CAAC,CAACwE,IAAcA,EAAEC,QAAQ,CAAC;QACtE,IAAIH,MAAM/F,MAAM,KAAK,GAAG;YACtB3B,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,8BAA8B;YACnD;QACF;QAEA,MAAMU,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAC9CD,EAAE;QACFA,EAAEV,IAAAA,eAAQ,EAACmC,YAAK,CAACC,KAAK,GAAG,KAAK,YAAYpC,IAAAA,eAAQ,EAAC,wBAAwB,UAAU;QACrFU,EAAEV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,YAAY;QAElD,MAAM2G,WAAW,MAAMC,OAAe;YACpCxB,SAAS;YACTC,SAASkB,MAAMnC,GAAG,CAAC,CAACqC,IAAe,CAAA;oBACjC7H,MAAM6H,EAAE5B,OAAO,CAAC,SAAS;oBACzB9B,OAAO0D;gBACT,CAAA;QACF;QAEA,MAAMI,gBAAgB,MAAMC,QAAQ;YAClC1B,SAAS,CAAC,gCAAgC,EAAEuB,SAAS9B,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;YAC7EuB,SAAS;QACX;QAEA,IAAIS,eAAe;YACjB3D,IAAG6D,UAAU,CAACxE,MAAKC,IAAI,CAACF,QAAQqE;YAChC9H,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,CAAC,uBAAuB,CAAC,EAAE;QAClD;IACF;IAEA,MAAcM,YAAYd,UAAsB,EAAiB;QAC/DM,QAAQC,GAAG,CAACC,IAAAA,eAAQ,EAAC,iBAAiB;IACxC;IAEQO,iBAAuB;QAC7B,MAAMG,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,EAAE,CAAC;QAC/CU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,gCAAgC,QAAQ,wBAAwB,CAAC;QAC/EU,EAAE,CAAC,iEAAiE,CAAC;QACrEA,EAAE,CAAC,gDAAgD,CAAC;QAEpDA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,kBAAkB,QAAQ,EAAE,CAAC;QAC3CU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,4CAA4C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,oCAAoC,CAAC;QACtEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,MAAM,WAAW,uDAAuD,CAAC;QAEzFU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,oBAAoB,QAAQ,EAAE,CAAC;QAC7CU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,+CAA+C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,+CAA+C,CAAC;QAC9EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,wCAAwC,CAAC;QACvEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,iDAAiD,CAAC;QAEhFU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,cAAc,QAAQ,EAAE,CAAC;QACvCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,yCAAyC,CAAC;QAC1EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,8CAA8C,CAAC;QAC/EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,WAAW,wCAAwC,CAAC;QAEzEU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,+BAA+B,UAAU,EAAE,CAAC;QAC1DU,EAAE,CAAC,+BAA+B,CAAC;QACnCA,EAAE,CAAC,uCAAuC,CAAC;IAC7C;IAEQuH,mBAAyB;QAC/B,MAAMvH,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,mCAAmC,QAAQ,EAAE,CAAC;QAC9DU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,+CAA+C,QAAQ,IAAI,CAAC;QAC1EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,mBAAmB,CAAC;QACnDU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,+BAA+B,SAAS,EAAE,CAAC;QAC5DU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,eAAe,SAAS,EAAE,CAAC;QAC5CU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C,SAAS,IAAI,CAAC;QAE5EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,8BAA8B,CAAC;QAC9DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wEAAwE,CAAC,EAAE;QACvFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sFAAsF,CAAC,EAAE;QACrGU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,+BAA+B,CAAC,EAAE;QAC9CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,6CAA6C,CAAC,EAAE;QAC5DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sCAAsC,CAAC,EAAE;QACrDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,OAAO,CAAC,EAAE;QACtBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,oEAAoE,CAAC,EAAE;QACnFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,gBAAgB,CAAC,EAAE;QAC/BU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,4BAA4B,CAAC,EAAE;QAC3CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,sCAAsC,CAAC,EAAE;QACrDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,uBAAuB,CAAC,EAAE;QACtCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,0BAA0B,CAAC,EAAE;QACzCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,oDAAoD,CAAC,EAAE;QACnEU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,6BAA6B,CAAC,EAAE;QAC5CU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,UAAU,CAAC,EAAE;QACzBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,SAAS,CAAC,EAAE;QACxBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,SAAS,CAAC,EAAE;QACxBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,qEAAqE,CAAC,EAAE;QACpFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,yCAAyC,CAAC,EAAE;QACxDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kEAAkE,CAAC,EAAE;QACjFU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,QAAQ,CAAC,EAAE;QACvBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,EAAE,CAAC,EAAE;QACjBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kDAAkD,CAAC,EAAE;QACjEU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,qCAAqC,CAAC,EAAE;QACpDU,EAAE,CAAC,EAAE,CAAC;QAENA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,mBAAmB,QAAQ,IAAI,CAAC;QAC9CU,EAAE,CAAC,GAAG,EAAEV,IAAAA,eAAQ,EAAC,mBAAmB,SAAS,IAAI,CAAC;QAClDU,EAAE,CAAC,SAAS,EAAEV,IAAAA,eAAQ,EAAC,sDAAsD,UAAU,IAAI,CAAC;QAE5FU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,MAAM,WAAW,8BAA8B,CAAC;QAC9DU,EAAE,CAAC,wBAAwB,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB,SAAS,IAAI,CAAC;QAE7EU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,EAAE,CAAC;QACtCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,gDAAgD,CAAC;QAC/EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,4CAA4C,CAAC;QAC3EU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,KAAK,SAAS,sDAAsD,CAAC;IACvF;IAEQQ,eAAqB;QAC3B,MAAME,IAAI,CAACC,IAAcC,QAAQC,MAAM,CAACC,KAAK,CAACH;QAE9CD,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,yBAAyB,QAAQ,EAAE,CAAC;QACpDU,EAAE,GAAGV,IAAAA,eAAQ,EAACe,UAAG,CAACC,UAAU,CAACC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC;QAExDP,EAAE,GAAGV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,EAAE,CAAC;QACtCU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,QAAQ,QAAQ,6BAA6B,CAAC;QAC9DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,uBAAuB,CAAC;QAC7DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,cAAc,QAAQ,uBAAuB,CAAC;QAC9DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,YAAY,QAAQ,4BAA4B,CAAC;QACjEU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,eAAe,QAAQ,uBAAuB,CAAC;QAC/DU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,aAAa,QAAQ,uBAAuB,CAAC;QAE7DU,EAAE,GAAGV,IAAAA,eAAQ,EAAC,yBAAyB,QAAQ,EAAE,CAAC;QAClDU,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,uCAAuC,SAAS,EAAE,CAAC;QACnEU,EAAE,CAAC,wCAAwC,CAAC;QAC5CA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,4BAA4B,SAAS,EAAE,CAAC;QACxDU,EAAE,CAAC,mDAAmD,CAAC;QACvDA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,2CAA2C,SAAS,EAAE,CAAC;QACvEU,EAAE,CAAC,uCAAuC,CAAC;QAC3CA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,yCAAyC,SAAS,EAAE,CAAC;QACrEU,EAAE,CAAC,kCAAkC,CAAC;QACtCA,EAAE,CAAC,EAAE,EAAEV,IAAAA,eAAQ,EAAC,6CAA6C,SAAS,EAAE,CAAC;QACzEU,EAAE,CAAC,8BAA8B,CAAC;QAElCA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,4BAA4B,QAAQ,EAAE,CAAC;QACrDU,EAAE,CAAC,mDAAmD,CAAC;QACvDA,EAAE,CAAC,qDAAqD,CAAC;QAEzDA,EAAE,GAAGV,IAAAA,eAAQ,EAAC,wBAAwB,QAAQ,EAAE,CAAC;QACjDU,EAAE,CAAC,QAAQ,EAAEV,IAAAA,eAAQ,EAAC,uBAAuB,QAAQ,IAAI,CAAC;QAC1DU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,KAAK,CAAC,EAAE;QACpBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,kBAAkB,CAAC,EAAE;QACjCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wBAAwB,CAAC,EAAE;QACvCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,yBAAyB,CAAC,EAAE;QACxCU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,8DAA8D,CAAC,EAAE;QAC7EU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,wCAAwC,CAAC,EAAE;QACvDU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,OAAO,CAAC,EAAE;QACtBU,EAAEV,IAAAA,eAAQ,EAAC,CAAC,KAAK,CAAC,EAAE;QACpBU,EAAE,CAAC,EAAE,CAAC;IACR;IAtoBA,YACE,AAAiBS,WAA+B,EAChD,AAAiB+G,SAA2B,CAC5C;aAFiB/G,cAAAA;aACA+G,YAAAA;IAChB;AAooBL"}
|