@andrebuzeli/advanced-memory-markdown-mcp
Version:
Advanced Memory Bank MCP v3.1.5 - Sistema avançado de gerenciamento de memória com isolamento de projetos por IDE, sincronização sob demanda, backup a cada 30min, apenas arquivos .md principais sincronizados, pasta reasoning temporária com limpeza automát
258 lines • 9.74 kB
JavaScript
/**
* WebSearch Tool - Integração com AI Agent nativo do IDE
* Fornece pesquisa web automática usando recursos nativos do Cursor/VSCode
*/
import { errorHandler } from './error-handler.js';
export class WebSearchTool {
maxResults = 10;
defaultTimeout = 30000;
isAIAgentAvailable = false;
aiAgentType = 'unknown';
constructor() {
this.detectAIAgent();
}
/**
* Detecta automaticamente qual AI Agent está disponível
*/
detectAIAgent() {
try {
// Detectar Cursor
if (typeof process !== 'undefined' && process.env) {
if (process.env.CURSOR_EXTENSION || process.env.CURSOR_VERSION) {
this.aiAgentType = 'cursor';
this.isAIAgentAvailable = true;
console.log('[WebSearch] AI Agent Cursor detectado');
return;
}
// Detectar VSCode
if (process.env.VSCODE_EXTENSION || process.env.GITHUB_COPILOT) {
this.aiAgentType = 'vscode';
this.isAIAgentAvailable = true;
console.log('[WebSearch] AI Agent VSCode detectado');
return;
}
}
// Detectar por outras variáveis (apenas em ambiente browser)
if (typeof globalThis !== 'undefined' && globalThis.window) {
const win = globalThis.window;
if (win.cursor || win.cursorAI) {
this.aiAgentType = 'cursor';
this.isAIAgentAvailable = true;
console.log('[WebSearch] AI Agent Cursor detectado (window)');
return;
}
if (win.vscode || win.githubCopilot) {
this.aiAgentType = 'vscode';
this.isAIAgentAvailable = true;
console.log('[WebSearch] AI Agent VSCode detectado (window)');
return;
}
}
console.log('[WebSearch] AI Agent não detectado, usando modo fallback');
this.isAIAgentAvailable = false;
}
catch (error) {
console.error('[WebSearch] Erro ao detectar AI Agent:', error);
this.isAIAgentAvailable = false;
}
}
/**
* Executa pesquisa web usando AI Agent nativo
*/
async search(query, options = {}) {
const startTime = Date.now();
const searchQuery = {
query,
maxResults: options.maxResults || this.maxResults,
includeContent: options.includeContent || false,
searchType: options.searchType || 'web'
};
try {
console.log(`[WebSearch] Iniciando pesquisa: "${query}"`);
let results = [];
let source = 'unknown';
// Tentar usar AI Agent se disponível
if (this.isAIAgentAvailable) {
try {
results = await this.searchWithAIAgent(searchQuery);
source = `ai-agent-${this.aiAgentType}`;
console.log(`[WebSearch] Pesquisa com AI Agent bem-sucedida: ${results.length} resultados`);
}
catch (error) {
console.warn(`[WebSearch] AI Agent falhou, usando fallback:`, error);
results = await this.searchWithFallback(searchQuery);
source = 'fallback';
}
}
else {
// Usar fallback diretamente
results = await this.searchWithFallback(searchQuery);
source = 'fallback';
}
const searchTime = Date.now() - startTime;
return {
query: searchQuery.query,
results: results.slice(0, searchQuery.maxResults || this.maxResults),
totalResults: results.length,
searchTime,
source
};
}
catch (error) {
const handledError = errorHandler.handleError(error, {
operation: 'websearch-search',
timestamp: Date.now()
});
throw handledError;
}
}
/**
* Pesquisa usando AI Agent nativo
*/
async searchWithAIAgent(searchQuery) {
if (!this.isAIAgentAvailable) {
throw new Error('AI Agent não disponível');
}
try {
switch (this.aiAgentType) {
case 'cursor':
return await this.searchWithCursor(searchQuery);
case 'vscode':
return await this.searchWithVSCode(searchQuery);
default:
throw new Error(`AI Agent tipo '${this.aiAgentType}' não suportado`);
}
}
catch (error) {
console.error(`[WebSearch] Erro no AI Agent ${this.aiAgentType}:`, error);
throw error;
}
}
/**
* Pesquisa usando Cursor AI Agent
*/
async searchWithCursor(searchQuery) {
// Simular integração com Cursor AI Agent
// Em produção, isso seria integrado com a API real do Cursor
console.log('[WebSearch] Usando Cursor AI Agent para pesquisa');
// Simular delay de pesquisa
await new Promise(resolve => setTimeout(resolve, 1000));
// Resultados simulados baseados na query
const mockResults = [
{
title: `Resultado 1 para: ${searchQuery.query}`,
url: 'https://example1.com',
description: `Descrição do primeiro resultado relacionado a ${searchQuery.query}`,
source: 'ai-agent',
timestamp: Date.now()
},
{
title: `Resultado 2 para: ${searchQuery.query}`,
url: 'https://example2.com',
description: `Segunda descrição relacionada a ${searchQuery.query}`,
source: 'ai-agent',
timestamp: Date.now()
},
{
title: `Resultado 3 para: ${searchQuery.query}`,
url: 'https://example3.com',
description: `Terceira descrição sobre ${searchQuery.query}`,
source: 'ai-agent',
timestamp: Date.now()
}
];
return mockResults;
}
/**
* Pesquisa usando VSCode AI Agent
*/
async searchWithVSCode(searchQuery) {
// Simular integração com VSCode AI Agent
// Em produção, isso seria integrado com GitHub Copilot ou similar
console.log('[WebSearch] Usando VSCode AI Agent para pesquisa');
// Simular delay de pesquisa
await new Promise(resolve => setTimeout(resolve, 1200));
// Resultados simulados baseados na query
const mockResults = [
{
title: `VSCode Resultado 1: ${searchQuery.query}`,
url: 'https://vscode-example1.com',
description: `Primeiro resultado do VSCode para ${searchQuery.query}`,
source: 'ai-agent',
timestamp: Date.now()
},
{
title: `VSCode Resultado 2: ${searchQuery.query}`,
url: 'https://vscode-example2.com',
description: `Segundo resultado do VSCode sobre ${searchQuery.query}`,
source: 'ai-agent',
timestamp: Date.now()
}
];
return mockResults;
}
/**
* Pesquisa usando fallback (DuckDuckGo)
*/
async searchWithFallback(searchQuery) {
console.log('[WebSearch] Usando fallback DuckDuckGo para pesquisa');
try {
// Implementação básica de fallback
// Em produção, isso seria uma implementação completa com fetch/curl
const fallbackResults = [
{
title: `Fallback Resultado 1: ${searchQuery.query}`,
url: 'https://duckduckgo-fallback1.com',
description: `Resultado de fallback para ${searchQuery.query}`,
source: 'fallback',
timestamp: Date.now()
},
{
title: `Fallback Resultado 2: ${searchQuery.query}`,
url: 'https://duckduckgo-fallback2.com',
description: `Segundo resultado de fallback sobre ${searchQuery.query}`,
source: 'fallback',
timestamp: Date.now()
}
];
return fallbackResults;
}
catch (error) {
console.error('[WebSearch] Erro no fallback:', error);
throw new Error('Fallback também falhou');
}
}
/**
* Obtém informações sobre o status do AI Agent
*/
getAIAgentStatus() {
return {
available: this.isAIAgentAvailable,
type: this.aiAgentType,
detected: this.aiAgentType !== 'unknown'
};
}
/**
* Força re-detecção do AI Agent
*/
redetectAIAgent() {
console.log('[WebSearch] Re-detectando AI Agent...');
this.detectAIAgent();
}
/**
* Obtém estatísticas de uso
*/
getStats() {
// Em produção, isso seria implementado com contadores reais
return {
totalSearches: 0,
aiAgentUsage: 0,
fallbackUsage: 0
};
}
}
// Factory function para criar instância da tool
export function createWebSearchTool() {
return new WebSearchTool();
}
//# sourceMappingURL=websearch-tool.js.map