cast-code 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +150 -150
- package/dist/common/services/llm.service.js +1 -1
- package/dist/common/services/llm.service.js.map +1 -1
- package/dist/common/services/multi-llm.service.js +2 -2
- package/dist/common/services/multi-llm.service.js.map +1 -1
- package/dist/modules/config/services/config-commands.service.js +9 -3
- package/dist/modules/config/services/config-commands.service.js.map +1 -1
- package/dist/modules/config/services/init-config.service.js +8 -3
- package/dist/modules/config/services/init-config.service.js.map +1 -1
- package/dist/modules/core/services/deep-agent.service.js +27 -7
- package/dist/modules/core/services/deep-agent.service.js.map +1 -1
- package/dist/modules/git/services/commit-generator.service.js +21 -5
- package/dist/modules/git/services/commit-generator.service.js.map +1 -1
- package/dist/modules/repl/services/repl.service.js +2 -0
- package/dist/modules/repl/services/repl.service.js.map +1 -1
- package/dist/modules/repl/services/smart-input.js +30 -30
- package/dist/modules/repl/services/smart-input.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/config/services/init-config.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport {\n checkbox,\n Separator,\n} from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { ConfigManagerService } from './config-manager.service';\nimport {\n ProviderType,\n PROVIDER_METADATA,\n MODEL_PURPOSES,\n ModelConfig,\n CastConfig,\n} from '../types/config.types';\nimport {\n selectWithEsc,\n inputWithEsc,\n confirmWithEsc,\n CancelledPromptError,\n} from '../../repl/utils/prompts-with-esc';\n\n@Injectable()\nexport class InitConfigService {\n constructor(private readonly configManager: ConfigManagerService) {}\n\n async runInitialSetup(): Promise<void> {\n console.log(chalk.cyan.bold('\\n🚀 Bem-vindo ao Cast Code!\\n'));\n console.log(\n 'Vamos configurar seus provedores de IA e modelos. ' +\n 'Você pode configurar múltiplos provedores e atribuir modelos diferentes para diferentes tarefas.\\n'\n );\n console.log(chalk.gray('(pressione ESC a qualquer momento para cancelar)\\n'));\n\n const config: CastConfig = {\n version: 1,\n providers: {},\n models: {},\n };\n\n const selectedProviders = await this.selectProviders();\n\n if (selectedProviders.length === 0) {\n console.log(chalk.yellow('Nenhum provedor selecionado. Configuração cancelada.'));\n return;\n }\n\n for (const provider of selectedProviders) {\n console.log(chalk.cyan(`\\n📦 Configurando ${PROVIDER_METADATA[provider].name}...`));\n const providerConfig = await this.configureProvider(provider);\n if (providerConfig === null) {\n console.log(chalk.yellow('\\n❌ Configuração cancelada.\\n'));\n return;\n }\n if (providerConfig) {\n config.providers[provider] = providerConfig;\n }\n }\n\n console.log(chalk.cyan('\\n🤖 Configurando Modelos por Finalidade\\n'));\n console.log(\n 'Agora você pode configurar diferentes modelos para diferentes tarefas. ' +\n 'Por exemplo, usar um modelo mais barato para sub-agentes, ou um mais poderoso para arquitetura.\\n'\n );\n\n const availableProviders = selectedProviders.filter(\n (p) => config.providers[p]\n );\n\n const modelsConfigured = await this.configureModels(config, availableProviders);\n if (!modelsConfigured) {\n console.log(chalk.yellow('\\n❌ Configuração cancelada.\\n'));\n return;\n }\n\n await this.configManager.saveConfig(config);\n\n console.log(chalk.green.bold('\\n✅ Configuração salva com sucesso!\\n'));\n console.log(`Arquivo de configuração: ${chalk.gray(this.configManager.getConfigPath())}\\n`);\n console.log(chalk.cyan('Próximos passos:'));\n console.log(' • Rode \"cast\" para iniciar a CLI');\n console.log(' • Use \"cast config\" para editar as configurações depois');\n console.log();\n }\n\n private async selectProviders(): Promise<ProviderType[]> {\n const choices = [\n ...Object.values(PROVIDER_METADATA).map((meta) => ({\n name: `${meta.name} - ${meta.description}`,\n value: meta.type,\n checked: meta.type === 'openai',\n })),\n new Separator(),\n {\n name: 'Nenhum (cancelar)',\n value: 'none' as ProviderType,\n },\n ];\n\n try {\n const selected = await checkbox<ProviderType>({\n message: 'Selecione os provedores de IA que deseja configurar:',\n choices,\n pageSize: 12,\n });\n\n return selected.filter((s): s is ProviderType => s !== 'none');\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error.name === 'CancelledPromptError') {\n console.log(chalk.yellow('\\n\\n❌ Cancelado pelo usuário.\\n'));\n return [];\n }\n throw error;\n }\n }\n\n private async configureProvider(\n provider: ProviderType\n ): Promise<{ apiKey?: string; baseUrl?: string } | null> {\n const meta = PROVIDER_METADATA[provider];\n\n if (provider === 'ollama') {\n const baseUrl = await inputWithEsc({\n message: 'URL do servidor Ollama:',\n default: meta.defaultBaseUrl,\n });\n if (baseUrl === null) return null;\n return { baseUrl };\n }\n\n console.log(chalk.gray(` → Obtenha sua API key em: ${meta.websiteUrl}`));\n\n const apiKey = await inputWithEsc({\n message: `API Key para ${meta.name}:`,\n validate: (value) => {\n if (!value || value.trim().length < 10) {\n return 'Por favor, insira uma API key válida';\n }\n return true;\n },\n });\n\n if (apiKey === null) return null;\n\n const useCustomUrl = await confirmWithEsc({\n message: 'Usar URL de API customizada (ex: OpenRouter, proxy)?',\n default: false,\n });\n\n if (useCustomUrl === null) return null;\n\n let baseUrl: string | undefined;\n if (useCustomUrl) {\n baseUrl = await inputWithEsc({\n message: 'URL da API:',\n default: meta.defaultBaseUrl,\n });\n if (baseUrl === null) return null;\n }\n\n console.log(chalk.gray(` → Modelos populares: ${meta.popularModels.join(', ')}`));\n\n return { apiKey, baseUrl };\n }\n\n private async configureModels(\n config: CastConfig,\n availableProviders: ProviderType[]\n ): Promise<boolean> {\n console.log(chalk.yellow('→ Configurando modelo padrão (obrigatório)\\n'));\n const defaultModel = await this.selectModelConfig(\n 'default',\n availableProviders,\n config.providers\n );\n if (defaultModel === null) return false;\n config.models.default = defaultModel;\n\n const configureOthers = await confirmWithEsc({\n message: 'Deseja configurar modelos específicos para outras finalidades?',\n default: true,\n });\n\n if (configureOthers === null) return false;\n\n if (!configureOthers) {\n MODEL_PURPOSES.forEach((purpose) => {\n if (purpose.value !== 'default') {\n config.models[purpose.value] = { ...config.models.default };\n }\n });\n return true;\n }\n\n for (const purpose of MODEL_PURPOSES) {\n if (purpose.value === 'default') continue;\n\n const shouldConfigure = await confirmWithEsc({\n message: `Configurar modelo para \"${purpose.label}\" (${purpose.description})?`,\n default: purpose.value === 'subAgent',\n });\n\n if (shouldConfigure === null) return false;\n\n if (shouldConfigure) {\n const modelConfig = await this.selectModelConfig(\n purpose.value,\n availableProviders,\n config.providers,\n config.models.default\n );\n if (modelConfig === null) return false;\n config.models[purpose.value] = modelConfig;\n } else {\n config.models[purpose.value] = { ...config.models.default };\n }\n }\n\n return true;\n }\n\n private async selectModelConfig(\n purpose: string,\n availableProviders: ProviderType[],\n providersConfig: CastConfig['providers'],\n defaultModel?: ModelConfig\n ): Promise<ModelConfig | null> {\n const providerChoices = availableProviders.map((p) => ({\n name: PROVIDER_METADATA[p].name,\n value: p,\n }));\n\n const provider = await selectWithEsc<ProviderType>({\n message: `Provedor para ${purpose}:`,\n choices: providerChoices,\n default: defaultModel?.provider,\n });\n\n if (provider === null) return null;\n\n const meta = PROVIDER_METADATA[provider];\n\n const modelChoices = [\n ...meta.popularModels.map((m) => ({ name: m, value: m })),\n { name: 'Outro (customizado)', value: '__custom__' },\n ];\n\n let model: string;\n const selectedModel = await selectWithEsc<string>({\n message: `Modelo para ${purpose}:`,\n choices: modelChoices,\n default: defaultModel?.model,\n });\n\n if (selectedModel === null) return null;\n\n if (selectedModel === '__custom__') {\n const customModel = await inputWithEsc({\n message: 'Nome do modelo:',\n default: defaultModel?.model || meta.popularModels[0],\n });\n if (customModel === null) return null;\n model = customModel;\n } else {\n model = selectedModel;\n }\n\n return {\n provider,\n model,\n };\n }\n}\n"],"names":["InitConfigService","runInitialSetup","console","log","chalk","cyan","bold","gray","config","version","providers","models","selectedProviders","selectProviders","length","yellow","provider","PROVIDER_METADATA","name","providerConfig","configureProvider","availableProviders","filter","p","modelsConfigured","configureModels","configManager","saveConfig","green","getConfigPath","choices","Object","values","map","meta","description","value","type","checked","Separator","selected","checkbox","message","pageSize","s","error","CancelledPromptError","baseUrl","inputWithEsc","default","defaultBaseUrl","websiteUrl","apiKey","validate","trim","useCustomUrl","confirmWithEsc","popularModels","join","defaultModel","selectModelConfig","configureOthers","MODEL_PURPOSES","forEach","purpose","shouldConfigure","label","modelConfig","providersConfig","providerChoices","selectWithEsc","modelChoices","m","model","selectedModel","customModel"],"mappings":";;;;+BAsBaA;;;eAAAA;;;wBAtBc;yBAIpB;8DACW;sCACmB;6BAO9B;gCAMA;;;;;;;;;;;;;;;AAGA,IAAA,AAAMA,oBAAN,MAAMA;IAGX,MAAMC,kBAAiC;QACrCC,QAAQC,GAAG,CAACC,cAAK,CAACC,IAAI,CAACC,IAAI,CAAC;QAC5BJ,QAAQC,GAAG,CACT,uDACE;QAEJD,QAAQC,GAAG,CAACC,cAAK,CAACG,IAAI,CAAC;QAEvB,MAAMC,SAAqB;YACzBC,SAAS;YACTC,WAAW,CAAC;YACZC,QAAQ,CAAC;QACX;QAEA,MAAMC,oBAAoB,MAAM,IAAI,CAACC,eAAe;QAEpD,IAAID,kBAAkBE,MAAM,KAAK,GAAG;YAClCZ,QAAQC,GAAG,CAACC,cAAK,CAACW,MAAM,CAAC;YACzB;QACF;QAEA,KAAK,MAAMC,YAAYJ,kBAAmB;YACxCV,QAAQC,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC,CAAC,kBAAkB,EAAEY,8BAAiB,CAACD,SAAS,CAACE,IAAI,CAAC,GAAG,CAAC;YACjF,MAAMC,iBAAiB,MAAM,IAAI,CAACC,iBAAiB,CAACJ;YACpD,IAAIG,mBAAmB,MAAM;gBAC3BjB,QAAQC,GAAG,CAACC,cAAK,CAACW,MAAM,CAAC;gBACzB;YACF;YACA,IAAII,gBAAgB;gBAClBX,OAAOE,SAAS,CAACM,SAAS,GAAGG;YAC/B;QACF;QAEAjB,QAAQC,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC;QACvBH,QAAQC,GAAG,CACT,4EACE;QAGJ,MAAMkB,qBAAqBT,kBAAkBU,MAAM,CACjD,CAACC,IAAMf,OAAOE,SAAS,CAACa,EAAE;QAG5B,MAAMC,mBAAmB,MAAM,IAAI,CAACC,eAAe,CAACjB,QAAQa;QAC5D,IAAI,CAACG,kBAAkB;YACrBtB,QAAQC,GAAG,CAACC,cAAK,CAACW,MAAM,CAAC;YACzB;QACF;QAEA,MAAM,IAAI,CAACW,aAAa,CAACC,UAAU,CAACnB;QAEpCN,QAAQC,GAAG,CAACC,cAAK,CAACwB,KAAK,CAACtB,IAAI,CAAC;QAC7BJ,QAAQC,GAAG,CAAC,CAAC,yBAAyB,EAAEC,cAAK,CAACG,IAAI,CAAC,IAAI,CAACmB,aAAa,CAACG,aAAa,IAAI,EAAE,CAAC;QAC1F3B,QAAQC,GAAG,CAACC,cAAK,CAACC,IAAI,CAAC;QACvBH,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG,CAAC;QACZD,QAAQC,GAAG;IACb;IAEA,MAAcU,kBAA2C;QACvD,MAAMiB,UAAU;eACXC,OAAOC,MAAM,CAACf,8BAAiB,EAAEgB,GAAG,CAAC,CAACC,OAAU,CAAA;oBACjDhB,MAAM,GAAGgB,KAAKhB,IAAI,CAAC,GAAG,EAAEgB,KAAKC,WAAW,EAAE;oBAC1CC,OAAOF,KAAKG,IAAI;oBAChBC,SAASJ,KAAKG,IAAI,KAAK;gBACzB,CAAA;YACA,IAAIE,kBAAS;YACb;gBACErB,MAAM;gBACNkB,OAAO;YACT;SACD;QAED,IAAI;YACF,MAAMI,WAAW,MAAMC,IAAAA,iBAAQ,EAAe;gBAC5CC,SAAS;gBACTZ;gBACAa,UAAU;YACZ;YAEA,OAAOH,SAASlB,MAAM,CAAC,CAACsB,IAAyBA,MAAM;QACzD,EAAE,OAAOC,OAAY;YACnB,IAAIA,iBAAiBC,oCAAoB,IAAID,MAAM3B,IAAI,KAAK,wBAAwB;gBAClFhB,QAAQC,GAAG,CAACC,cAAK,CAACW,MAAM,CAAC;gBACzB,OAAO,EAAE;YACX;YACA,MAAM8B;QACR;IACF;IAEA,MAAczB,kBACZJ,QAAsB,EACiC;QACvD,MAAMkB,OAAOjB,8BAAiB,CAACD,SAAS;QAExC,IAAIA,aAAa,UAAU;YACzB,MAAM+B,UAAU,MAAMC,IAAAA,4BAAY,EAAC;gBACjCN,SAAS;gBACTO,SAASf,KAAKgB,cAAc;YAC9B;YACA,IAAIH,YAAY,MAAM,OAAO;YAC7B,OAAO;gBAAEA;YAAQ;QACnB;QAEA7C,QAAQC,GAAG,CAACC,cAAK,CAACG,IAAI,CAAC,CAAC,4BAA4B,EAAE2B,KAAKiB,UAAU,EAAE;QAEvE,MAAMC,SAAS,MAAMJ,IAAAA,4BAAY,EAAC;YAChCN,SAAS,CAAC,aAAa,EAAER,KAAKhB,IAAI,CAAC,CAAC,CAAC;YACrCmC,UAAU,CAACjB;gBACT,IAAI,CAACA,SAASA,MAAMkB,IAAI,GAAGxC,MAAM,GAAG,IAAI;oBACtC,OAAO;gBACT;gBACA,OAAO;YACT;QACF;QAEA,IAAIsC,WAAW,MAAM,OAAO;QAE5B,MAAMG,eAAe,MAAMC,IAAAA,8BAAc,EAAC;YACxCd,SAAS;YACTO,SAAS;QACX;QAEA,IAAIM,iBAAiB,MAAM,OAAO;QAElC,IAAIR;QACJ,IAAIQ,cAAc;YAChBR,UAAU,MAAMC,IAAAA,4BAAY,EAAC;gBAC3BN,SAAS;gBACTO,SAASf,KAAKgB,cAAc;YAC9B;YACA,IAAIH,YAAY,MAAM,OAAO;QAC/B;QAEA7C,QAAQC,GAAG,CAACC,cAAK,CAACG,IAAI,CAAC,CAAC,uBAAuB,EAAE2B,KAAKuB,aAAa,CAACC,IAAI,CAAC,OAAO;QAEhF,OAAO;YAAEN;YAAQL;QAAQ;IAC3B;IAEA,MAActB,gBACZjB,MAAkB,EAClBa,kBAAkC,EAChB;QAClBnB,QAAQC,GAAG,CAACC,cAAK,CAACW,MAAM,CAAC;QACzB,MAAM4C,eAAe,MAAM,IAAI,CAACC,iBAAiB,CAC/C,WACAvC,oBACAb,OAAOE,SAAS;QAElB,IAAIiD,iBAAiB,MAAM,OAAO;QAClCnD,OAAOG,MAAM,CAACsC,OAAO,GAAGU;QAExB,MAAME,kBAAkB,MAAML,IAAAA,8BAAc,EAAC;YAC3Cd,SAAS;YACTO,SAAS;QACX;QAEA,IAAIY,oBAAoB,MAAM,OAAO;QAErC,IAAI,CAACA,iBAAiB;YACpBC,2BAAc,CAACC,OAAO,CAAC,CAACC;gBACtB,IAAIA,QAAQ5B,KAAK,KAAK,WAAW;oBAC/B5B,OAAOG,MAAM,CAACqD,QAAQ5B,KAAK,CAAC,GAAG;wBAAE,GAAG5B,OAAOG,MAAM,CAACsC,OAAO;oBAAC;gBAC5D;YACF;YACA,OAAO;QACT;QAEA,KAAK,MAAMe,WAAWF,2BAAc,CAAE;YACpC,IAAIE,QAAQ5B,KAAK,KAAK,WAAW;YAEjC,MAAM6B,kBAAkB,MAAMT,IAAAA,8BAAc,EAAC;gBAC3Cd,SAAS,CAAC,wBAAwB,EAAEsB,QAAQE,KAAK,CAAC,GAAG,EAAEF,QAAQ7B,WAAW,CAAC,EAAE,CAAC;gBAC9Ec,SAASe,QAAQ5B,KAAK,KAAK;YAC7B;YAEA,IAAI6B,oBAAoB,MAAM,OAAO;YAErC,IAAIA,iBAAiB;gBACnB,MAAME,cAAc,MAAM,IAAI,CAACP,iBAAiB,CAC9CI,QAAQ5B,KAAK,EACbf,oBACAb,OAAOE,SAAS,EAChBF,OAAOG,MAAM,CAACsC,OAAO;gBAEvB,IAAIkB,gBAAgB,MAAM,OAAO;gBACjC3D,OAAOG,MAAM,CAACqD,QAAQ5B,KAAK,CAAC,GAAG+B;YACjC,OAAO;gBACL3D,OAAOG,MAAM,CAACqD,QAAQ5B,KAAK,CAAC,GAAG;oBAAE,GAAG5B,OAAOG,MAAM,CAACsC,OAAO;gBAAC;YAC5D;QACF;QAEA,OAAO;IACT;IAEA,MAAcW,kBACZI,OAAe,EACf3C,kBAAkC,EAClC+C,eAAwC,EACxCT,YAA0B,EACG;QAC7B,MAAMU,kBAAkBhD,mBAAmBY,GAAG,CAAC,CAACV,IAAO,CAAA;gBACrDL,MAAMD,8BAAiB,CAACM,EAAE,CAACL,IAAI;gBAC/BkB,OAAOb;YACT,CAAA;QAEA,MAAMP,WAAW,MAAMsD,IAAAA,6BAAa,EAAe;YACjD5B,SAAS,CAAC,cAAc,EAAEsB,QAAQ,CAAC,CAAC;YACpClC,SAASuC;YACTpB,SAASU,cAAc3C;QACzB;QAEA,IAAIA,aAAa,MAAM,OAAO;QAE9B,MAAMkB,OAAOjB,8BAAiB,CAACD,SAAS;QAExC,MAAMuD,eAAe;eAChBrC,KAAKuB,aAAa,CAACxB,GAAG,CAAC,CAACuC,IAAO,CAAA;oBAAEtD,MAAMsD;oBAAGpC,OAAOoC;gBAAE,CAAA;YACtD;gBAAEtD,MAAM;gBAAuBkB,OAAO;YAAa;SACpD;QAED,IAAIqC;QACJ,MAAMC,gBAAgB,MAAMJ,IAAAA,6BAAa,EAAS;YAChD5B,SAAS,CAAC,YAAY,EAAEsB,QAAQ,CAAC,CAAC;YAClClC,SAASyC;YACTtB,SAASU,cAAcc;QACzB;QAEA,IAAIC,kBAAkB,MAAM,OAAO;QAEnC,IAAIA,kBAAkB,cAAc;YAClC,MAAMC,cAAc,MAAM3B,IAAAA,4BAAY,EAAC;gBACrCN,SAAS;gBACTO,SAASU,cAAcc,SAASvC,KAAKuB,aAAa,CAAC,EAAE;YACvD;YACA,IAAIkB,gBAAgB,MAAM,OAAO;YACjCF,QAAQE;QACV,OAAO;YACLF,QAAQC;QACV;QAEA,OAAO;YACL1D;YACAyD;QACF;IACF;IAvPA,YAAY,AAAiB/C,aAAmC,CAAE;aAArCA,gBAAAA;IAAsC;AAwPrE"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/config/services/init-config.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport {\n checkbox,\n Separator,\n} from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { ConfigManagerService } from './config-manager.service';\nimport {\n ProviderType,\n PROVIDER_METADATA,\n MODEL_PURPOSES,\n ModelConfig,\n CastConfig,\n} from '../types/config.types';\nimport {\n selectWithEsc,\n inputWithEsc,\n confirmWithEsc,\n CancelledPromptError,\n} from '../../repl/utils/prompts-with-esc';\n\n@Injectable()\nexport class InitConfigService {\n constructor(private readonly configManager: ConfigManagerService) {}\n\n async runInitialSetup(): Promise<void> {\n console.log(chalk.cyan.bold('\\n🚀 Bem-vindo ao Cast Code!\\n'));\n console.log(\n 'Vamos configurar seus provedores de IA e modelos. ' +\n 'Você pode configurar múltiplos provedores e atribuir modelos diferentes para diferentes tarefas.\\n'\n );\n console.log(chalk.gray('(pressione ESC a qualquer momento para cancelar)\\n'));\n\n const config: CastConfig = {\n version: 1,\n providers: {},\n models: {},\n };\n\n const selectedProviders = await this.selectProviders();\n\n if (selectedProviders.length === 0) {\n console.log(chalk.yellow('Nenhum provedor selecionado. Configuração cancelada.'));\n return;\n }\n\n for (const provider of selectedProviders) {\n console.log(chalk.cyan(`\\n📦 Configurando ${PROVIDER_METADATA[provider].name}...`));\n const providerConfig = await this.configureProvider(provider);\n if (providerConfig === null) {\n console.log(chalk.yellow('\\n❌ Configuração cancelada.\\n'));\n return;\n }\n if (providerConfig) {\n config.providers[provider] = providerConfig;\n }\n }\n\n console.log(chalk.cyan('\\n🤖 Configurando Modelos por Finalidade\\n'));\n console.log(\n 'Agora você pode configurar diferentes modelos para diferentes tarefas. ' +\n 'Por exemplo, usar um modelo mais barato para sub-agentes, ou um mais poderoso para arquitetura.\\n'\n );\n\n const availableProviders = selectedProviders.filter(\n (p) => config.providers[p]\n );\n\n const modelsConfigured = await this.configureModels(config, availableProviders);\n if (!modelsConfigured) {\n console.log(chalk.yellow('\\n❌ Configuração cancelada.\\n'));\n return;\n }\n\n await this.configManager.saveConfig(config);\n\n console.log(chalk.green.bold('\\n✅ Configuração salva com sucesso!\\n'));\n console.log(`Arquivo de configuração: ${chalk.gray(this.configManager.getConfigPath())}\\n`);\n console.log(chalk.cyan('Próximos passos:'));\n console.log(' • Rode \"cast\" para iniciar a CLI');\n console.log(' • Use \"cast config\" para editar as configurações depois');\n console.log();\n }\n\n private async selectProviders(): Promise<ProviderType[]> {\n const choices = [\n ...Object.values(PROVIDER_METADATA).map((meta) => ({\n name: `${meta.name} - ${meta.description}`,\n value: meta.type,\n checked: meta.type === 'openai',\n })),\n new Separator(),\n {\n name: 'Nenhum (cancelar)',\n value: 'none' as ProviderType,\n },\n ];\n\n try {\n const selected = await checkbox<ProviderType>({\n message: 'Selecione os provedores de IA que deseja configurar:',\n choices,\n pageSize: 12,\n });\n\n return selected.filter((s): s is ProviderType => s !== 'none');\n } catch (error: any) {\n if (error instanceof CancelledPromptError || error.name === 'CancelledPromptError') {\n console.log(chalk.yellow('\\n\\n❌ Cancelado pelo usuário.\\n'));\n return [];\n }\n throw error;\n }\n }\n\n private async configureProvider(\n provider: ProviderType\n ): Promise<{ apiKey?: string; baseUrl?: string } | null> {\n const meta = PROVIDER_METADATA[provider];\n\n if (provider === 'ollama') {\n const baseUrl = await inputWithEsc({\n message: 'URL do servidor Ollama:',\n default: meta.defaultBaseUrl,\n });\n if (baseUrl === null) return null;\n return { baseUrl };\n }\n\n console.log(chalk.gray(` → Obtenha sua API key em: ${meta.websiteUrl}`));\n\n const apiKeyRaw = await inputWithEsc({\n message: `API Key para ${meta.name}:`,\n validate: (value) => {\n const clean = value.trim();\n if (!clean || clean.length < 10) {\n return 'Por favor, insira uma API key válida';\n }\n if (/[\\s%]/.test(clean)) {\n return 'API key contém caracteres inválidos (espaços ou %)';\n }\n return true;\n },\n });\n\n if (apiKeyRaw === null) return null;\n const apiKey = apiKeyRaw.trim();\n\n const useCustomUrl = await confirmWithEsc({\n message: 'Usar URL de API customizada (ex: OpenRouter, proxy)?',\n default: false,\n });\n\n if (useCustomUrl === null) return null;\n\n let baseUrl: string | undefined;\n if (useCustomUrl) {\n baseUrl = await inputWithEsc({\n message: 'URL da API:',\n default: meta.defaultBaseUrl,\n });\n if (baseUrl === null) return null;\n }\n\n console.log(chalk.gray(` → Modelos populares: ${meta.popularModels.join(', ')}`));\n\n return { apiKey, baseUrl };\n }\n\n private async configureModels(\n config: CastConfig,\n availableProviders: ProviderType[]\n ): Promise<boolean> {\n console.log(chalk.yellow('→ Configurando modelo padrão (obrigatório)\\n'));\n const defaultModel = await this.selectModelConfig(\n 'default',\n availableProviders,\n config.providers\n );\n if (defaultModel === null) return false;\n config.models.default = defaultModel;\n\n const configureOthers = await confirmWithEsc({\n message: 'Deseja configurar modelos específicos para outras finalidades?',\n default: true,\n });\n\n if (configureOthers === null) return false;\n\n if (!configureOthers) {\n MODEL_PURPOSES.forEach((purpose) => {\n if (purpose.value !== 'default') {\n config.models[purpose.value] = { ...config.models.default };\n }\n });\n return true;\n }\n\n for (const purpose of MODEL_PURPOSES) {\n if (purpose.value === 'default') continue;\n\n const shouldConfigure = await confirmWithEsc({\n message: `Configurar modelo para \"${purpose.label}\" (${purpose.description})?`,\n default: purpose.value === 'subAgent',\n });\n\n if (shouldConfigure === null) return false;\n\n if (shouldConfigure) {\n const modelConfig = await this.selectModelConfig(\n purpose.value,\n availableProviders,\n config.providers,\n config.models.default\n );\n if (modelConfig === null) return false;\n config.models[purpose.value] = modelConfig;\n } else {\n config.models[purpose.value] = { ...config.models.default };\n }\n }\n\n return true;\n }\n\n private async selectModelConfig(\n purpose: string,\n availableProviders: ProviderType[],\n providersConfig: CastConfig['providers'],\n defaultModel?: ModelConfig\n ): Promise<ModelConfig | null> {\n const providerChoices = availableProviders.map((p) => ({\n name: PROVIDER_METADATA[p].name,\n value: p,\n }));\n\n const provider = await selectWithEsc<ProviderType>({\n message: `Provedor para ${purpose}:`,\n choices: providerChoices,\n default: defaultModel?.provider,\n });\n\n if (provider === null) return null;\n\n const meta = PROVIDER_METADATA[provider];\n\n const modelChoices = [\n ...meta.popularModels.map((m) => ({ name: m, value: m })),\n { name: 'Outro (customizado)', value: '__custom__' },\n ];\n\n let model: string;\n const selectedModel = await selectWithEsc<string>({\n message: `Modelo para ${purpose}:`,\n choices: modelChoices,\n default: defaultModel?.model,\n });\n\n if (selectedModel === null) return null;\n\n if (selectedModel === '__custom__') {\n const customModel = await inputWithEsc({\n message: 'Nome do modelo:',\n default: defaultModel?.model || meta.popularModels[0],\n });\n if (customModel === null) return null;\n model = customModel;\n } else {\n model = selectedModel;\n }\n\n return {\n provider,\n model,\n };\n }\n}\n"],"names":["InitConfigService","runInitialSetup","console","log","chalk","cyan","bold","gray","config","version","providers","models","selectedProviders","selectProviders","length","yellow","provider","PROVIDER_METADATA","name","providerConfig","configureProvider","availableProviders","filter","p","modelsConfigured","configureModels","configManager","saveConfig","green","getConfigPath","choices","Object","values","map","meta","description","value","type","checked","Separator","selected","checkbox","message","pageSize","s","error","CancelledPromptError","baseUrl","inputWithEsc","default","defaultBaseUrl","websiteUrl","apiKeyRaw","validate","clean","trim","test","apiKey","useCustomUrl","confirmWithEsc","popularModels","join","defaultModel","selectModelConfig","configureOthers","MODEL_PURPOSES","forEach","purpose","shouldConfigure","label","modelConfig","providersConfig","providerChoices","selectWithEsc","modelChoices","m","model","selectedModel","customModel"],"mappings":"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"}
|
|
@@ -12,7 +12,6 @@ const _common = require("@nestjs/common");
|
|
|
12
12
|
const _messages = require("@langchain/core/messages");
|
|
13
13
|
const _child_process = require("child_process");
|
|
14
14
|
const _deepagents = require("deepagents");
|
|
15
|
-
const _configservice = require("../../../common/services/config.service");
|
|
16
15
|
const _multillmservice = require("../../../common/services/multi-llm.service");
|
|
17
16
|
const _markdownrendererservice = require("../../../common/services/markdown-renderer.service");
|
|
18
17
|
const _agentregistryservice = require("../../agents/services/agent-registry.service");
|
|
@@ -45,9 +44,6 @@ const DEEPAGENT_BUILTIN_TOOLS = new Set([
|
|
|
45
44
|
'task'
|
|
46
45
|
]);
|
|
47
46
|
let DeepAgentService = class DeepAgentService {
|
|
48
|
-
async onModuleInit() {
|
|
49
|
-
await this.configService.loadGlobalConfig();
|
|
50
|
-
}
|
|
51
47
|
async initialize() {
|
|
52
48
|
const projectPath = await this.projectLoader.detectProject();
|
|
53
49
|
if (projectPath) {
|
|
@@ -80,6 +76,11 @@ let DeepAgentService = class DeepAgentService {
|
|
|
80
76
|
const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();
|
|
81
77
|
const mcpServerSummaries = this.mcpRegistry.getServerSummaries();
|
|
82
78
|
const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);
|
|
79
|
+
this.cachedSystemPrompt = systemPrompt;
|
|
80
|
+
this.cachedExtraTools = extraTools;
|
|
81
|
+
this.cachedMcpTools = mcpTools;
|
|
82
|
+
this.cachedMcpDiscoveryTools = mcpDiscoveryTools;
|
|
83
|
+
this.cachedSubagents = subagents;
|
|
83
84
|
this.agent = (0, _deepagents.createDeepAgent)({
|
|
84
85
|
model: this.model,
|
|
85
86
|
systemPrompt,
|
|
@@ -100,6 +101,22 @@ let DeepAgentService = class DeepAgentService {
|
|
|
100
101
|
toolCount: extraTools.length + mcpTools.length
|
|
101
102
|
};
|
|
102
103
|
}
|
|
104
|
+
async reinitializeModel() {
|
|
105
|
+
this.model = this.multiLlmService.createStreamingModel('default');
|
|
106
|
+
this.agent = (0, _deepagents.createDeepAgent)({
|
|
107
|
+
model: this.model,
|
|
108
|
+
systemPrompt: this.cachedSystemPrompt,
|
|
109
|
+
tools: [
|
|
110
|
+
...this.cachedExtraTools,
|
|
111
|
+
...this.cachedMcpTools,
|
|
112
|
+
...this.cachedMcpDiscoveryTools
|
|
113
|
+
],
|
|
114
|
+
subagents: this.cachedSubagents,
|
|
115
|
+
backend: ()=>new _deepagents.FilesystemBackend({
|
|
116
|
+
rootDir: process.cwd()
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
}
|
|
103
120
|
getGitStatus() {
|
|
104
121
|
try {
|
|
105
122
|
const branch = (0, _child_process.execSync)('git rev-parse --abbrev-ref HEAD 2>/dev/null', {
|
|
@@ -538,8 +555,7 @@ Keep the summary under 500 words. Output ONLY the summary, no preamble.`),
|
|
|
538
555
|
};
|
|
539
556
|
}
|
|
540
557
|
}
|
|
541
|
-
constructor(
|
|
542
|
-
this.configService = configService;
|
|
558
|
+
constructor(multiLlmService, agentRegistry, toolsRegistry, mcpRegistry, projectLoader, projectContext, skillRegistry, memoryService, markdownRenderer){
|
|
543
559
|
this.multiLlmService = multiLlmService;
|
|
544
560
|
this.agentRegistry = agentRegistry;
|
|
545
561
|
this.toolsRegistry = toolsRegistry;
|
|
@@ -553,13 +569,17 @@ Keep the summary under 500 words. Output ONLY the summary, no preamble.`),
|
|
|
553
569
|
this.messages = [];
|
|
554
570
|
this.tokenCount = 0;
|
|
555
571
|
this.lastToolOutputs = [];
|
|
572
|
+
this.cachedSystemPrompt = '';
|
|
573
|
+
this.cachedExtraTools = [];
|
|
574
|
+
this.cachedMcpTools = [];
|
|
575
|
+
this.cachedMcpDiscoveryTools = [];
|
|
576
|
+
this.cachedSubagents = [];
|
|
556
577
|
}
|
|
557
578
|
};
|
|
558
579
|
DeepAgentService = _ts_decorate([
|
|
559
580
|
(0, _common.Injectable)(),
|
|
560
581
|
_ts_metadata("design:type", Function),
|
|
561
582
|
_ts_metadata("design:paramtypes", [
|
|
562
|
-
typeof _configservice.ConfigService === "undefined" ? Object : _configservice.ConfigService,
|
|
563
583
|
typeof _multillmservice.MultiLlmService === "undefined" ? Object : _multillmservice.MultiLlmService,
|
|
564
584
|
typeof _agentregistryservice.AgentRegistryService === "undefined" ? Object : _agentregistryservice.AgentRegistryService,
|
|
565
585
|
typeof _toolsregistryservice.ToolsRegistryService === "undefined" ? Object : _toolsregistryservice.ToolsRegistryService,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/core/services/deep-agent.service.ts"],"sourcesContent":["import { Injectable, OnModuleInit } from '@nestjs/common';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { HumanMessage, AIMessage, SystemMessage, BaseMessage } from '@langchain/core/messages';\nimport { execSync } from 'child_process';\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { ConfigService } from '../../../common/services/config.service';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MarkdownRendererService } from '../../../common/services/markdown-renderer.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { ProjectLoaderService } from '../../project/services/project-loader.service';\nimport { ProjectContextService } from '../../project/services/project-context.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { MemoryService } from '../../memory/services/memory.service';\nimport { ProjectInitResult } from '../../project/types';\nimport { Task } from '../../tasks/types/task.types';\nimport { McpServerSummary } from '../../mcp/types';\n\nconst SUMMARIZE_THRESHOLD = 40;\nconst KEEP_RECENT = 10;\nconst RECURSION_LIMIT = 100;\nconst DEEPAGENT_BUILTIN_TOOLS = new Set([\n 'read_file', 'write_file', 'edit_file', 'glob', 'grep', 'ls',\n 'write_todos', 'task',\n]);\n\n@Injectable()\nexport class DeepAgentService implements OnModuleInit {\n private agent: any;\n private model: BaseChatModel | null = null;\n private messages: BaseMessage[] = [];\n private tokenCount = 0;\n private lastToolOutputs: { tool: string; output: string }[] = [];\n\n constructor(\n private readonly configService: ConfigService,\n private readonly multiLlmService: MultiLlmService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly toolsRegistry: ToolsRegistryService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly projectLoader: ProjectLoaderService,\n private readonly projectContext: ProjectContextService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly memoryService: MemoryService,\n private readonly markdownRenderer: MarkdownRendererService,\n ) {}\n\n async onModuleInit() {\n await this.configService.loadGlobalConfig();\n }\n\n async initialize(): Promise<ProjectInitResult> {\n const projectPath = await this.projectLoader.detectProject();\n\n if (projectPath) {\n const projectConfig = await this.projectLoader.loadProject(projectPath);\n\n if (projectConfig.context) {\n this.projectContext.setContext(projectConfig.context);\n }\n\n if (projectConfig.mcpConfigs) {\n this.mcpRegistry.loadConfigs(projectConfig.mcpConfigs);\n await this.mcpRegistry.connectAll();\n }\n\n const agentsOverridePath = this.projectLoader.getAgentsOverridePath(projectPath);\n const legacyAgentsOverridePath = this.projectLoader.getLegacyAgentsOverridePath(projectPath);\n await this.agentRegistry.loadProjectAgents(agentsOverridePath);\n await this.agentRegistry.loadProjectAgents(legacyAgentsOverridePath);\n\n const skillsOverridePath = this.projectLoader.getSkillsOverridePath(projectPath);\n const legacySkillsOverridePath = this.projectLoader.getLegacySkillsOverridePath(projectPath);\n await this.skillRegistry.loadProjectSkills(skillsOverridePath);\n await this.skillRegistry.loadProjectSkills(legacySkillsOverridePath);\n\n await this.memoryService.initialize(projectPath);\n }\n\n this.model = this.multiLlmService.createStreamingModel('default');\n\n const contextPrompt = this.projectContext.getContextPrompt();\n const memoryPrompt = await this.memoryService.getMemoryPrompt();\n const skillKnowledge = this.skillRegistry.getAllSkillKnowledge();\n const subagents = this.agentRegistry.getSubagentDefinitions(contextPrompt);\n const allTools = this.toolsRegistry.getAllTools();\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n\n const extraTools = allTools.filter(t => !DEEPAGENT_BUILTIN_TOOLS.has(t.name));\n const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();\n const mcpServerSummaries = this.mcpRegistry.getServerSummaries();\n\n const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);\n\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt,\n tools: [...extraTools, ...mcpTools, ...mcpDiscoveryTools],\n subagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n\n return {\n projectPath,\n hasContext: this.projectContext.hasContext(),\n agentCount: subagents.length,\n toolCount: extraTools.length + mcpTools.length,\n };\n }\n\n private getGitStatus(): string {\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const status = execSync('git status --short 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const log = execSync('git log --oneline -5 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n\n let result = `Branch: ${branch}`;\n if (status) {\n result += `\\nChanges:\\n${status}`;\n } else {\n result += `\\nStatus: clean`;\n }\n if (log) {\n result += `\\nRecent commits:\\n${log}`;\n }\n return result;\n } catch {\n return 'Not a git repository';\n }\n }\n\n private buildSystemPrompt(\n contextPrompt: string,\n memoryPrompt: string,\n skillKnowledge: string,\n subagents: any[],\n tools: any[],\n mcpTools: any[],\n mcpServerSummaries: McpServerSummary[] = [],\n ): string {\n const gitInfo = this.getGitStatus();\n const allToolNames = [\n ...tools.map((t: any) => t.name),\n ...mcpTools.map((t: any) => t.name),\n ];\n\n const parts: string[] = [];\n\n parts.push(\n `You are Cast, an autonomous AI coding assistant running as a CLI tool.`,\n `You are a highly capable agent that can independently explore codebases, make decisions, execute multi-step plans, and delegate work to specialized sub-agents. You help developers with software engineering tasks including writing code, debugging, refactoring, and answering questions about codebases.`,\n ``,\n );\n\n parts.push(\n `# CRITICAL RULES`,\n ``,\n `## NEVER Guess — ALWAYS Verify`,\n `- NEVER say a file \"doesn't exist\" without FIRST using glob or read_file to check`,\n `- NEVER guess file contents — ALWAYS read_file before answering about a file`,\n `- NEVER assume a directory structure — ALWAYS use ls or glob to discover it`,\n `- NEVER say \"I don't have access\" — you DO have access through your tools`,\n `- If a user mentions a file path, your FIRST action must be to read it or verify it exists`,\n ``,\n `## Read Before Edit`,\n `- ALWAYS use read_file on a file before using edit_file or write_file on it`,\n `- NEVER edit a file you haven't read in this conversation`,\n `- Understand existing code before suggesting modifications`,\n ``,\n `## Minimal Changes`,\n `- Only make changes that are directly requested or clearly necessary`,\n `- Don't add features, refactor code, or make \"improvements\" beyond what was asked`,\n `- Don't add docstrings, comments, or type annotations to code you didn't change`,\n `- Preserve existing code style and conventions`,\n ``,\n );\n\n const builtInCount = tools.length;\n const mcpCount = mcpTools.length;\n const discoveryCount = 2;\n\n parts.push(\n `# Available Tools`,\n ``,\n `You have ${allToolNames.length} tools available:`,\n `- **Built-in**: ${builtInCount} tools (read_file, write_file, edit_file, glob, grep, ls, shell, task management, memory)`,\n );\n\n if (mcpCount > 0) {\n const serverCount = mcpServerSummaries.length;\n parts.push(`- **MCP**: ${mcpCount} tools from ${serverCount} server(s)`);\n }\n\n if (mcpCount > 0) {\n parts.push(`- **Discovery**: ${discoveryCount} tools (mcp_list_servers, mcp_list_tools)`);\n }\n\n parts.push(\n ``,\n `USE THEM PROACTIVELY.`,\n ``,\n );\n\n if (tools.length > 0) {\n parts.push(`## Built-in Tools`);\n for (const t of tools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n parts.push(``);\n }\n\n if (mcpTools.length > 0) {\n parts.push(`## MCP Tools (External Services)`);\n parts.push(``);\n parts.push(`**⚠️ Important**: Only tools from servers with status \"connected\" are available. Tools from disconnected servers will fail.`);\n parts.push(``);\n\n if (mcpServerSummaries.length > 0) {\n for (const server of mcpServerSummaries) {\n const statusIcon = server.status === 'connected' ? '✓' : '✗';\n parts.push(`### ${statusIcon} ${server.name} (${server.transport}, ${server.status}) — ${server.toolCount} tools`);\n for (const td of server.toolDescriptions) {\n parts.push(`- **${td.name}**: ${td.description}`);\n }\n }\n } else {\n for (const t of mcpTools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n }\n parts.push(`## MCP Discovery Tools`);\n parts.push(`- **mcp_list_servers**: List all connected MCP servers with status and tool counts`);\n parts.push(`- **mcp_list_tools**: List tools from a specific server or all servers`);\n parts.push(``);\n }\n\n parts.push(\n `# Tool Usage Guidelines`,\n ``,\n `## File Operations`,\n `- Use **read_file** to read file contents. Always read before editing.`,\n `- Use **write_file** only to create NEW files. Prefer edit_file for existing files.`,\n `- Use **edit_file** for precise string replacements in existing files.`,\n ` - Provide enough context in old_string to make it unique`,\n ` - Use replace_all=true only when renaming across the file`,\n ``,\n `## Search & Discovery`,\n `- Use **glob** to find files by pattern (e.g., \"**/*.ts\", \"src/**/*.service.ts\")`,\n `- Use **grep** to search content within files (supports regex)`,\n ` - Use context_lines to see surrounding code`,\n ` - Use output_mode=\"files_with_matches\" to just find file paths`,\n `- Use **ls** to list directory contents`,\n `- When looking for something, try glob first, then grep if needed`,\n ``,\n `## Shell Commands`,\n `- Use **shell** for git, npm, docker, and other CLI operations`,\n `- Dangerous commands (rm -rf, sudo, git push --force) require user approval`,\n `- Use **shell_background** for long-running tasks (dev servers, watch mode)`,\n ``,\n `## Task Management`,\n `- Use **task_create** to break complex work into trackable subtasks`,\n `- Use **task_update** to mark tasks as in_progress or completed`,\n `- Use **task_list** to see all tasks and their status`,\n `- Use **ask_user_question** when you need clarification BEFORE acting`,\n ``,\n `## Memory`,\n `- Use **memory_write** to save important learnings and project insights`,\n `- Use **memory_read** to recall previously saved notes`,\n `- Memory persists across sessions — use it to avoid repeating mistakes`,\n ``,\n );\n\n if (mcpTools.length > 0) {\n parts.push(\n `# MCP Integration Protocol`,\n ``,\n `MCP (Model Context Protocol) tools connect you to external services. They work exactly like built-in tools but reach outside the local filesystem.`,\n ``,\n `## Connected Servers`,\n );\n if (mcpServerSummaries.length > 0) {\n for (const s of mcpServerSummaries) {\n parts.push(`- **${s.name}** (${s.transport}, ${s.status}) — ${s.toolCount} tools`);\n }\n }\n parts.push(\n ``,\n `## When to Use MCP vs Built-in`,\n `| Need | Use |`,\n `|------|-----|`,\n `| Read/write local files | Built-in (read_file, write_file, edit_file) |`,\n `| Search local codebase | Built-in (glob, grep) |`,\n `| Run commands | Built-in (shell) |`,\n `| Interact with external APIs/services | MCP tools |`,\n `| Discover available MCP capabilities | mcp_list_servers, mcp_list_tools |`,\n ``,\n `## MCP Tool Naming Convention`,\n `MCP tools follow the pattern \\`{server}_{tool}\\` (e.g., \\`figma_get_file\\`, \\`github_create_issue\\`).`,\n `The prefix tells you which server provides the tool.`,\n ``,\n `## Discovery`,\n `- Use **mcp_list_servers** to see which servers are connected and their status`,\n `- Use **mcp_list_tools** to explore what tools a server provides (with descriptions)`,\n `- When you're unsure which MCP tool to use, call mcp_list_tools first`,\n ``,\n `## Error Handling`,\n `- If an MCP tool returns an error, check the server status with mcp_list_servers`,\n `- MCP servers can disconnect — if a tool fails, the server may need reconnection`,\n `- Report MCP errors to the user and suggest they check /mcp list in the REPL`,\n ``,\n );\n }\n\n parts.push(\n `# Planning Protocol`,\n ``,\n `## When to Enter Plan Mode`,\n `Use **enter_plan_mode** when:`,\n `- Task touches 3+ files`,\n `- Task involves new features or architecture changes`,\n `- Task is ambiguous and needs scope definition`,\n `- User explicitly asks for a plan`,\n ``,\n `Do NOT plan for: simple fixes, single-file edits, questions, explanations`,\n ``,\n `## Plan Mode Workflow`,\n `1. **enter_plan_mode** — signals you are planning`,\n `2. **Explore rapidly**: Use glob and grep efficiently to understand codebase`,\n `3. **Design**: Create structured plan with specific file changes and order`,\n `4. **exit_plan_mode** — present plan for approval`,\n `5. **Execute immediately** after approval without asking for further confirmation`,\n ``,\n `## Critical: Autonomous Execution`,\n `AFTER the user approves your plan, you MUST:`,\n `- Start implementing immediately`,\n `- Create tasks and execute them sequentially`,\n `- Do NOT ask \"should I proceed?\" or \"ready to start?\"`,\n `- Do NOT wait for additional confirmation`,\n `- Just execute the approved plan autonomously`,\n ``,\n `## Plan Quality Rules`,\n `- Specify WHAT changes and WHY for each file`,\n `- Order by dependency (foundations first)`,\n `- Include verification at the end`,\n `- Use ask_user_question ONLY to clarify requirements, not to ask for permission to execute`,\n ``,\n );\n\n if (subagents.length > 0) {\n parts.push(\n `# Sub-Agent Orchestration`,\n ``,\n `You have ${subagents.length} specialized sub-agents available. Each has domain-specific knowledge and tools.`,\n ``,\n `## Available Sub-Agents`,\n );\n for (const sa of subagents) {\n const mcpAnnotation = sa.mcp && sa.mcp.length > 0 ? ` [MCP: ${sa.mcp.join(', ')}]` : '';\n parts.push(`- **${sa.name}**: ${sa.description}${mcpAnnotation}`);\n }\n parts.push(\n ``,\n `## When to Delegate to Sub-Agents`,\n `- Task requires specialized domain knowledge (React, testing, API design, databases)`,\n `- Multiple independent subtasks can be worked on in parallel`,\n `- Task is well-defined and self-contained (a sub-agent can complete it without further guidance)`,\n `- You want a focused review or analysis (e.g., code review, architecture review)`,\n ``,\n `## When NOT to Delegate`,\n `- Simple tasks you can do yourself quickly`,\n `- Tasks that require back-and-forth with the user`,\n `- Tasks that depend heavily on earlier context in this conversation`,\n ``,\n `## Delegation Pattern`,\n `1. Identify the task and which sub-agent is best suited`,\n `2. Create a clear, specific task description with all necessary context`,\n `3. Delegate execution to that sub-agent (do not stop at planning only)`,\n `4. Track delegated work with task_create/task_update`,\n `5. When the sub-agent returns, verify the result and integrate it`,\n `6. Mark the task as completed`,\n ``,\n `## Delegation Quality Bar`,\n `- If user explicitly asks to use a specific sub-agent, you MUST delegate to it`,\n `- For frontend UI generation from Figma, prefer the frontend sub-agent when available`,\n `- Avoid fake delegation: creating tasks without executing delegated work is not enough`,\n `- Return concrete delegated outputs (files changed, decisions made, validations run)`,\n ``,\n `## Multi-Agent Coordination`,\n `For large tasks, you can orchestrate multiple sub-agents:`,\n `1. Break the work into independent pieces`,\n `2. Assign each piece to the most qualified sub-agent`,\n `3. Track progress with task_create/task_update`,\n `4. Integrate results and verify the combined output`,\n ``,\n `## MCP-Aware Delegation`,\n `When a task involves heavy interaction with an external service (e.g., fetching Figma designs, managing GitHub issues):`,\n `- Check which sub-agents have MCP access (annotated with [MCP: name] above)`,\n `- Delegate MCP-heavy work to the sub-agent with the right MCP connection`,\n `- If no sub-agent has the needed MCP, handle it yourself using the MCP tools directly`,\n `- Include the MCP server name in the task description so the sub-agent knows which tools to use`,\n ``,\n );\n }\n\n parts.push(\n `# Execution Protocol`,\n ``,\n `## Exploring a Project`,\n `1. ls the root directory`,\n `2. Read key config files (package.json, tsconfig.json, etc.)`,\n `3. glob to map directory tree with key patterns`,\n `4. Read the most important files (entry points, main modules)`,\n `5. Present a structured summary`,\n `Be EXHAUSTIVE. Read as many files as needed.`,\n ``,\n `## Implementing Changes`,\n `1. Understand the current codebase (read relevant files)`,\n `2. If complex (3+ files): use enter_plan_mode`,\n `3. Create a task list with task_create for each step`,\n `4. Execute each step, marking tasks as completed`,\n `5. Verify changes (re-read edited files, run tests)`,\n `6. Summarize what was done`,\n ``,\n `## Tool Chain Patterns`,\n `- **Find something**: glob → grep → read_file`,\n `- **Edit a file**: read_file → edit_file → read_file (verify)`,\n `- **Explore a module**: ls → glob(\"module/**/*\") → read_file (key files)`,\n `- **Debug an issue**: grep (error) → read_file → edit_file → shell (test)`,\n `- **New feature**: enter_plan_mode → task_create → [implement] → shell (test)`,\n ``,\n `## Thoroughness Rules`,\n `- NEVER give up after one failed search. Try different patterns and approaches.`,\n `- ALWAYS verify changes by re-reading the file after editing.`,\n `- If tests exist, run them after changes: shell(\"npm test\") or equivalent.`,\n `- When you encounter an error, analyze and fix it — don't just report it.`,\n `- If blocked, try a different approach. If still blocked, ask the user.`,\n ``,\n );\n\n parts.push(\n `# Autonomous Decision-Making`,\n ``,\n `You are an autonomous agent. Make decisions proactively:`,\n ``,\n `## Decision Framework`,\n `| Situation | Action |`,\n `|-----------|--------|`,\n `| User asks to implement something | Explore first, then plan if complex |`,\n `| You find a bug while working | Fix it AND mention it to the user |`,\n `| Test fails after your change | Analyze the failure and fix it |`,\n `| Build fails | Read the error, fix the cause |`,\n `| File you need doesn't exist | Search broader, check for alternatives |`,\n `| Task is ambiguous | ask_user_question BEFORE starting |`,\n `| Task has multiple approaches | Briefly explain options, pick the best one |`,\n `| Something could break | Use enter_plan_mode and verify |`,\n ``,\n `## Self-Correction`,\n `- After editing, always re-read the file to verify the change is correct`,\n `- If a tool call fails, understand why and adjust (don't retry the same thing)`,\n `- If your approach isn't working after 3 attempts, step back and reconsider`,\n `- Save important learnings with memory_write so you don't repeat mistakes`,\n ``,\n );\n\n parts.push(\n `# Git Safety Protocol`,\n `- NEVER update git config`,\n `- NEVER run destructive git commands (push --force, reset --hard, clean -f) without explicit user request`,\n `- NEVER skip hooks (--no-verify) unless user explicitly requests it`,\n `- When committing: stage specific files (not \"git add -A\"), write clear commit messages`,\n `- When creating PRs: summarize all commits, not just the latest`,\n ``,\n );\n\n parts.push(\n `# Response Style`,\n `- Be concise in responses but thorough in your work`,\n `- Show your work: mention which tools you're using and why`,\n `- When showing code changes, explain WHAT changed and WHY`,\n `- Use markdown formatting for readability`,\n `- Reference files with their path (e.g., \"In src/main.ts:\")`,\n ``,\n );\n\n parts.push(\n `# User Mentions`,\n `When the user's message contains <file>, <directory>, <url>, or <git> tags,`,\n `these are automatically injected file/directory contents from @ mentions.`,\n `The content inside these tags is REAL and CURRENT — trust it and use it to answer.`,\n `Do NOT re-read a file that was already provided via a mention tag unless you need a different section.`,\n ``,\n );\n\n if (skillKnowledge) {\n const skillSummaries = this.skillRegistry.getSkillSummaries();\n\n parts.push(\n `# Domain Knowledge`,\n ``,\n `You have ${skillSummaries.length} skills loaded:`,\n );\n\n for (const skill of skillSummaries) {\n parts.push(`- **${skill.name}**: ${skill.description}`);\n }\n\n parts.push(\n ``,\n `The following are the complete guidelines from your skill library. These are reference materials — study them to learn patterns, decision frameworks, and anti-patterns for each domain. Use this knowledge when making decisions about how to approach tasks.`,\n ``,\n skillKnowledge,\n ``,\n );\n }\n\n parts.push(\n `# Environment`,\n `- Working directory: ${process.cwd()}`,\n `- Platform: ${process.platform}`,\n `- Node.js: ${process.version}`,\n ``,\n `# Git Status (snapshot)`,\n gitInfo,\n ``,\n );\n\n if (contextPrompt) {\n parts.push(contextPrompt, ``);\n }\n\n if (memoryPrompt) {\n parts.push(\n `# Auto Memory`,\n `These are notes from previous sessions:`,\n memoryPrompt,\n ``,\n );\n }\n\n return parts.join('\\n');\n }\n\n private formatToolStart(toolName: string, input: any): string {\n const dim = '\\x1b[2m';\n const cyan = '\\x1b[36m';\n const reset = '\\x1b[0m';\n const icon = '\\u23bf';\n\n let detail = '';\n\n switch (toolName) {\n case 'read_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'write_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'edit_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'glob':\n detail = input?.pattern ? ` ${input.pattern}` : '';\n if (input?.cwd) detail += ` in ${input.cwd}`;\n break;\n case 'grep':\n detail = input?.pattern ? ` \"${input.pattern}\"` : '';\n if (input?.file_pattern) detail += ` (${input.file_pattern})`;\n break;\n case 'shell':\n if (input?.command) {\n const cmd = input.command.length > 80 ? input.command.slice(0, 80) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'shell_background':\n if (input?.command) {\n const cmd = input.command.length > 60 ? input.command.slice(0, 60) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'ls':\n detail = ` ${input?.directory || input?.path || '.'}`;\n break;\n case 'web_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'web_fetch':\n detail = input?.url ? ` ${input.url}` : '';\n break;\n case 'task_create':\n detail = input?.title ? ` \"${input.title}\"` : '';\n break;\n case 'task_update':\n detail = input?.id ? ` #${input.id} → ${input?.status || ''}` : '';\n break;\n case 'task_list':\n detail = '';\n break;\n case 'task_get':\n detail = input?.id ? ` #${input.id}` : '';\n break;\n case 'ask_user_question':\n detail = input?.question ? ` \"${input.question.slice(0, 50)}${input.question.length > 50 ? '...' : ''}\"` : '';\n break;\n case 'enter_plan_mode':\n detail = ' Starting plan...';\n break;\n case 'exit_plan_mode':\n detail = ' Submitting plan';\n break;\n case 'memory_write':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_read':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'mcp_list_servers':\n detail = ' Listing MCP servers';\n break;\n case 'mcp_list_tools':\n detail = input?.server ? ` server=${input.server}` : ' (all servers)';\n break;\n default:\n if (input) {\n const keys = Object.keys(input);\n if (keys.length > 0) {\n const firstVal = String(input[keys[0]]).slice(0, 60);\n detail = ` ${keys[0]}=${firstVal}`;\n }\n }\n }\n\n return `\\n${dim} ${cyan}${icon}${reset}${dim} ${toolName}${detail}${reset}\\n`;\n }\n\n private formatToolEnd(toolName: string, output: string): string {\n if (!output || output.length === 0) return '';\n\n const dim = '\\x1b[2m';\n const green = '\\x1b[32m';\n const reset = '\\x1b[0m';\n\n switch (toolName) {\n case 'read_file': {\n const lineCount = output.split('\\n').length;\n return `${dim} ${green}\\u2713${reset}${dim} ${lineCount} lines${reset}\\n`;\n }\n case 'write_file':\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n case 'edit_file': {\n if (output.startsWith('Error')) {\n return `${dim} \\x1b[31m${output.slice(0, 150)}${reset}\\n`;\n }\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n }\n case 'glob': {\n const lines = output.split('\\n').filter(l => l.trim());\n const fileCount = lines.length;\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 100)}${reset}`).join('\\n');\n const more = fileCount > 5 ? `\\n${dim} ... (${fileCount - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'grep': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 5 ? `\\n${dim} ... (${lines.length - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'shell':\n case 'shell_background': {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 8).map(l => `${dim} ${l.slice(0, 150)}${reset}`).join('\\n');\n const more = lines.length > 8 ? `\\n${dim} ... (${lines.length - 8} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'ls': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 10).map(l => `${dim} ${l}${reset}`).join('\\n');\n const more = lines.length > 10 ? `\\n${dim} ... (${lines.length - 10} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n default: {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 3).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 3 ? `\\n${dim} ... (${lines.length - 3} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n }\n }\n\n private async autoSummarize(force = false): Promise<boolean> {\n if ((!force && this.messages.length < SUMMARIZE_THRESHOLD) || !this.model) {\n return false;\n }\n\n if (this.messages.length < 4) {\n return false;\n }\n\n const oldMessages = this.messages.slice(0, this.messages.length - KEEP_RECENT);\n const recentMessages = this.messages.slice(this.messages.length - KEEP_RECENT);\n\n const conversationText = oldMessages.map((m) => {\n const role = m._getType() === 'human' ? 'User' : 'Assistant';\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const truncated = content.length > 500 ? content.slice(0, 500) + '...' : content;\n return `${role}: ${truncated}`;\n }).join('\\n');\n\n try {\n const summaryResponse = await this.model.invoke([\n new SystemMessage(\n `You are a conversation summarizer. Produce a concise summary of the following conversation between a user and an AI assistant. Focus on:\n- Key decisions made\n- Files that were read or modified\n- Tasks completed or pending\n- Important context the assistant needs to remember\nKeep the summary under 500 words. Output ONLY the summary, no preamble.`\n ),\n new HumanMessage(conversationText),\n ]);\n\n const summaryText = typeof summaryResponse.content === 'string'\n ? summaryResponse.content\n : JSON.stringify(summaryResponse.content);\n\n this.messages = [\n new SystemMessage(`[Conversation Summary — ${oldMessages.length} messages compacted]\\n\\n${summaryText}`),\n ...recentMessages,\n ];\n\n return true;\n } catch {\n return false;\n }\n }\n\n async *chat(message: string): AsyncGenerator<string> {\n const summarized = await this.autoSummarize();\n if (summarized) {\n yield `\\n\\x1b[2m \\u2500 conversation compacted (${this.messages.length} messages retained)\\x1b[0m\\n`;\n }\n\n this.messages.push(new HumanMessage(message));\n this.lastToolOutputs = [];\n\n let stream: any;\n try {\n stream = this.agent.streamEvents(\n { messages: this.messages },\n { version: 'v2', recursionLimit: RECURSION_LIMIT },\n );\n } catch (error) {\n yield `\\n\\x1b[31m Error starting agent: ${(error as Error).message}\\x1b[0m\\n`;\n return;\n }\n\n let fullResponse = '';\n let lastToolName = '';\n let interactionInputTokens = 0;\n let interactionOutputTokens = 0;\n\n try {\n for await (const event of stream) {\n if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {\n const content = event.data.chunk.content;\n if (typeof content === 'string' && content) {\n yield content;\n fullResponse += content;\n }\n }\n\n if (event.event === 'on_chat_model_end') {\n const output = event.data?.output;\n const usage = output?.usage_metadata\n || output?.response_metadata?.usage;\n if (usage) {\n interactionInputTokens += usage.input_tokens || usage.prompt_tokens || usage.promptTokens || 0;\n interactionOutputTokens += usage.output_tokens || usage.completion_tokens || usage.completionTokens || 0;\n }\n }\n\n if (event.event === 'on_tool_start') {\n lastToolName = event.name;\n yield this.formatToolStart(event.name, event.data?.input);\n }\n\n if (event.event === 'on_tool_end') {\n const raw = event.data?.output;\n let output = '';\n if (typeof raw === 'string') {\n output = raw;\n } else if (raw?.content) {\n output = typeof raw.content === 'string' ? raw.content : JSON.stringify(raw.content);\n } else if (raw?.output) {\n output = typeof raw.output === 'string' ? raw.output : JSON.stringify(raw.output);\n } else if (raw) {\n output = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);\n }\n if (output) {\n this.lastToolOutputs.push({ tool: lastToolName, output });\n yield this.formatToolEnd(lastToolName, output);\n }\n }\n\n if (event.event === 'on_tool_error') {\n const error = event.data?.error;\n yield `\\n\\x1b[31m \\u2717 Error: ${error?.message || 'Unknown error'}\\x1b[0m\\n`;\n }\n }\n } catch (error) {\n const msg = (error as Error).message;\n if (!msg.includes('abort') && !msg.includes('cancel')) {\n yield `\\n\\x1b[31m Stream error: ${msg}\\x1b[0m\\n`;\n }\n }\n\n if (fullResponse) {\n this.messages.push(new AIMessage(fullResponse));\n }\n\n this.tokenCount += interactionInputTokens + interactionOutputTokens;\n\n const fmt = (n: number) => n.toLocaleString();\n yield `\\n\\x1b[2m \\u2500 tokens: ${fmt(interactionInputTokens)} in / ${fmt(interactionOutputTokens)} out (session: ${fmt(this.tokenCount)})\\x1b[0m\\n`;\n }\n\n clearHistory() {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n async compactHistory(): Promise<{ compacted: boolean; messagesBefore: number; messagesAfter: number }> {\n const before = this.messages.length;\n if (before < 4) {\n return { compacted: false, messagesBefore: before, messagesAfter: before };\n }\n const result = await this.autoSummarize(true);\n return { compacted: result, messagesBefore: before, messagesAfter: this.messages.length };\n }\n\n getHistory(): BaseMessage[] {\n return this.messages;\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n getLastToolOutputs(): { tool: string; output: string }[] {\n return this.lastToolOutputs;\n }\n\n async executeTask(task: Task): Promise<{ success: boolean; error?: string }> {\n try {\n const message = `Execute a seguinte tarefa:\\n\\n**${task.subject}**\\n\\n${task.description}\\n\\nCertifique-se de completar a tarefa totalmente e verificar o resultado.`;\n\n let fullResponse = '';\n for await (const chunk of this.chat(message)) {\n fullResponse += chunk;\n process.stdout.write(chunk);\n }\n\n return { success: true };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n}\n"],"names":["DeepAgentService","SUMMARIZE_THRESHOLD","KEEP_RECENT","RECURSION_LIMIT","DEEPAGENT_BUILTIN_TOOLS","Set","onModuleInit","configService","loadGlobalConfig","initialize","projectPath","projectLoader","detectProject","projectConfig","loadProject","context","projectContext","setContext","mcpConfigs","mcpRegistry","loadConfigs","connectAll","agentsOverridePath","getAgentsOverridePath","legacyAgentsOverridePath","getLegacyAgentsOverridePath","agentRegistry","loadProjectAgents","skillsOverridePath","getSkillsOverridePath","legacySkillsOverridePath","getLegacySkillsOverridePath","skillRegistry","loadProjectSkills","memoryService","model","multiLlmService","createStreamingModel","contextPrompt","getContextPrompt","memoryPrompt","getMemoryPrompt","skillKnowledge","getAllSkillKnowledge","subagents","getSubagentDefinitions","allTools","toolsRegistry","getAllTools","mcpTools","getAllMcpTools","extraTools","filter","t","has","name","mcpDiscoveryTools","getDiscoveryTools","mcpServerSummaries","getServerSummaries","systemPrompt","buildSystemPrompt","agent","createDeepAgent","tools","backend","FilesystemBackend","rootDir","process","cwd","hasContext","agentCount","length","toolCount","getGitStatus","branch","execSync","encoding","trim","status","log","result","gitInfo","allToolNames","map","parts","push","builtInCount","mcpCount","discoveryCount","serverCount","description","server","statusIcon","transport","td","toolDescriptions","s","sa","mcpAnnotation","mcp","join","skillSummaries","getSkillSummaries","skill","platform","version","formatToolStart","toolName","input","dim","cyan","reset","icon","detail","file_path","pattern","file_pattern","command","cmd","slice","directory","path","query","url","title","id","question","key","keys","Object","firstVal","String","formatToolEnd","output","green","lineCount","split","startsWith","lines","l","fileCount","preview","more","autoSummarize","force","messages","oldMessages","recentMessages","conversationText","m","role","_getType","content","JSON","stringify","truncated","summaryResponse","invoke","SystemMessage","HumanMessage","summaryText","chat","message","summarized","lastToolOutputs","stream","streamEvents","recursionLimit","error","fullResponse","lastToolName","interactionInputTokens","interactionOutputTokens","event","data","chunk","usage","usage_metadata","response_metadata","input_tokens","prompt_tokens","promptTokens","output_tokens","completion_tokens","completionTokens","raw","tool","msg","includes","AIMessage","tokenCount","fmt","n","toLocaleString","clearHistory","compactHistory","before","compacted","messagesBefore","messagesAfter","getHistory","getMessageCount","getTokenCount","getLastToolOutputs","executeTask","task","subject","stdout","write","success","markdownRenderer"],"mappings":";;;;+BA4BaA;;;eAAAA;;;wBA5B4B;0BAE2B;+BAC3C;4BAC0B;+BACrB;iCACE;yCACQ;sCACH;sCACA;oCACF;sCACE;uCACC;sCACD;+BACP;;;;;;;;;;AAK9B,MAAMC,sBAAsB;AAC5B,MAAMC,cAAc;AACpB,MAAMC,kBAAkB;AACxB,MAAMC,0BAA0B,IAAIC,IAAI;IACtC;IAAa;IAAc;IAAa;IAAQ;IAAQ;IACxD;IAAe;CAChB;AAGM,IAAA,AAAML,mBAAN,MAAMA;IAoBX,MAAMM,eAAe;QACnB,MAAM,IAAI,CAACC,aAAa,CAACC,gBAAgB;IAC3C;IAEA,MAAMC,aAAyC;QAC7C,MAAMC,cAAc,MAAM,IAAI,CAACC,aAAa,CAACC,aAAa;QAE1D,IAAIF,aAAa;YACf,MAAMG,gBAAgB,MAAM,IAAI,CAACF,aAAa,CAACG,WAAW,CAACJ;YAE3D,IAAIG,cAAcE,OAAO,EAAE;gBACzB,IAAI,CAACC,cAAc,CAACC,UAAU,CAACJ,cAAcE,OAAO;YACtD;YAEA,IAAIF,cAAcK,UAAU,EAAE;gBAC5B,IAAI,CAACC,WAAW,CAACC,WAAW,CAACP,cAAcK,UAAU;gBACrD,MAAM,IAAI,CAACC,WAAW,CAACE,UAAU;YACnC;YAEA,MAAMC,qBAAqB,IAAI,CAACX,aAAa,CAACY,qBAAqB,CAACb;YACpE,MAAMc,2BAA2B,IAAI,CAACb,aAAa,CAACc,2BAA2B,CAACf;YAChF,MAAM,IAAI,CAACgB,aAAa,CAACC,iBAAiB,CAACL;YAC3C,MAAM,IAAI,CAACI,aAAa,CAACC,iBAAiB,CAACH;YAE3C,MAAMI,qBAAqB,IAAI,CAACjB,aAAa,CAACkB,qBAAqB,CAACnB;YACpE,MAAMoB,2BAA2B,IAAI,CAACnB,aAAa,CAACoB,2BAA2B,CAACrB;YAChF,MAAM,IAAI,CAACsB,aAAa,CAACC,iBAAiB,CAACL;YAC3C,MAAM,IAAI,CAACI,aAAa,CAACC,iBAAiB,CAACH;YAE3C,MAAM,IAAI,CAACI,aAAa,CAACzB,UAAU,CAACC;QACtC;QAEA,IAAI,CAACyB,KAAK,GAAG,IAAI,CAACC,eAAe,CAACC,oBAAoB,CAAC;QAEvD,MAAMC,gBAAgB,IAAI,CAACtB,cAAc,CAACuB,gBAAgB;QAC1D,MAAMC,eAAe,MAAM,IAAI,CAACN,aAAa,CAACO,eAAe;QAC7D,MAAMC,iBAAiB,IAAI,CAACV,aAAa,CAACW,oBAAoB;QAC9D,MAAMC,YAAY,IAAI,CAAClB,aAAa,CAACmB,sBAAsB,CAACP;QAC5D,MAAMQ,WAAW,IAAI,CAACC,aAAa,CAACC,WAAW;QAC/C,MAAMC,WAAW,IAAI,CAAC9B,WAAW,CAAC+B,cAAc;QAEhD,MAAMC,aAAaL,SAASM,MAAM,CAACC,CAAAA,IAAK,CAACjD,wBAAwBkD,GAAG,CAACD,EAAEE,IAAI;QAC3E,MAAMC,oBAAoB,IAAI,CAACrC,WAAW,CAACsC,iBAAiB;QAC5D,MAAMC,qBAAqB,IAAI,CAACvC,WAAW,CAACwC,kBAAkB;QAE9D,MAAMC,eAAe,IAAI,CAACC,iBAAiB,CAACvB,eAAeE,cAAcE,gBAAgBE,WAAWE,UAAUG,UAAUS;QAExH,IAAI,CAACI,KAAK,GAAGC,IAAAA,2BAAe,EAAC;YAC3B5B,OAAO,IAAI,CAACA,KAAK;YACjByB;YACAI,OAAO;mBAAIb;mBAAeF;mBAAaO;aAAkB;YACzDZ;YACAqB,SAAS,IAAM,IAAIC,6BAAiB,CAAC;oBAAEC,SAASC,QAAQC,GAAG;gBAAG;QAChE;QAEA,OAAO;YACL3D;YACA4D,YAAY,IAAI,CAACtD,cAAc,CAACsD,UAAU;YAC1CC,YAAY3B,UAAU4B,MAAM;YAC5BC,WAAWtB,WAAWqB,MAAM,GAAGvB,SAASuB,MAAM;QAChD;IACF;IAEQE,eAAuB;QAC7B,IAAI;YACF,MAAMC,SAASC,IAAAA,uBAAQ,EAAC,+CAA+C;gBACrEC,UAAU;gBACVR,KAAKD,QAAQC,GAAG;YAClB,GAAGS,IAAI;YACP,MAAMC,SAASH,IAAAA,uBAAQ,EAAC,kCAAkC;gBACxDC,UAAU;gBACVR,KAAKD,QAAQC,GAAG;YAClB,GAAGS,IAAI;YACP,MAAME,MAAMJ,IAAAA,uBAAQ,EAAC,oCAAoC;gBACvDC,UAAU;gBACVR,KAAKD,QAAQC,GAAG;YAClB,GAAGS,IAAI;YAEP,IAAIG,SAAS,CAAC,QAAQ,EAAEN,QAAQ;YAChC,IAAII,QAAQ;gBACVE,UAAU,CAAC,YAAY,EAAEF,QAAQ;YACnC,OAAO;gBACLE,UAAU,CAAC,eAAe,CAAC;YAC7B;YACA,IAAID,KAAK;gBACPC,UAAU,CAAC,mBAAmB,EAAED,KAAK;YACvC;YACA,OAAOC;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEQpB,kBACNvB,aAAqB,EACrBE,YAAoB,EACpBE,cAAsB,EACtBE,SAAgB,EAChBoB,KAAY,EACZf,QAAe,EACfS,qBAAyC,EAAE,EACnC;QACR,MAAMwB,UAAU,IAAI,CAACR,YAAY;QACjC,MAAMS,eAAe;eAChBnB,MAAMoB,GAAG,CAAC,CAAC/B,IAAWA,EAAEE,IAAI;eAC5BN,SAASmC,GAAG,CAAC,CAAC/B,IAAWA,EAAEE,IAAI;SACnC;QAED,MAAM8B,QAAkB,EAAE;QAE1BA,MAAMC,IAAI,CACR,CAAC,sEAAsE,CAAC,EACxE,CAAC,4SAA4S,CAAC,EAC9S,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,gBAAgB,CAAC,EAClB,EAAE,EACF,CAAC,8BAA8B,CAAC,EAChC,CAAC,iFAAiF,CAAC,EACnF,CAAC,4EAA4E,CAAC,EAC9E,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,0FAA0F,CAAC,EAC5F,EAAE,EACF,CAAC,mBAAmB,CAAC,EACrB,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yDAAyD,CAAC,EAC3D,CAAC,0DAA0D,CAAC,EAC5D,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,oEAAoE,CAAC,EACtE,CAAC,iFAAiF,CAAC,EACnF,CAAC,+EAA+E,CAAC,EACjF,CAAC,8CAA8C,CAAC,EAChD,EAAE;QAGJ,MAAMC,eAAevB,MAAMQ,MAAM;QACjC,MAAMgB,WAAWvC,SAASuB,MAAM;QAChC,MAAMiB,iBAAiB;QAEvBJ,MAAMC,IAAI,CACR,CAAC,iBAAiB,CAAC,EACnB,EAAE,EACF,CAAC,SAAS,EAAEH,aAAaX,MAAM,CAAC,iBAAiB,CAAC,EAClD,CAAC,gBAAgB,EAAEe,aAAa,yFAAyF,CAAC;QAG5H,IAAIC,WAAW,GAAG;YAChB,MAAME,cAAchC,mBAAmBc,MAAM;YAC7Ca,MAAMC,IAAI,CAAC,CAAC,WAAW,EAAEE,SAAS,YAAY,EAAEE,YAAY,UAAU,CAAC;QACzE;QAEA,IAAIF,WAAW,GAAG;YAChBH,MAAMC,IAAI,CAAC,CAAC,iBAAiB,EAAEG,eAAe,yCAAyC,CAAC;QAC1F;QAEAJ,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,EAAE;QAGJ,IAAItB,MAAMQ,MAAM,GAAG,GAAG;YACpBa,MAAMC,IAAI,CAAC,CAAC,iBAAiB,CAAC;YAC9B,KAAK,MAAMjC,KAAKW,MAAO;gBACrBqB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEjC,EAAEE,IAAI,CAAC,IAAI,EAAEF,EAAEsC,WAAW,EAAE;YAChD;YACAN,MAAMC,IAAI,CAAC,EAAE;QACf;QAEA,IAAIrC,SAASuB,MAAM,GAAG,GAAG;YACvBa,MAAMC,IAAI,CAAC,CAAC,gCAAgC,CAAC;YAC7CD,MAAMC,IAAI,CAAC,EAAE;YACbD,MAAMC,IAAI,CAAC,CAAC,2HAA2H,CAAC;YACxID,MAAMC,IAAI,CAAC,EAAE;YAEb,IAAI5B,mBAAmBc,MAAM,GAAG,GAAG;gBACjC,KAAK,MAAMoB,UAAUlC,mBAAoB;oBACvC,MAAMmC,aAAaD,OAAOb,MAAM,KAAK,cAAc,MAAM;oBACzDM,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEO,WAAW,CAAC,EAAED,OAAOrC,IAAI,CAAC,EAAE,EAAEqC,OAAOE,SAAS,CAAC,EAAE,EAAEF,OAAOb,MAAM,CAAC,IAAI,EAAEa,OAAOnB,SAAS,CAAC,MAAM,CAAC;oBACjH,KAAK,MAAMsB,MAAMH,OAAOI,gBAAgB,CAAE;wBACxCX,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAES,GAAGxC,IAAI,CAAC,IAAI,EAAEwC,GAAGJ,WAAW,EAAE;oBAClD;gBACF;YACF,OAAO;gBACL,KAAK,MAAMtC,KAAKJ,SAAU;oBACxBoC,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEjC,EAAEE,IAAI,CAAC,IAAI,EAAEF,EAAEsC,WAAW,EAAE;gBAChD;YACF;YACAN,MAAMC,IAAI,CAAC,CAAC,sBAAsB,CAAC;YACnCD,MAAMC,IAAI,CAAC,CAAC,kFAAkF,CAAC;YAC/FD,MAAMC,IAAI,CAAC,CAAC,sEAAsE,CAAC;YACnFD,MAAMC,IAAI,CAAC,EAAE;QACf;QAEAD,MAAMC,IAAI,CACR,CAAC,uBAAuB,CAAC,EACzB,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,sEAAsE,CAAC,EACxE,CAAC,mFAAmF,CAAC,EACrF,CAAC,sEAAsE,CAAC,EACxE,CAAC,0DAA0D,CAAC,EAC5D,CAAC,2DAA2D,CAAC,EAC7D,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,gFAAgF,CAAC,EAClF,CAAC,8DAA8D,CAAC,EAChE,CAAC,6CAA6C,CAAC,EAC/C,CAAC,gEAAgE,CAAC,EAClE,CAAC,uCAAuC,CAAC,EACzC,CAAC,iEAAiE,CAAC,EACnE,EAAE,EACF,CAAC,iBAAiB,CAAC,EACnB,CAAC,8DAA8D,CAAC,EAChE,CAAC,2EAA2E,CAAC,EAC7E,CAAC,2EAA2E,CAAC,EAC7E,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,mEAAmE,CAAC,EACrE,CAAC,+DAA+D,CAAC,EACjE,CAAC,qDAAqD,CAAC,EACvD,CAAC,qEAAqE,CAAC,EACvE,EAAE,EACF,CAAC,SAAS,CAAC,EACX,CAAC,uEAAuE,CAAC,EACzE,CAAC,sDAAsD,CAAC,EACxD,CAAC,sEAAsE,CAAC,EACxE,EAAE;QAGJ,IAAIrC,SAASuB,MAAM,GAAG,GAAG;YACvBa,MAAMC,IAAI,CACR,CAAC,0BAA0B,CAAC,EAC5B,EAAE,EACF,CAAC,kJAAkJ,CAAC,EACpJ,EAAE,EACF,CAAC,oBAAoB,CAAC;YAExB,IAAI5B,mBAAmBc,MAAM,GAAG,GAAG;gBACjC,KAAK,MAAMyB,KAAKvC,mBAAoB;oBAClC2B,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEW,EAAE1C,IAAI,CAAC,IAAI,EAAE0C,EAAEH,SAAS,CAAC,EAAE,EAAEG,EAAElB,MAAM,CAAC,IAAI,EAAEkB,EAAExB,SAAS,CAAC,MAAM,CAAC;gBACnF;YACF;YACAY,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,8BAA8B,CAAC,EAChC,CAAC,cAAc,CAAC,EAChB,CAAC,cAAc,CAAC,EAChB,CAAC,wEAAwE,CAAC,EAC1E,CAAC,iDAAiD,CAAC,EACnD,CAAC,mCAAmC,CAAC,EACrC,CAAC,oDAAoD,CAAC,EACtD,CAAC,0EAA0E,CAAC,EAC5E,EAAE,EACF,CAAC,6BAA6B,CAAC,EAC/B,CAAC,qGAAqG,CAAC,EACvG,CAAC,oDAAoD,CAAC,EACtD,EAAE,EACF,CAAC,YAAY,CAAC,EACd,CAAC,8EAA8E,CAAC,EAChF,CAAC,oFAAoF,CAAC,EACtF,CAAC,qEAAqE,CAAC,EACvE,EAAE,EACF,CAAC,iBAAiB,CAAC,EACnB,CAAC,gFAAgF,CAAC,EAClF,CAAC,gFAAgF,CAAC,EAClF,CAAC,4EAA4E,CAAC,EAC9E,EAAE;QAEN;QAEAD,MAAMC,IAAI,CACR,CAAC,mBAAmB,CAAC,EACrB,EAAE,EACF,CAAC,0BAA0B,CAAC,EAC5B,CAAC,6BAA6B,CAAC,EAC/B,CAAC,uBAAuB,CAAC,EACzB,CAAC,oDAAoD,CAAC,EACtD,CAAC,8CAA8C,CAAC,EAChD,CAAC,iCAAiC,CAAC,EACnC,EAAE,EACF,CAAC,yEAAyE,CAAC,EAC3E,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,iDAAiD,CAAC,EACnD,CAAC,4EAA4E,CAAC,EAC9E,CAAC,0EAA0E,CAAC,EAC5E,CAAC,iDAAiD,CAAC,EACnD,CAAC,iFAAiF,CAAC,EACnF,EAAE,EACF,CAAC,iCAAiC,CAAC,EACnC,CAAC,4CAA4C,CAAC,EAC9C,CAAC,gCAAgC,CAAC,EAClC,CAAC,4CAA4C,CAAC,EAC9C,CAAC,qDAAqD,CAAC,EACvD,CAAC,yCAAyC,CAAC,EAC3C,CAAC,6CAA6C,CAAC,EAC/C,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,4CAA4C,CAAC,EAC9C,CAAC,yCAAyC,CAAC,EAC3C,CAAC,iCAAiC,CAAC,EACnC,CAAC,0FAA0F,CAAC,EAC5F,EAAE;QAGJ,IAAI1C,UAAU4B,MAAM,GAAG,GAAG;YACxBa,MAAMC,IAAI,CACR,CAAC,yBAAyB,CAAC,EAC3B,EAAE,EACF,CAAC,SAAS,EAAE1C,UAAU4B,MAAM,CAAC,gFAAgF,CAAC,EAC9G,EAAE,EACF,CAAC,uBAAuB,CAAC;YAE3B,KAAK,MAAM0B,MAAMtD,UAAW;gBAC1B,MAAMuD,gBAAgBD,GAAGE,GAAG,IAAIF,GAAGE,GAAG,CAAC5B,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE0B,GAAGE,GAAG,CAACC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG;gBACrFhB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEY,GAAG3C,IAAI,CAAC,IAAI,EAAE2C,GAAGP,WAAW,GAAGQ,eAAe;YAClE;YACAd,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,iCAAiC,CAAC,EACnC,CAAC,oFAAoF,CAAC,EACtF,CAAC,4DAA4D,CAAC,EAC9D,CAAC,gGAAgG,CAAC,EAClG,CAAC,gFAAgF,CAAC,EAClF,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,0CAA0C,CAAC,EAC5C,CAAC,iDAAiD,CAAC,EACnD,CAAC,mEAAmE,CAAC,EACrE,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,uDAAuD,CAAC,EACzD,CAAC,uEAAuE,CAAC,EACzE,CAAC,sEAAsE,CAAC,EACxE,CAAC,oDAAoD,CAAC,EACtD,CAAC,iEAAiE,CAAC,EACnE,CAAC,6BAA6B,CAAC,EAC/B,EAAE,EACF,CAAC,yBAAyB,CAAC,EAC3B,CAAC,8EAA8E,CAAC,EAChF,CAAC,qFAAqF,CAAC,EACvF,CAAC,sFAAsF,CAAC,EACxF,CAAC,oFAAoF,CAAC,EACtF,EAAE,EACF,CAAC,2BAA2B,CAAC,EAC7B,CAAC,yDAAyD,CAAC,EAC3D,CAAC,yCAAyC,CAAC,EAC3C,CAAC,oDAAoD,CAAC,EACtD,CAAC,8CAA8C,CAAC,EAChD,CAAC,mDAAmD,CAAC,EACrD,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,uHAAuH,CAAC,EACzH,CAAC,2EAA2E,CAAC,EAC7E,CAAC,wEAAwE,CAAC,EAC1E,CAAC,qFAAqF,CAAC,EACvF,CAAC,+FAA+F,CAAC,EACjG,EAAE;QAEN;QAEAD,MAAMC,IAAI,CACR,CAAC,oBAAoB,CAAC,EACtB,EAAE,EACF,CAAC,sBAAsB,CAAC,EACxB,CAAC,wBAAwB,CAAC,EAC1B,CAAC,4DAA4D,CAAC,EAC9D,CAAC,+CAA+C,CAAC,EACjD,CAAC,6DAA6D,CAAC,EAC/D,CAAC,+BAA+B,CAAC,EACjC,CAAC,4CAA4C,CAAC,EAC9C,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzB,CAAC,wDAAwD,CAAC,EAC1D,CAAC,6CAA6C,CAAC,EAC/C,CAAC,oDAAoD,CAAC,EACtD,CAAC,gDAAgD,CAAC,EAClD,CAAC,mDAAmD,CAAC,EACrD,CAAC,0BAA0B,CAAC,EAC5B,EAAE,EACF,CAAC,sBAAsB,CAAC,EACxB,CAAC,6CAA6C,CAAC,EAC/C,CAAC,6DAA6D,CAAC,EAC/D,CAAC,wEAAwE,CAAC,EAC1E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,6EAA6E,CAAC,EAC/E,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,+EAA+E,CAAC,EACjF,CAAC,6DAA6D,CAAC,EAC/D,CAAC,0EAA0E,CAAC,EAC5E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,uEAAuE,CAAC,EACzE,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,4BAA4B,CAAC,EAC9B,EAAE,EACF,CAAC,wDAAwD,CAAC,EAC1D,EAAE,EACF,CAAC,qBAAqB,CAAC,EACvB,CAAC,sBAAsB,CAAC,EACxB,CAAC,sBAAsB,CAAC,EACxB,CAAC,0EAA0E,CAAC,EAC5E,CAAC,oEAAoE,CAAC,EACtE,CAAC,iEAAiE,CAAC,EACnE,CAAC,+CAA+C,CAAC,EACjD,CAAC,wEAAwE,CAAC,EAC1E,CAAC,yDAAyD,CAAC,EAC3D,CAAC,6EAA6E,CAAC,EAC/E,CAAC,0DAA0D,CAAC,EAC5D,EAAE,EACF,CAAC,kBAAkB,CAAC,EACpB,CAAC,wEAAwE,CAAC,EAC1E,CAAC,8EAA8E,CAAC,EAChF,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,qBAAqB,CAAC,EACvB,CAAC,yBAAyB,CAAC,EAC3B,CAAC,yGAAyG,CAAC,EAC3G,CAAC,mEAAmE,CAAC,EACrE,CAAC,uFAAuF,CAAC,EACzF,CAAC,+DAA+D,CAAC,EACjE,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,gBAAgB,CAAC,EAClB,CAAC,mDAAmD,CAAC,EACrD,CAAC,0DAA0D,CAAC,EAC5D,CAAC,yDAAyD,CAAC,EAC3D,CAAC,yCAAyC,CAAC,EAC3C,CAAC,2DAA2D,CAAC,EAC7D,EAAE;QAGJD,MAAMC,IAAI,CACR,CAAC,eAAe,CAAC,EACjB,CAAC,2EAA2E,CAAC,EAC7E,CAAC,yEAAyE,CAAC,EAC3E,CAAC,kFAAkF,CAAC,EACpF,CAAC,sGAAsG,CAAC,EACxG,EAAE;QAGJ,IAAI5C,gBAAgB;YAClB,MAAM4D,iBAAiB,IAAI,CAACtE,aAAa,CAACuE,iBAAiB;YAE3DlB,MAAMC,IAAI,CACR,CAAC,kBAAkB,CAAC,EACpB,EAAE,EACF,CAAC,SAAS,EAAEgB,eAAe9B,MAAM,CAAC,eAAe,CAAC;YAGpD,KAAK,MAAMgC,SAASF,eAAgB;gBAClCjB,MAAMC,IAAI,CAAC,CAAC,IAAI,EAAEkB,MAAMjD,IAAI,CAAC,IAAI,EAAEiD,MAAMb,WAAW,EAAE;YACxD;YAEAN,MAAMC,IAAI,CACR,EAAE,EACF,CAAC,8PAA8P,CAAC,EAChQ,EAAE,EACF5C,gBACA,EAAE;QAEN;QAEA2C,MAAMC,IAAI,CACR,CAAC,aAAa,CAAC,EACf,CAAC,qBAAqB,EAAElB,QAAQC,GAAG,IAAI,EACvC,CAAC,YAAY,EAAED,QAAQqC,QAAQ,EAAE,EACjC,CAAC,WAAW,EAAErC,QAAQsC,OAAO,EAAE,EAC/B,EAAE,EACF,CAAC,uBAAuB,CAAC,EACzBxB,SACA,EAAE;QAGJ,IAAI5C,eAAe;YACjB+C,MAAMC,IAAI,CAAChD,eAAe,EAAE;QAC9B;QAEA,IAAIE,cAAc;YAChB6C,MAAMC,IAAI,CACR,CAAC,aAAa,CAAC,EACf,CAAC,uCAAuC,CAAC,EACzC9C,cACA,EAAE;QAEN;QAEA,OAAO6C,MAAMgB,IAAI,CAAC;IACpB;IAEQM,gBAAgBC,QAAgB,EAAEC,KAAU,EAAU;QAC5D,MAAMC,MAAM;QACZ,MAAMC,OAAO;QACb,MAAMC,QAAQ;QACd,MAAMC,OAAO;QAEb,IAAIC,SAAS;QAEb,OAAQN;YACN,KAAK;gBACHM,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOM,YAAY,CAAC,CAAC,EAAEN,MAAMM,SAAS,EAAE,GAAG;gBACpD;YACF,KAAK;gBACHD,SAASL,OAAOO,UAAU,CAAC,CAAC,EAAEP,MAAMO,OAAO,EAAE,GAAG;gBAChD,IAAIP,OAAOxC,KAAK6C,UAAU,CAAC,IAAI,EAAEL,MAAMxC,GAAG,EAAE;gBAC5C;YACF,KAAK;gBACH6C,SAASL,OAAOO,UAAU,CAAC,EAAE,EAAEP,MAAMO,OAAO,CAAC,CAAC,CAAC,GAAG;gBAClD,IAAIP,OAAOQ,cAAcH,UAAU,CAAC,EAAE,EAAEL,MAAMQ,YAAY,CAAC,CAAC,CAAC;gBAC7D;YACF,KAAK;gBACH,IAAIR,OAAOS,SAAS;oBAClB,MAAMC,MAAMV,MAAMS,OAAO,CAAC9C,MAAM,GAAG,KAAKqC,MAAMS,OAAO,CAACE,KAAK,CAAC,GAAG,MAAM,QAAQX,MAAMS,OAAO;oBAC1FJ,SAAS,CAAC,CAAC,EAAEK,KAAK;gBACpB;gBACA;YACF,KAAK;gBACH,IAAIV,OAAOS,SAAS;oBAClB,MAAMC,MAAMV,MAAMS,OAAO,CAAC9C,MAAM,GAAG,KAAKqC,MAAMS,OAAO,CAACE,KAAK,CAAC,GAAG,MAAM,QAAQX,MAAMS,OAAO;oBAC1FJ,SAAS,CAAC,CAAC,EAAEK,KAAK;gBACpB;gBACA;YACF,KAAK;gBACHL,SAAS,CAAC,CAAC,EAAEL,OAAOY,aAAaZ,OAAOa,QAAQ,KAAK;gBACrD;YACF,KAAK;gBACHR,SAASL,OAAOc,QAAQ,CAAC,EAAE,EAAEd,MAAMc,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHT,SAASL,OAAOe,MAAM,CAAC,CAAC,EAAEf,MAAMe,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHV,SAASL,OAAOgB,QAAQ,CAAC,EAAE,EAAEhB,MAAMgB,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHX,SAASL,OAAOiB,KAAK,CAAC,EAAE,EAAEjB,MAAMiB,EAAE,CAAC,GAAG,EAAEjB,OAAO9B,UAAU,IAAI,GAAG;gBAChE;YACF,KAAK;gBACHmC,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOiB,KAAK,CAAC,EAAE,EAAEjB,MAAMiB,EAAE,EAAE,GAAG;gBACvC;YACF,KAAK;gBACHZ,SAASL,OAAOkB,WAAW,CAAC,EAAE,EAAElB,MAAMkB,QAAQ,CAACP,KAAK,CAAC,GAAG,MAAMX,MAAMkB,QAAQ,CAACvD,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,CAAC,GAAG;gBAC3G;YACF,KAAK;gBACH0C,SAAS;gBACT;YACF,KAAK;gBACHA,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOmB,MAAM,CAAC,CAAC,EAAEnB,MAAMmB,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHd,SAASL,OAAOmB,MAAM,CAAC,CAAC,EAAEnB,MAAMmB,GAAG,EAAE,GAAG;gBACxC;YACF,KAAK;gBACHd,SAASL,OAAOc,QAAQ,CAAC,EAAE,EAAEd,MAAMc,KAAK,CAAC,CAAC,CAAC,GAAG;gBAC9C;YACF,KAAK;gBACHT,SAAS;gBACT;YACF,KAAK;gBACHA,SAASL,OAAOjB,SAAS,CAAC,QAAQ,EAAEiB,MAAMjB,MAAM,EAAE,GAAG;gBACrD;YACF;gBACE,IAAIiB,OAAO;oBACT,MAAMoB,OAAOC,OAAOD,IAAI,CAACpB;oBACzB,IAAIoB,KAAKzD,MAAM,GAAG,GAAG;wBACnB,MAAM2D,WAAWC,OAAOvB,KAAK,CAACoB,IAAI,CAAC,EAAE,CAAC,EAAET,KAAK,CAAC,GAAG;wBACjDN,SAAS,CAAC,CAAC,EAAEe,IAAI,CAAC,EAAE,CAAC,CAAC,EAAEE,UAAU;oBACpC;gBACF;QACJ;QAEA,OAAO,CAAC,EAAE,EAAErB,IAAI,EAAE,EAAEC,OAAOE,OAAOD,QAAQF,IAAI,CAAC,EAAEF,WAAWM,SAASF,MAAM,EAAE,CAAC;IAChF;IAEQqB,cAAczB,QAAgB,EAAE0B,MAAc,EAAU;QAC9D,IAAI,CAACA,UAAUA,OAAO9D,MAAM,KAAK,GAAG,OAAO;QAE3C,MAAMsC,MAAM;QACZ,MAAMyB,QAAQ;QACd,MAAMvB,QAAQ;QAEd,OAAQJ;YACN,KAAK;gBAAa;oBAChB,MAAM4B,YAAYF,OAAOG,KAAK,CAAC,MAAMjE,MAAM;oBAC3C,OAAO,GAAGsC,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAE0B,UAAU,MAAM,EAAExB,MAAM,EAAE,CAAC;gBAC9E;YACA,KAAK;gBACH,OAAO,GAAGF,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;YACnF,KAAK;gBAAa;oBAChB,IAAIsB,OAAOI,UAAU,CAAC,UAAU;wBAC9B,OAAO,GAAG5B,IAAI,YAAY,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;oBAC9D;oBACA,OAAO,GAAGF,IAAI,IAAI,EAAEyB,MAAM,MAAM,EAAEvB,QAAQF,IAAI,CAAC,EAAEwB,OAAOd,KAAK,CAAC,GAAG,OAAOR,MAAM,EAAE,CAAC;gBACnF;YACA,KAAK;gBAAQ;oBACX,MAAM2B,QAAQL,OAAOG,KAAK,CAAC,MAAMrF,MAAM,CAACwF,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAM+D,YAAYF,MAAMnE,MAAM;oBAC9B,MAAMsE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOF,YAAY,IAAI,CAAC,EAAE,EAAE/B,IAAI,SAAS,EAAE+B,YAAY,EAAE,MAAM,EAAE7B,OAAO,GAAG;oBACjF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;gBAAQ;oBACX,MAAMJ,QAAQL,OAAOG,KAAK,CAAC,MAAMrF,MAAM,CAACwF,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAMgE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMnE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEsC,IAAI,SAAS,EAAE6B,MAAMnE,MAAM,GAAG,EAAE,MAAM,EAAEwC,OAAO,GAAG;oBACvF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;YACL,KAAK;gBAAoB;oBACvB,MAAMJ,QAAQL,OAAOG,KAAK,CAAC;oBAC3B,MAAMK,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMnE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEsC,IAAI,SAAS,EAAE6B,MAAMnE,MAAM,GAAG,EAAE,YAAY,EAAEwC,OAAO,GAAG;oBAC7F,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA,KAAK;gBAAM;oBACT,MAAMJ,QAAQL,OAAOG,KAAK,CAAC,MAAMrF,MAAM,CAACwF,CAAAA,IAAKA,EAAE9D,IAAI;oBACnD,MAAMgE,UAAUH,MAAMnB,KAAK,CAAC,GAAG,IAAIpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,IAAI5B,OAAO,EAAEX,IAAI,CAAC;oBAC3E,MAAM0C,OAAOJ,MAAMnE,MAAM,GAAG,KAAK,CAAC,EAAE,EAAEsC,IAAI,SAAS,EAAE6B,MAAMnE,MAAM,GAAG,GAAG,MAAM,EAAEwC,OAAO,GAAG;oBACzF,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;YACA;gBAAS;oBACP,MAAMJ,QAAQL,OAAOG,KAAK,CAAC;oBAC3B,MAAMK,UAAUH,MAAMnB,KAAK,CAAC,GAAG,GAAGpC,GAAG,CAACwD,CAAAA,IAAK,GAAG9B,IAAI,IAAI,EAAE8B,EAAEpB,KAAK,CAAC,GAAG,OAAOR,OAAO,EAAEX,IAAI,CAAC;oBACxF,MAAM0C,OAAOJ,MAAMnE,MAAM,GAAG,IAAI,CAAC,EAAE,EAAEsC,IAAI,SAAS,EAAE6B,MAAMnE,MAAM,GAAG,EAAE,YAAY,EAAEwC,OAAO,GAAG;oBAC7F,OAAO,GAAG8B,UAAUC,KAAK,EAAE,CAAC;gBAC9B;QACF;IACF;IAEA,MAAcC,cAAcC,QAAQ,KAAK,EAAoB;QAC3D,IAAI,AAAC,CAACA,SAAS,IAAI,CAACC,QAAQ,CAAC1E,MAAM,GAAGvE,uBAAwB,CAAC,IAAI,CAACkC,KAAK,EAAE;YACzE,OAAO;QACT;QAEA,IAAI,IAAI,CAAC+G,QAAQ,CAAC1E,MAAM,GAAG,GAAG;YAC5B,OAAO;QACT;QAEA,MAAM2E,cAAc,IAAI,CAACD,QAAQ,CAAC1B,KAAK,CAAC,GAAG,IAAI,CAAC0B,QAAQ,CAAC1E,MAAM,GAAGtE;QAClE,MAAMkJ,iBAAiB,IAAI,CAACF,QAAQ,CAAC1B,KAAK,CAAC,IAAI,CAAC0B,QAAQ,CAAC1E,MAAM,GAAGtE;QAElE,MAAMmJ,mBAAmBF,YAAY/D,GAAG,CAAC,CAACkE;YACxC,MAAMC,OAAOD,EAAEE,QAAQ,OAAO,UAAU,SAAS;YACjD,MAAMC,UAAU,OAAOH,EAAEG,OAAO,KAAK,WAAWH,EAAEG,OAAO,GAAGC,KAAKC,SAAS,CAACL,EAAEG,OAAO;YACpF,MAAMG,YAAYH,QAAQjF,MAAM,GAAG,MAAMiF,QAAQjC,KAAK,CAAC,GAAG,OAAO,QAAQiC;YACzE,OAAO,GAAGF,KAAK,EAAE,EAAEK,WAAW;QAChC,GAAGvD,IAAI,CAAC;QAER,IAAI;YACF,MAAMwD,kBAAkB,MAAM,IAAI,CAAC1H,KAAK,CAAC2H,MAAM,CAAC;gBAC9C,IAAIC,uBAAa,CACf,CAAC;;;;;uEAK4D,CAAC;gBAEhE,IAAIC,sBAAY,CAACX;aAClB;YAED,MAAMY,cAAc,OAAOJ,gBAAgBJ,OAAO,KAAK,WACnDI,gBAAgBJ,OAAO,GACvBC,KAAKC,SAAS,CAACE,gBAAgBJ,OAAO;YAE1C,IAAI,CAACP,QAAQ,GAAG;gBACd,IAAIa,uBAAa,CAAC,CAAC,wBAAwB,EAAEZ,YAAY3E,MAAM,CAAC,wBAAwB,EAAEyF,aAAa;mBACpGb;aACJ;YAED,OAAO;QACT,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEA,OAAOc,KAAKC,OAAe,EAA0B;QACnD,MAAMC,aAAa,MAAM,IAAI,CAACpB,aAAa;QAC3C,IAAIoB,YAAY;YACd,MAAM,CAAC,0CAA0C,EAAE,IAAI,CAAClB,QAAQ,CAAC1E,MAAM,CAAC,4BAA4B,CAAC;QACvG;QAEA,IAAI,CAAC0E,QAAQ,CAAC5D,IAAI,CAAC,IAAI0E,sBAAY,CAACG;QACpC,IAAI,CAACE,eAAe,GAAG,EAAE;QAEzB,IAAIC;QACJ,IAAI;YACFA,SAAS,IAAI,CAACxG,KAAK,CAACyG,YAAY,CAC9B;gBAAErB,UAAU,IAAI,CAACA,QAAQ;YAAC,GAC1B;gBAAExC,SAAS;gBAAM8D,gBAAgBrK;YAAgB;QAErD,EAAE,OAAOsK,OAAO;YACd,MAAM,CAAC,kCAAkC,EAAE,AAACA,MAAgBN,OAAO,CAAC,SAAS,CAAC;YAC9E;QACF;QAEA,IAAIO,eAAe;QACnB,IAAIC,eAAe;QACnB,IAAIC,yBAAyB;QAC7B,IAAIC,0BAA0B;QAE9B,IAAI;YACF,WAAW,MAAMC,SAASR,OAAQ;gBAChC,IAAIQ,MAAMA,KAAK,KAAK,0BAA0BA,MAAMC,IAAI,EAAEC,OAAOvB,SAAS;oBACxE,MAAMA,UAAUqB,MAAMC,IAAI,CAACC,KAAK,CAACvB,OAAO;oBACxC,IAAI,OAAOA,YAAY,YAAYA,SAAS;wBAC1C,MAAMA;wBACNiB,gBAAgBjB;oBAClB;gBACF;gBAEA,IAAIqB,MAAMA,KAAK,KAAK,qBAAqB;oBACvC,MAAMxC,SAASwC,MAAMC,IAAI,EAAEzC;oBAC3B,MAAM2C,QAAQ3C,QAAQ4C,kBACjB5C,QAAQ6C,mBAAmBF;oBAChC,IAAIA,OAAO;wBACTL,0BAA0BK,MAAMG,YAAY,IAAIH,MAAMI,aAAa,IAAIJ,MAAMK,YAAY,IAAI;wBAC7FT,2BAA2BI,MAAMM,aAAa,IAAIN,MAAMO,iBAAiB,IAAIP,MAAMQ,gBAAgB,IAAI;oBACzG;gBACF;gBAEA,IAAIX,MAAMA,KAAK,KAAK,iBAAiB;oBACnCH,eAAeG,MAAMvH,IAAI;oBACzB,MAAM,IAAI,CAACoD,eAAe,CAACmE,MAAMvH,IAAI,EAAEuH,MAAMC,IAAI,EAAElE;gBACrD;gBAEA,IAAIiE,MAAMA,KAAK,KAAK,eAAe;oBACjC,MAAMY,MAAMZ,MAAMC,IAAI,EAAEzC;oBACxB,IAAIA,SAAS;oBACb,IAAI,OAAOoD,QAAQ,UAAU;wBAC3BpD,SAASoD;oBACX,OAAO,IAAIA,KAAKjC,SAAS;wBACvBnB,SAAS,OAAOoD,IAAIjC,OAAO,KAAK,WAAWiC,IAAIjC,OAAO,GAAGC,KAAKC,SAAS,CAAC+B,IAAIjC,OAAO;oBACrF,OAAO,IAAIiC,KAAKpD,QAAQ;wBACtBA,SAAS,OAAOoD,IAAIpD,MAAM,KAAK,WAAWoD,IAAIpD,MAAM,GAAGoB,KAAKC,SAAS,CAAC+B,IAAIpD,MAAM;oBAClF,OAAO,IAAIoD,KAAK;wBACdpD,SAAS,OAAOoD,QAAQ,WAAWhC,KAAKC,SAAS,CAAC+B,OAAOtD,OAAOsD;oBAClE;oBACA,IAAIpD,QAAQ;wBACV,IAAI,CAAC+B,eAAe,CAAC/E,IAAI,CAAC;4BAAEqG,MAAMhB;4BAAcrC;wBAAO;wBACvD,MAAM,IAAI,CAACD,aAAa,CAACsC,cAAcrC;oBACzC;gBACF;gBAEA,IAAIwC,MAAMA,KAAK,KAAK,iBAAiB;oBACnC,MAAML,QAAQK,MAAMC,IAAI,EAAEN;oBAC1B,MAAM,CAAC,0BAA0B,EAAEA,OAAON,WAAW,gBAAgB,SAAS,CAAC;gBACjF;YACF;QACF,EAAE,OAAOM,OAAO;YACd,MAAMmB,MAAM,AAACnB,MAAgBN,OAAO;YACpC,IAAI,CAACyB,IAAIC,QAAQ,CAAC,YAAY,CAACD,IAAIC,QAAQ,CAAC,WAAW;gBACrD,MAAM,CAAC,0BAA0B,EAAED,IAAI,SAAS,CAAC;YACnD;QACF;QAEA,IAAIlB,cAAc;YAChB,IAAI,CAACxB,QAAQ,CAAC5D,IAAI,CAAC,IAAIwG,mBAAS,CAACpB;QACnC;QAEA,IAAI,CAACqB,UAAU,IAAInB,yBAAyBC;QAE5C,MAAMmB,MAAM,CAACC,IAAcA,EAAEC,cAAc;QAC3C,MAAM,CAAC,0BAA0B,EAAEF,IAAIpB,wBAAwB,MAAM,EAAEoB,IAAInB,yBAAyB,eAAe,EAAEmB,IAAI,IAAI,CAACD,UAAU,EAAE,UAAU,CAAC;IACvJ;IAEAI,eAAe;QACb,IAAI,CAACjD,QAAQ,GAAG,EAAE;QAClB,IAAI,CAAC6C,UAAU,GAAG;IACpB;IAEA,MAAMK,iBAAiG;QACrG,MAAMC,SAAS,IAAI,CAACnD,QAAQ,CAAC1E,MAAM;QACnC,IAAI6H,SAAS,GAAG;YACd,OAAO;gBAAEC,WAAW;gBAAOC,gBAAgBF;gBAAQG,eAAeH;YAAO;QAC3E;QACA,MAAMpH,SAAS,MAAM,IAAI,CAAC+D,aAAa,CAAC;QACxC,OAAO;YAAEsD,WAAWrH;YAAQsH,gBAAgBF;YAAQG,eAAe,IAAI,CAACtD,QAAQ,CAAC1E,MAAM;QAAC;IAC1F;IAEAiI,aAA4B;QAC1B,OAAO,IAAI,CAACvD,QAAQ;IACtB;IAEAwD,kBAA0B;QACxB,OAAO,IAAI,CAACxD,QAAQ,CAAC1E,MAAM;IAC7B;IAEAmI,gBAAwB;QACtB,OAAO,IAAI,CAACZ,UAAU;IACxB;IAEAa,qBAAyD;QACvD,OAAO,IAAI,CAACvC,eAAe;IAC7B;IAEA,MAAMwC,YAAYC,IAAU,EAAiD;QAC3E,IAAI;YACF,MAAM3C,UAAU,CAAC,gCAAgC,EAAE2C,KAAKC,OAAO,CAAC,MAAM,EAAED,KAAKnH,WAAW,CAAC,2EAA2E,CAAC;YAErK,IAAI+E,eAAe;YACnB,WAAW,MAAMM,SAAS,IAAI,CAACd,IAAI,CAACC,SAAU;gBAC5CO,gBAAgBM;gBAChB5G,QAAQ4I,MAAM,CAACC,KAAK,CAACjC;YACvB;YAEA,OAAO;gBAAEkC,SAAS;YAAK;QACzB,EAAE,OAAOzC,OAAO;YACd,OAAO;gBAAEyC,SAAS;gBAAOzC,OAAO,AAACA,MAAgBN,OAAO;YAAC;QAC3D;IACF;IAj1BA,YACE,AAAiB5J,aAA4B,EAC7C,AAAiB6B,eAAgC,EACjD,AAAiBV,aAAmC,EACpD,AAAiBqB,aAAmC,EACpD,AAAiB5B,WAA+B,EAChD,AAAiBR,aAAmC,EACpD,AAAiBK,cAAqC,EACtD,AAAiBgB,aAAmC,EACpD,AAAiBE,aAA4B,EAC7C,AAAiBiL,gBAAyC,CAC1D;aAViB5M,gBAAAA;aACA6B,kBAAAA;aACAV,gBAAAA;aACAqB,gBAAAA;aACA5B,cAAAA;aACAR,gBAAAA;aACAK,iBAAAA;aACAgB,gBAAAA;aACAE,gBAAAA;aACAiL,mBAAAA;aAfXhL,QAA8B;aAC9B+G,WAA0B,EAAE;aAC5B6C,aAAa;aACb1B,kBAAsD,EAAE;IAa7D;AAu0BL"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/core/services/deep-agent.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { HumanMessage, AIMessage, SystemMessage, BaseMessage } from '@langchain/core/messages';\nimport { execSync } from 'child_process';\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { MultiLlmService } from '../../../common/services/multi-llm.service';\nimport { MarkdownRendererService } from '../../../common/services/markdown-renderer.service';\nimport { AgentRegistryService } from '../../agents/services/agent-registry.service';\nimport { ToolsRegistryService } from '../../tools/services/tools-registry.service';\nimport { McpRegistryService } from '../../mcp/services/mcp-registry.service';\nimport { ProjectLoaderService } from '../../project/services/project-loader.service';\nimport { ProjectContextService } from '../../project/services/project-context.service';\nimport { SkillRegistryService } from '../../skills/services/skill-registry.service';\nimport { MemoryService } from '../../memory/services/memory.service';\nimport { ProjectInitResult } from '../../project/types';\nimport { Task } from '../../tasks/types/task.types';\nimport { McpServerSummary } from '../../mcp/types';\n\nconst SUMMARIZE_THRESHOLD = 40;\nconst KEEP_RECENT = 10;\nconst RECURSION_LIMIT = 100;\nconst DEEPAGENT_BUILTIN_TOOLS = new Set([\n 'read_file', 'write_file', 'edit_file', 'glob', 'grep', 'ls',\n 'write_todos', 'task',\n]);\n\n@Injectable()\nexport class DeepAgentService {\n private agent: any;\n private model: BaseChatModel | null = null;\n private messages: BaseMessage[] = [];\n private tokenCount = 0;\n private lastToolOutputs: { tool: string; output: string }[] = [];\n\n private cachedSystemPrompt: string = '';\n private cachedExtraTools: any[] = [];\n private cachedMcpTools: any[] = [];\n private cachedMcpDiscoveryTools: any[] = [];\n private cachedSubagents: any[] = [];\n\n constructor(\n private readonly multiLlmService: MultiLlmService,\n private readonly agentRegistry: AgentRegistryService,\n private readonly toolsRegistry: ToolsRegistryService,\n private readonly mcpRegistry: McpRegistryService,\n private readonly projectLoader: ProjectLoaderService,\n private readonly projectContext: ProjectContextService,\n private readonly skillRegistry: SkillRegistryService,\n private readonly memoryService: MemoryService,\n private readonly markdownRenderer: MarkdownRendererService,\n ) {}\n\n async initialize(): Promise<ProjectInitResult> {\n const projectPath = await this.projectLoader.detectProject();\n\n if (projectPath) {\n const projectConfig = await this.projectLoader.loadProject(projectPath);\n\n if (projectConfig.context) {\n this.projectContext.setContext(projectConfig.context);\n }\n\n if (projectConfig.mcpConfigs) {\n this.mcpRegistry.loadConfigs(projectConfig.mcpConfigs);\n await this.mcpRegistry.connectAll();\n }\n\n const agentsOverridePath = this.projectLoader.getAgentsOverridePath(projectPath);\n const legacyAgentsOverridePath = this.projectLoader.getLegacyAgentsOverridePath(projectPath);\n await this.agentRegistry.loadProjectAgents(agentsOverridePath);\n await this.agentRegistry.loadProjectAgents(legacyAgentsOverridePath);\n\n const skillsOverridePath = this.projectLoader.getSkillsOverridePath(projectPath);\n const legacySkillsOverridePath = this.projectLoader.getLegacySkillsOverridePath(projectPath);\n await this.skillRegistry.loadProjectSkills(skillsOverridePath);\n await this.skillRegistry.loadProjectSkills(legacySkillsOverridePath);\n\n await this.memoryService.initialize(projectPath);\n }\n\n this.model = this.multiLlmService.createStreamingModel('default');\n\n const contextPrompt = this.projectContext.getContextPrompt();\n const memoryPrompt = await this.memoryService.getMemoryPrompt();\n const skillKnowledge = this.skillRegistry.getAllSkillKnowledge();\n const subagents = this.agentRegistry.getSubagentDefinitions(contextPrompt);\n const allTools = this.toolsRegistry.getAllTools();\n const mcpTools = this.mcpRegistry.getAllMcpTools();\n\n const extraTools = allTools.filter(t => !DEEPAGENT_BUILTIN_TOOLS.has(t.name));\n const mcpDiscoveryTools = this.mcpRegistry.getDiscoveryTools();\n const mcpServerSummaries = this.mcpRegistry.getServerSummaries();\n\n const systemPrompt = this.buildSystemPrompt(contextPrompt, memoryPrompt, skillKnowledge, subagents, allTools, mcpTools, mcpServerSummaries);\n\n this.cachedSystemPrompt = systemPrompt;\n this.cachedExtraTools = extraTools;\n this.cachedMcpTools = mcpTools;\n this.cachedMcpDiscoveryTools = mcpDiscoveryTools;\n this.cachedSubagents = subagents;\n\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt,\n tools: [...extraTools, ...mcpTools, ...mcpDiscoveryTools],\n subagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n\n return {\n projectPath,\n hasContext: this.projectContext.hasContext(),\n agentCount: subagents.length,\n toolCount: extraTools.length + mcpTools.length,\n };\n }\n\n async reinitializeModel(): Promise<void> {\n this.model = this.multiLlmService.createStreamingModel('default');\n this.agent = createDeepAgent({\n model: this.model,\n systemPrompt: this.cachedSystemPrompt,\n tools: [...this.cachedExtraTools, ...this.cachedMcpTools, ...this.cachedMcpDiscoveryTools],\n subagents: this.cachedSubagents,\n backend: () => new FilesystemBackend({ rootDir: process.cwd() }),\n });\n }\n\n private getGitStatus(): string {\n try {\n const branch = execSync('git rev-parse --abbrev-ref HEAD 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const status = execSync('git status --short 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n const log = execSync('git log --oneline -5 2>/dev/null', {\n encoding: 'utf-8',\n cwd: process.cwd(),\n }).trim();\n\n let result = `Branch: ${branch}`;\n if (status) {\n result += `\\nChanges:\\n${status}`;\n } else {\n result += `\\nStatus: clean`;\n }\n if (log) {\n result += `\\nRecent commits:\\n${log}`;\n }\n return result;\n } catch {\n return 'Not a git repository';\n }\n }\n\n private buildSystemPrompt(\n contextPrompt: string,\n memoryPrompt: string,\n skillKnowledge: string,\n subagents: any[],\n tools: any[],\n mcpTools: any[],\n mcpServerSummaries: McpServerSummary[] = [],\n ): string {\n const gitInfo = this.getGitStatus();\n const allToolNames = [\n ...tools.map((t: any) => t.name),\n ...mcpTools.map((t: any) => t.name),\n ];\n\n const parts: string[] = [];\n\n parts.push(\n `You are Cast, an autonomous AI coding assistant running as a CLI tool.`,\n `You are a highly capable agent that can independently explore codebases, make decisions, execute multi-step plans, and delegate work to specialized sub-agents. You help developers with software engineering tasks including writing code, debugging, refactoring, and answering questions about codebases.`,\n ``,\n );\n\n parts.push(\n `# CRITICAL RULES`,\n ``,\n `## NEVER Guess — ALWAYS Verify`,\n `- NEVER say a file \"doesn't exist\" without FIRST using glob or read_file to check`,\n `- NEVER guess file contents — ALWAYS read_file before answering about a file`,\n `- NEVER assume a directory structure — ALWAYS use ls or glob to discover it`,\n `- NEVER say \"I don't have access\" — you DO have access through your tools`,\n `- If a user mentions a file path, your FIRST action must be to read it or verify it exists`,\n ``,\n `## Read Before Edit`,\n `- ALWAYS use read_file on a file before using edit_file or write_file on it`,\n `- NEVER edit a file you haven't read in this conversation`,\n `- Understand existing code before suggesting modifications`,\n ``,\n `## Minimal Changes`,\n `- Only make changes that are directly requested or clearly necessary`,\n `- Don't add features, refactor code, or make \"improvements\" beyond what was asked`,\n `- Don't add docstrings, comments, or type annotations to code you didn't change`,\n `- Preserve existing code style and conventions`,\n ``,\n );\n\n const builtInCount = tools.length;\n const mcpCount = mcpTools.length;\n const discoveryCount = 2;\n\n parts.push(\n `# Available Tools`,\n ``,\n `You have ${allToolNames.length} tools available:`,\n `- **Built-in**: ${builtInCount} tools (read_file, write_file, edit_file, glob, grep, ls, shell, task management, memory)`,\n );\n\n if (mcpCount > 0) {\n const serverCount = mcpServerSummaries.length;\n parts.push(`- **MCP**: ${mcpCount} tools from ${serverCount} server(s)`);\n }\n\n if (mcpCount > 0) {\n parts.push(`- **Discovery**: ${discoveryCount} tools (mcp_list_servers, mcp_list_tools)`);\n }\n\n parts.push(\n ``,\n `USE THEM PROACTIVELY.`,\n ``,\n );\n\n if (tools.length > 0) {\n parts.push(`## Built-in Tools`);\n for (const t of tools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n parts.push(``);\n }\n\n if (mcpTools.length > 0) {\n parts.push(`## MCP Tools (External Services)`);\n parts.push(``);\n parts.push(`**⚠️ Important**: Only tools from servers with status \"connected\" are available. Tools from disconnected servers will fail.`);\n parts.push(``);\n\n if (mcpServerSummaries.length > 0) {\n for (const server of mcpServerSummaries) {\n const statusIcon = server.status === 'connected' ? '✓' : '✗';\n parts.push(`### ${statusIcon} ${server.name} (${server.transport}, ${server.status}) — ${server.toolCount} tools`);\n for (const td of server.toolDescriptions) {\n parts.push(`- **${td.name}**: ${td.description}`);\n }\n }\n } else {\n for (const t of mcpTools) {\n parts.push(`- **${t.name}**: ${t.description}`);\n }\n }\n parts.push(`## MCP Discovery Tools`);\n parts.push(`- **mcp_list_servers**: List all connected MCP servers with status and tool counts`);\n parts.push(`- **mcp_list_tools**: List tools from a specific server or all servers`);\n parts.push(``);\n }\n\n parts.push(\n `# Tool Usage Guidelines`,\n ``,\n `## File Operations`,\n `- Use **read_file** to read file contents. Always read before editing.`,\n `- Use **write_file** only to create NEW files. Prefer edit_file for existing files.`,\n `- Use **edit_file** for precise string replacements in existing files.`,\n ` - Provide enough context in old_string to make it unique`,\n ` - Use replace_all=true only when renaming across the file`,\n ``,\n `## Search & Discovery`,\n `- Use **glob** to find files by pattern (e.g., \"**/*.ts\", \"src/**/*.service.ts\")`,\n `- Use **grep** to search content within files (supports regex)`,\n ` - Use context_lines to see surrounding code`,\n ` - Use output_mode=\"files_with_matches\" to just find file paths`,\n `- Use **ls** to list directory contents`,\n `- When looking for something, try glob first, then grep if needed`,\n ``,\n `## Shell Commands`,\n `- Use **shell** for git, npm, docker, and other CLI operations`,\n `- Dangerous commands (rm -rf, sudo, git push --force) require user approval`,\n `- Use **shell_background** for long-running tasks (dev servers, watch mode)`,\n ``,\n `## Task Management`,\n `- Use **task_create** to break complex work into trackable subtasks`,\n `- Use **task_update** to mark tasks as in_progress or completed`,\n `- Use **task_list** to see all tasks and their status`,\n `- Use **ask_user_question** when you need clarification BEFORE acting`,\n ``,\n `## Memory`,\n `- Use **memory_write** to save important learnings and project insights`,\n `- Use **memory_read** to recall previously saved notes`,\n `- Memory persists across sessions — use it to avoid repeating mistakes`,\n ``,\n );\n\n if (mcpTools.length > 0) {\n parts.push(\n `# MCP Integration Protocol`,\n ``,\n `MCP (Model Context Protocol) tools connect you to external services. They work exactly like built-in tools but reach outside the local filesystem.`,\n ``,\n `## Connected Servers`,\n );\n if (mcpServerSummaries.length > 0) {\n for (const s of mcpServerSummaries) {\n parts.push(`- **${s.name}** (${s.transport}, ${s.status}) — ${s.toolCount} tools`);\n }\n }\n parts.push(\n ``,\n `## When to Use MCP vs Built-in`,\n `| Need | Use |`,\n `|------|-----|`,\n `| Read/write local files | Built-in (read_file, write_file, edit_file) |`,\n `| Search local codebase | Built-in (glob, grep) |`,\n `| Run commands | Built-in (shell) |`,\n `| Interact with external APIs/services | MCP tools |`,\n `| Discover available MCP capabilities | mcp_list_servers, mcp_list_tools |`,\n ``,\n `## MCP Tool Naming Convention`,\n `MCP tools follow the pattern \\`{server}_{tool}\\` (e.g., \\`figma_get_file\\`, \\`github_create_issue\\`).`,\n `The prefix tells you which server provides the tool.`,\n ``,\n `## Discovery`,\n `- Use **mcp_list_servers** to see which servers are connected and their status`,\n `- Use **mcp_list_tools** to explore what tools a server provides (with descriptions)`,\n `- When you're unsure which MCP tool to use, call mcp_list_tools first`,\n ``,\n `## Error Handling`,\n `- If an MCP tool returns an error, check the server status with mcp_list_servers`,\n `- MCP servers can disconnect — if a tool fails, the server may need reconnection`,\n `- Report MCP errors to the user and suggest they check /mcp list in the REPL`,\n ``,\n );\n }\n\n parts.push(\n `# Planning Protocol`,\n ``,\n `## When to Enter Plan Mode`,\n `Use **enter_plan_mode** when:`,\n `- Task touches 3+ files`,\n `- Task involves new features or architecture changes`,\n `- Task is ambiguous and needs scope definition`,\n `- User explicitly asks for a plan`,\n ``,\n `Do NOT plan for: simple fixes, single-file edits, questions, explanations`,\n ``,\n `## Plan Mode Workflow`,\n `1. **enter_plan_mode** — signals you are planning`,\n `2. **Explore rapidly**: Use glob and grep efficiently to understand codebase`,\n `3. **Design**: Create structured plan with specific file changes and order`,\n `4. **exit_plan_mode** — present plan for approval`,\n `5. **Execute immediately** after approval without asking for further confirmation`,\n ``,\n `## Critical: Autonomous Execution`,\n `AFTER the user approves your plan, you MUST:`,\n `- Start implementing immediately`,\n `- Create tasks and execute them sequentially`,\n `- Do NOT ask \"should I proceed?\" or \"ready to start?\"`,\n `- Do NOT wait for additional confirmation`,\n `- Just execute the approved plan autonomously`,\n ``,\n `## Plan Quality Rules`,\n `- Specify WHAT changes and WHY for each file`,\n `- Order by dependency (foundations first)`,\n `- Include verification at the end`,\n `- Use ask_user_question ONLY to clarify requirements, not to ask for permission to execute`,\n ``,\n );\n\n if (subagents.length > 0) {\n parts.push(\n `# Sub-Agent Orchestration`,\n ``,\n `You have ${subagents.length} specialized sub-agents available. Each has domain-specific knowledge and tools.`,\n ``,\n `## Available Sub-Agents`,\n );\n for (const sa of subagents) {\n const mcpAnnotation = sa.mcp && sa.mcp.length > 0 ? ` [MCP: ${sa.mcp.join(', ')}]` : '';\n parts.push(`- **${sa.name}**: ${sa.description}${mcpAnnotation}`);\n }\n parts.push(\n ``,\n `## When to Delegate to Sub-Agents`,\n `- Task requires specialized domain knowledge (React, testing, API design, databases)`,\n `- Multiple independent subtasks can be worked on in parallel`,\n `- Task is well-defined and self-contained (a sub-agent can complete it without further guidance)`,\n `- You want a focused review or analysis (e.g., code review, architecture review)`,\n ``,\n `## When NOT to Delegate`,\n `- Simple tasks you can do yourself quickly`,\n `- Tasks that require back-and-forth with the user`,\n `- Tasks that depend heavily on earlier context in this conversation`,\n ``,\n `## Delegation Pattern`,\n `1. Identify the task and which sub-agent is best suited`,\n `2. Create a clear, specific task description with all necessary context`,\n `3. Delegate execution to that sub-agent (do not stop at planning only)`,\n `4. Track delegated work with task_create/task_update`,\n `5. When the sub-agent returns, verify the result and integrate it`,\n `6. Mark the task as completed`,\n ``,\n `## Delegation Quality Bar`,\n `- If user explicitly asks to use a specific sub-agent, you MUST delegate to it`,\n `- For frontend UI generation from Figma, prefer the frontend sub-agent when available`,\n `- Avoid fake delegation: creating tasks without executing delegated work is not enough`,\n `- Return concrete delegated outputs (files changed, decisions made, validations run)`,\n ``,\n `## Multi-Agent Coordination`,\n `For large tasks, you can orchestrate multiple sub-agents:`,\n `1. Break the work into independent pieces`,\n `2. Assign each piece to the most qualified sub-agent`,\n `3. Track progress with task_create/task_update`,\n `4. Integrate results and verify the combined output`,\n ``,\n `## MCP-Aware Delegation`,\n `When a task involves heavy interaction with an external service (e.g., fetching Figma designs, managing GitHub issues):`,\n `- Check which sub-agents have MCP access (annotated with [MCP: name] above)`,\n `- Delegate MCP-heavy work to the sub-agent with the right MCP connection`,\n `- If no sub-agent has the needed MCP, handle it yourself using the MCP tools directly`,\n `- Include the MCP server name in the task description so the sub-agent knows which tools to use`,\n ``,\n );\n }\n\n parts.push(\n `# Execution Protocol`,\n ``,\n `## Exploring a Project`,\n `1. ls the root directory`,\n `2. Read key config files (package.json, tsconfig.json, etc.)`,\n `3. glob to map directory tree with key patterns`,\n `4. Read the most important files (entry points, main modules)`,\n `5. Present a structured summary`,\n `Be EXHAUSTIVE. Read as many files as needed.`,\n ``,\n `## Implementing Changes`,\n `1. Understand the current codebase (read relevant files)`,\n `2. If complex (3+ files): use enter_plan_mode`,\n `3. Create a task list with task_create for each step`,\n `4. Execute each step, marking tasks as completed`,\n `5. Verify changes (re-read edited files, run tests)`,\n `6. Summarize what was done`,\n ``,\n `## Tool Chain Patterns`,\n `- **Find something**: glob → grep → read_file`,\n `- **Edit a file**: read_file → edit_file → read_file (verify)`,\n `- **Explore a module**: ls → glob(\"module/**/*\") → read_file (key files)`,\n `- **Debug an issue**: grep (error) → read_file → edit_file → shell (test)`,\n `- **New feature**: enter_plan_mode → task_create → [implement] → shell (test)`,\n ``,\n `## Thoroughness Rules`,\n `- NEVER give up after one failed search. Try different patterns and approaches.`,\n `- ALWAYS verify changes by re-reading the file after editing.`,\n `- If tests exist, run them after changes: shell(\"npm test\") or equivalent.`,\n `- When you encounter an error, analyze and fix it — don't just report it.`,\n `- If blocked, try a different approach. If still blocked, ask the user.`,\n ``,\n );\n\n parts.push(\n `# Autonomous Decision-Making`,\n ``,\n `You are an autonomous agent. Make decisions proactively:`,\n ``,\n `## Decision Framework`,\n `| Situation | Action |`,\n `|-----------|--------|`,\n `| User asks to implement something | Explore first, then plan if complex |`,\n `| You find a bug while working | Fix it AND mention it to the user |`,\n `| Test fails after your change | Analyze the failure and fix it |`,\n `| Build fails | Read the error, fix the cause |`,\n `| File you need doesn't exist | Search broader, check for alternatives |`,\n `| Task is ambiguous | ask_user_question BEFORE starting |`,\n `| Task has multiple approaches | Briefly explain options, pick the best one |`,\n `| Something could break | Use enter_plan_mode and verify |`,\n ``,\n `## Self-Correction`,\n `- After editing, always re-read the file to verify the change is correct`,\n `- If a tool call fails, understand why and adjust (don't retry the same thing)`,\n `- If your approach isn't working after 3 attempts, step back and reconsider`,\n `- Save important learnings with memory_write so you don't repeat mistakes`,\n ``,\n );\n\n parts.push(\n `# Git Safety Protocol`,\n `- NEVER update git config`,\n `- NEVER run destructive git commands (push --force, reset --hard, clean -f) without explicit user request`,\n `- NEVER skip hooks (--no-verify) unless user explicitly requests it`,\n `- When committing: stage specific files (not \"git add -A\"), write clear commit messages`,\n `- When creating PRs: summarize all commits, not just the latest`,\n ``,\n );\n\n parts.push(\n `# Response Style`,\n `- Be concise in responses but thorough in your work`,\n `- Show your work: mention which tools you're using and why`,\n `- When showing code changes, explain WHAT changed and WHY`,\n `- Use markdown formatting for readability`,\n `- Reference files with their path (e.g., \"In src/main.ts:\")`,\n ``,\n );\n\n parts.push(\n `# User Mentions`,\n `When the user's message contains <file>, <directory>, <url>, or <git> tags,`,\n `these are automatically injected file/directory contents from @ mentions.`,\n `The content inside these tags is REAL and CURRENT — trust it and use it to answer.`,\n `Do NOT re-read a file that was already provided via a mention tag unless you need a different section.`,\n ``,\n );\n\n if (skillKnowledge) {\n const skillSummaries = this.skillRegistry.getSkillSummaries();\n\n parts.push(\n `# Domain Knowledge`,\n ``,\n `You have ${skillSummaries.length} skills loaded:`,\n );\n\n for (const skill of skillSummaries) {\n parts.push(`- **${skill.name}**: ${skill.description}`);\n }\n\n parts.push(\n ``,\n `The following are the complete guidelines from your skill library. These are reference materials — study them to learn patterns, decision frameworks, and anti-patterns for each domain. Use this knowledge when making decisions about how to approach tasks.`,\n ``,\n skillKnowledge,\n ``,\n );\n }\n\n parts.push(\n `# Environment`,\n `- Working directory: ${process.cwd()}`,\n `- Platform: ${process.platform}`,\n `- Node.js: ${process.version}`,\n ``,\n `# Git Status (snapshot)`,\n gitInfo,\n ``,\n );\n\n if (contextPrompt) {\n parts.push(contextPrompt, ``);\n }\n\n if (memoryPrompt) {\n parts.push(\n `# Auto Memory`,\n `These are notes from previous sessions:`,\n memoryPrompt,\n ``,\n );\n }\n\n return parts.join('\\n');\n }\n\n private formatToolStart(toolName: string, input: any): string {\n const dim = '\\x1b[2m';\n const cyan = '\\x1b[36m';\n const reset = '\\x1b[0m';\n const icon = '\\u23bf';\n\n let detail = '';\n\n switch (toolName) {\n case 'read_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'write_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'edit_file':\n detail = input?.file_path ? ` ${input.file_path}` : '';\n break;\n case 'glob':\n detail = input?.pattern ? ` ${input.pattern}` : '';\n if (input?.cwd) detail += ` in ${input.cwd}`;\n break;\n case 'grep':\n detail = input?.pattern ? ` \"${input.pattern}\"` : '';\n if (input?.file_pattern) detail += ` (${input.file_pattern})`;\n break;\n case 'shell':\n if (input?.command) {\n const cmd = input.command.length > 80 ? input.command.slice(0, 80) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'shell_background':\n if (input?.command) {\n const cmd = input.command.length > 60 ? input.command.slice(0, 60) + '...' : input.command;\n detail = ` ${cmd}`;\n }\n break;\n case 'ls':\n detail = ` ${input?.directory || input?.path || '.'}`;\n break;\n case 'web_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'web_fetch':\n detail = input?.url ? ` ${input.url}` : '';\n break;\n case 'task_create':\n detail = input?.title ? ` \"${input.title}\"` : '';\n break;\n case 'task_update':\n detail = input?.id ? ` #${input.id} → ${input?.status || ''}` : '';\n break;\n case 'task_list':\n detail = '';\n break;\n case 'task_get':\n detail = input?.id ? ` #${input.id}` : '';\n break;\n case 'ask_user_question':\n detail = input?.question ? ` \"${input.question.slice(0, 50)}${input.question.length > 50 ? '...' : ''}\"` : '';\n break;\n case 'enter_plan_mode':\n detail = ' Starting plan...';\n break;\n case 'exit_plan_mode':\n detail = ' Submitting plan';\n break;\n case 'memory_write':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_read':\n detail = input?.key ? ` ${input.key}` : '';\n break;\n case 'memory_search':\n detail = input?.query ? ` \"${input.query}\"` : '';\n break;\n case 'mcp_list_servers':\n detail = ' Listing MCP servers';\n break;\n case 'mcp_list_tools':\n detail = input?.server ? ` server=${input.server}` : ' (all servers)';\n break;\n default:\n if (input) {\n const keys = Object.keys(input);\n if (keys.length > 0) {\n const firstVal = String(input[keys[0]]).slice(0, 60);\n detail = ` ${keys[0]}=${firstVal}`;\n }\n }\n }\n\n return `\\n${dim} ${cyan}${icon}${reset}${dim} ${toolName}${detail}${reset}\\n`;\n }\n\n private formatToolEnd(toolName: string, output: string): string {\n if (!output || output.length === 0) return '';\n\n const dim = '\\x1b[2m';\n const green = '\\x1b[32m';\n const reset = '\\x1b[0m';\n\n switch (toolName) {\n case 'read_file': {\n const lineCount = output.split('\\n').length;\n return `${dim} ${green}\\u2713${reset}${dim} ${lineCount} lines${reset}\\n`;\n }\n case 'write_file':\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n case 'edit_file': {\n if (output.startsWith('Error')) {\n return `${dim} \\x1b[31m${output.slice(0, 150)}${reset}\\n`;\n }\n return `${dim} ${green}\\u2713${reset}${dim} ${output.slice(0, 120)}${reset}\\n`;\n }\n case 'glob': {\n const lines = output.split('\\n').filter(l => l.trim());\n const fileCount = lines.length;\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 100)}${reset}`).join('\\n');\n const more = fileCount > 5 ? `\\n${dim} ... (${fileCount - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'grep': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 5).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 5 ? `\\n${dim} ... (${lines.length - 5} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'shell':\n case 'shell_background': {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 8).map(l => `${dim} ${l.slice(0, 150)}${reset}`).join('\\n');\n const more = lines.length > 8 ? `\\n${dim} ... (${lines.length - 8} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n case 'ls': {\n const lines = output.split('\\n').filter(l => l.trim());\n const preview = lines.slice(0, 10).map(l => `${dim} ${l}${reset}`).join('\\n');\n const more = lines.length > 10 ? `\\n${dim} ... (${lines.length - 10} more)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n default: {\n const lines = output.split('\\n');\n const preview = lines.slice(0, 3).map(l => `${dim} ${l.slice(0, 120)}${reset}`).join('\\n');\n const more = lines.length > 3 ? `\\n${dim} ... (${lines.length - 3} more lines)${reset}` : '';\n return `${preview}${more}\\n`;\n }\n }\n }\n\n private async autoSummarize(force = false): Promise<boolean> {\n if ((!force && this.messages.length < SUMMARIZE_THRESHOLD) || !this.model) {\n return false;\n }\n\n if (this.messages.length < 4) {\n return false;\n }\n\n const oldMessages = this.messages.slice(0, this.messages.length - KEEP_RECENT);\n const recentMessages = this.messages.slice(this.messages.length - KEEP_RECENT);\n\n const conversationText = oldMessages.map((m) => {\n const role = m._getType() === 'human' ? 'User' : 'Assistant';\n const content = typeof m.content === 'string' ? m.content : JSON.stringify(m.content);\n const truncated = content.length > 500 ? content.slice(0, 500) + '...' : content;\n return `${role}: ${truncated}`;\n }).join('\\n');\n\n try {\n const summaryResponse = await this.model.invoke([\n new SystemMessage(\n `You are a conversation summarizer. Produce a concise summary of the following conversation between a user and an AI assistant. Focus on:\n- Key decisions made\n- Files that were read or modified\n- Tasks completed or pending\n- Important context the assistant needs to remember\nKeep the summary under 500 words. Output ONLY the summary, no preamble.`\n ),\n new HumanMessage(conversationText),\n ]);\n\n const summaryText = typeof summaryResponse.content === 'string'\n ? summaryResponse.content\n : JSON.stringify(summaryResponse.content);\n\n this.messages = [\n new SystemMessage(`[Conversation Summary — ${oldMessages.length} messages compacted]\\n\\n${summaryText}`),\n ...recentMessages,\n ];\n\n return true;\n } catch {\n return false;\n }\n }\n\n async *chat(message: string): AsyncGenerator<string> {\n const summarized = await this.autoSummarize();\n if (summarized) {\n yield `\\n\\x1b[2m \\u2500 conversation compacted (${this.messages.length} messages retained)\\x1b[0m\\n`;\n }\n\n this.messages.push(new HumanMessage(message));\n this.lastToolOutputs = [];\n\n let stream: any;\n try {\n stream = this.agent.streamEvents(\n { messages: this.messages },\n { version: 'v2', recursionLimit: RECURSION_LIMIT },\n );\n } catch (error) {\n yield `\\n\\x1b[31m Error starting agent: ${(error as Error).message}\\x1b[0m\\n`;\n return;\n }\n\n let fullResponse = '';\n let lastToolName = '';\n let interactionInputTokens = 0;\n let interactionOutputTokens = 0;\n\n try {\n for await (const event of stream) {\n if (event.event === 'on_chat_model_stream' && event.data?.chunk?.content) {\n const content = event.data.chunk.content;\n if (typeof content === 'string' && content) {\n yield content;\n fullResponse += content;\n }\n }\n\n if (event.event === 'on_chat_model_end') {\n const output = event.data?.output;\n const usage = output?.usage_metadata\n || output?.response_metadata?.usage;\n if (usage) {\n interactionInputTokens += usage.input_tokens || usage.prompt_tokens || usage.promptTokens || 0;\n interactionOutputTokens += usage.output_tokens || usage.completion_tokens || usage.completionTokens || 0;\n }\n }\n\n if (event.event === 'on_tool_start') {\n lastToolName = event.name;\n yield this.formatToolStart(event.name, event.data?.input);\n }\n\n if (event.event === 'on_tool_end') {\n const raw = event.data?.output;\n let output = '';\n if (typeof raw === 'string') {\n output = raw;\n } else if (raw?.content) {\n output = typeof raw.content === 'string' ? raw.content : JSON.stringify(raw.content);\n } else if (raw?.output) {\n output = typeof raw.output === 'string' ? raw.output : JSON.stringify(raw.output);\n } else if (raw) {\n output = typeof raw === 'object' ? JSON.stringify(raw) : String(raw);\n }\n if (output) {\n this.lastToolOutputs.push({ tool: lastToolName, output });\n yield this.formatToolEnd(lastToolName, output);\n }\n }\n\n if (event.event === 'on_tool_error') {\n const error = event.data?.error;\n yield `\\n\\x1b[31m \\u2717 Error: ${error?.message || 'Unknown error'}\\x1b[0m\\n`;\n }\n }\n } catch (error) {\n const msg = (error as Error).message;\n if (!msg.includes('abort') && !msg.includes('cancel')) {\n yield `\\n\\x1b[31m Stream error: ${msg}\\x1b[0m\\n`;\n }\n }\n\n if (fullResponse) {\n this.messages.push(new AIMessage(fullResponse));\n }\n\n this.tokenCount += interactionInputTokens + interactionOutputTokens;\n\n const fmt = (n: number) => n.toLocaleString();\n yield `\\n\\x1b[2m \\u2500 tokens: ${fmt(interactionInputTokens)} in / ${fmt(interactionOutputTokens)} out (session: ${fmt(this.tokenCount)})\\x1b[0m\\n`;\n }\n\n clearHistory() {\n this.messages = [];\n this.tokenCount = 0;\n }\n\n async compactHistory(): Promise<{ compacted: boolean; messagesBefore: number; messagesAfter: number }> {\n const before = this.messages.length;\n if (before < 4) {\n return { compacted: false, messagesBefore: before, messagesAfter: before };\n }\n const result = await this.autoSummarize(true);\n return { compacted: result, messagesBefore: before, messagesAfter: this.messages.length };\n }\n\n getHistory(): BaseMessage[] {\n return this.messages;\n }\n\n getMessageCount(): number {\n return this.messages.length;\n }\n\n getTokenCount(): number {\n return this.tokenCount;\n }\n\n getLastToolOutputs(): { tool: string; output: string }[] {\n return this.lastToolOutputs;\n }\n\n async executeTask(task: Task): Promise<{ success: boolean; error?: string }> {\n try {\n const message = `Execute a seguinte tarefa:\\n\\n**${task.subject}**\\n\\n${task.description}\\n\\nCertifique-se de completar a tarefa totalmente e verificar o resultado.`;\n\n let fullResponse = '';\n for await (const chunk of this.chat(message)) {\n fullResponse += chunk;\n process.stdout.write(chunk);\n }\n\n return { success: true };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n}\n"],"names":["DeepAgentService","SUMMARIZE_THRESHOLD","KEEP_RECENT","RECURSION_LIMIT","DEEPAGENT_BUILTIN_TOOLS","Set","initialize","projectPath","projectLoader","detectProject","projectConfig","loadProject","context","projectContext","setContext","mcpConfigs","mcpRegistry","loadConfigs","connectAll","agentsOverridePath","getAgentsOverridePath","legacyAgentsOverridePath","getLegacyAgentsOverridePath","agentRegistry","loadProjectAgents","skillsOverridePath","getSkillsOverridePath","legacySkillsOverridePath","getLegacySkillsOverridePath","skillRegistry","loadProjectSkills","memoryService","model","multiLlmService","createStreamingModel","contextPrompt","getContextPrompt","memoryPrompt","getMemoryPrompt","skillKnowledge","getAllSkillKnowledge","subagents","getSubagentDefinitions","allTools","toolsRegistry","getAllTools","mcpTools","getAllMcpTools","extraTools","filter","t","has","name","mcpDiscoveryTools","getDiscoveryTools","mcpServerSummaries","getServerSummaries","systemPrompt","buildSystemPrompt","cachedSystemPrompt","cachedExtraTools","cachedMcpTools","cachedMcpDiscoveryTools","cachedSubagents","agent","createDeepAgent","tools","backend","FilesystemBackend","rootDir","process","cwd","hasContext","agentCount","length","toolCount","reinitializeModel","getGitStatus","branch","execSync","encoding","trim","status","log","result","gitInfo","allToolNames","map","parts","push","builtInCount","mcpCount","discoveryCount","serverCount","description","server","statusIcon","transport","td","toolDescriptions","s","sa","mcpAnnotation","mcp","join","skillSummaries","getSkillSummaries","skill","platform","version","formatToolStart","toolName","input","dim","cyan","reset","icon","detail","file_path","pattern","file_pattern","command","cmd","slice","directory","path","query","url","title","id","question","key","keys","Object","firstVal","String","formatToolEnd","output","green","lineCount","split","startsWith","lines","l","fileCount","preview","more","autoSummarize","force","messages","oldMessages","recentMessages","conversationText","m","role","_getType","content","JSON","stringify","truncated","summaryResponse","invoke","SystemMessage","HumanMessage","summaryText","chat","message","summarized","lastToolOutputs","stream","streamEvents","recursionLimit","error","fullResponse","lastToolName","interactionInputTokens","interactionOutputTokens","event","data","chunk","usage","usage_metadata","response_metadata","input_tokens","prompt_tokens","promptTokens","output_tokens","completion_tokens","completionTokens","raw","tool","msg","includes","AIMessage","tokenCount","fmt","n","toLocaleString","clearHistory","compactHistory","before","compacted","messagesBefore","messagesAfter","getHistory","getMessageCount","getTokenCount","getLastToolOutputs","executeTask","task","subject","stdout","write","success","markdownRenderer"],"mappings":"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"}
|
|
@@ -38,11 +38,17 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
38
38
|
cwd,
|
|
39
39
|
encoding: 'utf-8'
|
|
40
40
|
});
|
|
41
|
+
const untrackedRaw = (0, _child_process.execSync)('git ls-files --others --exclude-standard', {
|
|
42
|
+
cwd,
|
|
43
|
+
encoding: 'utf-8'
|
|
44
|
+
});
|
|
45
|
+
const untrackedFiles = untrackedRaw.trim() ? untrackedRaw.trim().split('\n').filter((f)=>f.trim()) : [];
|
|
41
46
|
return {
|
|
42
47
|
staged,
|
|
43
48
|
unstaged,
|
|
44
49
|
stagedFiles: this.extractFiles(staged),
|
|
45
50
|
unstagedFiles: this.extractFiles(unstaged),
|
|
51
|
+
untrackedFiles,
|
|
46
52
|
stats
|
|
47
53
|
};
|
|
48
54
|
} catch {
|
|
@@ -66,7 +72,8 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
66
72
|
const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());
|
|
67
73
|
const allFiles = [
|
|
68
74
|
...diffInfo.stagedFiles,
|
|
69
|
-
...diffInfo.unstagedFiles
|
|
75
|
+
...diffInfo.unstagedFiles,
|
|
76
|
+
...diffInfo.untrackedFiles
|
|
70
77
|
];
|
|
71
78
|
const scope = this.monorepoDetector.determineScope(allFiles, monorepoInfo);
|
|
72
79
|
const llm = this.multiLlmService.createModel('cheap');
|
|
@@ -84,7 +91,8 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
84
91
|
const monorepoInfo = this.monorepoDetector.detectMonorepo(process.cwd());
|
|
85
92
|
const allFiles = [
|
|
86
93
|
...diffInfo.stagedFiles,
|
|
87
|
-
...diffInfo.unstagedFiles
|
|
94
|
+
...diffInfo.unstagedFiles,
|
|
95
|
+
...diffInfo.untrackedFiles
|
|
88
96
|
];
|
|
89
97
|
const llm = this.multiLlmService.createModel('cheap');
|
|
90
98
|
const splitPrompt = this.buildSplitPrompt(diffInfo, allFiles);
|
|
@@ -237,7 +245,9 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
237
245
|
return String(content);
|
|
238
246
|
}
|
|
239
247
|
cleanCommitMessage(message) {
|
|
240
|
-
|
|
248
|
+
const lines = message.trim().split('\n').map((l)=>l.trim()).filter((l)=>l.length > 0);
|
|
249
|
+
const firstCommitLine = lines.find((l)=>l.includes(':')) || lines[0] || '';
|
|
250
|
+
return firstCommitLine.replace(/^["']|["']$/g, '').trim();
|
|
241
251
|
}
|
|
242
252
|
buildCommitPrompt(diffInfo, scope) {
|
|
243
253
|
const scopeHint = scope ? `\n\nThis is a monorepo. The changes are primarily in the "${scope}" module.` : '';
|
|
@@ -248,11 +258,12 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
248
258
|
if (diffInfo.unstaged) {
|
|
249
259
|
fullDiff += `=== Unstaged changes ===\n${diffInfo.unstaged}\n\n`;
|
|
250
260
|
}
|
|
261
|
+
const untrackedHint = diffInfo.untrackedFiles.length > 0 ? `\nNew untracked files (will also be committed): ${diffInfo.untrackedFiles.join(', ')}\n` : '';
|
|
251
262
|
const maxLength = 10000;
|
|
252
263
|
if (fullDiff.length > maxLength) {
|
|
253
264
|
fullDiff = fullDiff.slice(0, maxLength) + '\n\n... (truncated)';
|
|
254
265
|
}
|
|
255
|
-
return `Generate a conventional commit message for the following changes.${scopeHint}\n\nFiles changed:\n${diffInfo.stats}\n\n${fullDiff}`;
|
|
266
|
+
return `Generate a single conventional commit message for ALL of the following changes.${scopeHint}\n\nFiles changed:\n${diffInfo.stats}${untrackedHint}\n\n${fullDiff}`;
|
|
256
267
|
}
|
|
257
268
|
buildSplitPrompt(diffInfo, files) {
|
|
258
269
|
let fullDiff = '';
|
|
@@ -262,11 +273,16 @@ let CommitGeneratorService = class CommitGeneratorService {
|
|
|
262
273
|
if (diffInfo.unstaged) {
|
|
263
274
|
fullDiff += `=== Unstaged changes ===\n${diffInfo.unstaged}\n\n`;
|
|
264
275
|
}
|
|
276
|
+
const allFiles = [
|
|
277
|
+
...files,
|
|
278
|
+
...diffInfo.untrackedFiles.filter((f)=>!files.includes(f))
|
|
279
|
+
];
|
|
280
|
+
const untrackedHint = diffInfo.untrackedFiles.length > 0 ? `\nNew untracked files (must be included in commits): ${diffInfo.untrackedFiles.join(', ')}\n` : '';
|
|
265
281
|
const maxLength = 8000;
|
|
266
282
|
if (fullDiff.length > maxLength) {
|
|
267
283
|
fullDiff = fullDiff.slice(0, maxLength) + '\n\n... (truncated)';
|
|
268
284
|
}
|
|
269
|
-
return `Analyze all the files below and group them into logical commits.\n\nFiles: ${
|
|
285
|
+
return `Analyze all the files below and group them into logical commits. Include ALL files in the result.\n\nFiles: ${allFiles.join(', ')}${untrackedHint}\n\nStats:\n${diffInfo.stats}\n\n${fullDiff}`;
|
|
270
286
|
}
|
|
271
287
|
async generateMessageForGroup(group, diffInfo) {
|
|
272
288
|
const llm = this.multiLlmService.createModel('cheap');
|