@elizaos/plugin-research 0.1.0

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.
Files changed (71) hide show
  1. package/README.md +400 -0
  2. package/dist/index.cjs +9366 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.js +9284 -0
  5. package/dist/index.js.map +1 -0
  6. package/package.json +80 -0
  7. package/src/__tests__/action-chaining.test.ts +532 -0
  8. package/src/__tests__/actions.test.ts +118 -0
  9. package/src/__tests__/cache-rate-limiter.test.ts +303 -0
  10. package/src/__tests__/content-extractors.test.ts +26 -0
  11. package/src/__tests__/deepresearch-bench-integration.test.ts +520 -0
  12. package/src/__tests__/deepresearch-bench-simplified.e2e.test.ts +290 -0
  13. package/src/__tests__/deepresearch-bench.e2e.test.ts +376 -0
  14. package/src/__tests__/e2e.test.ts +1870 -0
  15. package/src/__tests__/multi-benchmark-runner.ts +427 -0
  16. package/src/__tests__/providers.test.ts +156 -0
  17. package/src/__tests__/real-world.e2e.test.ts +788 -0
  18. package/src/__tests__/research-scenarios.test.ts +755 -0
  19. package/src/__tests__/research.e2e.test.ts +704 -0
  20. package/src/__tests__/research.test.ts +174 -0
  21. package/src/__tests__/search-providers.test.ts +174 -0
  22. package/src/__tests__/single-benchmark-runner.ts +735 -0
  23. package/src/__tests__/test-search-providers.ts +171 -0
  24. package/src/__tests__/verify-apis.test.ts +82 -0
  25. package/src/actions.ts +1677 -0
  26. package/src/benchmark/deepresearch-benchmark.ts +369 -0
  27. package/src/evaluation/research-evaluator.ts +444 -0
  28. package/src/examples/api-integration.md +498 -0
  29. package/src/examples/browserbase-integration.md +132 -0
  30. package/src/examples/debug-research-query.ts +162 -0
  31. package/src/examples/defi-code-scenarios.md +536 -0
  32. package/src/examples/defi-implementation-guide.md +454 -0
  33. package/src/examples/eliza-research-example.ts +142 -0
  34. package/src/examples/fix-renewable-energy-research.ts +209 -0
  35. package/src/examples/research-scenarios.md +408 -0
  36. package/src/examples/run-complete-renewable-research.ts +303 -0
  37. package/src/examples/run-deep-research.ts +352 -0
  38. package/src/examples/run-logged-research.ts +304 -0
  39. package/src/examples/run-real-research.ts +151 -0
  40. package/src/examples/save-research-output.ts +133 -0
  41. package/src/examples/test-file-logging.ts +199 -0
  42. package/src/examples/test-real-research.ts +67 -0
  43. package/src/examples/test-renewable-energy-research.ts +229 -0
  44. package/src/index.ts +28 -0
  45. package/src/integrations/cache.ts +128 -0
  46. package/src/integrations/content-extractors/firecrawl.ts +314 -0
  47. package/src/integrations/content-extractors/pdf-extractor.ts +350 -0
  48. package/src/integrations/content-extractors/playwright.ts +420 -0
  49. package/src/integrations/factory.ts +419 -0
  50. package/src/integrations/index.ts +18 -0
  51. package/src/integrations/rate-limiter.ts +181 -0
  52. package/src/integrations/search-providers/academic.ts +290 -0
  53. package/src/integrations/search-providers/exa.ts +205 -0
  54. package/src/integrations/search-providers/npm.ts +330 -0
  55. package/src/integrations/search-providers/pypi.ts +211 -0
  56. package/src/integrations/search-providers/serpapi.ts +277 -0
  57. package/src/integrations/search-providers/serper.ts +358 -0
  58. package/src/integrations/search-providers/stagehand-google.ts +87 -0
  59. package/src/integrations/search-providers/tavily.ts +187 -0
  60. package/src/processing/relevance-analyzer.ts +353 -0
  61. package/src/processing/research-logger.ts +450 -0
  62. package/src/processing/result-processor.ts +372 -0
  63. package/src/prompts/research-prompts.ts +419 -0
  64. package/src/providers/cacheProvider.ts +164 -0
  65. package/src/providers.ts +173 -0
  66. package/src/service.ts +2588 -0
  67. package/src/services/swe-bench.ts +286 -0
  68. package/src/strategies/research-strategies.ts +790 -0
  69. package/src/types/pdf-parse.d.ts +34 -0
  70. package/src/types.ts +551 -0
  71. package/src/verification/claim-verifier.ts +443 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/service.ts","../src/evaluation/research-evaluator.ts","../src/types.ts","../src/processing/result-processor.ts","../src/processing/relevance-analyzer.ts","../src/processing/research-logger.ts","../src/integrations/search-providers/tavily.ts","../src/integrations/search-providers/serper.ts","../src/integrations/search-providers/stagehand-google.ts","../src/integrations/content-extractors/firecrawl.ts","../src/integrations/content-extractors/playwright.ts","../src/integrations/rate-limiter.ts","../src/integrations/cache.ts","../src/integrations/factory.ts","../src/integrations/search-providers/academic.ts","../src/integrations/search-providers/exa.ts","../src/integrations/search-providers/serpapi.ts","../src/integrations/search-providers/pypi.ts","../src/integrations/search-providers/npm.ts","../src/integrations/content-extractors/pdf-extractor.ts","../src/strategies/research-strategies.ts","../src/verification/claim-verifier.ts","../src/prompts/research-prompts.ts","../src/providers.ts","../src/actions.ts","../src/__tests__/deepresearch-bench-simplified.e2e.test.ts","../src/index.ts"],"sourcesContent":["import { elizaLogger, IAgentRuntime, ModelType, Service } from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ResearchEvaluator } from './evaluation/research-evaluator';\nimport { SearchResultProcessor } from './processing/result-processor';\nimport { RelevanceAnalyzer } from './processing/relevance-analyzer';\nimport { ResearchLogger } from './processing/research-logger';\nimport {\n ContentExtractor,\n createContentExtractor,\n createSearchProvider,\n SearchProvider,\n} from './integrations';\nimport { createAcademicSearchProvider } from './integrations/factory';\nimport { PDFExtractor } from './integrations/content-extractors/pdf-extractor';\nimport {\n EvaluationCriteriaGenerator,\n QueryPlanner,\n ResearchStrategyFactory,\n} from './strategies/research-strategies';\nimport {\n BibliographyEntry,\n Citation,\n DeepResearchBenchResult,\n EvaluationMetrics,\n EvaluationResults,\n FactualClaim,\n IterationRecord,\n PerformanceMetrics,\n PhaseTiming,\n ReportSection,\n ResearchConfig,\n ResearchDepth,\n ResearchDomain,\n ResearchFinding,\n ResearchMetadata,\n ResearchPhase,\n ResearchProgress,\n ResearchProject,\n ResearchSource,\n ResearchStatus,\n SearchResult,\n SourceType,\n TaskType,\n VerificationStatus,\n} from './types';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport { ClaimVerifier } from './verification/claim-verifier';\nimport { RESEARCH_PROMPTS, formatPrompt, getPromptConfig } from './prompts/research-prompts';\n\n// Factory for creating search providers and content extractors\nclass SearchProviderFactory {\n private pdfExtractor: PDFExtractor;\n \n constructor(private runtime: IAgentRuntime) {\n this.pdfExtractor = new PDFExtractor();\n }\n\n getProvider(type: string): SearchProvider {\n // Use academic search for academic domains\n if (type === 'academic') {\n return createAcademicSearchProvider(this.runtime);\n }\n \n const provider = createSearchProvider(type, this.runtime);\n if (!provider) {\n throw new Error('No search provider available');\n }\n return provider;\n }\n\n getContentExtractor(): ContentExtractor {\n const extractor = createContentExtractor(this.runtime);\n if (!extractor) {\n throw new Error('No content extractor available');\n }\n return extractor;\n }\n \n getPDFExtractor(): PDFExtractor {\n return this.pdfExtractor;\n }\n}\n\nconst DEFAULT_CONFIG: ResearchConfig = {\n maxSearchResults: 30, // Increased for more comprehensive coverage\n maxDepth: 5, // Deeper research iterations\n timeout: 600000, // 10 minutes for thorough research\n enableCitations: true,\n enableImages: false,\n searchProviders: ['web', 'academic', 'github'], // Include GitHub for code research by default\n language: 'en',\n researchDepth: ResearchDepth.DEEP, // Default to deep research\n domain: ResearchDomain.GENERAL,\n evaluationEnabled: true,\n cacheEnabled: true,\n parallelSearches: 5, // More parallel searches for efficiency\n retryAttempts: 3,\n qualityThreshold: 0.85, // Higher quality threshold\n};\n\nexport class ResearchService extends Service {\n private projects: Map<string, ResearchProject> = new Map();\n private activeResearch: Map<string, AbortController> = new Map();\n private searchProviderFactory: SearchProviderFactory;\n private queryPlanner: QueryPlanner;\n private strategyFactory: ResearchStrategyFactory;\n private criteriaGenerator: EvaluationCriteriaGenerator;\n private evaluator: ResearchEvaluator;\n private resultProcessor: SearchResultProcessor;\n private relevanceAnalyzer: RelevanceAnalyzer;\n private researchLogger: ResearchLogger;\n private performanceData: Map<string, PerformanceMetrics> = new Map();\n private claimVerifier: ClaimVerifier;\n\n static serviceName = 'research';\n public serviceName = 'research';\n\n static async start(runtime: IAgentRuntime) {\n const service = new ResearchService(runtime);\n return service;\n }\n\n static async stop(runtime: IAgentRuntime) {\n const service = new ResearchService(runtime);\n await service.stop();\n }\n\n public capabilityDescription =\n 'PhD-level deep research across 22 domains with RACE/FACT evaluation';\n\n constructor(runtime: IAgentRuntime) {\n super();\n this.runtime = runtime;\n this.searchProviderFactory = new SearchProviderFactory(runtime);\n this.queryPlanner = new QueryPlanner(runtime);\n this.strategyFactory = new ResearchStrategyFactory(runtime);\n this.criteriaGenerator = new EvaluationCriteriaGenerator(runtime);\n this.evaluator = new ResearchEvaluator(runtime);\n this.relevanceAnalyzer = new RelevanceAnalyzer(runtime);\n this.researchLogger = new ResearchLogger(runtime);\n this.resultProcessor = new SearchResultProcessor({\n qualityThreshold: 0.4,\n deduplicationThreshold: 0.85,\n maxResults: 50,\n prioritizeRecent: true,\n diversityWeight: 0.3,\n });\n this.claimVerifier = new ClaimVerifier(\n runtime, \n this.searchProviderFactory.getContentExtractor()\n );\n }\n\n async createResearchProject(\n query: string,\n config?: Partial<ResearchConfig>\n ): Promise<ResearchProject> {\n const projectId = uuidv4();\n const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n\n // Always use full research pipeline for best quality\n elizaLogger.info(`[ResearchService] Starting comprehensive research for: ${query}`);\n \n // Extract metadata from query\n const metadata = await this.extractMetadata(query, mergedConfig);\n\n const project: ResearchProject = {\n id: projectId,\n query,\n status: ResearchStatus.PENDING,\n phase: ResearchPhase.INITIALIZATION,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n findings: [],\n sources: [],\n metadata,\n };\n\n this.projects.set(projectId, project);\n\n // Start research asynchronously\n this.startResearch(projectId, mergedConfig).catch((error) => {\n elizaLogger.error(`Research failed for project ${projectId}:`, error);\n project.status = ResearchStatus.FAILED;\n project.error = error.message;\n });\n\n return project;\n }\n\n private async extractMetadata(query: string, config: ResearchConfig): Promise<ResearchMetadata> {\n // Extract domain if not provided\n const domain = config.domain || (await this.extractDomain(query));\n\n // Extract task type\n const taskType = await this.extractTaskType(query);\n \n // Select appropriate search providers based on domain and query\n const selectedProviders = this.selectSearchProviders(domain, query);\n \n // Update config with domain-specific providers (merge with user-specified ones)\n const searchProviders = config.searchProviders?.length \n ? [...new Set([...config.searchProviders, ...selectedProviders])]\n : selectedProviders;\n \n // Update the config object for use in research\n (config as any).searchProviders = searchProviders;\n \n elizaLogger.info(`[ResearchService] Domain: ${domain}, Selected providers: ${searchProviders.join(', ')}`);\n\n // Create query plan\n const queryPlan = await this.queryPlanner.createQueryPlan(query, {\n domain,\n taskType,\n depth: config.researchDepth,\n });\n\n // Generate evaluation criteria\n const evaluationCriteria = await this.criteriaGenerator.generateCriteria(query, domain);\n\n // Initialize performance metrics\n const performanceMetrics: PerformanceMetrics = {\n totalDuration: 0,\n phaseBreakdown: {} as Record<ResearchPhase, PhaseTiming>,\n searchQueries: 0,\n sourcesProcessed: 0,\n tokensGenerated: 0,\n cacheHits: 0,\n parallelOperations: 0,\n };\n\n return {\n domain,\n taskType,\n language: config.language,\n depth: config.researchDepth,\n queryPlan,\n evaluationCriteria,\n iterationHistory: [],\n performanceMetrics,\n };\n }\n\n private async extractDomain(query: string): Promise<ResearchDomain> {\n // Use embeddings-based classification for more accurate domain detection\n try {\n if (this.runtime.useModel) {\n // Create domain examples for similarity matching\n const domainExamples = {\n [ResearchDomain.PHYSICS]: [\n \"quantum mechanics and particle physics research\",\n \"theoretical physics and relativity studies\",\n \"condensed matter physics and thermodynamics\"\n ],\n [ResearchDomain.COMPUTER_SCIENCE]: [\n \"machine learning and artificial intelligence\",\n \"software engineering and programming languages\",\n \"algorithms and data structures research\"\n ],\n [ResearchDomain.BIOLOGY]: [\n \"molecular biology and genetics research\",\n \"cell biology and biochemistry studies\",\n \"evolutionary biology and ecology\"\n ],\n [ResearchDomain.MEDICINE]: [\n \"clinical medicine and patient treatment\",\n \"medical research and drug development\",\n \"healthcare and disease management\"\n ],\n [ResearchDomain.CHEMISTRY]: [\n \"organic chemistry and synthesis\",\n \"analytical chemistry and spectroscopy\",\n \"physical chemistry and materials\"\n ],\n [ResearchDomain.PSYCHOLOGY]: [\n \"cognitive psychology and behavior\",\n \"clinical psychology and mental health\",\n \"social psychology and human behavior\"\n ],\n [ResearchDomain.ECONOMICS]: [\n \"economic theory and market analysis\",\n \"finance and monetary policy\",\n \"economic development and trade\"\n ],\n [ResearchDomain.POLITICS]: [\n \"political theory and governance\",\n \"international relations and diplomacy\",\n \"public policy and administration\"\n ]\n };\n \n // Get query embedding\n const queryEmbedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: query\n });\n \n let bestDomain = ResearchDomain.GENERAL;\n let bestSimilarity = 0;\n \n // Compare with domain examples\n for (const [domain, examples] of Object.entries(domainExamples)) {\n for (const example of examples) {\n try {\n const exampleEmbedding = await this.runtime.useModel(ModelType.TEXT_EMBEDDING, {\n text: example\n });\n \n // Calculate cosine similarity\n const similarity = this.calculateCosineSimilarity(queryEmbedding as number[], exampleEmbedding as number[]);\n \n if (similarity > bestSimilarity) {\n bestSimilarity = similarity;\n bestDomain = domain as ResearchDomain;\n }\n } catch (error) {\n elizaLogger.debug(`Error processing domain example: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n }\n \n // If similarity is high enough, use embedding-based classification\n if (bestSimilarity > 0.7) {\n elizaLogger.info(`Domain classified via embeddings: ${bestDomain} (similarity: ${bestSimilarity.toFixed(3)})`);\n return bestDomain;\n }\n }\n } catch (error) {\n elizaLogger.warn('Error using embeddings for domain classification, falling back to LLM:', error);\n }\n \n // Fallback: Use LLM classification\n if (this.runtime.useModel) {\n const prompt = `Analyze this research query and determine the most appropriate research domain.\n\nQuery: \"${query}\"\n\nAvailable domains:\n${Object.values(ResearchDomain).map(d => `- ${d}`).join('\\n')}\n\nConsider:\n- Primary subject matter and field of study\n- Methodology and approach\n- Target audience and applications\n- Interdisciplinary connections\n\nRespond with ONLY the domain name from the list above. Be precise.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are an expert research domain classifier. Analyze the query and respond with only the most appropriate domain name from the provided list.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.1, // Low temperature for consistent classification\n });\n\n const domainText = (\n typeof response === 'string' ? response : (response as any).content || ''\n ).trim().toLowerCase();\n\n // Exact match first\n for (const domain of Object.values(ResearchDomain)) {\n if (domainText === domain.toLowerCase()) {\n elizaLogger.info(`Domain classified via LLM: ${domain}`);\n return domain as ResearchDomain;\n }\n }\n\n // Partial match fallback\n for (const domain of Object.values(ResearchDomain)) {\n if (domainText.includes(domain.toLowerCase().replace('_', ' ')) || \n domainText.includes(domain.toLowerCase().replace('_', ''))) {\n elizaLogger.info(`Domain classified via LLM (partial match): ${domain}`);\n return domain as ResearchDomain;\n }\n }\n\n elizaLogger.warn(`Could not extract domain from LLM response: ${domainText}`);\n } catch (error) {\n elizaLogger.warn('Error using LLM for domain extraction, falling back to heuristics:', error);\n }\n }\n \n // Final fallback: Simple keyword matching\n const lowerQuery = query.toLowerCase();\n const keywords = {\n [ResearchDomain.PHYSICS]: ['quantum', 'physics', 'particle', 'relativity', 'thermodynamics'],\n [ResearchDomain.COMPUTER_SCIENCE]: ['computer', 'software', 'algorithm', 'programming', 'ai', 'artificial intelligence', 'machine learning'],\n [ResearchDomain.BIOLOGY]: ['biology', 'gene', 'cell', 'dna', 'evolution', 'organism'],\n [ResearchDomain.MEDICINE]: ['medicine', 'health', 'disease', 'treatment', 'clinical', 'medical'],\n [ResearchDomain.CHEMISTRY]: ['chemistry', 'chemical', 'molecule', 'synthesis', 'compound'],\n [ResearchDomain.PSYCHOLOGY]: ['psychology', 'mental', 'behavior', 'cognitive', 'brain'],\n [ResearchDomain.ECONOMICS]: ['economic', 'finance', 'market', 'currency', 'trade'],\n [ResearchDomain.POLITICS]: ['political', 'government', 'policy', 'politics', 'governance']\n };\n \n for (const [domain, words] of Object.entries(keywords)) {\n if (words.some(word => lowerQuery.includes(word))) {\n elizaLogger.info(`Domain classified via keywords: ${domain}`);\n return domain as ResearchDomain;\n }\n }\n \n elizaLogger.info('Domain classified as GENERAL (no specific match found)');\n return ResearchDomain.GENERAL;\n }\n \n private calculateCosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) return 0;\n \n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n \n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n \n const magnitude = Math.sqrt(normA) * Math.sqrt(normB);\n return magnitude === 0 ? 0 : dotProduct / magnitude;\n }\n \n private selectSearchProviders(domain: ResearchDomain, query: string): string[] {\n const providers = new Set(['web']); // Always include web search\n \n // Add domain-specific providers\n switch (domain) {\n case ResearchDomain.COMPUTER_SCIENCE:\n case ResearchDomain.ENGINEERING:\n providers.add('github');\n providers.add('academic');\n // Add package managers if the query mentions specific languages/packages\n if (query.toLowerCase().includes('python') || query.toLowerCase().includes('pip') || query.toLowerCase().includes('pypi')) {\n providers.add('pypi');\n }\n if (query.toLowerCase().includes('javascript') || query.toLowerCase().includes('node') || query.toLowerCase().includes('npm')) {\n providers.add('npm');\n }\n break;\n \n case ResearchDomain.PHYSICS:\n case ResearchDomain.CHEMISTRY:\n case ResearchDomain.BIOLOGY:\n case ResearchDomain.MEDICINE:\n case ResearchDomain.MATHEMATICS:\n providers.add('academic');\n break;\n \n case ResearchDomain.ECONOMICS:\n case ResearchDomain.POLITICS:\n case ResearchDomain.PSYCHOLOGY:\n providers.add('academic');\n break;\n \n default:\n // For general research, include academic for scholarly sources\n providers.add('academic');\n \n // Check for code-related keywords in any domain\n if (query.toLowerCase().match(/(code|programming|software|library|package|framework|api)/)) {\n providers.add('github');\n }\n if (query.toLowerCase().match(/(python|pip|pypi)/)) {\n providers.add('pypi');\n }\n if (query.toLowerCase().match(/(javascript|typescript|node|npm)/)) {\n providers.add('npm');\n }\n break;\n }\n \n return Array.from(providers);\n }\n\n private async extractTaskType(query: string): Promise<TaskType> {\n // Simple heuristic-based task type extraction for testing\n const lowerQuery = query.toLowerCase();\n \n // Check for task type keywords\n if (lowerQuery.includes('compar') || lowerQuery.includes('versus') || lowerQuery.includes('vs')) {\n return TaskType.COMPARATIVE;\n }\n if (lowerQuery.includes('analyz') || lowerQuery.includes('analysis') || lowerQuery.includes('examine')) {\n return TaskType.ANALYTICAL;\n }\n if (lowerQuery.includes('synthes') || lowerQuery.includes('combin') || lowerQuery.includes('integrat')) {\n return TaskType.SYNTHETIC;\n }\n if (lowerQuery.includes('evaluat') || lowerQuery.includes('assess') || lowerQuery.includes('judge')) {\n return TaskType.EVALUATIVE;\n }\n if (lowerQuery.includes('predict') || lowerQuery.includes('forecast') || lowerQuery.includes('future')) {\n return TaskType.PREDICTIVE;\n }\n \n // If we have a working runtime.useModel, use it for more accurate classification\n if (this.runtime.useModel) {\n const prompt = `Analyze this research query and determine the primary task type.\n\nQuery: \"${query}\"\n\nTask Types:\n- ${TaskType.EXPLORATORY}: General exploration of a topic\n- ${TaskType.COMPARATIVE}: Comparing different items, approaches, or solutions\n- ${TaskType.ANALYTICAL}: Deep analysis of a specific subject\n- ${TaskType.SYNTHETIC}: Combining multiple perspectives or sources\n- ${TaskType.EVALUATIVE}: Assessment or evaluation of something\n- ${TaskType.PREDICTIVE}: Forecasting or predicting future trends\n\nRespond with ONLY the task type (e.g., \"analytical\"). Be precise.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a research task classifier. Respond with only the task type, nothing else.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n });\n\n const taskText = (\n typeof response === 'string' ? response : (response as any).content || ''\n ).trim().toLowerCase();\n\n // Check for exact matches\n for (const taskType of Object.values(TaskType)) {\n if (taskText === taskType.toLowerCase()) {\n return taskType as TaskType;\n }\n }\n\n // Check for keyword matches\n if (taskText.includes('compar')) return TaskType.COMPARATIVE;\n if (taskText.includes('analy')) return TaskType.ANALYTICAL;\n if (taskText.includes('synth')) return TaskType.SYNTHETIC;\n if (taskText.includes('eval')) return TaskType.EVALUATIVE;\n if (taskText.includes('pred') || taskText.includes('forecast')) return TaskType.PREDICTIVE;\n\n elizaLogger.warn(`Could not extract task type from response: ${taskText}`);\n } catch (error) {\n elizaLogger.warn('Error using model for task type extraction, falling back to heuristics:', error);\n }\n }\n \n return TaskType.EXPLORATORY;\n }\n\n private async startResearch(projectId: string, config: ResearchConfig): Promise<void> {\n const project = this.projects.get(projectId);\n if (!project) return;\n\n const controller = new AbortController();\n this.activeResearch.set(projectId, controller);\n\n try {\n project.status = ResearchStatus.ACTIVE;\n const startTime = Date.now();\n\n // Phase 1: Planning and Relevance Analysis\n await this.updatePhase(project, ResearchPhase.PLANNING);\n \n // Analyze query for relevance criteria\n elizaLogger.info(`[ResearchService] Analyzing query relevance for: ${project.query}`);\n const queryAnalysis = await this.relevanceAnalyzer.analyzeQueryRelevance(project.query);\n \n // Initialize comprehensive logging\n await this.researchLogger.initializeSession(projectId, project.query, queryAnalysis);\n\n // Phase 2: Searching with Relevance Filtering\n await this.updatePhase(project, ResearchPhase.SEARCHING);\n await this.executeSearchWithRelevance(project, config, controller.signal, queryAnalysis);\n\n // Phase 3: Analyzing with Relevance Verification\n await this.updatePhase(project, ResearchPhase.ANALYZING);\n await this.analyzeFindingsWithRelevance(project, config, queryAnalysis);\n\n // Synthesize findings\n await this.updatePhase(project, ResearchPhase.SYNTHESIZING);\n await this.synthesizeFindings(project);\n\n // Generate report (before evaluation)\n await this.updatePhase(project, ResearchPhase.REPORTING);\n await this.generateReport(project);\n\n // Evaluate if configured (optional)\n if (config.evaluationEnabled) {\n try {\n await this.updatePhase(project, ResearchPhase.EVALUATING);\n await this.evaluateProject(project.id);\n } catch (evalError) {\n elizaLogger.warn('[ResearchService] Evaluation failed, but research completed:', evalError);\n // Don't fail the entire research if evaluation fails\n }\n }\n\n // Verify query answering and finalize logging\n const queryAnswering = await this.relevanceAnalyzer.verifyQueryAnswering(project.findings, project.query);\n await this.researchLogger.finalizeSession(projectId, queryAnswering.gaps, queryAnswering.recommendations);\n\n // Complete\n await this.updatePhase(project, ResearchPhase.COMPLETE);\n project.status = ResearchStatus.COMPLETED;\n project.completedAt = Date.now();\n\n // Update performance metrics\n const totalDuration = Date.now() - startTime;\n if (project.metadata.performanceMetrics) {\n project.metadata.performanceMetrics.totalDuration = totalDuration;\n }\n\n // Log final summary\n elizaLogger.info(`[ResearchService] Research completed for project ${projectId}:`, {\n duration: totalDuration,\n sources: project.sources.length,\n findings: project.findings.length,\n relevantFindings: project.findings.filter(f => f.relevance >= 0.7).length,\n queryAnswering: queryAnswering.coverage\n });\n } catch (error) {\n if ((error as any).name === 'AbortError') {\n project.status = ResearchStatus.PAUSED;\n } else {\n project.status = ResearchStatus.FAILED;\n project.error = error instanceof Error ? error.message : String(error);\n }\n throw error;\n } finally {\n this.activeResearch.delete(projectId);\n project.updatedAt = Date.now();\n }\n }\n\n private deduplicateResults(results: SearchResult[]): SearchResult[] {\n const seen = new Set<string>();\n const unique: SearchResult[] = [];\n \n for (const result of results) {\n // Use URL as unique identifier\n if (!seen.has(result.url)) {\n seen.add(result.url);\n unique.push(result);\n }\n }\n \n // Sort by score descending\n return unique.sort((a, b) => (b.score || 0) - (a.score || 0));\n }\n\n private async updatePhase(project: ResearchProject, phase: ResearchPhase): Promise<void> {\n const previousPhase = project.phase;\n project.phase = phase;\n project.updatedAt = Date.now();\n\n // Update phase timing\n if (project.metadata.performanceMetrics) {\n const phaseKey = previousPhase;\n if (phaseKey && project.metadata.performanceMetrics.phaseBreakdown[phaseKey]) {\n project.metadata.performanceMetrics.phaseBreakdown[phaseKey].endTime = Date.now();\n }\n\n project.metadata.performanceMetrics.phaseBreakdown[phase] = {\n startTime: Date.now(),\n endTime: 0,\n duration: 0,\n retries: 0,\n errors: [],\n };\n }\n\n // Emit progress\n this.emitProgress(project, `Starting ${phase} phase`);\n }\n\n private async executeSearchWithRelevance(\n project: ResearchProject,\n config: ResearchConfig,\n signal: AbortSignal,\n queryAnalysis: any\n ): Promise<void> {\n const queryPlan = project.metadata.queryPlan;\n \n // Use multiple search providers for comprehensive coverage\n const isAcademicDomain = [\n ResearchDomain.PHYSICS,\n ResearchDomain.CHEMISTRY,\n ResearchDomain.BIOLOGY,\n ResearchDomain.MEDICINE,\n ResearchDomain.COMPUTER_SCIENCE,\n ResearchDomain.MATHEMATICS,\n ResearchDomain.ENGINEERING,\n ResearchDomain.PSYCHOLOGY,\n ].includes(project.metadata.domain);\n \n const allResults: SearchResult[] = [];\n \n // Always search web sources with relevance scoring\n const webProvider = this.searchProviderFactory.getProvider('web');\n const webResults = await webProvider.search(queryPlan.mainQuery, config.maxSearchResults);\n allResults.push(...webResults);\n \n // Also search academic sources if configured or if academic domain\n if (config.searchProviders.includes('academic') || isAcademicDomain) {\n try {\n const academicProvider = this.searchProviderFactory.getProvider('academic');\n const academicResults = await academicProvider.search(queryPlan.mainQuery, config.maxSearchResults);\n allResults.push(...academicResults);\n } catch (error) {\n elizaLogger.warn('Academic search failed, continuing with web results:', error);\n }\n }\n \n // Score search results for relevance BEFORE processing\n elizaLogger.info(`[ResearchService] Scoring ${allResults.length} search results for relevance`);\n const relevanceScores = new Map<string, any>();\n \n for (const result of allResults) {\n if (signal.aborted) break;\n const relevanceScore = await this.relevanceAnalyzer.scoreSearchResultRelevance(result, queryAnalysis);\n relevanceScores.set(result.url, relevanceScore);\n }\n \n // Log search results with relevance scores\n await this.researchLogger.logSearch(\n project.id, \n queryPlan.mainQuery, \n 'web+academic', \n allResults, \n relevanceScores\n );\n \n // Filter and sort by relevance score (minimum threshold 0.5)\n const relevantResults = allResults\n .filter(result => (relevanceScores.get(result.url)?.score || 0) >= 0.5)\n .sort((a, b) => (relevanceScores.get(b.url)?.score || 0) - (relevanceScores.get(a.url)?.score || 0));\n \n const mainResults = relevantResults.slice(0, config.maxSearchResults);\n \n elizaLogger.info(`[ResearchService] Filtered to ${mainResults.length}/${allResults.length} relevant results (threshold >= 0.5)`);\n\n // Process main results\n for (const result of mainResults) {\n if (signal.aborted) break;\n\n const source = await this.processSearchResult(result, project);\n if (source) {\n project.sources.push(source);\n }\n }\n\n // Execute sub-queries\n for (const subQuery of queryPlan.subQueries) {\n if (signal.aborted) break;\n\n // Check dependencies\n const dependenciesMet = subQuery.dependsOn.every(\n (depId) => queryPlan.subQueries.find((sq) => sq.id === depId)?.completed\n );\n\n if (!dependenciesMet) continue;\n\n const subResults = await webProvider.search(\n subQuery.query,\n Math.floor(config.maxSearchResults / 2)\n );\n\n for (const result of subResults) {\n if (signal.aborted) break;\n\n const source = await this.processSearchResult(result, project);\n if (source) {\n project.sources.push(source);\n }\n }\n\n subQuery.completed = true;\n }\n\n // Update iteration history\n const iteration: IterationRecord = {\n iteration: project.metadata.iterationHistory.length + 1,\n timestamp: Date.now(),\n queriesUsed: [queryPlan.mainQuery, ...queryPlan.subQueries.map((sq) => sq.query)],\n sourcesFound: project.sources.length,\n findingsExtracted: 0,\n qualityScore: 0,\n };\n\n project.metadata.iterationHistory.push(iteration);\n\n // Adaptive refinement if needed\n if (queryPlan.adaptiveRefinement && project.sources.length < queryPlan.expectedSources) {\n await this.performAdaptiveRefinement(project, config, signal);\n }\n }\n\n private async processSearchResult(\n result: SearchResult,\n project: ResearchProject\n ): Promise<ResearchSource | null> {\n try {\n // Skip error results from mock providers\n if ((result.metadata as any)?.error === true) {\n elizaLogger.warn(`[ResearchService] Skipping error result: ${result.title}`);\n return null;\n }\n \n // Extract content if not already present\n let fullContent = result.content;\n if (!fullContent) {\n // Check if it's a PDF\n if (PDFExtractor.isPDFUrl(result.url)) {\n const pdfExtractor = this.searchProviderFactory.getPDFExtractor();\n const pdfContent = await pdfExtractor.extractFromURL(result.url);\n fullContent = pdfContent?.markdown || pdfContent?.content || '';\n } else {\n const contentExtractor = this.searchProviderFactory.getContentExtractor();\n const extracted = await contentExtractor.extractContent(result.url);\n fullContent = extracted.content;\n }\n }\n\n // Categorize source\n const sourceType = this.categorizeSource(result);\n\n const source: ResearchSource = {\n id: uuidv4(),\n url: result.url,\n title: result.title,\n snippet: result.snippet,\n fullContent,\n accessedAt: Date.now(),\n type: sourceType,\n reliability: await this.assessReliability(result, sourceType),\n domain: result.metadata?.domain,\n author: result.metadata?.author ? [result.metadata.author].flat() : undefined,\n publishDate: result.metadata?.publishDate,\n metadata: {\n language: result.metadata?.language || 'en',\n journal: result.metadata?.type === 'academic' ? result.metadata.domain : undefined,\n },\n };\n\n return source;\n } catch (error) {\n elizaLogger.warn(`Failed to process search result ${result.url}:`, error);\n return null;\n }\n }\n\n private categorizeSource(result: SearchResult): SourceType {\n const url = result.url.toLowerCase();\n const metadata = result.metadata;\n\n if (url.includes('arxiv.org') || url.includes('pubmed') || url.includes('.edu')) {\n return SourceType.ACADEMIC;\n }\n if (metadata?.type === 'news' || url.includes('news')) {\n return SourceType.NEWS;\n }\n if (url.includes('github.com') || url.includes('docs.')) {\n return SourceType.TECHNICAL;\n }\n if (url.includes('.gov')) {\n return SourceType.GOVERNMENT;\n }\n if (url.includes('.org') && !url.includes('wikipedia')) {\n return SourceType.ORGANIZATION;\n }\n\n return SourceType.WEB;\n }\n\n private async assessReliability(result: SearchResult, sourceType: SourceType): Promise<number> {\n let baseScore = 0.5;\n\n // Adjust based on source type\n switch (sourceType) {\n case SourceType.ACADEMIC:\n baseScore = 0.9;\n break;\n case SourceType.GOVERNMENT:\n baseScore = 0.85;\n break;\n case SourceType.TECHNICAL:\n baseScore = 0.8;\n break;\n case SourceType.NEWS:\n baseScore = 0.7;\n break;\n case SourceType.ORGANIZATION:\n baseScore = 0.75;\n break;\n }\n\n // Adjust based on metadata\n if (result.metadata?.author) baseScore += 0.05;\n if (result.metadata?.publishDate) baseScore += 0.05;\n\n return Math.min(baseScore, 1.0);\n }\n\n private async performAdaptiveRefinement(\n project: ResearchProject,\n config: ResearchConfig,\n signal: AbortSignal\n ): Promise<void> {\n const currentFindings = project.findings.slice(0, 5).map((f) => f.content);\n const refinedQueries = await this.queryPlanner.refineQuery(\n project.query,\n currentFindings,\n project.metadata.iterationHistory.length\n );\n\n const searchProvider = this.searchProviderFactory.getProvider(config.searchProviders[0]);\n\n for (const query of refinedQueries) {\n if (signal.aborted) break;\n\n const results = await searchProvider.search(query, Math.floor(config.maxSearchResults / 3));\n\n for (const result of results) {\n const source = await this.processSearchResult(result, project);\n if (source) {\n project.sources.push(source);\n }\n }\n }\n }\n\n private async analyzeFindings(project: ResearchProject, config: ResearchConfig): Promise<void> {\n elizaLogger.info(`[ResearchService] Analyzing ${project.sources.length} sources`);\n \n for (const source of project.sources) {\n // Use fullContent if available, otherwise fall back to snippet\n const contentToAnalyze = source.fullContent || source.snippet || source.title;\n \n if (!contentToAnalyze) {\n elizaLogger.warn(`[ResearchService] No content available for source: ${source.url}`);\n continue;\n }\n\n // Extract key findings\n const findings = await this.extractFindings(source, project.query, contentToAnalyze);\n\n // Extract factual claims\n const claims = await this.extractFactualClaims(source, contentToAnalyze);\n\n // Create research findings\n for (const finding of findings) {\n const researchFinding: ResearchFinding = {\n id: uuidv4(),\n content: finding.content,\n source,\n relevance: finding.relevance,\n confidence: finding.confidence,\n timestamp: Date.now(),\n category: finding.category,\n citations: [],\n factualClaims: claims.filter((c) =>\n finding.content.toLowerCase().includes(c.statement.substring(0, 30).toLowerCase())\n ),\n relatedFindings: [],\n verificationStatus: VerificationStatus.PENDING,\n extractionMethod: source.fullContent ? 'llm-extraction' : 'snippet-extraction',\n };\n\n project.findings.push(researchFinding);\n }\n }\n\n elizaLogger.info(`[ResearchService] Extracted ${project.findings.length} findings`);\n\n // Update quality score\n const lastIteration =\n project.metadata.iterationHistory[project.metadata.iterationHistory.length - 1];\n if (lastIteration) {\n lastIteration.findingsExtracted = project.findings.length;\n lastIteration.qualityScore = this.calculateQualityScore(project);\n }\n }\n\n private async extractFindings(\n source: ResearchSource,\n query: string,\n content: string\n ): Promise<Array<{ content: string; relevance: number; confidence: number; category: string }>> {\n const prompt = `Extract key findings from this source that are relevant to the research query.\n \nResearch Query: \"${query}\"\nSource: ${source.title}\nURL: ${source.url}\nContent: ${content.substring(0, 3000)}...\n\nFor each finding:\n1. Extract the specific finding/insight\n2. Rate relevance to query (0-1)\n3. Rate confidence in the finding (0-1)\n4. Categorize (fact, opinion, data, theory, method, result)\n\nFormat as JSON array:\n[{\n \"content\": \"finding text\",\n \"relevance\": 0.9,\n \"confidence\": 0.8,\n \"category\": \"fact\"\n}]`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n {\n role: 'system',\n content: 'You are a research analyst extracting key findings from sources.',\n },\n { role: 'user', content: prompt },\n ],\n });\n\n try {\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n \n // Try to extract JSON from the response\n const jsonMatch = responseContent.match(/\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n const findings = JSON.parse(jsonMatch[0]);\n // Validate findings structure\n if (Array.isArray(findings) && findings.length > 0) {\n return findings;\n }\n }\n \n // If no valid JSON found, throw error instead of creating fake findings\n throw new Error(`Failed to extract valid findings from LLM response. Response: ${responseContent.substring(0, 200)}`);\n } catch (e) {\n elizaLogger.error('[ResearchService] Failed to extract findings from source:', {\n sourceUrl: source.url,\n error: e instanceof Error ? e.message : String(e),\n contentLength: content.length\n });\n \n // Return empty array instead of fake findings - let the caller handle the failure\n return [];\n }\n }\n\n private async extractFactualClaims(source: ResearchSource, content: string): Promise<FactualClaim[]> {\n const prompt = `Extract specific factual claims from this source that can be verified.\n \nSource: ${source.title}\nContent: ${content.substring(0, 2000)}...\n\nFor each factual claim:\n1. Extract the exact statement\n2. Identify supporting evidence in the text\n3. Rate confidence (0-1)\n\nFormat as JSON array:\n[{\n \"statement\": \"claim text\",\n \"evidence\": [\"supporting text 1\", \"supporting text 2\"],\n \"confidence\": 0.9\n}]`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n {\n role: 'system',\n content: 'You are a fact-checker extracting verifiable claims from sources.',\n },\n { role: 'user', content: prompt },\n ],\n });\n\n try {\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n // Try to extract JSON from the response\n const jsonMatch = responseContent.match(/\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n const claims = JSON.parse(jsonMatch[0]);\n return claims.map((claim: any) => ({\n id: uuidv4(),\n statement: claim.statement,\n supportingEvidence: claim.evidence || [],\n sourceUrls: [source.url],\n verificationStatus: VerificationStatus.UNVERIFIED,\n confidenceScore: claim.confidence || 0.5,\n relatedClaims: [],\n }));\n }\n return [];\n } catch (e) {\n elizaLogger.warn('[ResearchService] Failed to parse claims');\n return [];\n }\n }\n\n private calculateQualityScore(project: ResearchProject): number {\n const sourceQuality =\n project.sources.reduce((sum, s) => sum + s.reliability, 0) / project.sources.length;\n const findingQuality =\n project.findings.reduce((sum, f) => sum + f.relevance * f.confidence, 0) /\n project.findings.length;\n const coverage = Math.min(\n project.sources.length / project.metadata.queryPlan.expectedSources,\n 1\n );\n\n return sourceQuality * 0.3 + findingQuality * 0.5 + coverage * 0.2;\n }\n\n private async synthesizeFindings(project: ResearchProject): Promise<void> {\n elizaLogger.info(`[ResearchService] Starting synthesis for ${project.findings.length} findings`);\n \n // Group findings by category\n const categories = new Map<string, ResearchFinding[]>();\n for (const finding of project.findings) {\n const existing = categories.get(finding.category) || [];\n existing.push(finding);\n categories.set(finding.category, existing);\n }\n\n // Synthesize by category\n const categoryAnalysis: Record<string, string> = {};\n for (const [category, findings] of categories) {\n const synthesis = await this.synthesizeCategory(category, findings);\n categoryAnalysis[category] = synthesis;\n }\n\n // Overall synthesis\n const overallSynthesis = await this.createOverallSynthesis(project, categoryAnalysis);\n\n // Update metadata\n project.metadata.categoryAnalysis = categoryAnalysis;\n project.metadata.synthesis = overallSynthesis;\n \n elizaLogger.info(`[ResearchService] Synthesis completed. Overall synthesis length: ${overallSynthesis.length} characters`);\n }\n\n private async synthesizeCategory(category: string, findings: ResearchFinding[]): Promise<string> {\n const findingTexts = findings.map((f) => f.content).join('\\n\\n');\n\n const prompt = `Synthesize these ${category} findings into a coherent summary:\n \n${findingTexts}\n\nCreate a comprehensive synthesis that:\n1. Identifies common themes\n2. Notes contradictions or debates\n3. Highlights key insights\n4. Maintains academic rigor`;\n\n elizaLogger.debug(`[ResearchService] Calling LLM for category synthesis with prompt length: ${prompt.length}`);\n \n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [{ role: 'user', content: prompt }],\n });\n\n const result = typeof response === 'string' ? response : (response as any).content || '';\n elizaLogger.debug(`[ResearchService] Category synthesis response length: ${result.length}`);\n return result;\n }\n\n private async createOverallSynthesis(\n project: ResearchProject,\n categoryAnalysis: Record<string, string>\n ): Promise<string> {\n const prompt = `Create an overall synthesis of this research project:\n \nResearch Query: \"${project.query}\"\nDomain: ${project.metadata.domain}\nTask Type: ${project.metadata.taskType}\n\nCategory Analyses:\n${Object.entries(categoryAnalysis)\n .map(([cat, analysis]) => `${cat}:\\n${analysis}`)\n .join('\\n\\n')}\n\nCreate a comprehensive synthesis that:\n1. Answers the original research question\n2. Integrates insights across categories\n3. Identifies knowledge gaps\n4. Suggests future research directions`;\n\n elizaLogger.debug(`[ResearchService] Calling LLM for overall synthesis with prompt length: ${prompt.length}`);\n \n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [{ role: 'user', content: prompt }],\n });\n\n const result = typeof response === 'string' ? response : (response as any).content || '';\n elizaLogger.debug(`[ResearchService] Overall synthesis response length: ${result.length}`);\n return result;\n }\n\n private async generateReport(project: ResearchProject): Promise<void> {\n try {\n elizaLogger.info(`[ResearchService] Generating comprehensive report for project ${project.id}`);\n\n // Use new prompt templates for better structure\n const queryAnalysis = await this.analyzeQueryForReport(project);\n \n // Step 1: Generate initial comprehensive report\n const initialSections = await this.generateComprehensiveReport(project);\n\n // Step 2: Extract and verify claims from initial report\n const claims = await this.extractClaimsFromReport(initialSections, project);\n const verificationResults = await this.verifyClaimsWithSources(claims, project);\n\n // Step 3: Enhance report with verification results and detailed analysis\n const enhancedSections = await this.enhanceReportWithDetailedAnalysis(\n project, \n initialSections,\n verificationResults\n );\n\n // Step 4: Add executive summary and finalize\n const executiveSummary = await this.generateExecutiveSummary(project, verificationResults);\n \n // Build final report with citations and bibliography\n const fullReport = this.buildFinalReport(executiveSummary, enhancedSections, project);\n\n // Build proper ResearchReport structure\n const wordCount = fullReport.split(' ').length;\n const readingTime = Math.ceil(wordCount / 200);\n\n project.report = {\n id: uuidv4(),\n title: `Research Report: ${project.query}`,\n abstract: executiveSummary.substring(0, 300) + '...',\n summary: executiveSummary,\n sections: enhancedSections,\n citations: this.extractAllCitations(project),\n bibliography: this.createBibliography(project),\n generatedAt: Date.now(),\n wordCount,\n readingTime,\n evaluationMetrics: {\n raceScore: {\n overall: 0,\n comprehensiveness: 0,\n depth: 0,\n instructionFollowing: 0,\n readability: 0,\n breakdown: [],\n },\n factScore: {\n citationAccuracy: 0,\n effectiveCitations: 0,\n totalCitations: 0,\n verifiedCitations: 0,\n disputedCitations: 0,\n citationCoverage: 0,\n sourceCredibility: 0,\n breakdown: [],\n },\n timestamp: Date.now(),\n evaluatorVersion: '1.0',\n },\n exportFormats: [\n { format: 'json', generated: false },\n { format: 'markdown', generated: false },\n { format: 'deepresearch', generated: false },\n ],\n };\n\n // Save to file\n await this.saveReportToFile(project);\n\n elizaLogger.info('[ResearchService] Report generation complete');\n } catch (error) {\n elizaLogger.error('[ResearchService] Report generation failed:', error);\n throw error;\n }\n }\n\n private async analyzeQueryForReport(project: ResearchProject): Promise<any> {\n const prompt = formatPrompt(RESEARCH_PROMPTS.QUERY_ANALYSIS, { query: project.query });\n \n const config = getPromptConfig('analysis');\n const response = await this.runtime.useModel(config.modelType, {\n messages: [\n { role: 'system', content: 'You are an expert research analyst.' },\n { role: 'user', content: prompt }\n ],\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n });\n\n try {\n const content = typeof response === 'string' ? response : response.content || '';\n return JSON.parse(content);\n } catch {\n return { query: project.query, concepts: [], dimensions: [] };\n }\n }\n\n private async extractClaimsFromReport(\n sections: ReportSection[], \n project: ResearchProject\n ): Promise<FactualClaim[]> {\n const claims: FactualClaim[] = [];\n \n for (const section of sections) {\n const sectionClaims = await this.extractClaimsFromText(section.content, project.sources);\n claims.push(...sectionClaims);\n }\n \n return claims;\n }\n\n private async extractClaimsFromText(\n text: string, \n sources: ResearchSource[]\n ): Promise<FactualClaim[]> {\n const prompt = formatPrompt(RESEARCH_PROMPTS.CLAIM_EXTRACTION, { \n text,\n sourceCount: sources.length \n });\n \n const config = getPromptConfig('extraction');\n const response = await this.runtime.useModel(config.modelType, {\n messages: [\n { role: 'system', content: 'Extract specific, verifiable claims from the text.' },\n { role: 'user', content: prompt }\n ],\n temperature: config.temperature,\n max_tokens: config.maxTokens,\n });\n\n try {\n const content = typeof response === 'string' ? response : response.content || '';\n const extractedClaims = JSON.parse(content).claims || [];\n \n return extractedClaims.map((claim: any) => ({\n statement: claim.statement,\n confidence: claim.confidence || 0.5,\n sourceUrls: claim.sources || [],\n supportingEvidence: claim.evidence || [],\n category: claim.category || 'general'\n }));\n } catch {\n return [];\n }\n }\n\n private async verifyClaimsWithSources(\n claims: FactualClaim[], \n project: ResearchProject\n ): Promise<Map<string, any>> {\n const verificationResults = new Map();\n \n // Group claims by primary source for efficient verification\n const claimsBySource = new Map<string, FactualClaim[]>();\n \n for (const claim of claims) {\n const primaryUrl = claim.sourceUrls[0];\n if (primaryUrl) {\n if (!claimsBySource.has(primaryUrl)) {\n claimsBySource.set(primaryUrl, []);\n }\n claimsBySource.get(primaryUrl)!.push(claim);\n }\n }\n \n // Verify claims batch by source\n for (const [sourceUrl, sourceClaims] of claimsBySource) {\n const source = project.sources.find(s => s.url === sourceUrl);\n if (source) {\n const results = await this.claimVerifier.batchVerifyClaims(\n sourceClaims.map(claim => ({ claim, primarySource: source })),\n project.sources\n );\n \n results.forEach((result, index) => {\n verificationResults.set(sourceClaims[index].statement, result);\n });\n }\n }\n \n return verificationResults;\n }\n\n private buildFinalReport(\n executiveSummary: string,\n sections: ReportSection[],\n project: ResearchProject\n ): string {\n const reportParts = [\n `# ${project.query}`,\n `\\n_Generated on ${new Date().toISOString()}_\\n`,\n `## Executive Summary\\n\\n${executiveSummary}\\n`,\n ];\n\n // Add main sections\n for (const section of sections) {\n reportParts.push(`## ${section.heading}\\n\\n${section.content}\\n`);\n }\n\n // Add methodology section\n const methodology = this.generateMethodologySection(project);\n reportParts.push(`## Research Methodology\\n\\n${methodology}\\n`);\n\n // Add references\n reportParts.push('## References\\n');\n const bibliography = this.createBibliography(project);\n bibliography.forEach((entry, idx) => {\n reportParts.push(`${idx + 1}. ${entry.citation}`);\n });\n\n return reportParts.join('\\n');\n }\n\n private async saveReportToFile(project: ResearchProject): Promise<void> {\n try {\n // Create logs directory\n const logsDir = path.join(process.cwd(), 'research_logs');\n await fs.mkdir(logsDir, { recursive: true });\n\n // Generate filename with timestamp and sanitized query\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const sanitizedQuery = project.query\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .substring(0, 50);\n const filename = `${timestamp}_${sanitizedQuery}.md`;\n const filepath = path.join(logsDir, filename);\n\n // Export as markdown\n const markdownContent = this.exportAsMarkdown(project);\n \n // Add metadata header\n const fullContent = `---\nid: ${project.id}\nquery: ${project.query}\nstatus: ${project.status}\ndomain: ${project.metadata.domain}\ntaskType: ${project.metadata.taskType}\ncreatedAt: ${new Date(project.createdAt).toISOString()}\ncompletedAt: ${project.completedAt ? new Date(project.completedAt).toISOString() : 'In Progress'}\nsources: ${project.sources.length}\nfindings: ${project.findings.length}\n---\n\n${markdownContent}\n\n## Metadata\n\n- **Research Domain**: ${project.metadata.domain}\n- **Task Type**: ${project.metadata.taskType}\n- **Research Depth**: ${project.metadata.depth}\n- **Sources Analyzed**: ${project.sources.length}\n- **Key Findings**: ${project.findings.length}\n- **Word Count**: ${project.report?.wordCount || 'N/A'}\n- **Estimated Reading Time**: ${project.report?.readingTime || 'N/A'} minutes\n\n## Source URLs\n\n${project.sources.map((s, i) => `${i + 1}. [${s.title}](${s.url})`).join('\\n')}\n`;\n\n await fs.writeFile(filepath, fullContent, 'utf-8');\n elizaLogger.info(`[ResearchService] Report saved to: ${filepath}`);\n\n // Also save JSON version\n const jsonFilepath = filepath.replace('.md', '.json');\n await fs.writeFile(jsonFilepath, JSON.stringify(project, null, 2), 'utf-8');\n elizaLogger.info(`[ResearchService] JSON data saved to: ${jsonFilepath}`);\n\n } catch (error) {\n elizaLogger.error('[ResearchService] Failed to save report to file:', error);\n }\n }\n\n /**\n * PASS 1: Generate comprehensive initial report sections\n * Creates detailed sections for each category with thorough analysis\n */\n private async generateComprehensiveReport(project: ResearchProject): Promise<ReportSection[]> {\n elizaLogger.info(`[ResearchService] PASS 1: Generating comprehensive initial report for ${project.findings.length} findings`);\n \n const sections: ReportSection[] = [];\n \n // Group findings by category for organized analysis\n const categories = new Map<string, ResearchFinding[]>();\n for (const finding of project.findings) {\n const existing = categories.get(finding.category) || [];\n existing.push(finding);\n categories.set(finding.category, existing);\n }\n\n elizaLogger.info(`[ResearchService] Found ${categories.size} categories: ${Array.from(categories.keys()).join(', ')}`);\n\n // Create executive summary\n const executiveSummary = await this.generateExecutiveSummary(project, new Map());\n sections.push({\n id: 'executive-summary',\n heading: 'Executive Summary',\n level: 0,\n content: executiveSummary,\n findings: [],\n citations: [],\n metadata: {\n wordCount: executiveSummary.split(' ').length,\n citationDensity: 0,\n readabilityScore: 0,\n keyTerms: [],\n },\n });\n\n // Generate comprehensive sections for each category\n for (const [category, findings] of categories.entries()) {\n elizaLogger.info(`[ResearchService] PASS 1: Generating comprehensive analysis for category: ${category} (${findings.length} findings)`);\n \n const categoryAnalysis = await this.generateDetailedCategoryAnalysis(category, findings, project.query);\n \n sections.push({\n id: `comprehensive-${category}`,\n heading: this.formatCategoryHeading(category),\n level: 1,\n content: categoryAnalysis,\n findings: findings.map(f => f.id),\n citations: this.extractCitations(findings),\n metadata: {\n wordCount: categoryAnalysis.split(' ').length,\n citationDensity: findings.length / (categoryAnalysis.split(' ').length / 100),\n readabilityScore: 0,\n keyTerms: [],\n },\n });\n }\n\n // Generate methodology section\n const methodology = await this.generateMethodologySection(project);\n sections.push({\n id: 'methodology',\n heading: 'Research Methodology',\n level: 1,\n content: methodology,\n findings: [],\n citations: [],\n metadata: {\n wordCount: methodology.split(' ').length,\n citationDensity: 0,\n readabilityScore: 0,\n keyTerms: [],\n },\n });\n\n // Generate implications and future work\n const implications = await this.generateImplicationsSection(project);\n sections.push({\n id: 'implications',\n heading: 'Implications and Future Directions',\n level: 1,\n content: implications,\n findings: [],\n citations: [],\n metadata: {\n wordCount: implications.split(' ').length,\n citationDensity: 0,\n readabilityScore: 0,\n keyTerms: [],\n },\n });\n\n const totalWords = sections.reduce((sum, s) => sum + s.metadata.wordCount, 0);\n elizaLogger.info(`[ResearchService] PASS 1 completed: Generated ${sections.length} sections with ${totalWords} total words`);\n \n return sections;\n }\n\n /**\n * PASS 2: Enhance report with detailed source analysis\n * Identifies top sources, extracts detailed content, and performs comprehensive rewrite\n */\n private async enhanceReportWithDetailedAnalysis(project: ResearchProject, initialSections: ReportSection[], verificationResults: Map<string, any>): Promise<ReportSection[]> {\n elizaLogger.info(`[ResearchService] PASS 2: Beginning detailed source analysis enhancement`);\n \n // Step 1: Identify top 10 sources\n const topSources = this.identifyTopSources(project, 10);\n elizaLogger.info(`[ResearchService] PASS 2: Identified top ${topSources.length} sources for detailed analysis`);\n \n // Step 2: Extract 10k words from each top source\n const detailedSourceContent = await this.extractDetailedSourceContent(topSources);\n elizaLogger.info(`[ResearchService] PASS 2: Extracted detailed content from ${detailedSourceContent.size} sources`);\n \n // Step 3: Enhance each section with detailed analysis\n const enhancedSections: ReportSection[] = [];\n \n for (const section of initialSections) {\n elizaLogger.info(`[ResearchService] PASS 2: Enhancing section \"${section.heading}\" with detailed analysis`);\n \n const enhancedContent = await this.enhanceSection(section, detailedSourceContent, project);\n const enhancedSection = {\n ...section,\n content: enhancedContent,\n metadata: {\n ...section.metadata,\n wordCount: enhancedContent.split(' ').length,\n }\n };\n \n enhancedSections.push(enhancedSection);\n }\n \n // Step 4: Add detailed source analysis section\n const detailedAnalysis = await this.generateDetailedSourceAnalysis(detailedSourceContent, project);\n enhancedSections.push({\n id: 'detailed-source-analysis',\n heading: 'Detailed Source Analysis',\n level: 1,\n content: detailedAnalysis,\n findings: [],\n citations: [],\n metadata: {\n wordCount: detailedAnalysis.split(' ').length,\n citationDensity: 0,\n readabilityScore: 0,\n keyTerms: [],\n },\n });\n\n const totalWords = enhancedSections.reduce((sum, s) => sum + s.metadata.wordCount, 0);\n elizaLogger.info(`[ResearchService] PASS 2 completed: Enhanced ${enhancedSections.length} sections with ${totalWords} total words`);\n \n return enhancedSections;\n }\n\n private async generateExecutiveSummary(project: ResearchProject, verificationResults: Map<string, any>): Promise<string> {\n const findingsSample = project.findings.slice(0, 10).map(f => f.content).join('\\n\\n');\n \n const prompt = `Create a comprehensive executive summary for this research project.\n\nResearch Query: \"${project.query}\"\n\nKey Findings Sample:\n${findingsSample}\n\nTotal Sources: ${project.sources.length}\nTotal Findings: ${project.findings.length}\n\nCreate a 400-500 word executive summary that:\n1. States the research objective clearly\n2. Summarizes the methodology used\n3. Highlights the most significant findings\n4. Discusses key implications\n5. Provides actionable insights\n\nFocus on being comprehensive yet accessible, suitable for both technical and non-technical audiences.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research analyst creating executive summaries for comprehensive research reports.' },\n { role: 'user', content: prompt }\n ],\n });\n\n return typeof response === 'string' ? response : (response as any).content || '';\n }\n\n private async generateDetailedCategoryAnalysis(category: string, findings: ResearchFinding[], originalQuery: string): Promise<string> {\n const findingTexts = findings.map(f => f.content).join('\\n\\n');\n \n const prompt = `Create a comprehensive analysis for the category \"${category}\" based on these research findings.\n\nOriginal Research Query: \"${originalQuery}\"\n\nFindings in this category:\n${findingTexts}\n\nCreate a detailed 800-1200 word analysis that:\n1. Introduces the category and its relevance to the research question\n2. Analyzes patterns and themes across findings\n3. Discusses methodological approaches mentioned\n4. Identifies consensus and disagreements in the literature\n5. Evaluates the strength of evidence\n6. Discusses limitations and gaps\n7. Connects findings to broader implications\n8. Suggests areas for future research\n\nUse a scholarly tone with clear subsections. Be thorough and analytical.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research analyst writing comprehensive literature reviews.' },\n { role: 'user', content: prompt }\n ],\n });\n\n return typeof response === 'string' ? response : (response as any).content || '';\n }\n\n private async generateMethodologySection(project: ResearchProject): Promise<string> {\n const searchProviders = project.sources.map(s => s.url.split('.')[1] || 'unknown').slice(0, 5);\n const domains = [...new Set(project.sources.map(s => s.type))];\n \n const prompt = `Create a comprehensive methodology section for this research project.\n\nResearch Query: \"${project.query}\"\nSources Analyzed: ${project.sources.length}\nSearch Domains: ${domains.join(', ')}\nKey Findings: ${project.findings.length}\n\nCreate a 400-600 word methodology section that describes:\n1. Research approach and design\n2. Search strategy and keywords used\n3. Source selection criteria\n4. Data extraction methods\n5. Quality assessment procedures\n6. Analysis framework\n7. Limitations and potential biases\n\nBe specific about the systematic approach taken and justify methodological choices.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research methodologist describing systematic research approaches.' },\n { role: 'user', content: prompt }\n ],\n });\n\n return typeof response === 'string' ? response : (response as any).content || '';\n }\n\n private async generateImplicationsSection(project: ResearchProject): Promise<string> {\n const keyFindings = project.findings\n .sort((a, b) => (b.relevance * b.confidence) - (a.relevance * a.confidence))\n .slice(0, 8)\n .map(f => f.content)\n .join('\\n\\n');\n \n const prompt = `Create a comprehensive implications and future directions section.\n\nResearch Query: \"${project.query}\"\n\nKey Findings:\n${keyFindings}\n\nCreate a 600-800 word section that:\n1. Discusses theoretical implications\n2. Identifies practical applications\n3. Considers policy implications (if relevant)\n4. Addresses methodological contributions\n5. Suggests specific future research directions\n6. Discusses potential real-world impact\n7. Identifies research gaps that need attention\n8. Proposes concrete next steps\n\nBe forward-looking and actionable while grounding recommendations in the evidence found.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research strategist identifying implications and future research directions.' },\n { role: 'user', content: prompt }\n ],\n });\n\n return typeof response === 'string' ? response : (response as any).content || '';\n }\n\n private identifyTopSources(project: ResearchProject, count: number): ResearchSource[] {\n // Score sources based on multiple criteria\n const scoredSources = project.sources.map(source => {\n const findingsFromSource = project.findings.filter(f => f.source.id === source.id);\n const avgRelevance = findingsFromSource.reduce((sum, f) => sum + f.relevance, 0) / Math.max(findingsFromSource.length, 1);\n const avgConfidence = findingsFromSource.reduce((sum, f) => sum + f.confidence, 0) / Math.max(findingsFromSource.length, 1);\n const contentLength = source.fullContent?.length || source.snippet?.length || 0;\n \n // Scoring formula: findings count + avg relevance + avg confidence + content richness + source reliability\n const score = (findingsFromSource.length * 2) + avgRelevance + avgConfidence + (contentLength > 5000 ? 1 : 0) + source.reliability;\n \n return { source, score, findingsCount: findingsFromSource.length };\n });\n\n // Sort by score and return top sources\n return scoredSources\n .sort((a, b) => b.score - a.score)\n .slice(0, count)\n .map(s => {\n elizaLogger.info(`[ResearchService] Top source: ${s.source.title} (Score: ${s.score.toFixed(2)}, Findings: ${s.findingsCount})`);\n return s.source;\n });\n }\n\n private async extractDetailedSourceContent(sources: ResearchSource[]): Promise<Map<string, string>> {\n const detailedContent = new Map<string, string>();\n \n for (const source of sources) {\n try {\n elizaLogger.info(`[ResearchService] Extracting detailed content from: ${source.title}`);\n \n let content = source.fullContent || source.snippet || '';\n \n // If we need more content, try to re-extract with higher limits\n if (content.length < 8000 && source.url) {\n elizaLogger.info(`[ResearchService] Re-extracting with higher limits for: ${source.url}`);\n const extractor = this.searchProviderFactory.getContentExtractor();\n const extractedContent = await extractor.extractContent(source.url);\n const extractedText = typeof extractedContent === 'string' ? extractedContent : extractedContent?.content || '';\n if (extractedText && extractedText.length > content.length) {\n content = extractedText;\n }\n }\n \n // Take first 10k words\n const words = content.split(/\\s+/).slice(0, 10000);\n const detailedText = words.join(' ');\n \n detailedContent.set(source.id, detailedText);\n elizaLogger.info(`[ResearchService] Extracted ${detailedText.length} characters from ${source.title}`);\n \n } catch (error) {\n elizaLogger.warn(`[ResearchService] Failed to extract detailed content from ${source.title}:`, error);\n }\n }\n \n return detailedContent;\n }\n\n private async enhanceSection(section: ReportSection, detailedContent: Map<string, string>, project: ResearchProject): Promise<string> {\n // Get relevant detailed content for this section\n const relevantSources: string[] = [];\n for (const findingId of section.findings) {\n const finding = project.findings.find(f => f.id === findingId);\n if (finding && detailedContent.has(finding.source.id)) {\n relevantSources.push(detailedContent.get(finding.source.id)!);\n }\n }\n \n if (relevantSources.length === 0) {\n elizaLogger.info(`[ResearchService] No detailed content available for section: ${section.heading}`);\n return section.content;\n }\n \n const combinedDetailedContent = relevantSources.join('\\n\\n---\\n\\n').substring(0, 15000);\n \n const prompt = `Enhance this research section with detailed analysis from additional source material.\n\nOriginal Section: \"${section.heading}\"\nOriginal Content:\n${section.content}\n\nDetailed Source Material (first 15k chars):\n${combinedDetailedContent}\n\nYour task:\n1. Rewrite the section to be more comprehensive and detailed\n2. Incorporate specific details, examples, and evidence from the detailed source material\n3. Add nuanced analysis and insights not present in the original\n4. Correct any potential inaccuracies using the detailed sources\n5. Expand the discussion while maintaining focus and relevance\n6. Aim for 800-1200 words for major sections, 400-600 for smaller ones\n\nMaintain the academic tone and ensure all claims are well-supported by the source material.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research analyst enhancing reports with detailed source analysis.' },\n { role: 'user', content: prompt }\n ],\n });\n\n const enhancedContent = typeof response === 'string' ? response : (response as any).content || section.content;\n elizaLogger.info(`[ResearchService] Enhanced section \"${section.heading}\" from ${section.content.length} to ${enhancedContent.length} characters`);\n \n return enhancedContent;\n }\n\n private async generateDetailedSourceAnalysis(detailedContent: Map<string, string>, project: ResearchProject): Promise<string> {\n const sourceAnalyses: string[] = [];\n \n for (const [sourceId, content] of detailedContent.entries()) {\n const source = project.sources.find(s => s.id === sourceId);\n if (!source) continue;\n \n const findings = project.findings.filter(f => f.source.id === sourceId);\n \n const analysisPrompt = `Conduct a detailed analysis of this research source.\n\nSource: ${source.title}\nURL: ${source.url}\nFindings Extracted: ${findings.length}\n\nSource Content (first 5k chars):\n${content.substring(0, 5000)}\n\nCreate a comprehensive analysis (300-400 words) that:\n1. Evaluates the credibility and authority of the source\n2. Assesses the methodology used (if applicable)\n3. Discusses the strength of evidence presented\n4. Identifies key contributions to the research question\n5. Notes any limitations or biases\n6. Compares findings with other sources in the literature\n\nBe critical yet fair in your assessment.`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { role: 'system', content: 'You are a research analyst conducting detailed source evaluations.' },\n { role: 'user', content: analysisPrompt }\n ],\n });\n\n const analysis = typeof response === 'string' ? response : (response as any).content || '';\n sourceAnalyses.push(`### ${source.title}\\n\\n${analysis}`);\n }\n \n const fullAnalysis = `This section provides detailed analysis of the top sources identified for this research project, offering critical evaluation of their methodology, findings, and contributions to our understanding of the research question.\n\n${sourceAnalyses.join('\\n\\n')}\n\n## Summary of Source Quality\n\nBased on the detailed analysis above, the sources demonstrate varying levels of methodological rigor and relevance to the research question. The majority provide valuable insights through peer-reviewed research, while some offer practical perspectives from industry applications. This diversity of source types strengthens the overall evidence base for our conclusions.`;\n\n return fullAnalysis;\n }\n\n private formatCategoryHeading(category: string): string {\n return category.charAt(0).toUpperCase() + category.slice(1).replace(/_/g, ' ');\n }\n\n private extractCitations(findings: ResearchFinding[]): Citation[] {\n const citations: Citation[] = [];\n\n for (const finding of findings) {\n for (const claim of finding.factualClaims) {\n citations.push({\n id: uuidv4(),\n text: claim.statement,\n source: finding.source,\n confidence: claim.confidenceScore,\n verificationStatus: claim.verificationStatus,\n context: finding.content,\n usageCount: 1,\n });\n }\n }\n\n return citations;\n }\n\n private extractAllCitations(project: ResearchProject): Citation[] {\n return this.extractCitations(project.findings);\n }\n\n private createBibliography(project: ResearchProject): BibliographyEntry[] {\n const entries: BibliographyEntry[] = [];\n const processedUrls = new Set<string>();\n\n for (const source of project.sources) {\n if (processedUrls.has(source.url)) continue;\n processedUrls.add(source.url);\n\n const authors = source.author?.join(', ') || 'Unknown';\n const year = source.publishDate ? new Date(source.publishDate).getFullYear() : 'n.d.';\n const citation = `${authors} (${year}). ${source.title}. Retrieved from ${source.url}`;\n\n entries.push({\n id: source.id,\n citation,\n format: 'APA',\n source,\n accessCount: project.findings.filter((f) => f.source.id === source.id).length,\n });\n }\n\n return entries.sort((a, b) => a.citation.localeCompare(b.citation));\n }\n\n async evaluateProject(projectId: string): Promise<EvaluationResults> {\n const project = this.projects.get(projectId);\n if (!project || !project.report) {\n throw new Error('Project not found or report not generated');\n }\n\n const evaluationMetrics = await this.evaluator.evaluateProject(\n project,\n project.metadata.evaluationCriteria\n );\n\n // Construct the full EvaluationResults object\n const evaluation: EvaluationResults = {\n projectId: project.id,\n raceEvaluation: {\n scores: evaluationMetrics.raceScore,\n detailedFeedback: [],\n },\n factEvaluation: {\n scores: evaluationMetrics.factScore,\n citationMap: {\n claims: new Map(),\n sources: new Map(),\n verification: new Map(),\n },\n verificationDetails: [],\n },\n overallScore: evaluationMetrics.raceScore.overall,\n recommendations: this.generateRecommendations(evaluationMetrics),\n timestamp: Date.now(),\n };\n\n // Update project with evaluation results\n project.evaluationResults = evaluation;\n\n // Update report metrics\n if (project.report) {\n project.report.evaluationMetrics = {\n raceScore: evaluationMetrics.raceScore,\n factScore: evaluationMetrics.factScore,\n timestamp: evaluation.timestamp,\n evaluatorVersion: '1.0',\n };\n }\n\n return evaluation;\n }\n\n private generateRecommendations(metrics: EvaluationMetrics): string[] {\n const recommendations: string[] = [];\n const race = metrics.raceScore;\n const fact = metrics.factScore;\n\n if (race.comprehensiveness < 0.7) {\n recommendations.push('Expand coverage to include more aspects of the research topic');\n }\n if (race.depth < 0.7) {\n recommendations.push('Provide deeper analysis and more detailed explanations');\n }\n if (race.readability < 0.7) {\n recommendations.push('Improve clarity and structure for better readability');\n }\n if (fact.citationAccuracy < 0.7) {\n recommendations.push('Verify citations and ensure claims are properly supported');\n }\n if (fact.effectiveCitations < fact.totalCitations * 0.8) {\n recommendations.push('Remove duplicate or redundant citations');\n }\n\n return recommendations;\n }\n\n async exportProject(\n projectId: string,\n format: 'json' | 'markdown' | 'deepresearch'\n ): Promise<string> {\n const project = this.projects.get(projectId);\n if (!project || !project.report) {\n throw new Error('Project not found or report not generated');\n }\n\n switch (format) {\n case 'json':\n return JSON.stringify(project, null, 2);\n\n case 'markdown':\n return this.exportAsMarkdown(project);\n\n case 'deepresearch':\n return JSON.stringify(this.exportAsDeepResearchBench(project));\n\n default:\n throw new Error(`Unsupported export format: ${format}`);\n }\n }\n\n private exportAsMarkdown(project: ResearchProject): string {\n if (!project.report) return '';\n\n let markdown = `# ${project.report.title}\\n\\n`;\n markdown += `**Generated:** ${new Date(project.report.generatedAt).toISOString()}\\n\\n`;\n markdown += `## Abstract\\n\\n${project.report.abstract}\\n\\n`;\n\n for (const section of project.report.sections) {\n const heading = '#'.repeat(section.level + 1);\n markdown += `${heading} ${section.heading}\\n\\n`;\n markdown += `${section.content}\\n\\n`;\n }\n\n markdown += `## References\\n\\n`;\n for (const entry of project.report.bibliography) {\n markdown += `- ${entry.citation}\\n`;\n }\n\n return markdown;\n }\n\n private exportAsDeepResearchBench(project: ResearchProject): DeepResearchBenchResult {\n if (!project.report) throw new Error('Report not generated');\n\n const article = project.report.sections.map((s) => `${s.heading}\\n\\n${s.content}`).join('\\n\\n');\n\n return {\n id: project.id,\n prompt: project.query,\n article,\n metadata: {\n domain: project.metadata.domain,\n taskType: project.metadata.taskType,\n generatedAt: new Date().toISOString(),\n modelVersion: 'eliza-research-1.0',\n evaluationScores: project.report.evaluationMetrics ? {\n race: project.report.evaluationMetrics.raceScore,\n fact: project.report.evaluationMetrics.factScore,\n } : {\n race: {\n overall: 0,\n comprehensiveness: 0,\n depth: 0,\n instructionFollowing: 0,\n readability: 0,\n breakdown: [],\n },\n fact: {\n citationAccuracy: 0,\n effectiveCitations: 0,\n totalCitations: 0,\n verifiedCitations: 0,\n disputedCitations: 0,\n citationCoverage: 0,\n sourceCredibility: 0,\n breakdown: [],\n },\n },\n },\n };\n }\n\n async compareProjects(projectIds: string[]): Promise<any> {\n const projects = projectIds\n .map((id) => this.projects.get(id))\n .filter(Boolean) as ResearchProject[];\n\n if (projects.length < 2) {\n throw new Error('Need at least 2 projects to compare');\n }\n\n // Calculate similarity\n const similarity = await this.calculateProjectSimilarity(projects);\n\n // Find differences\n const differences = await this.findProjectDifferences(projects);\n\n // Extract unique insights\n const uniqueInsights = await this.extractUniqueInsights(projects);\n\n // Compare quality\n const qualityComparison = this.compareProjectQuality(projects);\n\n return {\n projectIds,\n similarity,\n differences,\n uniqueInsights,\n qualityComparison,\n recommendation: await this.generateComparisonRecommendation(\n projects,\n similarity,\n differences\n ),\n };\n }\n\n private async calculateProjectSimilarity(projects: ResearchProject[]): Promise<number> {\n // Compare domains, findings overlap, source overlap\n const domainMatch = projects.every((p) => p.metadata.domain === projects[0].metadata.domain)\n ? 0.2\n : 0;\n\n // Compare findings\n const allFindings = projects.flatMap((p) => p.findings.map((f) => f.content));\n const uniqueFindings = new Set(allFindings);\n const overlapRatio = 1 - uniqueFindings.size / allFindings.length;\n\n return domainMatch + overlapRatio * 0.8;\n }\n\n private async findProjectDifferences(projects: ResearchProject[]): Promise<string[]> {\n const differences: string[] = [];\n\n // Domain differences\n const domains = new Set(projects.map((p) => p.metadata.domain));\n if (domains.size > 1) {\n differences.push(\n `Projects span ${domains.size} different domains: ${Array.from(domains).join(', ')}`\n );\n }\n\n // Approach differences\n const taskTypes = new Set(projects.map((p) => p.metadata.taskType));\n if (taskTypes.size > 1) {\n differences.push(`Different research approaches used: ${Array.from(taskTypes).join(', ')}`);\n }\n\n // Source type differences\n const sourceTypes = projects.map((p) => {\n const types = new Set(p.sources.map((s) => s.type));\n return Array.from(types);\n });\n\n return differences;\n }\n\n private async extractUniqueInsights(\n projects: ResearchProject[]\n ): Promise<Record<string, string[]>> {\n const insights: Record<string, string[]> = {};\n\n for (const project of projects) {\n const projectInsights = project.findings\n .filter((f) => f.relevance > 0.8 && f.confidence > 0.8)\n .slice(0, 3)\n .map((f) => f.content.substring(0, 200) + '...');\n\n insights[project.id] = projectInsights;\n }\n\n return insights;\n }\n\n private compareProjectQuality(projects: ResearchProject[]): any[] {\n return projects.map((p) => ({\n projectId: p.id,\n sourceCount: p.sources.length,\n findingCount: p.findings.length,\n avgSourceReliability: p.sources.reduce((sum, s) => sum + s.reliability, 0) / p.sources.length,\n evaluationScore: p.evaluationResults?.overallScore || 0,\n }));\n }\n\n private async generateComparisonRecommendation(\n projects: ResearchProject[],\n similarity: number,\n differences: string[]\n ): Promise<string> {\n if (similarity > 0.8) {\n return 'These projects are highly similar and could be merged or one could be used as validation for the other.';\n } else if (similarity > 0.5) {\n return 'These projects have moderate overlap but explore different aspects. Consider synthesizing insights from both.';\n } else {\n return 'These projects are quite different and provide complementary perspectives on related topics.';\n }\n }\n\n async addRefinedQueries(projectId: string, queries: string[]): Promise<void> {\n const project = this.projects.get(projectId);\n if (!project) throw new Error('Project not found');\n\n // Add as new sub-queries\n const newSubQueries = queries.map((query, index) => ({\n id: `refined_${Date.now()}_${index}`,\n query,\n purpose: 'Refined based on initial findings',\n priority: 2,\n dependsOn: [],\n searchProviders: ['web'],\n expectedResultType:\n project.metadata.taskType === TaskType.ANALYTICAL\n ? ('theoretical' as any)\n : ('factual' as any),\n completed: false,\n }));\n\n project.metadata.queryPlan.subQueries.push(...newSubQueries);\n\n // Continue research if active\n if (project.status === ResearchStatus.ACTIVE) {\n const controller = this.activeResearch.get(projectId);\n if (controller) {\n // Execute new queries\n const config = { ...DEFAULT_CONFIG, domain: project.metadata.domain };\n await this.executeSearchWithRelevance(project, config, controller.signal, {});\n }\n }\n }\n\n async pauseResearch(projectId: string): Promise<void> {\n const controller = this.activeResearch.get(projectId);\n if (controller) {\n controller.abort();\n }\n\n const project = this.projects.get(projectId);\n if (project) {\n project.status = ResearchStatus.PAUSED;\n project.updatedAt = Date.now();\n }\n }\n\n async resumeResearch(projectId: string): Promise<void> {\n const project = this.projects.get(projectId);\n if (!project || project.status !== ResearchStatus.PAUSED) {\n throw new Error('Project not found or not paused');\n }\n\n // Restart research from current phase\n const config = { ...DEFAULT_CONFIG, domain: project.metadata.domain };\n this.startResearch(projectId, config).catch((error) => {\n elizaLogger.error(`Failed to resume research ${projectId}:`, error);\n });\n }\n\n private emitProgress(project: ResearchProject, message: string): void {\n const progress: ResearchProgress = {\n projectId: project.id,\n phase: project.phase,\n message,\n progress: this.calculateProgress(project),\n timestamp: Date.now(),\n };\n\n // In a real implementation, this would emit to event system\n elizaLogger.info(`Research progress: ${JSON.stringify(progress)}`);\n }\n\n private calculateProgress(project: ResearchProject): number {\n const phases = Object.values(ResearchPhase);\n const currentIndex = phases.indexOf(project.phase);\n return (currentIndex / (phases.length - 1)) * 100;\n }\n\n private async analyzeFindingsWithRelevance(\n project: ResearchProject,\n config: ResearchConfig,\n queryAnalysis: any\n ): Promise<void> {\n elizaLogger.info(`[ResearchService] Analyzing ${project.sources.length} sources with relevance verification`);\n \n for (const source of project.sources) {\n // Use fullContent if available, otherwise fall back to snippet\n const contentToAnalyze = source.fullContent || source.snippet || source.title;\n \n if (!contentToAnalyze) {\n elizaLogger.warn(`[ResearchService] No content available for source: ${source.url}`);\n await this.researchLogger.logContentExtraction(\n project.id,\n source.url,\n source.title,\n 'none',\n false,\n 0,\n 'No content available'\n );\n continue;\n }\n\n // Log content extraction success\n await this.researchLogger.logContentExtraction(\n project.id,\n source.url,\n source.title,\n source.fullContent ? 'content-extractor' : 'snippet',\n true,\n contentToAnalyze.length\n );\n\n // Extract findings with relevance analysis\n const findings = await this.extractFindingsWithRelevance(\n source, \n project.query, \n contentToAnalyze, \n queryAnalysis\n );\n\n // Score findings for relevance\n const findingRelevanceScores = new Map<string, any>();\n for (const finding of findings) {\n const relevanceScore = await this.relevanceAnalyzer.scoreFindingRelevance(\n {\n id: uuidv4(),\n content: finding.content,\n source,\n relevance: finding.relevance,\n confidence: finding.confidence,\n timestamp: Date.now(),\n category: finding.category,\n citations: [],\n factualClaims: [],\n relatedFindings: [],\n verificationStatus: VerificationStatus.PENDING,\n extractionMethod: 'llm-extraction'\n },\n queryAnalysis,\n project.query\n );\n findingRelevanceScores.set(finding.content, relevanceScore);\n }\n\n // Log finding extraction\n await this.researchLogger.logFindingExtraction(\n project.id,\n source.url,\n contentToAnalyze.length,\n findings,\n findingRelevanceScores\n );\n\n // Only keep findings with good relevance scores (>= 0.6)\n const relevantFindings = findings.filter(finding => {\n const relevanceScore = findingRelevanceScores.get(finding.content);\n return (relevanceScore?.score || finding.relevance) >= 0.6;\n });\n\n elizaLogger.info(`[ResearchService] Kept ${relevantFindings.length}/${findings.length} relevant findings from ${source.title}`);\n\n // Extract factual claims for relevant findings\n const claims = await this.extractFactualClaims(source, contentToAnalyze);\n\n // Create research findings with enhanced relevance information\n for (const finding of relevantFindings) {\n const relevanceScore = findingRelevanceScores.get(finding.content);\n \n const researchFinding: ResearchFinding = {\n id: uuidv4(),\n content: finding.content,\n source,\n relevance: relevanceScore?.score || finding.relevance,\n confidence: finding.confidence,\n timestamp: Date.now(),\n category: finding.category,\n citations: [],\n factualClaims: claims.filter((c) =>\n finding.content.toLowerCase().includes(c.statement.substring(0, 30).toLowerCase())\n ),\n relatedFindings: [],\n verificationStatus: VerificationStatus.PENDING,\n extractionMethod: source.fullContent ? 'llm-extraction-with-relevance' : 'snippet-extraction-with-relevance',\n };\n\n project.findings.push(researchFinding);\n }\n }\n\n elizaLogger.info(`[ResearchService] Extracted ${project.findings.length} relevant findings`);\n\n // Update quality score\n const lastIteration =\n project.metadata.iterationHistory[project.metadata.iterationHistory.length - 1];\n if (lastIteration) {\n lastIteration.findingsExtracted = project.findings.length;\n lastIteration.qualityScore = this.calculateQualityScore(project);\n }\n }\n\n private async extractFindingsWithRelevance(\n source: ResearchSource,\n query: string,\n content: string,\n queryAnalysis: any\n ): Promise<Array<{ content: string; relevance: number; confidence: number; category: string }>> {\n const prompt = `Extract key findings from this source that DIRECTLY address the research query.\n\nResearch Query: \"${query}\"\nQuery Intent: ${queryAnalysis.queryIntent}\nKey Topics: ${queryAnalysis.keyTopics.join(', ')}\nRequired Elements: ${queryAnalysis.requiredElements.join(', ')}\n\nSource: ${source.title}\nURL: ${source.url}\nContent: ${content.substring(0, 3000)}...\n\nCRITICAL INSTRUCTIONS:\n1. Only extract findings that DIRECTLY relate to the research query\n2. Each finding must address at least one key topic or required element\n3. Rate relevance strictly - only high relevance should get scores > 0.7\n4. Focus on actionable insights that help answer the original question\n5. Avoid generic or tangential information\n\nFor each finding:\n1. Extract the specific finding/insight that addresses the query\n2. Rate relevance to query (0-1) - be strict, only highly relevant content should score > 0.7\n3. Rate confidence in the finding (0-1)\n4. Categorize appropriately\n\nFormat as JSON array:\n[{\n \"content\": \"specific finding that addresses the query\",\n \"relevance\": 0.9,\n \"confidence\": 0.8,\n \"category\": \"fact\"\n}]`;\n\n elizaLogger.debug(`[ResearchService] Calling LLM for finding extraction:`, {\n sourceTitle: source.title,\n contentLength: content.length,\n promptLength: prompt.length\n });\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n {\n role: 'system',\n content: 'You are a research analyst extracting only the most relevant findings that directly address the research query. Be strict about relevance.',\n },\n { role: 'user', content: prompt },\n ],\n temperature: 0.3, // Lower temperature for more focused extraction\n });\n\n elizaLogger.debug(`[ResearchService] LLM response received:`, {\n responseType: typeof response,\n responseLength: response ? String(response).length : 0,\n responsePreview: response ? String(response).substring(0, 200) : 'null'\n });\n\n try {\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n \n // Try to extract JSON from the response\n const jsonMatch = responseContent.match(/\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n const findings = JSON.parse(jsonMatch[0]);\n // Validate findings structure and filter for quality\n if (Array.isArray(findings) && findings.length > 0) {\n // Additional filtering for relevance in the extraction phase\n const relevantFindings = findings.filter(f => \n f.content && \n f.content.length > 20 && // Minimum content length\n f.relevance >= 0.5 && // Minimum relevance threshold\n f.category && \n typeof f.confidence === 'number'\n );\n \n elizaLogger.debug(`[ResearchService] Extracted ${relevantFindings.length}/${findings.length} quality findings from ${source.title}`);\n return relevantFindings;\n }\n }\n \n // If no valid JSON found, throw error instead of creating fake findings\n throw new Error(`Failed to extract valid findings from LLM response. Response: ${responseContent.substring(0, 200)}`);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n const errorStack = e instanceof Error ? e.stack : undefined;\n \n elizaLogger.error('[ResearchService] Failed to extract relevant findings from source:', {\n sourceUrl: source.url,\n sourceTitle: source.title,\n error: errorMessage,\n contentLength: content.length,\n contentPreview: content.substring(0, 200),\n stack: errorStack,\n fullError: e\n });\n \n console.error(`[DETAILED ERROR] Finding extraction failed for ${source.title}:`, {\n error: errorMessage,\n stack: errorStack,\n contentLength: content.length\n });\n \n // Return empty array instead of fake findings - let the caller handle the failure\n return [];\n }\n }\n\n // Service lifecycle methods\n async stop(): Promise<void> {\n // Abort all active research\n for (const [projectId, controller] of this.activeResearch) {\n controller.abort();\n const project = this.projects.get(projectId);\n if (project) {\n project.status = ResearchStatus.PAUSED;\n }\n }\n this.activeResearch.clear();\n }\n\n async getProject(projectId: string): Promise<ResearchProject | undefined> {\n return this.projects.get(projectId);\n }\n\n async getAllProjects(): Promise<ResearchProject[]> {\n return Array.from(this.projects.values());\n }\n\n async getActiveProjects(): Promise<ResearchProject[]> {\n return Array.from(this.projects.values()).filter((p) => p.status === ResearchStatus.ACTIVE);\n }\n}\n","import { IAgentRuntime, elizaLogger, ModelType } from '@elizaos/core';\nimport {\n ResearchProject,\n ResearchReport,\n Citation,\n FactualClaim,\n RACEScore,\n FACTScore,\n EvaluationCriteria,\n EvaluationMetrics,\n VerificationStatus,\n} from '../types';\n\n/**\n * RACE (Reference-based Adaptive Criteria-driven Evaluation) implementation\n */\nexport class RACEEvaluator {\n constructor(private runtime: IAgentRuntime) {}\n\n async evaluate(\n report: ResearchReport,\n criteria: EvaluationCriteria,\n referenceReport?: ResearchReport\n ): Promise<RACEScore> {\n const scores = {\n comprehensiveness: await this.evaluateDimension(\n report,\n criteria.comprehensiveness,\n 'comprehensiveness',\n referenceReport\n ),\n depth: await this.evaluateDimension(report, criteria.depth, 'depth', referenceReport),\n instructionFollowing: await this.evaluateDimension(\n report,\n criteria.instructionFollowing,\n 'instructionFollowing',\n referenceReport\n ),\n readability: await this.evaluateDimension(\n report,\n criteria.readability,\n 'readability',\n referenceReport\n ),\n };\n\n // Calculate weighted overall score\n const overall =\n scores.comprehensiveness * criteria.comprehensiveness.weight +\n scores.depth * criteria.depth.weight +\n scores.instructionFollowing * criteria.instructionFollowing.weight +\n scores.readability * criteria.readability.weight;\n\n return {\n overall,\n comprehensiveness: scores.comprehensiveness,\n depth: scores.depth,\n instructionFollowing: scores.instructionFollowing,\n readability: scores.readability,\n breakdown: [],\n };\n }\n\n private async evaluateDimension(\n report: ResearchReport,\n criteriaDefinition: any,\n dimension: string,\n referenceReport?: ResearchReport\n ): Promise<number> {\n try {\n // Check if we have useModel available\n if (!this.runtime.useModel) {\n elizaLogger.warn(`[RACEEvaluator] No model available for ${dimension} evaluation, using default score`);\n return 0.7; // Default score when no model available\n }\n\n const reportContent = this.extractReportContent(report);\n const referenceContent = referenceReport ? this.extractReportContent(referenceReport) : '';\n\n // Convert rubric items to string format if they're objects\n let rubricText = '';\n if (Array.isArray(criteriaDefinition.rubric)) {\n rubricText = criteriaDefinition.rubric.map((item: any, i: number) => {\n if (typeof item === 'string') {\n return `${i + 1}. ${item}`;\n } else if (item.description) {\n return `${item.score || i}. ${item.description}`;\n }\n return `${i + 1}. Criterion ${i + 1}`;\n }).join('\\n');\n }\n\n const prompt = `Evaluate this research report on the ${dimension} dimension.\n\nEvaluation Criteria:\n${criteriaDefinition.description}\n\nRubric Items to Check:\n${rubricText}\n\nReport to Evaluate (first 5000 chars):\n${reportContent.substring(0, 5000)}\n\n${referenceContent ? `Reference Report for Comparison (first 2000 chars):\\n${referenceContent.substring(0, 2000)}` : ''}\n\nProvide a score from 0-100 based on how well the report meets the criteria.\nConsider each rubric item and provide reasoning for your score.\n\nRespond with JSON:\n{\n \"score\": number (0-100),\n \"reasoning\": \"explanation of score\",\n \"rubricScores\": {\n \"item1\": score,\n \"item2\": score,\n ...\n }\n}`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are an expert research evaluator. Provide a balanced, fair assessment.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n max_tokens: 1000,\n });\n\n const content = typeof response === 'string' ? response : (response as any).content || '';\n \n // Try to parse JSON response\n try {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const result = JSON.parse(jsonMatch[0]);\n return Math.max(0, Math.min(1, result.score / 100)); // Normalize to 0-1\n }\n } catch (parseError) {\n elizaLogger.warn(`[RACEEvaluator] Failed to parse JSON response for ${dimension}:`, parseError);\n }\n\n // Fallback: try to extract score from text\n const scoreMatch = content.match(/score[:\\s]+(\\d+)/i);\n if (scoreMatch) {\n const score = parseInt(scoreMatch[1]);\n return Math.max(0, Math.min(1, score / 100));\n }\n\n elizaLogger.error(`[RACEEvaluator] Failed to extract score for ${dimension}`);\n return 0.5; // Default middle score\n } catch (e) {\n elizaLogger.error(`[RACEEvaluator] Failed to evaluate ${dimension}:`, e);\n return 0.5; // Default middle score\n }\n }\n\n private extractReportContent(report: ResearchReport): string {\n let content = `Title: ${report.title}\\n\\nSummary: ${report.summary}\\n\\n`;\n\n for (const section of report.sections) {\n content += `## ${section.heading}\\n${section.content}\\n\\n`;\n if (section.subsections) {\n for (const subsection of section.subsections) {\n content += `### ${subsection.heading}\\n${subsection.content}\\n\\n`;\n }\n }\n }\n\n return content.substring(0, 10000); // Limit length for LLM context\n }\n}\n\n/**\n * FACT (Framework for Factual Abundance and Citation Trustworthiness) implementation\n */\nexport class FACTEvaluator {\n constructor(private runtime: IAgentRuntime) {}\n\n async evaluate(project: ResearchProject): Promise<FACTScore> {\n const allClaims = await this.extractFactualClaims(project);\n const verificationResults = await this.verifyClaims(allClaims);\n\n const totalCitations = project.report?.citations.length || 0;\n const verifiedCitations = verificationResults.filter((r) => r.verified).length;\n const citationAccuracy = totalCitations > 0 ? verifiedCitations / totalCitations : 0;\n\n // Deduplicate claims\n const uniqueClaims = this.deduplicateClaims(verificationResults);\n const effectiveCitations = uniqueClaims.filter((c) => c.verified).length;\n\n return {\n citationAccuracy,\n effectiveCitations,\n totalCitations,\n verifiedCitations,\n disputedCitations: 0,\n citationCoverage: totalCitations > 0 ? effectiveCitations / totalCitations : 0,\n sourceCredibility: 0.8, // Default credibility score\n breakdown: [],\n };\n }\n\n private async extractFactualClaims(project: ResearchProject): Promise<FactualClaim[]> {\n const claims: FactualClaim[] = [];\n\n if (!project.report) return claims;\n\n // Extract claims from report sections\n for (const section of project.report.sections) {\n const sectionClaims = await this.extractClaimsFromText(section.content, section.citations);\n claims.push(...sectionClaims);\n }\n\n // Also extract from findings\n for (const finding of project.findings) {\n if (finding.factualClaims) {\n claims.push(...finding.factualClaims);\n }\n }\n\n return claims;\n }\n\n private async extractClaimsFromText(\n text: string,\n citations: Citation[]\n ): Promise<FactualClaim[]> {\n // Check if we have a model available\n if (!this.runtime.useModel) {\n elizaLogger.warn('[FACTEvaluator] No model available for claim extraction');\n return [];\n }\n\n const prompt = `Extract factual claims and their citations from this text.\n\nText:\n${text.substring(0, 3000)}\n\nAvailable Citations:\n${citations.slice(0, 10).map((c, i) => `[${i + 1}] ${c.source.url}`).join('\\n')}\n\nFor each factual claim in the text:\n1. Extract the exact statement\n2. Identify which citation supports it (by number)\n3. Note the supporting evidence\n\nRespond with JSON array:\n[\n {\n \"statement\": \"exact factual claim\",\n \"citationIndex\": number,\n \"supportingEvidence\": \"relevant quote or context\"\n }\n]\n\nExtract 3-5 key claims maximum.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a fact extraction expert. Extract only clear, verifiable claims.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.2,\n max_tokens: 1500,\n });\n\n const content = typeof response === 'string' ? response : (response as any).content || '';\n \n // Try to parse JSON array\n const jsonMatch = content.match(/\\[[\\s\\S]*\\]/);\n if (jsonMatch) {\n const extracted = JSON.parse(jsonMatch[0]);\n\n return extracted.slice(0, 5).map((item: any) => ({\n id: `claim_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n statement: item.statement || '',\n supportingEvidence: [item.supportingEvidence || ''],\n sourceUrls: citations[item.citationIndex - 1]\n ? [citations[item.citationIndex - 1].source.url]\n : [],\n verificationStatus: VerificationStatus.UNVERIFIED,\n confidenceScore: 0.8,\n relatedClaims: [],\n }));\n }\n } catch (e) {\n elizaLogger.error('[FACTEvaluator] Failed to extract claims:', e);\n }\n \n return [];\n }\n\n private async verifyClaims(\n claims: FactualClaim[]\n ): Promise<Array<FactualClaim & { verified: boolean }>> {\n const results = [];\n\n for (const claim of claims) {\n const verified = await this.verifySingleClaim(claim);\n results.push({ ...claim, verified });\n }\n\n return results;\n }\n\n private async verifySingleClaim(claim: FactualClaim): Promise<boolean> {\n // If no model available, return conservative estimate\n if (!this.runtime.useModel) {\n return claim.confidenceScore > 0.7;\n }\n\n // In a real implementation, this would:\n // 1. Fetch the source URL content\n // 2. Check if the content supports the claim\n // For now, we'll use a simplified verification\n\n if (!claim.sourceUrls || claim.sourceUrls.length === 0 || !claim.statement) return false;\n\n const prompt = `Does this evidence support the claim?\n\nClaim: ${claim.statement}\nEvidence: ${claim.supportingEvidence?.join(' ')}\nSource URL: ${claim.sourceUrls[0]}\n\nAnswer with just \"yes\" or \"no\".`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a fact verifier. Answer only yes or no.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.1,\n max_tokens: 10,\n });\n\n const answer = typeof response === 'string' ? response : (response as any).content || '';\n return answer.toLowerCase().includes('yes');\n } catch (e) {\n elizaLogger.error('[FACTEvaluator] Failed to verify claim:', e);\n return false;\n }\n }\n\n private deduplicateClaims(\n claims: Array<FactualClaim & { verified: boolean }>\n ): Array<FactualClaim & { verified: boolean }> {\n const seen = new Set<string>();\n const unique = [];\n\n for (const claim of claims) {\n const key = `${claim.statement}|${claim.sourceUrls?.join(',')}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(claim);\n }\n }\n\n return unique;\n }\n}\n\n/**\n * Combined evaluator for complete research assessment\n */\nexport class ResearchEvaluator {\n private raceEvaluator: RACEEvaluator;\n private factEvaluator: FACTEvaluator;\n\n constructor(runtime: IAgentRuntime) {\n this.raceEvaluator = new RACEEvaluator(runtime);\n this.factEvaluator = new FACTEvaluator(runtime);\n }\n\n async evaluateProject(\n project: ResearchProject,\n criteria: EvaluationCriteria,\n referenceReport?: ResearchReport\n ): Promise<EvaluationMetrics> {\n if (!project.report) {\n throw new Error('Project must have a completed report for evaluation');\n }\n\n const [raceScore, factScore] = await Promise.all([\n this.raceEvaluator.evaluate(project.report, criteria, referenceReport),\n this.factEvaluator.evaluate(project),\n ]);\n\n return {\n raceScore,\n factScore,\n timestamp: Date.now(),\n evaluatorVersion: '1.0',\n };\n }\n\n formatEvaluationReport(metrics: EvaluationMetrics): string {\n const race = metrics.raceScore!;\n const fact = metrics.factScore!;\n\n return `# Research Evaluation Report\n\n## RACE Scores\n- **Overall**: ${(race.overall * 100).toFixed(1)}%\n- **Comprehensiveness**: ${(race.comprehensiveness * 100).toFixed(1)}%\n- **Depth**: ${(race.depth * 100).toFixed(1)}%\n- **Instruction Following**: ${(race.instructionFollowing * 100).toFixed(1)}%\n- **Readability**: ${(race.readability * 100).toFixed(1)}%\n\n## FACT Scores\n- **Citation Accuracy**: ${(fact.citationAccuracy * 100).toFixed(1)}%\n- **Effective Citations**: ${fact.effectiveCitations}\n- **Total Citations**: ${fact.totalCitations}\n- **Verified Citations**: ${fact.verifiedCitations}\n\n## Overall Assessment\n${this.generateAssessment(race, fact)}`;\n }\n\n private generateAssessment(race: RACEScore, fact: FACTScore): string {\n const overallQuality = race.overall;\n const citationQuality = fact.citationAccuracy;\n\n if (overallQuality >= 0.8 && citationQuality >= 0.8) {\n return 'Excellent research quality with strong factual grounding.';\n } else if (overallQuality >= 0.6 && citationQuality >= 0.6) {\n return 'Good research quality with adequate citation support.';\n } else if (overallQuality >= 0.4 || citationQuality >= 0.4) {\n return 'Moderate research quality. Consider improving depth and citation accuracy.';\n } else {\n return 'Research needs significant improvement in both content quality and factual support.';\n }\n }\n}\n","// Core Research Types for DeepResearch Bench Compatibility\n\nexport interface ResearchProject {\n id: string;\n query: string;\n status: ResearchStatus;\n phase: ResearchPhase;\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n findings: ResearchFinding[];\n sources: ResearchSource[];\n report?: ResearchReport;\n error?: string;\n metadata: ResearchMetadata;\n evaluationResults?: EvaluationResults;\n}\n\nexport interface ResearchMetadata {\n domain: ResearchDomain;\n taskType: TaskType;\n language: string;\n depth: ResearchDepth;\n queryPlan: QueryPlan;\n evaluationCriteria: EvaluationCriteria;\n iterationHistory: IterationRecord[];\n performanceMetrics: PerformanceMetrics;\n categoryAnalysis?: Record<string, string>;\n synthesis?: string;\n}\n\n// DeepResearch Bench Domain Support (22 domains)\nexport enum ResearchDomain {\n PHYSICS = 'physics',\n CHEMISTRY = 'chemistry',\n BIOLOGY = 'biology',\n ENVIRONMENTAL_SCIENCE = 'environmental_science',\n ENGINEERING = 'engineering',\n COMPUTER_SCIENCE = 'computer_science',\n MATHEMATICS = 'mathematics',\n MEDICINE = 'medicine',\n PSYCHOLOGY = 'psychology',\n ECONOMICS = 'economics',\n FINANCE = 'finance',\n BUSINESS = 'business',\n MARKETING = 'marketing',\n HUMAN_RESOURCES = 'human_resources',\n LAW = 'law',\n POLITICS = 'politics',\n HISTORY = 'history',\n PHILOSOPHY = 'philosophy',\n ART_DESIGN = 'art_design',\n ENTERTAINMENT = 'entertainment',\n TRANSPORTATION = 'transportation',\n GENERAL = 'general'\n}\n\nexport enum TaskType {\n EXPLORATORY = 'exploratory',\n COMPARATIVE = 'comparative',\n ANALYTICAL = 'analytical',\n SYNTHETIC = 'synthetic',\n EVALUATIVE = 'evaluative',\n PREDICTIVE = 'predictive'\n}\n\nexport enum ResearchDepth {\n SURFACE = 'surface',\n MODERATE = 'moderate',\n DEEP = 'deep',\n PHD_LEVEL = 'phd-level'\n}\n\nexport interface QueryPlan {\n mainQuery: string;\n subQueries: SubQuery[];\n searchStrategy: SearchStrategy;\n expectedSources: number;\n iterationCount: number;\n adaptiveRefinement: boolean;\n domainSpecificApproach: DomainApproach;\n}\n\nexport interface SubQuery {\n id: string;\n query: string;\n purpose: string;\n priority: number;\n dependsOn: string[];\n searchProviders: string[];\n expectedResultType: ResultType;\n completed: boolean;\n results?: SubQueryResult;\n}\n\nexport interface SubQueryResult {\n sources: ResearchSource[];\n findings: ResearchFinding[];\n quality: number;\n nextQueries?: string[];\n}\n\nexport enum ResultType {\n FACTUAL = 'factual',\n STATISTICAL = 'statistical',\n THEORETICAL = 'theoretical',\n PRACTICAL = 'practical',\n COMPARATIVE = 'comparative'\n}\n\nexport interface SearchStrategy {\n approach: SearchApproach;\n sourceTypes: SourceType[];\n qualityThreshold: number;\n diversityRequirement: boolean;\n temporalFocus?: TemporalFocus;\n geographicScope?: string[];\n languagePreferences: string[];\n}\n\nexport enum SearchApproach {\n BREADTH_FIRST = 'breadth-first',\n DEPTH_FIRST = 'depth-first',\n ITERATIVE_REFINEMENT = 'iterative-refinement',\n HYPOTHESIS_DRIVEN = 'hypothesis-driven',\n CITATION_CHAINING = 'citation-chaining'\n}\n\nexport enum TemporalFocus {\n HISTORICAL = 'historical',\n CURRENT = 'current',\n RECENT = 'recent',\n FUTURE_ORIENTED = 'future-oriented'\n}\n\nexport interface DomainApproach {\n methodology: string;\n keyTerms: string[];\n authoritySource: string[];\n evaluationFocus: string[];\n}\n\nexport enum ResearchStatus {\n PENDING = 'pending',\n ACTIVE = 'active',\n COMPLETED = 'completed',\n FAILED = 'failed',\n PAUSED = 'paused',\n EVALUATING = 'evaluating'\n}\n\nexport enum ResearchPhase {\n INITIALIZATION = 'initialization',\n PLANNING = 'planning',\n SEARCHING = 'searching',\n ANALYZING = 'analyzing',\n SYNTHESIZING = 'synthesizing',\n EVALUATING = 'evaluating',\n REPORTING = 'reporting',\n COMPLETE = 'complete'\n}\n\nexport interface ResearchFinding {\n id: string;\n content: string;\n source: ResearchSource;\n relevance: number;\n confidence: number;\n timestamp: number;\n category: string;\n subcategory?: string;\n citations: Citation[];\n factualClaims: FactualClaim[];\n relatedFindings: string[];\n verificationStatus: VerificationStatus;\n extractionMethod: string;\n}\n\nexport interface FactualClaim {\n id: string;\n statement: string;\n supportingEvidence: string[];\n sourceUrls: string[];\n verificationStatus: VerificationStatus;\n confidenceScore: number;\n contradictions?: Contradiction[];\n relatedClaims: string[];\n}\n\nexport interface Contradiction {\n claimId: string;\n description: string;\n severity: 'minor' | 'moderate' | 'major';\n resolution?: string;\n}\n\nexport enum VerificationStatus {\n VERIFIED = 'verified',\n UNVERIFIED = 'unverified',\n DISPUTED = 'disputed',\n PARTIAL = 'partial',\n PENDING = 'pending'\n}\n\nexport interface ResearchSource {\n id: string;\n url: string;\n title: string;\n snippet?: string;\n fullContent?: string;\n accessedAt: number;\n type: SourceType;\n reliability: number;\n domain?: string;\n author?: string[];\n publishDate?: string;\n lastModified?: string;\n citations?: number;\n peerReviewed?: boolean;\n metadata: SourceMetadata;\n}\n\nexport enum SourceType {\n WEB = 'web',\n ACADEMIC = 'academic',\n NEWS = 'news',\n TECHNICAL = 'technical',\n BOOK = 'book',\n VIDEO = 'video',\n DATASET = 'dataset',\n GOVERNMENT = 'government',\n ORGANIZATION = 'organization'\n}\n\nexport interface SourceMetadata {\n journal?: string;\n doi?: string;\n isbn?: string;\n conference?: string;\n institution?: string;\n license?: string;\n language: string;\n wordCount?: number;\n readingLevel?: string;\n}\n\nexport interface Citation {\n id: string;\n text: string;\n source: ResearchSource;\n pageNumber?: number;\n section?: string;\n confidence: number;\n verificationStatus: VerificationStatus;\n context: string;\n usageCount: number;\n}\n\nexport interface ResearchReport {\n id: string;\n title: string;\n abstract: string;\n summary: string;\n sections: ReportSection[];\n citations: Citation[];\n bibliography: BibliographyEntry[];\n generatedAt: number;\n wordCount: number;\n readingTime: number;\n evaluationMetrics: EvaluationMetrics;\n exportFormats: ExportFormat[];\n}\n\nexport interface ReportSection {\n id: string;\n heading: string;\n level: number;\n content: string;\n findings: string[];\n citations: Citation[];\n subsections?: ReportSection[];\n metadata: SectionMetadata;\n}\n\nexport interface SectionMetadata {\n wordCount: number;\n citationDensity: number;\n readabilityScore: number;\n keyTerms: string[];\n}\n\nexport interface BibliographyEntry {\n id: string;\n citation: string;\n format: 'APA' | 'MLA' | 'Chicago' | 'Harvard';\n source: ResearchSource;\n accessCount: number;\n}\n\nexport interface ExportFormat {\n format: 'json' | 'markdown' | 'pdf' | 'deepresearch' | 'latex' | 'docx';\n url?: string;\n generated: boolean;\n}\n\n// RACE Evaluation Framework\nexport interface EvaluationCriteria {\n comprehensiveness: CriteriaDefinition;\n depth: CriteriaDefinition;\n instructionFollowing: CriteriaDefinition;\n readability: CriteriaDefinition;\n domainSpecific?: Record<string, CriteriaDefinition>;\n}\n\nexport interface CriteriaDefinition {\n name: string;\n description: string;\n weight: number;\n rubric: RubricItem[];\n scoringMethod: ScoringMethod;\n}\n\nexport interface RubricItem {\n score: number;\n description: string;\n examples?: string[];\n}\n\nexport enum ScoringMethod {\n BINARY = 'binary',\n SCALE = 'scale',\n RUBRIC = 'rubric',\n COMPARATIVE = 'comparative'\n}\n\nexport interface EvaluationMetrics {\n raceScore: RACEScore;\n factScore: FACTScore;\n timestamp: number;\n evaluatorVersion: string;\n}\n\nexport interface RACEScore {\n overall: number;\n comprehensiveness: number;\n depth: number;\n instructionFollowing: number;\n readability: number;\n domainSpecific?: Record<string, number>;\n breakdown: ScoreBreakdown[];\n}\n\nexport interface ScoreBreakdown {\n criterion: string;\n score: number;\n maxScore: number;\n justification: string;\n improvements: string[];\n}\n\n// FACT Evaluation Framework\nexport interface FACTScore {\n citationAccuracy: number;\n effectiveCitations: number;\n totalCitations: number;\n verifiedCitations: number;\n disputedCitations: number;\n citationCoverage: number;\n sourceCredibility: number;\n breakdown: FactBreakdown[];\n}\n\nexport interface FactBreakdown {\n sourceId: string;\n citationsFromSource: number;\n verifiedFromSource: number;\n credibilityScore: number;\n issues: string[];\n}\n\n// Performance and Optimization\nexport interface PerformanceMetrics {\n totalDuration: number;\n phaseBreakdown: Record<ResearchPhase, PhaseTiming>;\n searchQueries: number;\n sourcesProcessed: number;\n tokensGenerated: number;\n cacheHits: number;\n parallelOperations: number;\n}\n\nexport interface PhaseTiming {\n startTime: number;\n endTime: number;\n duration: number;\n retries: number;\n errors: string[];\n}\n\nexport interface IterationRecord {\n iteration: number;\n timestamp: number;\n queriesUsed: string[];\n sourcesFound: number;\n findingsExtracted: number;\n qualityScore: number;\n refinementReason?: string;\n}\n\n// Research Configuration\nexport interface ResearchConfig {\n maxSearchResults: number;\n maxDepth: number;\n timeout: number;\n enableCitations: boolean;\n enableImages: boolean;\n searchProviders: string[];\n language: string;\n researchDepth: ResearchDepth;\n domain: ResearchDomain;\n evaluationEnabled: boolean;\n cacheEnabled: boolean;\n parallelSearches: number;\n retryAttempts: number;\n qualityThreshold: number;\n}\n\n// Search and Content Types\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n content?: string;\n score: number;\n provider: string;\n metadata: SearchMetadata;\n}\n\nexport interface SearchMetadata {\n author?: string[];\n publishDate?: string;\n domain?: string;\n type?: string;\n language: string;\n location?: string;\n}\n\n// Progress Tracking\nexport interface ResearchProgress {\n projectId: string;\n phase: ResearchPhase;\n message: string;\n progress: number;\n timestamp: number;\n subProgress?: SubProgress;\n estimatedCompletion?: number;\n}\n\nexport interface SubProgress {\n current: number;\n total: number;\n description: string;\n items: string[];\n}\n\n// Evaluation Results\nexport interface EvaluationResults {\n projectId: string;\n raceEvaluation: RACEEvaluation;\n factEvaluation: FACTEvaluation;\n overallScore: number;\n recommendations: string[];\n timestamp: number;\n}\n\nexport interface RACEEvaluation {\n scores: RACEScore;\n referenceComparison?: ReferenceComparison;\n detailedFeedback: DetailedFeedback[];\n}\n\nexport interface FACTEvaluation {\n scores: FACTScore;\n citationMap: CitationMap;\n verificationDetails: VerificationDetail[];\n}\n\nexport interface ReferenceComparison {\n referenceId: string;\n similarityScore: number;\n strengths: string[];\n gaps: string[];\n}\n\nexport interface DetailedFeedback {\n section: string;\n score: number;\n feedback: string;\n suggestions: string[];\n}\n\nexport interface CitationMap {\n claims: Map<string, string[]>; // claim -> source URLs\n sources: Map<string, string[]>; // source URL -> claims\n verification: Map<string, VerificationStatus>;\n}\n\nexport interface VerificationDetail {\n claimId: string;\n sourceUrl: string;\n method: string;\n result: VerificationStatus;\n evidence?: string;\n confidence: number;\n}\n\n// DeepResearch Bench Format\nexport interface DeepResearchBenchResult {\n id: string;\n prompt: string;\n article: string;\n metadata: DeepResearchMetadata;\n}\n\nexport interface DeepResearchMetadata {\n domain: string;\n taskType: string;\n generatedAt: string;\n modelVersion: string;\n evaluationScores: {\n race: RACEScore;\n fact: FACTScore;\n };\n}\n\n// Action Chaining Support\nexport interface ActionContext {\n projectId: string;\n previousAction?: string;\n previousResult?: any;\n suggestedNextActions: string[];\n state: Record<string, any>;\n}\n\nexport interface ActionResult {\n success: boolean;\n data?: any;\n error?: string;\n nextActions: string[];\n metadata: Record<string, any>;\n}\n","import { elizaLogger } from '@elizaos/core';\nimport { SearchResult } from '../types';\n\nexport interface ProcessingConfig {\n deduplicationThreshold: number; // Similarity threshold for duplicate detection\n qualityThreshold: number; // Minimum quality score to include\n maxResults: number; // Maximum results to return\n prioritizeRecent: boolean; // Prioritize more recent sources\n diversityWeight: number; // Weight for domain diversity\n}\n\nexport interface ProcessedResults {\n results: SearchResult[];\n duplicatesRemoved: number;\n qualityFiltered: number;\n totalProcessed: number;\n diversityScore: number;\n}\n\nexport class SearchResultProcessor {\n private config: ProcessingConfig;\n\n constructor(config: Partial<ProcessingConfig> = {}) {\n this.config = {\n deduplicationThreshold: 0.85,\n qualityThreshold: 0.3,\n maxResults: 50,\n prioritizeRecent: true,\n diversityWeight: 0.3,\n ...config,\n };\n }\n\n async processResults(results: SearchResult[]): Promise<ProcessedResults> {\n elizaLogger.info(`Processing ${results.length} search results`);\n const startTime = Date.now();\n\n let processed = [...results];\n let duplicatesRemoved = 0;\n let qualityFiltered = 0;\n\n // Step 1: Quality filtering\n const beforeQuality = processed.length;\n processed = this.filterByQuality(processed);\n qualityFiltered = beforeQuality - processed.length;\n\n // Step 2: Deduplication\n const beforeDedup = processed.length;\n processed = await this.deduplicateResults(processed);\n duplicatesRemoved = beforeDedup - processed.length;\n\n // Step 3: Ranking and scoring\n processed = this.rankResults(processed);\n\n // Step 4: Diversity optimization\n processed = this.optimizeForDiversity(processed);\n\n // Step 5: Limit results\n processed = processed.slice(0, this.config.maxResults);\n\n const diversityScore = this.calculateDiversityScore(processed);\n const duration = Date.now() - startTime;\n\n elizaLogger.info(\n `Result processing completed in ${duration}ms: ` +\n `${processed.length} final results (removed ${duplicatesRemoved} duplicates, ` +\n `${qualityFiltered} low-quality), diversity: ${diversityScore.toFixed(2)}`\n );\n\n return {\n results: processed,\n duplicatesRemoved,\n qualityFiltered,\n totalProcessed: results.length,\n diversityScore,\n };\n }\n\n private filterByQuality(results: SearchResult[]): SearchResult[] {\n return results.filter(result => {\n // Basic quality checks\n if (!result.title || !result.content || result.content.length < 50) {\n return false;\n }\n\n // Score-based filtering\n if (result.score && result.score < this.config.qualityThreshold) {\n return false;\n }\n\n // Content quality checks\n if (this.isLowQualityContent(result)) {\n return false;\n }\n\n return true;\n });\n }\n\n private isLowQualityContent(result: SearchResult): boolean {\n if (!result.content) return true;\n const content = result.content.toLowerCase();\n const title = result.title.toLowerCase();\n\n // Check for spam indicators\n const spamIndicators = [\n 'click here',\n 'buy now',\n 'limited time',\n 'free download',\n 'miracle cure',\n 'get rich quick',\n 'weight loss',\n 'casino',\n 'porn',\n 'xxx',\n ];\n\n if (spamIndicators.some(indicator => content.includes(indicator) || title.includes(indicator))) {\n return true;\n }\n\n // Check for very repetitive content\n const words = content.split(/\\s+/);\n const wordCounts = words.reduce((counts, word) => {\n counts[word] = (counts[word] || 0) + 1;\n return counts;\n }, {} as Record<string, number>);\n\n const maxRepetition = Math.max(...Object.values(wordCounts));\n if (maxRepetition > words.length * 0.1) { // More than 10% repetition\n return true;\n }\n\n // Check for insufficient substantive content\n const sentences = content.split(/[.!?]+/).filter(s => s.trim().length > 10);\n if (sentences.length < 3) {\n return true;\n }\n\n return false;\n }\n\n private async deduplicateResults(results: SearchResult[]): Promise<SearchResult[]> {\n const deduplicated: SearchResult[] = [];\n const processed = new Set<string>();\n\n for (const result of results) {\n let isDuplicate = false;\n\n // URL-based deduplication (exact match)\n if (processed.has(result.url)) {\n continue;\n }\n\n // Content similarity-based deduplication\n for (const existing of deduplicated) {\n const similarity = this.calculateContentSimilarity(result, existing);\n if (similarity > this.config.deduplicationThreshold) {\n isDuplicate = true;\n // Keep the one with higher score or more recent\n if (this.shouldReplaceExisting(result, existing)) {\n const index = deduplicated.indexOf(existing);\n deduplicated[index] = result;\n }\n break;\n }\n }\n\n if (!isDuplicate) {\n deduplicated.push(result);\n processed.add(result.url);\n }\n }\n\n return deduplicated;\n }\n\n private calculateContentSimilarity(a: SearchResult, b: SearchResult): number {\n // Calculate similarity based on title and content\n const titleSim = this.calculateTextSimilarity(a.title, b.title);\n const contentSim = this.calculateTextSimilarity(\n (a.content || '').substring(0, 500),\n (b.content || '').substring(0, 500)\n );\n const snippetSim = this.calculateTextSimilarity(a.snippet || '', b.snippet || '');\n\n // Weighted average\n return titleSim * 0.4 + contentSim * 0.4 + snippetSim * 0.2;\n }\n\n private calculateTextSimilarity(text1: string, text2: string): number {\n // Simple Jaccard similarity based on word overlap\n const words1 = new Set(text1.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n const words2 = new Set(text2.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n\n const intersection = new Set([...words1].filter(w => words2.has(w)));\n const union = new Set([...words1, ...words2]);\n\n return union.size === 0 ? 0 : intersection.size / union.size;\n }\n\n private shouldReplaceExisting(newResult: SearchResult, existing: SearchResult): boolean {\n // Prefer higher scored results\n if (newResult.score && existing.score && newResult.score > existing.score) {\n return true;\n }\n\n // Prefer more recent sources if configured\n if (this.config.prioritizeRecent) {\n const newDate = this.extractDate(newResult);\n const existingDate = this.extractDate(existing);\n \n if (newDate && existingDate && newDate > existingDate) {\n return true;\n }\n }\n\n // Prefer longer, more substantive content\n if (newResult.content && existing.content && newResult.content.length > existing.content.length * 1.5) {\n return true;\n }\n\n return false;\n }\n\n private extractDate(result: SearchResult): Date | null {\n // Try to extract date from metadata\n if (result.metadata?.publishDate) {\n return new Date(result.metadata.publishDate);\n }\n\n // Try to extract from content\n if (result.content) {\n const dateMatches = result.content.match(/\\b(20\\d{2}[-/]\\d{1,2}[-/]\\d{1,2}|\\d{1,2}[-/]\\d{1,2}[-/]20\\d{2})\\b/);\n if (dateMatches) {\n return new Date(dateMatches[0]);\n }\n }\n\n return null;\n }\n\n private rankResults(results: SearchResult[]): SearchResult[] {\n return results.map(result => {\n let score = result.score || 0.5;\n\n // Boost academic sources\n if (result.provider === 'academic' || this.isAcademicSource(result)) {\n score *= 1.3;\n }\n\n // Boost reputable domains\n if (this.isReputableDomain(result.url)) {\n score *= 1.2;\n }\n\n // Boost recent content\n const date = this.extractDate(result);\n if (date) {\n const ageInDays = (Date.now() - date.getTime()) / (1000 * 60 * 60 * 24);\n if (ageInDays < 365) {\n score *= 1.1;\n }\n }\n\n // Boost longer, more comprehensive content\n if (result.content && result.content.length > 2000) {\n score *= 1.1;\n }\n\n return {\n ...result,\n score: Math.min(score, 1.0), // Cap at 1.0\n };\n }).sort((a, b) => (b.score || 0) - (a.score || 0));\n }\n\n private isAcademicSource(result: SearchResult): boolean {\n const academicDomains = [\n 'scholar.google.com',\n 'arxiv.org',\n 'pubmed.ncbi.nlm.nih.gov',\n 'ieee.org',\n 'acm.org',\n 'springer.com',\n 'sciencedirect.com',\n 'wiley.com',\n 'nature.com',\n 'science.org',\n '.edu',\n '.ac.uk',\n ];\n\n return academicDomains.some(domain => result.url.includes(domain));\n }\n\n private isReputableDomain(url: string): boolean {\n const reputableDomains = [\n 'wikipedia.org',\n 'britannica.com',\n 'stanford.edu',\n 'mit.edu',\n 'harvard.edu',\n 'nytimes.com',\n 'bbc.com',\n 'reuters.com',\n 'ap.org',\n 'cnn.com',\n 'washingtonpost.com',\n 'theguardian.com',\n 'economist.com',\n 'github.com',\n 'stackoverflow.com',\n ];\n\n return reputableDomains.some(domain => url.includes(domain));\n }\n\n private optimizeForDiversity(results: SearchResult[]): SearchResult[] {\n if (this.config.diversityWeight === 0) {\n return results;\n }\n\n const diversified: SearchResult[] = [];\n const domainCounts = new Map<string, number>();\n const providerCounts = new Map<string, number>();\n\n for (const result of results) {\n const domain = new URL(result.url).hostname;\n const provider = result.provider || 'unknown';\n\n const domainCount = domainCounts.get(domain) || 0;\n const providerCount = providerCounts.get(provider) || 0;\n\n // Apply diversity penalty for over-represented domains/providers\n let diversityPenalty = 1.0;\n if (domainCount > 2) {\n diversityPenalty *= 0.8;\n }\n if (providerCount > 5) {\n diversityPenalty *= 0.9;\n }\n\n const adjustedScore = (result.score || 0.5) * \n (1 - this.config.diversityWeight + this.config.diversityWeight * diversityPenalty);\n\n diversified.push({\n ...result,\n score: adjustedScore,\n });\n\n domainCounts.set(domain, domainCount + 1);\n providerCounts.set(provider, providerCount + 1);\n }\n\n return diversified.sort((a, b) => (b.score || 0) - (a.score || 0));\n }\n\n private calculateDiversityScore(results: SearchResult[]): number {\n if (results.length === 0) return 0;\n\n const domains = new Set(results.map(r => new URL(r.url).hostname));\n const providers = new Set(results.map(r => r.provider));\n\n // Calculate diversity as ratio of unique domains/providers to total results\n const domainDiversity = domains.size / results.length;\n const providerDiversity = providers.size / results.length;\n\n return (domainDiversity + providerDiversity) / 2;\n }\n}","import { elizaLogger, IAgentRuntime, ModelType } from '@elizaos/core';\nimport { SearchResult, ResearchSource, ResearchFinding } from '../types';\n\nexport interface RelevanceScore {\n score: number; // 0-1\n reasoning: string;\n queryAlignment: number; // How well it addresses the query\n topicRelevance: number; // How relevant to the topic\n specificity: number; // How specific vs generic\n}\n\nexport interface RelevanceAnalysis {\n queryIntent: string;\n keyTopics: string[];\n requiredElements: string[];\n exclusionCriteria: string[];\n}\n\n/**\n * Analyzes and scores relevance of search results and findings to the original research query\n */\nexport class RelevanceAnalyzer {\n constructor(private runtime: IAgentRuntime) {}\n\n /**\n * Analyze the research query to understand what constitutes relevance\n */\n async analyzeQueryRelevance(query: string): Promise<RelevanceAnalysis> {\n elizaLogger.info(`[RelevanceAnalyzer] Analyzing query intent: ${query}`);\n\n const prompt = `Analyze this research query to define what makes a source or finding relevant:\n\nQuery: \"${query}\"\n\nExtract:\n1. Query Intent: What is the user really asking for?\n2. Key Topics: Core topics that MUST be addressed\n3. Required Elements: Specific elements that relevant sources should contain\n4. Exclusion Criteria: What should be filtered out as irrelevant\n\nFormat as JSON:\n{\n \"queryIntent\": \"clear statement of what user wants\",\n \"keyTopics\": [\"topic1\", \"topic2\", \"topic3\"],\n \"requiredElements\": [\"element1\", \"element2\"],\n \"exclusionCriteria\": [\"avoid1\", \"avoid2\"]\n}`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a research query analyst. Extract query intent and relevance criteria precisely.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n });\n\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n const jsonMatch = responseContent.match(/\\{[\\s\\S]*\\}/);\n \n if (jsonMatch) {\n const analysis = JSON.parse(jsonMatch[0]);\n elizaLogger.info(`[RelevanceAnalyzer] Query analysis complete:`, {\n intent: analysis.queryIntent,\n keyTopicsCount: analysis.keyTopics?.length || 0,\n requiredElementsCount: analysis.requiredElements?.length || 0\n });\n return analysis;\n }\n } catch (error) {\n elizaLogger.error('[RelevanceAnalyzer] Failed to analyze query relevance:', error);\n }\n\n // Fallback analysis\n return {\n queryIntent: query,\n keyTopics: this.extractKeywordsFromQuery(query),\n requiredElements: [],\n exclusionCriteria: []\n };\n }\n\n /**\n * Score search result relevance before content extraction\n */\n async scoreSearchResultRelevance(\n result: SearchResult, \n queryAnalysis: RelevanceAnalysis\n ): Promise<RelevanceScore> {\n elizaLogger.debug(`[RelevanceAnalyzer] Scoring search result: ${result.title}`);\n\n const prompt = `Score the relevance of this search result to the research query:\n\nQUERY INTENT: ${queryAnalysis.queryIntent}\nKEY TOPICS: ${queryAnalysis.keyTopics.join(', ')}\nREQUIRED ELEMENTS: ${queryAnalysis.requiredElements.join(', ')}\n\nSEARCH RESULT:\nTitle: ${result.title}\nSnippet: ${result.snippet}\nURL: ${result.url}\n\nRate 0-1 for each dimension:\n1. Query Alignment: How directly does this address the query intent?\n2. Topic Relevance: How well does it cover the key topics?\n3. Specificity: How specific (vs generic) is the content to the query?\n\nProvide reasoning for the scores.\n\nFormat as JSON:\n{\n \"queryAlignment\": 0.8,\n \"topicRelevance\": 0.9,\n \"specificity\": 0.7,\n \"reasoning\": \"detailed explanation of why this result is/isn't relevant\",\n \"score\": 0.8\n}`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a search result relevance scorer. Be critical - only high relevance should get high scores.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.2,\n });\n\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n const jsonMatch = responseContent.match(/\\{[\\s\\S]*\\}/);\n \n if (jsonMatch) {\n const score = JSON.parse(jsonMatch[0]);\n const finalScore = (score.queryAlignment + score.topicRelevance + score.specificity) / 3;\n \n elizaLogger.debug(`[RelevanceAnalyzer] Search result scored:`, {\n url: result.url,\n score: finalScore,\n breakdown: {\n queryAlignment: score.queryAlignment,\n topicRelevance: score.topicRelevance,\n specificity: score.specificity\n }\n });\n\n return {\n score: finalScore,\n reasoning: score.reasoning,\n queryAlignment: score.queryAlignment,\n topicRelevance: score.topicRelevance,\n specificity: score.specificity\n };\n }\n } catch (error) {\n elizaLogger.error('[RelevanceAnalyzer] Failed to score search result:', error);\n }\n\n // Fallback: Simple keyword matching\n const titleScore = this.calculateKeywordScore(result.title, queryAnalysis.keyTopics);\n const snippetScore = this.calculateKeywordScore(result.snippet, queryAnalysis.keyTopics);\n const fallbackScore = (titleScore + snippetScore) / 2;\n\n return {\n score: fallbackScore,\n reasoning: `Fallback keyword scoring: title=${titleScore.toFixed(2)}, snippet=${snippetScore.toFixed(2)}`,\n queryAlignment: fallbackScore,\n topicRelevance: fallbackScore,\n specificity: 0.5\n };\n }\n\n /**\n * Score finding relevance after extraction\n */\n async scoreFindingRelevance(\n finding: ResearchFinding,\n queryAnalysis: RelevanceAnalysis,\n originalQuery: string\n ): Promise<RelevanceScore> {\n elizaLogger.debug(`[RelevanceAnalyzer] Scoring finding relevance`);\n\n const prompt = `Score how well this research finding answers the original query:\n\nORIGINAL QUERY: \"${originalQuery}\"\nQUERY INTENT: ${queryAnalysis.queryIntent}\nKEY TOPICS: ${queryAnalysis.keyTopics.join(', ')}\n\nFINDING:\nContent: ${finding.content}\nCategory: ${finding.category}\nSource: ${finding.source.title}\n\nCritical Assessment:\n1. Does this finding DIRECTLY address the query intent?\n2. Does it cover the key topics meaningfully?\n3. Is it specific to the query or generic information?\n4. Would this help someone answer the original question?\n\nRate 0-1 for each dimension and overall relevance.\n\nFormat as JSON:\n{\n \"queryAlignment\": 0.8,\n \"topicRelevance\": 0.9,\n \"specificity\": 0.7,\n \"reasoning\": \"detailed explanation of relevance to original query\",\n \"score\": 0.8\n}`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a research finding relevance judge. Be strict - only findings that directly address the query should score high.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.2,\n });\n\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n const jsonMatch = responseContent.match(/\\{[\\s\\S]*\\}/);\n \n if (jsonMatch) {\n const score = JSON.parse(jsonMatch[0]);\n const finalScore = (score.queryAlignment + score.topicRelevance + score.specificity) / 3;\n \n elizaLogger.debug(`[RelevanceAnalyzer] Finding scored:`, {\n score: finalScore,\n category: finding.category,\n sourceUrl: finding.source.url\n });\n\n return {\n score: finalScore,\n reasoning: score.reasoning,\n queryAlignment: score.queryAlignment,\n topicRelevance: score.topicRelevance,\n specificity: score.specificity\n };\n }\n } catch (error) {\n elizaLogger.error('[RelevanceAnalyzer] Failed to score finding:', error);\n }\n\n // Fallback scoring\n const keywordScore = this.calculateKeywordScore(finding.content, queryAnalysis.keyTopics);\n return {\n score: keywordScore,\n reasoning: `Fallback keyword scoring: ${keywordScore.toFixed(2)}`,\n queryAlignment: keywordScore,\n topicRelevance: keywordScore,\n specificity: 0.5\n };\n }\n\n /**\n * Verify that extracted findings actually answer the research query\n */\n async verifyQueryAnswering(\n findings: ResearchFinding[],\n originalQuery: string\n ): Promise<{\n coverage: number;\n gaps: string[];\n recommendations: string[];\n }> {\n elizaLogger.info(`[RelevanceAnalyzer] Verifying query answering for ${findings.length} findings`);\n\n const findingSummaries = findings\n .slice(0, 20) // Limit for prompt size\n .map((f, i) => `${i + 1}. ${f.content.substring(0, 200)}...`)\n .join('\\n');\n\n const prompt = `Assess how well these research findings answer the original query:\n\nORIGINAL QUERY: \"${originalQuery}\"\n\nFINDINGS:\n${findingSummaries}\n\nAssessment:\n1. Coverage Score (0-1): How well do these findings collectively answer the query?\n2. Gaps: What important aspects of the query are NOT addressed?\n3. Recommendations: What additional research is needed?\n\nFormat as JSON:\n{\n \"coverage\": 0.7,\n \"gaps\": [\"gap1\", \"gap2\"],\n \"recommendations\": [\"rec1\", \"rec2\"]\n}`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a research completeness assessor. Evaluate if findings actually answer the research question.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n });\n\n const responseContent = typeof response === 'string' ? response : (response as any).content || '';\n const jsonMatch = responseContent.match(/\\{[\\s\\S]*\\}/);\n \n if (jsonMatch) {\n const assessment = JSON.parse(jsonMatch[0]);\n elizaLogger.info(`[RelevanceAnalyzer] Query answering assessment:`, {\n coverage: assessment.coverage,\n gapsCount: assessment.gaps?.length || 0,\n recommendationsCount: assessment.recommendations?.length || 0\n });\n return assessment;\n }\n } catch (error) {\n elizaLogger.error('[RelevanceAnalyzer] Failed to verify query answering:', error);\n }\n\n return {\n coverage: findings.length > 0 ? 0.5 : 0,\n gaps: ['Unable to assess coverage'],\n recommendations: ['Manual review recommended']\n };\n }\n\n private extractKeywordsFromQuery(query: string): string[] {\n // Simple keyword extraction as fallback\n const words = query.toLowerCase()\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter(word => word.length > 3)\n .filter(word => !['what', 'how', 'why', 'when', 'where', 'which', 'that', 'this', 'with', 'from', 'they', 'have', 'been', 'will', 'are'].includes(word));\n \n return words.slice(0, 5);\n }\n\n private calculateKeywordScore(text: string, keywords: string[]): number {\n if (!keywords.length) return 0.5;\n \n const lowerText = text.toLowerCase();\n const matches = keywords.filter(keyword => lowerText.includes(keyword.toLowerCase()));\n return matches.length / keywords.length;\n }\n}","import { elizaLogger, IAgentRuntime } from '@elizaos/core';\nimport { SearchResult, ResearchSource, ResearchFinding, ResearchProject } from '../types';\nimport { RelevanceScore, RelevanceAnalysis } from './relevance-analyzer';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nexport interface SearchLog {\n timestamp: number;\n projectId: string;\n query: string;\n originalQuery: string;\n provider: string;\n resultsCount: number;\n results: Array<{\n title: string;\n url: string;\n snippet: string;\n relevanceScore?: RelevanceScore;\n processed: boolean;\n contentExtracted: boolean;\n findingsExtracted: number;\n }>;\n}\n\nexport interface ContentExtractionLog {\n timestamp: number;\n projectId: string;\n url: string;\n sourceTitle: string;\n method: string; // 'stagehand', 'firecrawl', 'playwright', 'pdf'\n success: boolean;\n contentLength: number;\n error?: string;\n relevanceScore?: RelevanceScore;\n}\n\nexport interface FindingExtractionLog {\n timestamp: number;\n projectId: string;\n sourceUrl: string;\n originalQuery: string;\n contentLength: number;\n findingsExtracted: number;\n findings: Array<{\n content: string;\n relevance: number;\n confidence: number;\n category: string;\n relevanceScore?: RelevanceScore;\n }>;\n queryAlignment: number;\n}\n\nexport interface ResearchSession {\n projectId: string;\n originalQuery: string;\n startTime: number;\n queryAnalysis: RelevanceAnalysis;\n searchLogs: SearchLog[];\n extractionLogs: ContentExtractionLog[];\n findingLogs: FindingExtractionLog[];\n summary: {\n totalSearches: number;\n totalResults: number;\n relevantResults: number;\n totalSources: number;\n successfulExtractions: number;\n totalFindings: number;\n relevantFindings: number;\n overallRelevance: number;\n gaps: string[];\n recommendations: string[];\n };\n}\n\n/**\n * Comprehensive logging system for research operations to track relevance throughout the pipeline\n */\nexport class ResearchLogger {\n private sessions: Map<string, ResearchSession> = new Map();\n private logsDir: string;\n\n constructor(private runtime: IAgentRuntime) {\n this.logsDir = path.join(process.cwd(), 'research_logs');\n }\n\n async initializeSession(\n projectId: string, \n originalQuery: string, \n queryAnalysis: RelevanceAnalysis\n ): Promise<void> {\n elizaLogger.info(`[ResearchLogger] Initializing session for project: ${projectId}`);\n\n const session: ResearchSession = {\n projectId,\n originalQuery,\n startTime: Date.now(),\n queryAnalysis,\n searchLogs: [],\n extractionLogs: [],\n findingLogs: [],\n summary: {\n totalSearches: 0,\n totalResults: 0,\n relevantResults: 0,\n totalSources: 0,\n successfulExtractions: 0,\n totalFindings: 0,\n relevantFindings: 0,\n overallRelevance: 0,\n gaps: [],\n recommendations: []\n }\n };\n\n this.sessions.set(projectId, session);\n\n // Create logs directory\n await fs.mkdir(this.logsDir, { recursive: true });\n }\n\n async logSearch(\n projectId: string,\n query: string,\n provider: string,\n results: SearchResult[],\n relevanceScores?: Map<string, RelevanceScore>\n ): Promise<void> {\n const session = this.sessions.get(projectId);\n if (!session) return;\n\n elizaLogger.info(`[ResearchLogger] Logging search: ${query} (${results.length} results)`);\n\n const searchLog: SearchLog = {\n timestamp: Date.now(),\n projectId,\n query,\n originalQuery: session.originalQuery,\n provider,\n resultsCount: results.length,\n results: results.map(result => ({\n title: result.title,\n url: result.url,\n snippet: result.snippet,\n relevanceScore: relevanceScores?.get(result.url),\n processed: false,\n contentExtracted: false,\n findingsExtracted: 0\n }))\n };\n\n session.searchLogs.push(searchLog);\n session.summary.totalSearches++;\n session.summary.totalResults += results.length;\n\n // Count relevant results (score >= 0.6)\n const relevantCount = searchLog.results.filter(r => (r.relevanceScore?.score || 0) >= 0.6).length;\n session.summary.relevantResults += relevantCount;\n\n elizaLogger.info(`[ResearchLogger] Search logged: ${relevantCount}/${results.length} relevant results`);\n }\n\n async logContentExtraction(\n projectId: string,\n url: string,\n sourceTitle: string,\n method: string,\n success: boolean,\n contentLength: number,\n error?: string,\n relevanceScore?: RelevanceScore\n ): Promise<void> {\n const session = this.sessions.get(projectId);\n if (!session) return;\n\n elizaLogger.info(`[ResearchLogger] Logging content extraction: ${url} (${success ? 'success' : 'failed'})`);\n\n const extractionLog: ContentExtractionLog = {\n timestamp: Date.now(),\n projectId,\n url,\n sourceTitle,\n method,\n success,\n contentLength,\n error,\n relevanceScore\n };\n\n session.extractionLogs.push(extractionLog);\n session.summary.totalSources++;\n\n if (success) {\n session.summary.successfulExtractions++;\n }\n\n // Update search log\n for (const searchLog of session.searchLogs) {\n const result = searchLog.results.find(r => r.url === url);\n if (result) {\n result.processed = true;\n result.contentExtracted = success;\n break;\n }\n }\n\n elizaLogger.debug(`[ResearchLogger] Content extraction logged: ${sourceTitle} - ${contentLength} chars`);\n }\n\n async logFindingExtraction(\n projectId: string,\n sourceUrl: string,\n contentLength: number,\n findings: Array<{\n content: string;\n relevance: number;\n confidence: number;\n category: string;\n }>,\n findingRelevanceScores?: Map<string, RelevanceScore>\n ): Promise<void> {\n const session = this.sessions.get(projectId);\n if (!session) return;\n\n elizaLogger.info(`[ResearchLogger] Logging finding extraction: ${sourceUrl} (${findings.length} findings)`);\n\n const findingsWithScores = findings.map(finding => ({\n ...finding,\n relevanceScore: findingRelevanceScores?.get(finding.content)\n }));\n\n const findingLog: FindingExtractionLog = {\n timestamp: Date.now(),\n projectId,\n sourceUrl,\n originalQuery: session.originalQuery,\n contentLength,\n findingsExtracted: findings.length,\n findings: findingsWithScores,\n queryAlignment: findingsWithScores.reduce((sum, f) => sum + (f.relevanceScore?.queryAlignment || f.relevance), 0) / Math.max(findings.length, 1)\n };\n\n session.findingLogs.push(findingLog);\n session.summary.totalFindings += findings.length;\n\n // Count relevant findings (relevance >= 0.7)\n const relevantCount = findings.filter(f => f.relevance >= 0.7).length;\n session.summary.relevantFindings += relevantCount;\n\n // Update search log\n for (const searchLog of session.searchLogs) {\n const result = searchLog.results.find(r => r.url === sourceUrl);\n if (result) {\n result.findingsExtracted = findings.length;\n break;\n }\n }\n\n elizaLogger.info(`[ResearchLogger] Finding extraction logged: ${relevantCount}/${findings.length} relevant findings`);\n }\n\n async finalizeSession(\n projectId: string,\n gaps: string[],\n recommendations: string[]\n ): Promise<ResearchSession> {\n const session = this.sessions.get(projectId);\n if (!session) throw new Error('Session not found');\n\n elizaLogger.info(`[ResearchLogger] Finalizing session for project: ${projectId}`);\n\n // Calculate overall relevance\n const totalRelevanceScore = session.findingLogs.reduce((sum, log) => sum + log.queryAlignment, 0);\n session.summary.overallRelevance = totalRelevanceScore / Math.max(session.findingLogs.length, 1);\n\n session.summary.gaps = gaps;\n session.summary.recommendations = recommendations;\n\n // Save detailed log to file\n await this.saveSessionLog(session);\n\n // Log summary\n elizaLogger.info(`[ResearchLogger] Session summary for ${projectId}:`, {\n duration: Date.now() - session.startTime,\n searches: session.summary.totalSearches,\n results: session.summary.totalResults,\n relevantResults: session.summary.relevantResults,\n sources: session.summary.totalSources,\n successfulExtractions: session.summary.successfulExtractions,\n findings: session.summary.totalFindings,\n relevantFindings: session.summary.relevantFindings,\n overallRelevance: session.summary.overallRelevance,\n gaps: gaps.length,\n recommendations: recommendations.length\n });\n\n return session;\n }\n\n private async saveSessionLog(session: ResearchSession): Promise<void> {\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const sanitizedQuery = session.originalQuery\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .substring(0, 50);\n \n const filename = `${timestamp}_${sanitizedQuery}_research-log.json`;\n const filepath = path.join(this.logsDir, filename);\n\n // Create comprehensive log with all details\n const logData = {\n ...session,\n metadata: {\n savedAt: Date.now(),\n version: '1.0',\n description: 'Comprehensive research session log with relevance tracking'\n },\n analysis: {\n relevanceByPhase: {\n searchResults: session.summary.relevantResults / Math.max(session.summary.totalResults, 1),\n contentExtraction: session.summary.successfulExtractions / Math.max(session.summary.totalSources, 1),\n findingExtraction: session.summary.relevantFindings / Math.max(session.summary.totalFindings, 1)\n },\n bottlenecks: this.identifyBottlenecks(session),\n recommendations: this.generateTechnicalRecommendations(session)\n }\n };\n\n await fs.writeFile(filepath, JSON.stringify(logData, null, 2), 'utf-8');\n elizaLogger.info(`[ResearchLogger] Session log saved to: ${filepath}`);\n\n // Also create a summary report\n const summaryPath = filepath.replace('.json', '_summary.md');\n const summaryContent = this.generateSummaryReport(session);\n await fs.writeFile(summaryPath, summaryContent, 'utf-8');\n elizaLogger.info(`[ResearchLogger] Summary report saved to: ${summaryPath}`);\n\n } catch (error) {\n elizaLogger.error('[ResearchLogger] Failed to save session log:', error);\n }\n }\n\n private identifyBottlenecks(session: ResearchSession): string[] {\n const bottlenecks: string[] = [];\n\n const relevanceRatio = session.summary.relevantResults / Math.max(session.summary.totalResults, 1);\n const extractionRatio = session.summary.successfulExtractions / Math.max(session.summary.totalSources, 1);\n const findingRatio = session.summary.relevantFindings / Math.max(session.summary.totalFindings, 1);\n\n if (relevanceRatio < 0.5) {\n bottlenecks.push('Low search result relevance - improve query generation or search provider selection');\n }\n \n if (extractionRatio < 0.7) {\n bottlenecks.push('Poor content extraction success rate - improve extraction methods or fallbacks');\n }\n \n if (findingRatio < 0.6) {\n bottlenecks.push('Low finding relevance - improve extraction prompts or relevance filtering');\n }\n\n if (session.summary.overallRelevance < 0.7) {\n bottlenecks.push('Overall low relevance - review entire pipeline for query alignment');\n }\n\n return bottlenecks;\n }\n\n private generateTechnicalRecommendations(session: ResearchSession): string[] {\n const recommendations: string[] = [];\n\n // Search quality recommendations\n const avgResultsPerSearch = session.summary.totalResults / Math.max(session.summary.totalSearches, 1);\n if (avgResultsPerSearch < 10) {\n recommendations.push('Increase search breadth - too few results per search');\n }\n\n // Finding quality recommendations\n const avgFindingsPerSource = session.summary.totalFindings / Math.max(session.summary.successfulExtractions, 1);\n if (avgFindingsPerSource < 2) {\n recommendations.push('Improve finding extraction - too few findings per source');\n }\n\n // Relevance recommendations\n if (session.summary.overallRelevance < 0.8) {\n recommendations.push('Enhance relevance filtering throughout pipeline');\n }\n\n return recommendations;\n }\n\n private generateSummaryReport(session: ResearchSession): string {\n const duration = Date.now() - session.startTime;\n const durationMin = Math.round(duration / 60000);\n\n return `# Research Session Summary\n\n## Query\n**Original Query:** ${session.originalQuery}\n\n**Duration:** ${durationMin} minutes\n\n## Query Analysis\n- **Intent:** ${session.queryAnalysis.queryIntent}\n- **Key Topics:** ${session.queryAnalysis.keyTopics.join(', ')}\n- **Required Elements:** ${session.queryAnalysis.requiredElements.join(', ')}\n\n## Results Summary\n- **Searches:** ${session.summary.totalSearches}\n- **Total Results:** ${session.summary.totalResults}\n- **Relevant Results:** ${session.summary.relevantResults} (${(session.summary.relevantResults / Math.max(session.summary.totalResults, 1) * 100).toFixed(1)}%)\n- **Sources Processed:** ${session.summary.totalSources}\n- **Successful Extractions:** ${session.summary.successfulExtractions} (${(session.summary.successfulExtractions / Math.max(session.summary.totalSources, 1) * 100).toFixed(1)}%)\n- **Total Findings:** ${session.summary.totalFindings}\n- **Relevant Findings:** ${session.summary.relevantFindings} (${(session.summary.relevantFindings / Math.max(session.summary.totalFindings, 1) * 100).toFixed(1)}%)\n\n## Relevance Score\n**Overall Relevance:** ${(session.summary.overallRelevance * 100).toFixed(1)}%\n\n## Identified Gaps\n${session.summary.gaps.map(gap => `- ${gap}`).join('\\n')}\n\n## Recommendations\n${session.summary.recommendations.map(rec => `- ${rec}`).join('\\n')}\n\n## Search Details\n${session.searchLogs.map((log, i) => `\n### Search ${i + 1}: ${log.query}\n- Provider: ${log.provider}\n- Results: ${log.resultsCount}\n- Relevant: ${log.results.filter(r => (r.relevanceScore?.score || 0) >= 0.6).length}\n`).join('\\n')}\n\n## Content Extraction\n${session.extractionLogs.map((log, i) => `\n### Extraction ${i + 1}: ${log.sourceTitle}\n- URL: ${log.url}\n- Method: ${log.method}\n- Success: ${log.success ? 'Yes' : 'No'}\n- Content Length: ${log.contentLength} chars\n${log.error ? `- Error: ${log.error}` : ''}\n`).join('\\n')}\n`;\n }\n\n getSessionSummary(projectId: string): ResearchSession | undefined {\n return this.sessions.get(projectId);\n }\n}","import axios, { AxiosError } from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\nimport { z } from 'zod';\n\n// Tavily API response schema validation\nconst TavilyResultSchema = z.object({\n title: z.string().optional(),\n url: z.string(),\n content: z.string().optional(),\n snippet: z.string().optional(),\n raw_content: z.string().nullable().optional(),\n score: z.number().optional(),\n});\n\nconst TavilyResponseSchema = z.object({\n query: z.string(),\n results: z.array(TavilyResultSchema),\n answer: z.string().optional(),\n follow_up_questions: z.array(z.string()).nullable().optional(),\n images: z\n .array(\n z.union([\n z.string(),\n z.object({\n url: z.string(),\n description: z.string().optional(),\n })\n ])\n )\n .optional(),\n});\n\nexport interface TavilyConfig {\n apiKey: string;\n searchDepth?: 'basic' | 'advanced';\n includeAnswer?: boolean;\n includeRawContent?: boolean;\n maxResults?: number;\n includeImages?: boolean;\n useCache?: boolean;\n}\n\nexport class TavilySearchProvider {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.tavily.com/search';\n private readonly config: TavilyConfig;\n\n constructor(config: TavilyConfig) {\n if (!config.apiKey) {\n throw new Error('Tavily API key is required');\n }\n this.apiKey = config.apiKey;\n this.config = {\n searchDepth: 'advanced',\n includeAnswer: true,\n includeRawContent: true,\n maxResults: 10,\n includeImages: false,\n useCache: true,\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n const startTime = Date.now();\n\n try {\n elizaLogger.info(`[Tavily] Searching for: ${query}`);\n\n const response = await axios.post(\n this.baseUrl,\n {\n api_key: this.apiKey,\n query,\n search_depth: this.config.searchDepth,\n include_answer: this.config.includeAnswer,\n include_raw_content: this.config.includeRawContent,\n max_results: maxResults || this.config.maxResults,\n include_images: this.config.includeImages,\n },\n {\n timeout: 30000, // 30 second timeout\n headers: {\n 'Content-Type': 'application/json',\n },\n }\n );\n\n // Check if response has error detail\n if (response.data?.detail?.error) {\n throw new Error(response.data.detail.error);\n }\n\n // Check if response has an error field\n if (response.data?.error) {\n throw new Error(response.data.error);\n }\n\n // Validate response\n const validatedData = TavilyResponseSchema.parse(response.data);\n\n const results: SearchResult[] = validatedData.results.map((result) => ({\n title: result.title || new URL(result.url).hostname || 'Untitled',\n url: result.url,\n snippet: result.snippet || result.content?.substring(0, 200) || '',\n content: result.raw_content || result.content,\n score: result.score || 0.5,\n provider: 'tavily',\n metadata: {\n language: 'en',\n domain: new URL(result.url).hostname,\n },\n }));\n\n const duration = Date.now() - startTime;\n elizaLogger.info(`[Tavily] Found ${results.length} results in ${duration}ms`);\n\n return results;\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n\n // Handle specific error cases\n if (axiosError.response?.status === 401) {\n elizaLogger.error('[Tavily] Invalid API key');\n throw new Error('Invalid Tavily API key');\n } else if (axiosError.response?.status === 429) {\n elizaLogger.error('[Tavily] Rate limit exceeded');\n throw new Error('Tavily rate limit exceeded');\n } else if (axiosError.code === 'ECONNABORTED') {\n elizaLogger.error(`[Tavily] Request timeout after ${duration}ms`);\n throw new Error('Tavily search timeout');\n }\n\n elizaLogger.error(`[Tavily] API error: ${axiosError.message}`, {\n status: axiosError.response?.status,\n data: axiosError.response?.data,\n });\n } else if (error instanceof z.ZodError) {\n elizaLogger.error('[Tavily] Invalid response format:', error.issues);\n throw new Error('Invalid Tavily API response format');\n } else {\n elizaLogger.error('[Tavily] Unknown error:', error);\n }\n\n throw error;\n }\n }\n\n async searchWithRetry(query: string, maxRetries: number = 3): Promise<SearchResult[]> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await this.search(query);\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxRetries) {\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n elizaLogger.warn(`[Tavily] Retry attempt ${attempt} after ${delay}ms`);\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError || new Error('Search failed after retries');\n }\n\n // Get current API usage (if Tavily provides this endpoint)\n async getUsage(): Promise<{ searches: number; limit: number } | null> {\n try {\n // Note: This is a hypothetical endpoint - check Tavily docs\n const response = await axios.get('https://api.tavily.com/usage', {\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n return response.data;\n } catch (error) {\n elizaLogger.warn('[Tavily] Could not fetch usage data');\n return null;\n }\n }\n}\n","import axios, { AxiosError } from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\nimport { z } from 'zod';\n\n// Serper API response schema validation\nconst SerperOrganicResultSchema = z.object({\n title: z.string(),\n link: z.string(),\n snippet: z.string().optional(),\n position: z.number(),\n date: z.string().optional(),\n});\n\nconst SerperKnowledgeGraphSchema = z.object({\n title: z.string(),\n type: z.string().optional(),\n website: z.string().optional(),\n description: z.string().optional(),\n descriptionSource: z.string().optional(),\n imageUrl: z.string().optional(),\n attributes: z.record(z.string()).optional(),\n});\n\nconst SerperResponseSchema = z.object({\n searchParameters: z.object({\n q: z.string(),\n type: z.string().optional(),\n engine: z.string().optional(),\n }),\n organic: z.array(SerperOrganicResultSchema).optional(),\n knowledgeGraph: SerperKnowledgeGraphSchema.optional(),\n answerBox: z\n .object({\n title: z.string().optional(),\n answer: z.string().optional(),\n snippet: z.string().optional(),\n link: z.string().optional(),\n })\n .optional(),\n searchInformation: z\n .object({\n totalResults: z.string().optional(),\n timeTaken: z.number().optional(),\n })\n .optional(),\n});\n\nexport interface SerperConfig {\n apiKey: string;\n country?: string;\n location?: string;\n language?: string;\n num?: number;\n autocorrect?: boolean;\n}\n\nexport class SerperSearchProvider {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://google.serper.dev/search';\n private readonly config: SerperConfig;\n\n constructor(config: SerperConfig) {\n if (!config.apiKey) {\n throw new Error('Serper API key is required');\n }\n this.apiKey = config.apiKey;\n this.config = {\n country: 'us',\n language: 'en',\n num: 10,\n autocorrect: true,\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n const startTime = Date.now();\n\n try {\n elizaLogger.info(`[Serper] Searching for: ${query}`);\n\n const response = await axios.post(\n this.baseUrl,\n {\n q: query,\n num: maxResults || this.config.num,\n gl: this.config.country,\n hl: this.config.language,\n autocorrect: this.config.autocorrect,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout: 20000, // 20 second timeout\n }\n );\n\n // Validate response\n const validatedData = SerperResponseSchema.parse(response.data);\n\n const results: SearchResult[] = [];\n\n // Add answer box if available\n if (validatedData.answerBox?.answer) {\n results.push({\n title: validatedData.answerBox.title || 'Direct Answer',\n url: validatedData.answerBox.link || '',\n snippet: validatedData.answerBox.answer,\n content: validatedData.answerBox.snippet || validatedData.answerBox.answer,\n score: 1.0, // Answer box has highest relevance\n provider: 'serper',\n metadata: {\n language: this.config.language || 'en',\n type: 'answer_box',\n },\n });\n }\n\n // Add knowledge graph if available\n if (validatedData.knowledgeGraph) {\n results.push({\n title: validatedData.knowledgeGraph.title,\n url: validatedData.knowledgeGraph.website || '',\n snippet: validatedData.knowledgeGraph.description || '',\n content: JSON.stringify({\n ...validatedData.knowledgeGraph,\n source: 'knowledge_graph',\n }),\n score: 0.9, // Knowledge graph is highly relevant\n provider: 'serper',\n metadata: {\n language: this.config.language || 'en',\n type: 'knowledge_graph',\n },\n });\n }\n\n // Add organic results\n if (validatedData.organic) {\n results.push(\n ...validatedData.organic.map((result, index) => ({\n title: result.title,\n url: result.link,\n snippet: result.snippet || '',\n content: undefined, // Serper doesn't provide full content\n score: 0.8 - index * 0.05, // Decreasing score by position\n provider: 'serper',\n metadata: {\n language: this.config.language || 'en',\n position: result.position,\n date: result.date,\n },\n }))\n );\n }\n\n const duration = Date.now() - startTime;\n elizaLogger.info(`[Serper] Found ${results.length} results in ${duration}ms`);\n\n return results.slice(0, maxResults || this.config.num);\n } catch (error) {\n const duration = Date.now() - startTime;\n\n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n\n // Handle specific error cases\n if (axiosError.response?.status === 401) {\n elizaLogger.error('[Serper] Invalid API key');\n throw new Error('Invalid Serper API key');\n } else if (axiosError.response?.status === 429) {\n elizaLogger.error('[Serper] Rate limit exceeded');\n throw new Error('Serper rate limit exceeded');\n } else if (axiosError.response?.status === 403) {\n elizaLogger.error('[Serper] Forbidden - check API key permissions', {\n data: axiosError.response?.data,\n headers: axiosError.response?.headers\n });\n throw new Error(`Serper API access forbidden: ${JSON.stringify(axiosError.response?.data)}`);\n } else if (axiosError.code === 'ECONNABORTED') {\n elizaLogger.error(`[Serper] Request timeout after ${duration}ms`);\n throw new Error('Serper search timeout');\n }\n\n elizaLogger.error(`[Serper] API error: ${axiosError.message}`, {\n status: axiosError.response?.status,\n data: axiosError.response?.data,\n });\n } else if (error instanceof z.ZodError) {\n elizaLogger.error('[Serper] Invalid response format:', error.issues);\n throw new Error('Invalid Serper API response format');\n } else {\n elizaLogger.error('[Serper] Unknown error:', error);\n }\n\n throw error;\n }\n }\n\n async searchNews(query: string, maxResults?: number): Promise<SearchResult[]> {\n const startTime = Date.now();\n\n try {\n elizaLogger.info(`[Serper] Searching news for: ${query}`);\n\n const response = await axios.post(\n 'https://google.serper.dev/news',\n {\n q: query,\n num: maxResults || this.config.num,\n gl: this.config.country,\n hl: this.config.language,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout: 20000,\n }\n );\n\n const results: SearchResult[] =\n response.data.news?.map((item: any, index: number) => ({\n title: item.title,\n url: item.link,\n snippet: item.snippet || '',\n content: JSON.stringify({\n date: item.date,\n source: item.source,\n imageUrl: item.imageUrl,\n }),\n score: 0.8 - index * 0.05,\n provider: 'serper',\n metadata: {\n language: this.config.language || 'en',\n type: 'news',\n date: item.date,\n source: item.source,\n },\n })) || [];\n\n const duration = Date.now() - startTime;\n elizaLogger.info(`[Serper] Found ${results.length} news results in ${duration}ms`);\n\n return results;\n } catch (error) {\n elizaLogger.error('[Serper] News search error:', error);\n throw error;\n }\n }\n\n async searchImages(\n query: string,\n maxResults?: number\n ): Promise<Array<{ url: string; title: string; source: string }>> {\n try {\n elizaLogger.info(`[Serper] Searching images for: ${query}`);\n\n const response = await axios.post(\n 'https://google.serper.dev/images',\n {\n q: query,\n num: maxResults || 10,\n gl: this.config.country,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout: 20000,\n }\n );\n\n return (\n response.data.images?.map((img: any) => ({\n url: img.imageUrl,\n title: img.title,\n source: img.source,\n })) || []\n );\n } catch (error) {\n elizaLogger.error('[Serper] Image search error:', error);\n throw error;\n }\n }\n\n async searchScholar(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[Serper] Searching Google Scholar for: ${query}`);\n\n const response = await axios.post(\n 'https://google.serper.dev/scholar',\n {\n q: query,\n num: maxResults || this.config.num,\n },\n {\n headers: {\n 'X-API-KEY': this.apiKey,\n 'Content-Type': 'application/json',\n },\n timeout: 20000,\n }\n );\n\n const results: SearchResult[] =\n response.data.organic?.map((item: any, index: number) => ({\n title: item.title,\n url: item.link,\n snippet: item.snippet || item.publication_info?.summary || '',\n content: JSON.stringify({\n authors: item.publication_info?.authors,\n year: item.year,\n citations: item.inline_links?.cited_by?.total,\n type: 'academic',\n }),\n score: 0.9 - index * 0.05, // Academic results have higher base score\n provider: 'serper',\n metadata: {\n language: this.config.language || 'en',\n type: 'academic',\n author: item.publication_info?.authors,\n publishDate: item.year,\n },\n })) || [];\n\n elizaLogger.info(`[Serper] Found ${results.length} scholar results`);\n\n return results;\n } catch (error) {\n elizaLogger.error('[Serper] Scholar search error:', error);\n throw error;\n }\n }\n\n // Get current API usage\n async getUsage(): Promise<{ searches: number; limit: number; remaining: number } | null> {\n try {\n const response = await axios.get('https://google.serper.dev/account', {\n headers: { 'X-API-KEY': this.apiKey },\n });\n\n return {\n searches: response.data.searches || 0,\n limit: response.data.limit || 0,\n remaining: response.data.remaining || 0,\n };\n } catch (error) {\n elizaLogger.warn('[Serper] Could not fetch usage data');\n return null;\n }\n }\n}\n","import { elizaLogger } from '@elizaos/core';\nimport { SearchResult } from '../../types';\n\nexport class StagehandGoogleSearchProvider {\n public readonly name = 'StagehandGoogle';\n \n constructor(private stagehandService: any) {}\n \n async search(query: string, maxResults: number = 10): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[StagehandGoogle] Searching for: ${query}`);\n \n // Get or create a Stagehand session\n const session = await this.stagehandService.getCurrentSession() || \n await this.stagehandService.createSession(`search-${Date.now()}`);\n \n // Navigate to Google\n await session.page.goto('https://www.google.com', { waitUntil: 'networkidle' });\n \n // Accept cookies if needed (for EU users)\n try {\n await session.page.click('button#L2AGLb', { timeout: 2000 });\n } catch (e) {\n // Cookie banner might not be present\n }\n \n // Type search query\n await session.stagehand.act({\n action: 'type',\n selector: 'textarea[name=\"q\"], input[name=\"q\"]',\n text: query\n });\n \n // Submit search\n await session.page.keyboard.press('Enter');\n await session.page.waitForNavigation({ waitUntil: 'networkidle' });\n \n // Extract search results using Stagehand's AI extraction\n const searchResults = await session.stagehand.extract({\n instruction: `Extract the top ${maxResults} organic search results. \n For each result, get the title, URL, and snippet/description. \n Skip ads, \"People also ask\", and other non-organic results.`,\n schema: {\n results: [{\n title: 'string',\n url: 'string', \n snippet: 'string'\n }]\n }\n });\n \n if (!searchResults.results || searchResults.results.length === 0) {\n // Fallback to manual extraction\n const results = await session.page.evaluate(() => {\n const items: any[] = [];\n const searchResults = document.querySelectorAll('div[data-async-context] > div');\n \n searchResults.forEach((result) => {\n const titleElement = result.querySelector('h3');\n const linkElement = result.querySelector('a[href]');\n const snippetElement = result.querySelector('span[style*=\"-webkit-line-clamp\"]');\n \n if (titleElement && linkElement) {\n items.push({\n title: titleElement.textContent || '',\n url: linkElement.getAttribute('href') || '',\n snippet: snippetElement?.textContent || ''\n });\n }\n });\n \n return items;\n });\n \n elizaLogger.info(`[StagehandGoogle] Found ${results.length} results via DOM extraction`);\n return results.slice(0, maxResults);\n }\n \n elizaLogger.info(`[StagehandGoogle] Found ${searchResults.results.length} results via AI extraction`);\n return searchResults.results.slice(0, maxResults);\n \n } catch (error) {\n elizaLogger.error('[StagehandGoogle] Search error:', error);\n throw error;\n }\n }\n} ","import axios, { AxiosError } from 'axios';\nimport { elizaLogger } from '@elizaos/core';\nimport { z } from 'zod';\n\n// Firecrawl API response schema\nconst FirecrawlResponseSchema = z.object({\n success: z.boolean(),\n data: z.object({\n content: z.string().optional(),\n markdown: z.string().optional(),\n html: z.string().optional(),\n metadata: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n language: z.string().optional(),\n keywords: z.string().optional(),\n robots: z.string().optional(),\n ogTitle: z.string().optional(),\n ogDescription: z.string().optional(),\n ogImage: z.string().optional(),\n ogUrl: z.string().optional(),\n canonical: z.string().optional(),\n }).optional(),\n links: z.array(z.string()).optional(),\n images: z.array(z.string()).optional(),\n }).optional(),\n error: z.string().optional(),\n});\n\nexport interface FirecrawlConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n includeHtml?: boolean;\n includeMarkdown?: boolean;\n includeMetadata?: boolean;\n includeLinks?: boolean;\n waitFor?: number;\n screenshot?: boolean;\n}\n\nexport interface ExtractedContent {\n content: string;\n markdown?: string;\n html?: string;\n metadata?: {\n title?: string;\n description?: string;\n language?: string;\n ogImage?: string;\n [key: string]: any;\n };\n links?: string[];\n images?: string[];\n}\n\nexport class FirecrawlContentExtractor {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly config: FirecrawlConfig;\n\n constructor(config: FirecrawlConfig) {\n if (!config.apiKey) {\n throw new Error('Firecrawl API key is required');\n }\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.firecrawl.dev/v0';\n this.config = {\n timeout: 60000, // 60 seconds default\n includeHtml: false,\n includeMarkdown: true,\n includeMetadata: true,\n includeLinks: true,\n waitFor: 0,\n screenshot: false,\n ...config,\n };\n }\n\n async extractContent(url: string): Promise<ExtractedContent | null> {\n const startTime = Date.now();\n \n try {\n elizaLogger.info(`[Firecrawl] Extracting content from: ${url}`);\n \n const response = await axios.post(\n `${this.baseUrl}/scrape`,\n {\n url,\n formats: this.getFormats(),\n waitFor: this.config.waitFor,\n screenshot: this.config.screenshot,\n includeTags: ['main', 'article', 'section', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'code', 'pre'],\n excludeTags: ['nav', 'footer', 'aside', 'script', 'style'],\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: this.config.timeout,\n }\n );\n\n // Validate response\n const validatedData = FirecrawlResponseSchema.parse(response.data);\n \n if (!validatedData.success || !validatedData.data) {\n elizaLogger.error(`[Firecrawl] Failed to extract content: ${validatedData.error}`);\n return null;\n }\n\n const data = validatedData.data;\n const content = data.markdown || data.content || '';\n \n if (!content) {\n elizaLogger.warn(`[Firecrawl] No content extracted from ${url}`);\n return null;\n }\n\n const duration = Date.now() - startTime;\n elizaLogger.info(`[Firecrawl] Content extracted in ${duration}ms (${content.length} characters)`);\n \n return {\n content,\n markdown: data.markdown,\n html: this.config.includeHtml ? data.html : undefined,\n metadata: data.metadata,\n links: data.links,\n images: data.images,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n \n if (axios.isAxiosError(error)) {\n const axiosError = error as AxiosError;\n \n // Handle specific error cases\n if (axiosError.response?.status === 401) {\n elizaLogger.error('[Firecrawl] Invalid API key');\n throw new Error('Invalid Firecrawl API key');\n } else if (axiosError.response?.status === 429) {\n elizaLogger.error('[Firecrawl] Rate limit exceeded');\n throw new Error('Firecrawl rate limit exceeded');\n } else if (axiosError.response?.status === 402) {\n elizaLogger.error('[Firecrawl] Payment required - check your plan');\n throw new Error('Firecrawl payment required');\n } else if (axiosError.code === 'ECONNABORTED') {\n elizaLogger.error(`[Firecrawl] Request timeout after ${duration}ms`);\n throw new Error('Firecrawl extraction timeout');\n }\n \n elizaLogger.error(`[Firecrawl] API error: ${axiosError.message}`, {\n status: axiosError.response?.status,\n data: axiosError.response?.data,\n });\n } else if (error instanceof z.ZodError) {\n elizaLogger.error('[Firecrawl] Invalid response format:', error.issues);\n } else {\n elizaLogger.error('[Firecrawl] Unknown error:', error);\n }\n \n return null;\n }\n }\n\n async extractBatch(urls: string[]): Promise<Map<string, ExtractedContent | null>> {\n elizaLogger.info(`[Firecrawl] Extracting content from ${urls.length} URLs`);\n \n const results = new Map<string, ExtractedContent | null>();\n \n // Process in batches to avoid rate limits\n const batchSize = 5;\n for (let i = 0; i < urls.length; i += batchSize) {\n const batch = urls.slice(i, i + batchSize);\n const batchPromises = batch.map(url => \n this.extractContent(url)\n .then(content => ({ url, content }))\n .catch(error => {\n elizaLogger.error(`[Firecrawl] Failed to extract ${url}:`, error);\n return { url, content: null };\n })\n );\n \n const batchResults = await Promise.all(batchPromises);\n batchResults.forEach(({ url, content }) => {\n results.set(url, content);\n });\n \n // Add delay between batches to respect rate limits\n if (i + batchSize < urls.length) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n }\n \n return results;\n }\n\n async crawlSite(startUrl: string, maxPages: number = 50): Promise<Map<string, ExtractedContent | null>> {\n try {\n elizaLogger.info(`[Firecrawl] Starting site crawl from: ${startUrl}`);\n \n const response = await axios.post(\n `${this.baseUrl}/crawl`,\n {\n url: startUrl,\n crawlerOptions: {\n maxCrawledLinks: maxPages,\n includes: [], // Add patterns to include\n excludes: ['*/tag/*', '*/category/*', '*/page/*'], // Common pagination patterns\n },\n pageOptions: {\n includeMarkdown: true,\n includeHtml: false,\n },\n },\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n timeout: (this.config.timeout || 60000) * 2, // Longer timeout for crawls\n }\n );\n\n const jobId = response.data?.jobId;\n \n if (!jobId) {\n elizaLogger.error('[Firecrawl] No job ID returned from crawl request');\n return new Map();\n }\n \n // Poll for completion\n return await this.pollCrawlJob(jobId, maxPages);\n } catch (error) {\n elizaLogger.error('[Firecrawl] Site crawl error:', error);\n return new Map();\n }\n }\n\n private async pollCrawlJob(jobId: string, maxPages: number): Promise<Map<string, ExtractedContent | null>> {\n const maxAttempts = 60; // 5 minutes max\n const pollInterval = 5000; // 5 seconds\n \n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n const response = await axios.get(\n `${this.baseUrl}/crawl/status/${jobId}`,\n {\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n },\n }\n );\n\n const { status, data } = response.data;\n \n if (status === 'completed' && data) {\n const results = new Map<string, ExtractedContent | null>();\n \n data.forEach((page: any) => {\n if (page.markdown || page.content) {\n results.set(page.url, {\n content: page.markdown || page.content,\n markdown: page.markdown,\n metadata: page.metadata,\n });\n }\n });\n \n elizaLogger.info(`[Firecrawl] Crawl completed: ${results.size} pages extracted`);\n return results;\n } else if (status === 'failed') {\n elizaLogger.error('[Firecrawl] Crawl job failed');\n return new Map();\n }\n \n // Still processing\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n } catch (error) {\n elizaLogger.error('[Firecrawl] Error polling crawl job:', error);\n return new Map();\n }\n }\n \n elizaLogger.error('[Firecrawl] Crawl job timeout');\n return new Map();\n }\n\n private getFormats(): string[] {\n const formats: string[] = ['text'];\n if (this.config.includeMarkdown) formats.push('markdown');\n if (this.config.includeHtml) formats.push('html');\n return formats;\n }\n\n // Get current API usage\n async getUsage(): Promise<{ used: number; limit: number; remaining: number } | null> {\n try {\n const response = await axios.get(`${this.baseUrl}/usage`, {\n headers: { 'Authorization': `Bearer ${this.apiKey}` },\n });\n \n return {\n used: response.data.used || 0,\n limit: response.data.limit || 0,\n remaining: response.data.remaining || 0,\n };\n } catch (error) {\n elizaLogger.warn('[Firecrawl] Could not fetch usage data');\n return null;\n }\n }\n} ","import { chromium, Browser, Page, BrowserContext } from 'playwright';\nimport { elizaLogger } from '@elizaos/core';\nimport * as cheerio from 'cheerio';\nimport { ExtractedContent } from './firecrawl';\n\nexport interface PlaywrightConfig {\n headless?: boolean;\n timeout?: number;\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle';\n userAgent?: string;\n viewport?: { width: number; height: number };\n blockResources?: string[]; // ['image', 'media', 'font']\n maxRetries?: number;\n enableJavaScript?: boolean;\n enableCookies?: boolean;\n}\n\nexport class PlaywrightContentExtractor {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private readonly config: PlaywrightConfig;\n\n constructor(config: PlaywrightConfig = {}) {\n this.config = {\n headless: true,\n timeout: 30000,\n waitUntil: 'networkidle',\n viewport: { width: 1920, height: 1080 },\n blockResources: ['image', 'media', 'font'],\n maxRetries: 3,\n enableJavaScript: true,\n enableCookies: false,\n ...config,\n };\n }\n\n async initialize(): Promise<void> {\n if (!this.browser) {\n elizaLogger.info('[Playwright] Initializing browser');\n this.browser = await chromium.launch({\n headless: this.config.headless,\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-dev-shm-usage',\n '--disable-accelerated-2d-canvas',\n '--no-first-run',\n '--no-zygote',\n '--disable-gpu',\n ],\n });\n \n this.context = await this.browser.newContext({\n userAgent: this.config.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',\n viewport: this.config.viewport,\n javaScriptEnabled: this.config.enableJavaScript,\n bypassCSP: true,\n ignoreHTTPSErrors: true,\n });\n \n // Block unnecessary resources to speed up loading\n if (this.config.blockResources && this.config.blockResources.length > 0) {\n await this.context.route('**/*', (route) => {\n const resourceType = route.request().resourceType();\n if (this.config.blockResources?.includes(resourceType)) {\n route.abort();\n } else {\n route.continue();\n }\n });\n }\n }\n }\n\n async close(): Promise<void> {\n if (this.context) {\n await this.context.close();\n this.context = null;\n }\n if (this.browser) {\n await this.browser.close();\n this.browser = null;\n }\n }\n\n async extractContent(url: string, retryCount: number = 0): Promise<ExtractedContent | null> {\n const startTime = Date.now();\n let page: Page | null = null;\n \n try {\n await this.initialize();\n \n if (!this.context) {\n throw new Error('Browser context not initialized');\n }\n \n elizaLogger.info(`[Playwright] Extracting content from: ${url}`);\n \n page = await this.context.newPage();\n \n // Set additional headers to appear more like a real browser\n await page.setExtraHTTPHeaders({\n 'Accept-Language': 'en-US,en;q=0.9',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',\n });\n \n // Navigate to the page\n await page.goto(url, {\n waitUntil: this.config.waitUntil,\n timeout: this.config.timeout,\n });\n \n // Wait for content to be visible\n await this.waitForContent(page);\n \n // Extract the content\n const content = await this.extractPageContent(page);\n \n const duration = Date.now() - startTime;\n elizaLogger.info(`[Playwright] Content extracted in ${duration}ms (${content.content.length} characters)`);\n \n return content;\n } catch (error) {\n const duration = Date.now() - startTime;\n elizaLogger.error(`[Playwright] Extraction error after ${duration}ms:`, error);\n \n // Retry logic\n if (retryCount < (this.config.maxRetries || 3)) {\n elizaLogger.info(`[Playwright] Retrying extraction (attempt ${retryCount + 1})`);\n await new Promise(resolve => setTimeout(resolve, 1000 * (retryCount + 1)));\n return this.extractContent(url, retryCount + 1);\n }\n \n return null;\n } finally {\n if (page) {\n await page.close().catch(() => {});\n }\n }\n }\n\n private async waitForContent(page: Page): Promise<void> {\n try {\n // Wait for common content selectors\n const contentSelectors = [\n 'main',\n 'article',\n '[role=\"main\"]',\n '#content',\n '.content',\n '.post',\n '.entry-content',\n ];\n \n for (const selector of contentSelectors) {\n try {\n await page.waitForSelector(selector, { timeout: 5000 });\n break;\n } catch {\n // Continue to next selector\n }\n }\n \n // Additional wait for dynamic content\n await page.waitForTimeout(1000);\n \n // Scroll to load lazy-loaded content\n await page.evaluate(() => {\n // @ts-ignore - This runs in browser context\n window.scrollTo(0, document.body.scrollHeight);\n });\n \n await page.waitForTimeout(500);\n \n // Scroll back to top\n await page.evaluate(() => {\n // @ts-ignore - This runs in browser context\n window.scrollTo(0, 0);\n });\n } catch (error) {\n elizaLogger.warn('[Playwright] Could not wait for specific content selectors');\n }\n }\n\n private async extractPageContent(page: Page): Promise<ExtractedContent> {\n // Get the page HTML\n const html = await page.content();\n \n // Extract text content using Playwright's built-in methods\n const textContent = await page.evaluate(() => {\n // @ts-ignore - This entire function runs in browser context\n const scripts = document.querySelectorAll('script, style, noscript');\n scripts.forEach((el: Element) => el.remove());\n \n // @ts-ignore - This runs in browser context\n const unwanted = document.querySelectorAll('nav, footer, aside, .sidebar, .advertisement, .ad');\n unwanted.forEach((el: Element) => el.remove());\n \n // Try to find main content areas\n const contentSelectors = [\n 'main',\n 'article',\n '[role=\"main\"]',\n '#content',\n '.content',\n '.post',\n '.entry-content',\n 'body'\n ];\n \n for (const selector of contentSelectors) {\n // @ts-ignore - This runs in browser context\n const element = document.querySelector(selector);\n if (element) {\n // @ts-ignore - HTMLElement exists in browser context\n return (element as any).innerText || element.textContent || '';\n }\n }\n \n // @ts-ignore - This runs in browser context\n return document.body.innerText || document.body.textContent || '';\n });\n \n // Extract metadata\n // @ts-ignore - All page.evaluate functions run in browser context\n const metadata = await page.evaluate(() => {\n const getMetaContent = (name: string): string | undefined => {\n const meta = document.querySelector(`meta[name=\"${name}\"], meta[property=\"${name}\"]`);\n return meta?.getAttribute('content') || undefined;\n };\n \n return {\n title: document.title,\n description: getMetaContent('description') || getMetaContent('og:description'),\n author: getMetaContent('author'),\n publishedTime: getMetaContent('article:published_time'),\n modifiedTime: getMetaContent('article:modified_time'),\n language: document.documentElement.lang || getMetaContent('language'),\n ogTitle: getMetaContent('og:title'),\n ogDescription: getMetaContent('og:description'),\n ogImage: getMetaContent('og:image'),\n ogUrl: getMetaContent('og:url'),\n canonical: document.querySelector('link[rel=\"canonical\"]')?.getAttribute('href'),\n keywords: getMetaContent('keywords'),\n };\n });\n \n // Extract links\n // @ts-ignore - All page.evaluate functions run in browser context\n const links = await page.evaluate(() => {\n const anchors = document.querySelectorAll('a[href]');\n return Array.from(anchors)\n .map(a => (a as any).href)\n .filter(href => href && !href.startsWith('#') && !href.startsWith('javascript:'));\n });\n \n // Extract images\n // @ts-ignore - All page.evaluate functions run in browser context\n const images = await page.evaluate(() => {\n const imgs = document.querySelectorAll('img[src]');\n return Array.from(imgs)\n .map(img => (img as any).src)\n .filter(src => src && !src.includes('data:image'));\n });\n \n // Convert to markdown using cheerio\n const $ = cheerio.load(html);\n \n // Remove unwanted elements\n $('script, style, nav, footer, aside, .sidebar, .advertisement, .ad').remove();\n \n // Convert to markdown-like format\n let markdown = '';\n \n // Process headings\n $('h1, h2, h3, h4, h5, h6').each((_, elem) => {\n const level = parseInt(elem.tagName.charAt(1));\n const text = $(elem).text().trim();\n if (text) {\n markdown += '\\n' + '#'.repeat(level) + ' ' + text + '\\n\\n';\n }\n });\n \n // Process paragraphs\n $('p').each((_, elem) => {\n const text = $(elem).text().trim();\n if (text) {\n markdown += text + '\\n\\n';\n }\n });\n \n // Process lists\n $('ul, ol').each((_, elem) => {\n $(elem).find('li').each((index, li) => {\n const text = $(li).text().trim();\n if (text) {\n const bullet = elem.tagName === 'ol' ? `${index + 1}.` : '-';\n markdown += `${bullet} ${text}\\n`;\n }\n });\n markdown += '\\n';\n });\n \n // Process code blocks\n $('pre, code').each((_, elem) => {\n const text = $(elem).text().trim();\n if (text) {\n if (elem.tagName === 'pre') {\n markdown += '```\\n' + text + '\\n```\\n\\n';\n } else {\n markdown += '`' + text + '`';\n }\n }\n });\n \n // Process blockquotes\n $('blockquote').each((_, elem) => {\n const text = $(elem).text().trim();\n if (text) {\n markdown += '> ' + text.replace(/\\n/g, '\\n> ') + '\\n\\n';\n }\n });\n \n return {\n content: textContent.trim(),\n markdown: markdown.trim() || textContent.trim(),\n html: html,\n metadata: metadata,\n links: [...new Set(links)], // Remove duplicates\n images: [...new Set(images)], // Remove duplicates\n };\n }\n\n async extractBatch(urls: string[]): Promise<Map<string, ExtractedContent | null>> {\n elizaLogger.info(`[Playwright] Extracting content from ${urls.length} URLs`);\n \n const results = new Map<string, ExtractedContent | null>();\n \n // Process sequentially to avoid overwhelming the browser\n for (const url of urls) {\n try {\n const content = await this.extractContent(url);\n results.set(url, content);\n } catch (error) {\n elizaLogger.error(`[Playwright] Failed to extract ${url}:`, error);\n results.set(url, null);\n }\n }\n \n return results;\n }\n\n async screenshot(url: string, outputPath: string): Promise<boolean> {\n let page: Page | null = null;\n \n try {\n await this.initialize();\n \n if (!this.context) {\n throw new Error('Browser context not initialized');\n }\n \n page = await this.context.newPage();\n await page.goto(url, {\n waitUntil: 'networkidle',\n timeout: this.config.timeout,\n });\n \n await page.screenshot({\n path: outputPath,\n fullPage: true,\n });\n \n elizaLogger.info(`[Playwright] Screenshot saved to ${outputPath}`);\n return true;\n } catch (error) {\n elizaLogger.error('[Playwright] Screenshot error:', error);\n return false;\n } finally {\n if (page) {\n await page.close().catch(() => {});\n }\n }\n }\n\n async pdf(url: string, outputPath: string): Promise<boolean> {\n let page: Page | null = null;\n \n try {\n await this.initialize();\n \n if (!this.context) {\n throw new Error('Browser context not initialized');\n }\n \n page = await this.context.newPage();\n await page.goto(url, {\n waitUntil: 'networkidle',\n timeout: this.config.timeout,\n });\n \n await page.pdf({\n path: outputPath,\n format: 'A4',\n printBackground: true,\n });\n \n elizaLogger.info(`[Playwright] PDF saved to ${outputPath}`);\n return true;\n } catch (error) {\n elizaLogger.error('[Playwright] PDF error:', error);\n return false;\n } finally {\n if (page) {\n await page.close().catch(() => {});\n }\n }\n }\n} ","import { elizaLogger } from '@elizaos/core';\nimport { SearchResult } from '../types';\n\n// Simple built-in rate limiter implementation\nclass RateLimiter {\n private tokens: number;\n private maxTokens: number;\n private refillRate: number;\n private lastRefill: number;\n\n constructor(config: {\n tokensPerInterval: number;\n interval: 'second' | 'minute' | 'hour' | 'day';\n fireImmediately?: boolean;\n }) {\n this.maxTokens = config.tokensPerInterval;\n this.tokens = config.tokensPerInterval;\n this.lastRefill = Date.now();\n \n // Convert interval to milliseconds\n const intervalMs = {\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 86400000\n };\n \n this.refillRate = intervalMs[config.interval] / config.tokensPerInterval;\n }\n\n private refillTokens(): void {\n const now = Date.now();\n const timePassed = now - this.lastRefill;\n const tokensToAdd = Math.floor(timePassed / this.refillRate);\n \n if (tokensToAdd > 0) {\n this.tokens = Math.min(this.maxTokens, this.tokens + tokensToAdd);\n this.lastRefill = now;\n }\n }\n\n async tryRemoveTokens(count: number): Promise<boolean> {\n this.refillTokens();\n \n if (this.tokens >= count) {\n this.tokens -= count;\n return true;\n }\n \n return false;\n }\n\n async removeTokens(count: number): Promise<void> {\n while (!(await this.tryRemoveTokens(count))) {\n // Wait for tokens to become available\n await new Promise(resolve => setTimeout(resolve, this.refillRate));\n }\n }\n\n async getTokensRemaining(): Promise<number> {\n this.refillTokens();\n return this.tokens;\n }\n}\n\nexport interface SearchProvider {\n search(query: string, maxResults?: number): Promise<any[]>;\n name?: string;\n}\n\nexport interface ContentExtractor {\n extractContent(url: string): Promise<{ content: string; title?: string; metadata?: any }>;\n name?: string;\n}\n\nexport class RateLimitedProvider implements SearchProvider {\n private limiter: RateLimiter;\n public readonly name: string;\n\n constructor(\n private provider: SearchProvider,\n config: {\n tokensPerInterval: number;\n interval: 'second' | 'minute' | 'hour' | 'day';\n fireImmediately?: boolean;\n }\n ) {\n this.name = `RateLimited(${provider.name || 'Unknown'})`;\n this.limiter = new RateLimiter(config);\n }\n\n async search(query: string, maxResults?: number): Promise<any[]> {\n const hasTokens = await this.limiter.tryRemoveTokens(1);\n if (!hasTokens) {\n elizaLogger.warn(`[${this.name}] Rate limit reached, waiting...`);\n await this.limiter.removeTokens(1);\n }\n \n return this.provider.search(query, maxResults);\n }\n}\n\n// Alias for backwards compatibility\nexport const RateLimitedSearchProvider = RateLimitedProvider;\n\nexport interface RateLimiterConfig {\n requestsPerMinute?: number;\n requestsPerHour?: number;\n requestsPerDay?: number;\n burstSize?: number;\n}\n\n// Convenience function to create rate-limited providers\nexport function createRateLimitedProvider(\n provider: SearchProvider,\n config: RateLimiterConfig = {}\n): SearchProvider {\n // Use the most restrictive limit\n if (config.requestsPerMinute) {\n return new RateLimitedProvider(provider, {\n tokensPerInterval: config.requestsPerMinute,\n interval: 'minute',\n });\n } else if (config.requestsPerHour) {\n return new RateLimitedProvider(provider, {\n tokensPerInterval: config.requestsPerHour,\n interval: 'hour',\n });\n } else if (config.requestsPerDay) {\n return new RateLimitedProvider(provider, {\n tokensPerInterval: config.requestsPerDay,\n interval: 'day',\n });\n } else {\n // Default to 60 requests per minute\n return new RateLimitedProvider(provider, {\n tokensPerInterval: 60,\n interval: 'minute',\n });\n }\n}\n\n// Advanced rate limiter with adaptive behavior\nexport class AdaptiveRateLimiter extends RateLimitedProvider {\n private errorCount: number = 0;\n private successCount: number = 0;\n private lastRateLimitError: number = 0;\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n const results = await super.search(query, maxResults);\n this.successCount++;\n this.errorCount = Math.max(0, this.errorCount - 1); // Gradually reduce error count\n return results;\n } catch (error: any) {\n if (error.message?.includes('rate limit') || error.message?.includes('429')) {\n this.errorCount++;\n this.lastRateLimitError = Date.now();\n \n // Exponential backoff based on error count\n const backoffMs = Math.min(60000, 1000 * Math.pow(2, this.errorCount));\n elizaLogger.warn(`[AdaptiveRateLimiter] Backing off for ${backoffMs}ms after ${this.errorCount} rate limit errors`);\n \n await new Promise(resolve => setTimeout(resolve, backoffMs));\n \n // Retry once after backoff\n return super.search(query, maxResults);\n }\n throw error;\n }\n }\n\n getStats() {\n return {\n errorCount: this.errorCount,\n successCount: this.successCount,\n lastRateLimitError: this.lastRateLimitError,\n timeSinceLastError: this.lastRateLimitError ? Date.now() - this.lastRateLimitError : null,\n };\n }\n} ","import { SearchResult } from '../types';\nimport { elizaLogger } from '@elizaos/core';\nimport { SearchProvider } from './rate-limiter';\nimport crypto from 'crypto';\n\nexport interface CacheConfig {\n ttlMinutes?: number;\n maxSize?: number;\n sizeCalculation?: (value: SearchResult[], key: string) => number;\n}\n\n// Built-in LRU cache implementation\nclass SimpleLRUCache<K, V> {\n private cache: Map<K, { value: V; timestamp: number }> = new Map();\n private maxSize: number;\n private ttl: number;\n\n constructor(options: { max: number; ttl: number }) {\n this.maxSize = options.max;\n this.ttl = options.ttl;\n }\n\n get(key: K): V | undefined {\n const item = this.cache.get(key);\n if (!item) return undefined;\n \n // Check if expired\n if (Date.now() - item.timestamp > this.ttl) {\n this.cache.delete(key);\n return undefined;\n }\n \n // Move to end (LRU behavior)\n this.cache.delete(key);\n this.cache.set(key, item);\n \n return item.value;\n }\n\n set(key: K, value: V): void {\n // Remove item if it exists (to reinsert at end)\n this.cache.delete(key);\n \n // Remove oldest items if at capacity\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n \n this.cache.set(key, { value, timestamp: Date.now() });\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\nexport class CachedSearchProvider implements SearchProvider {\n private cache: SimpleLRUCache<string, SearchResult[]>;\n public readonly name: string;\n\n constructor(\n private provider: SearchProvider,\n config: CacheConfig = {}\n ) {\n this.name = `Cached(${provider.name || 'Unknown'})`;\n \n this.cache = new SimpleLRUCache<string, SearchResult[]>({\n max: config.maxSize || 1000,\n ttl: (config.ttlMinutes || 60) * 60 * 1000, // Convert to milliseconds\n });\n }\n\n private getCacheKey(query: string, maxResults?: number): string {\n const keyData = `${query}:${maxResults || 'default'}`;\n return crypto.createHash('md5').update(keyData).digest('hex');\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n const cacheKey = this.getCacheKey(query, maxResults);\n \n // Check cache first\n const cached = this.cache.get(cacheKey);\n if (cached) {\n elizaLogger.info(`[Cache] Hit for query: ${query}`);\n return cached;\n }\n \n elizaLogger.info(`[Cache] Miss for query: ${query}`);\n \n // Fetch from underlying provider\n const results = await this.provider.search(query, maxResults);\n \n // Store in cache\n if (results && results.length > 0) {\n this.cache.set(cacheKey, results);\n }\n \n return results;\n }\n \n // Cache management methods\n clear(): void {\n this.cache.clear();\n }\n \n getCacheStats(): { size: number; hits: number; misses: number } {\n return {\n size: this.cache.size,\n hits: 0, // Could track this if needed\n misses: 0,\n };\n }\n}\n\n// Helper to create a cached provider with default settings\nexport function withCache(\n provider: SearchProvider,\n ttlMinutes: number = 60\n): CachedSearchProvider {\n return new CachedSearchProvider(provider, { ttlMinutes });\n} ","import { IAgentRuntime, elizaLogger } from '@elizaos/core';\nimport { SearchProvider, ContentExtractor } from './rate-limiter';\nimport { TavilySearchProvider } from './search-providers/tavily';\nimport { SerperSearchProvider } from './search-providers/serper';\nimport { AcademicSearchProvider } from './search-providers/academic';\nimport { FirecrawlContentExtractor, FirecrawlConfig } from './content-extractors/firecrawl';\nimport { PlaywrightContentExtractor } from './content-extractors/playwright';\nimport { CachedSearchProvider } from './cache';\nimport { RateLimitedSearchProvider } from './rate-limiter';\nimport { ExaSearchProvider } from './search-providers/exa';\nimport { SerpAPISearchProvider } from './search-providers/serpapi';\nimport { StagehandGoogleSearchProvider } from './search-providers/stagehand-google';\nimport { PyPISearchProvider } from './search-providers/pypi';\nimport { NPMSearchProvider } from './search-providers/npm';\n\nexport type { SearchProvider, ContentExtractor };\n\n// Wrapper to make FirecrawlContentExtractor compatible with ContentExtractor interface\nclass FirecrawlWrapper implements ContentExtractor {\n private extractor: FirecrawlContentExtractor;\n \n constructor(apiKey: string) {\n const config: FirecrawlConfig = { apiKey };\n this.extractor = new FirecrawlContentExtractor(config);\n }\n \n async extractContent(url: string): Promise<{ content: string; metadata?: any }> {\n const result = await this.extractor.extractContent(url);\n if (!result) {\n return { content: '', metadata: {} };\n }\n return result;\n }\n}\n\n// Wrapper to make PlaywrightContentExtractor compatible with ContentExtractor interface\nclass PlaywrightWrapper implements ContentExtractor {\n private extractor: PlaywrightContentExtractor;\n \n constructor() {\n this.extractor = new PlaywrightContentExtractor();\n }\n \n async extractContent(url: string): Promise<{ content: string; metadata?: any }> {\n const result = await this.extractor.extractContent(url);\n if (!result) {\n return { content: '', metadata: {} };\n }\n return result;\n }\n}\n\n// Wrapper for PyPI search provider\nclass PyPISearchWrapper implements SearchProvider {\n private provider: PyPISearchProvider;\n name = 'pypi';\n \n constructor() {\n this.provider = new PyPISearchProvider();\n }\n \n async search(query: string, maxResults?: number): Promise<any[]> {\n return this.provider.search(query, maxResults);\n }\n}\n\n// Wrapper for NPM search provider\nclass NPMSearchWrapper implements SearchProvider {\n private provider: NPMSearchProvider;\n name = 'npm';\n \n constructor() {\n this.provider = new NPMSearchProvider();\n }\n \n async search(query: string, maxResults?: number): Promise<any[]> {\n return this.provider.search(query, maxResults);\n }\n}\n\n// Wrapper for GitHub search provider (uses existing GitHub plugin)\nclass GitHubSearchWrapper implements SearchProvider {\n name = 'github';\n \n constructor(private runtime: IAgentRuntime) {}\n \n async search(query: string, maxResults?: number): Promise<any[]> {\n try {\n const githubService = this.runtime.getService('github');\n if (!githubService) {\n elizaLogger.warn('GitHub service not available');\n return [];\n }\n \n const results: any[] = [];\n const limit = maxResults || 10;\n \n // Search repositories\n const repos = await (githubService as any).searchRepositories(query, {\n sort: 'stars',\n per_page: Math.min(limit, 5),\n });\n \n if (repos?.items) {\n results.push(...repos.items.map((repo: any) => ({\n title: repo.full_name,\n url: repo.html_url,\n snippet: repo.description || 'No description',\n content: `${repo.description || ''}\\nStars: ${repo.stargazers_count} | Language: ${repo.language || 'N/A'}`,\n score: Math.min(1.0, repo.stargazers_count / 10000), // Normalize by star count\n provider: 'github',\n metadata: {\n type: 'repository',\n language: repo.language,\n stars: repo.stargazers_count,\n forks: repo.forks_count,\n openIssues: repo.open_issues_count,\n updatedAt: repo.updated_at,\n owner: repo.owner?.login,\n },\n })));\n }\n \n // Search issues if we have room for more results\n if (results.length < limit) {\n const issues = await (githubService as any).searchIssues(`${query} is:issue`, {\n sort: 'updated',\n per_page: Math.min(limit - results.length, 5),\n });\n \n if (issues?.items) {\n results.push(...issues.items.map((issue: any) => ({\n title: issue.title,\n url: issue.html_url,\n snippet: issue.body ? issue.body.substring(0, 200) + '...' : 'No description',\n content: `${issue.title}\\n${issue.body || ''}`,\n score: issue.comments / 50, // Normalize by comment count\n provider: 'github',\n metadata: {\n type: 'issue',\n state: issue.state,\n comments: issue.comments,\n author: issue.user?.login,\n createdAt: issue.created_at,\n updatedAt: issue.updated_at,\n number: issue.number,\n },\n })));\n }\n }\n \n return results.slice(0, limit);\n } catch (error) {\n elizaLogger.error('GitHub search error:', error);\n return [];\n }\n }\n}\n\n// StagehandContentExtractor - uses browserbase/stagehand for extraction\nclass StagehandContentExtractor implements ContentExtractor {\n constructor(private runtime: IAgentRuntime) {}\n \n async extractContent(url: string): Promise<{ content: string; title?: string; metadata?: any }> {\n try {\n const stagehandService = this.runtime.getService('stagehand');\n if (!stagehandService) {\n return { content: '', title: undefined, metadata: undefined };\n }\n \n // Cast to any to access custom methods\n const stagehand = stagehandService as any;\n const session = await stagehand.getCurrentSession?.() || \n await stagehand.createSession?.(`extract-${Date.now()}`);\n \n if (!session) {\n return { content: '', title: undefined, metadata: undefined };\n }\n \n await session.page.goto(url);\n await session.page.waitForLoadState('domcontentloaded');\n \n // Extract main content using AI\n const extracted = await session.stagehand.extract({\n instruction: 'Extract the main article content, title, and any important metadata. Exclude navigation, ads, and sidebars.',\n schema: {\n title: 'string',\n content: 'string',\n author: 'string?',\n publishDate: 'string?',\n description: 'string?'\n }\n });\n \n return {\n content: extracted.content || '',\n title: extracted.title,\n metadata: {\n author: extracted.author,\n publishDate: extracted.publishDate,\n description: extracted.description\n }\n };\n } catch (error) {\n elizaLogger.error('Stagehand content extraction error:', error);\n return { content: '', title: undefined, metadata: undefined };\n }\n }\n}\n\nexport function createSearchProvider(type: string, runtime: any): SearchProvider {\n const apiKey = runtime.getSetting(`${type.toUpperCase()}_API_KEY`);\n\n switch (type) {\n case 'tavily':\n if (!apiKey) {\n elizaLogger.info('Tavily API key not found, search features will be limited');\n // Return a mock provider that returns empty results\n return {\n name: 'tavily-mock',\n search: async () => []\n };\n }\n return new TavilySearchProvider({ apiKey });\n\n case 'serper':\n if (!apiKey) {\n elizaLogger.info('Serper API key not found, search features will be limited');\n return {\n name: 'serper-mock',\n search: async () => []\n };\n }\n return new SerperSearchProvider({ apiKey });\n \n case 'exa':\n if (!apiKey) {\n elizaLogger.info('Exa API key not found, search features will be limited');\n return {\n name: 'exa-mock',\n search: async () => []\n };\n }\n return new ExaSearchProvider({ apiKey });\n \n case 'serpapi':\n if (!apiKey) {\n elizaLogger.info('SerpAPI key not found, search features will be limited');\n return {\n name: 'serpapi-mock', \n search: async () => []\n };\n }\n return new SerpAPISearchProvider({ apiKey });\n\n case 'academic':\n return new AcademicSearchProvider(runtime);\n \n case 'pypi':\n elizaLogger.info('Using PyPI search provider');\n return new PyPISearchWrapper();\n \n case 'npm':\n elizaLogger.info('Using NPM search provider');\n return new NPMSearchWrapper();\n \n case 'github':\n elizaLogger.info('Using GitHub search provider');\n return new GitHubSearchWrapper(runtime);\n\n case 'web':\n default:\n // Try different providers in order of preference\n const providers = ['TAVILY', 'EXA', 'SERPAPI', 'SERPER'];\n for (const provider of providers) {\n const key = runtime.getSetting(`${provider}_API_KEY`);\n if (key) {\n elizaLogger.info(`Using ${provider} as web search provider`);\n switch (provider) {\n case 'TAVILY':\n return new TavilySearchProvider({ apiKey: key });\n case 'EXA':\n return new ExaSearchProvider({ apiKey: key });\n case 'SERPAPI':\n return new SerpAPISearchProvider({ apiKey: key });\n case 'SERPER':\n return new SerperSearchProvider({ apiKey: key });\n }\n }\n }\n \n elizaLogger.info('No web search provider configured, using mock provider');\n return {\n name: 'mock-web',\n search: async (query: string) => {\n elizaLogger.warn(`[Mock Web Provider] Attempted to search for: \"${query}\" but no API keys are configured`);\n elizaLogger.warn('[Mock Web Provider] Please configure at least one of: TAVILY_API_KEY, EXA_API_KEY, SERPAPI_API_KEY, or SERPER_API_KEY');\n // Return a single result explaining the issue\n return [{\n title: 'Search Provider Not Configured',\n url: 'https://example.com/configuration-needed',\n snippet: `Unable to search for \"${query}\" - No search API keys are configured. Please add TAVILY_API_KEY, EXA_API_KEY, SERPAPI_API_KEY, or SERPER_API_KEY to your environment.`,\n content: `Search attempted for: \"${query}\"\\n\\nNo search provider API keys were found. To enable web search, please configure one of the following environment variables:\\n- TAVILY_API_KEY\\n- EXA_API_KEY\\n- SERPAPI_API_KEY\\n- SERPER_API_KEY`,\n score: 0,\n provider: 'mock-web',\n metadata: {\n error: true,\n query: query,\n message: 'No search provider configured'\n }\n }];\n }\n };\n }\n}\n\n// Enhanced content extractor with multiple fallback strategies\nclass RobustContentExtractor implements ContentExtractor {\n private extractors: ContentExtractor[] = [];\n \n constructor(runtime: IAgentRuntime) {\n // Build priority list of extractors\n \n // 1. Stagehand/Browserbase (highest priority - AI-powered)\n try {\n const stagehandService = runtime.getService('stagehand');\n if (stagehandService) {\n this.extractors.push(new StagehandContentExtractor(runtime));\n elizaLogger.info('Added Stagehand content extractor');\n }\n } catch (e) {\n // Service not available\n }\n \n // 2. Firecrawl (high priority - commercial service)\n const firecrawlKey = runtime.getSetting('FIRECRAWL_API_KEY');\n if (firecrawlKey) {\n this.extractors.push(new FirecrawlWrapper(firecrawlKey));\n elizaLogger.info('Added Firecrawl content extractor');\n }\n \n // 3. Playwright (fallback - may get blocked)\n this.extractors.push(new PlaywrightWrapper());\n elizaLogger.info('Added Playwright content extractor as fallback');\n }\n \n async extractContent(url: string): Promise<{ content: string; title?: string; metadata?: any }> {\n const errors: Error[] = [];\n \n for (let i = 0; i < this.extractors.length; i++) {\n const extractor = this.extractors[i];\n const extractorName = extractor.constructor.name;\n \n try {\n elizaLogger.debug(`Attempting content extraction with ${extractorName} for: ${url}`);\n const result = await extractor.extractContent(url);\n \n // Validate result quality\n if (result && result.content && result.content.trim().length > 100) {\n elizaLogger.info(`Successfully extracted content with ${extractorName} (${result.content.length} chars)`);\n \n // Add extraction metadata\n result.metadata = {\n ...result.metadata,\n extractorUsed: extractorName,\n extractionTime: Date.now(),\n contentLength: result.content.length,\n url: url\n };\n \n return result;\n } else {\n elizaLogger.warn(`${extractorName} returned insufficient content (${result?.content?.length || 0} chars)`);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n elizaLogger.warn(`${extractorName} extraction failed for ${url}: ${errorMsg}`);\n errors.push(error instanceof Error ? error : new Error(errorMsg));\n }\n }\n \n // All extractors failed\n elizaLogger.error(`All content extractors failed for ${url}. Errors:`, errors.map(e => e.message));\n \n // Return minimal result with error info\n return {\n content: `Failed to extract content from ${url}. Content may be behind paywall, require authentication, or have anti-bot protection.`,\n title: undefined,\n metadata: {\n extractionFailed: true,\n url: url,\n errors: errors.map(e => e.message),\n extractionTime: Date.now()\n }\n };\n }\n}\n\nexport function createContentExtractor(runtime: IAgentRuntime): ContentExtractor | null {\n return new RobustContentExtractor(runtime);\n}\n\nexport function createAcademicSearchProvider(runtime: IAgentRuntime): SearchProvider {\n const semanticScholarKey = runtime.getSetting('SEMANTIC_SCHOLAR_API_KEY');\n elizaLogger.info('Using Academic search provider (Semantic Scholar, arXiv, CrossRef)');\n \n const provider = new AcademicSearchProvider({\n semanticScholarApiKey: semanticScholarKey,\n timeout: 30000,\n });\n \n // Wrap with rate limiting and caching\n const rateLimited = new RateLimitedSearchProvider(provider, {\n tokensPerInterval: 100, // Academic sources allow more requests\n interval: 'minute'\n });\n \n return new CachedSearchProvider(rateLimited);\n} ","import { elizaLogger } from '@elizaos/core';\nimport axios from 'axios';\nimport { SearchResult, SourceType } from '../../types';\n\nexport interface AcademicSearchConfig {\n semanticScholarApiKey?: string;\n useProxy?: boolean;\n timeout?: number;\n}\n\nexport class AcademicSearchProvider {\n public readonly name = 'Academic';\n private config: AcademicSearchConfig;\n\n constructor(config: AcademicSearchConfig = {}) {\n this.config = {\n timeout: 30000,\n useProxy: false,\n ...config,\n };\n }\n\n async search(query: string, maxResults: number = 20): Promise<SearchResult[]> {\n elizaLogger.info(`[Academic] Searching for: ${query}`);\n \n const results: SearchResult[] = [];\n \n // Search multiple academic sources in parallel\n const searches = await Promise.allSettled([\n this.searchSemanticScholar(query, Math.ceil(maxResults / 3)),\n this.searchArxiv(query, Math.ceil(maxResults / 3)),\n this.searchCrossRef(query, Math.ceil(maxResults / 3)),\n ]);\n \n for (const search of searches) {\n if (search.status === 'fulfilled') {\n results.push(...search.value);\n } else {\n elizaLogger.warn(`[Academic] Search failed:`, search.reason);\n }\n }\n \n // Sort by relevance score and limit results\n return results\n .sort((a, b) => b.score - a.score)\n .slice(0, maxResults);\n }\n\n private async searchSemanticScholar(query: string, limit: number): Promise<SearchResult[]> {\n try {\n const url = 'https://api.semanticscholar.org/graph/v1/paper/search';\n const params = {\n query,\n limit,\n fields: 'paperId,title,abstract,authors,year,citationCount,url,venue,publicationDate',\n };\n \n const headers: any = {\n 'User-Agent': 'Mozilla/5.0 (compatible; ElizaOS/1.0)',\n };\n \n if (this.config.semanticScholarApiKey) {\n headers['x-api-key'] = this.config.semanticScholarApiKey;\n }\n \n const response = await axios.get(url, {\n params,\n headers,\n timeout: this.config.timeout,\n validateStatus: (status) => status < 500, // Don't throw on 4xx errors\n });\n \n if (response.status === 429) {\n elizaLogger.warn('[Semantic Scholar] Rate limited, falling back to public rate');\n // Try again without API key\n delete headers['x-api-key'];\n const retryResponse = await axios.get(url, {\n params,\n headers,\n timeout: this.config.timeout,\n });\n response.data = retryResponse.data;\n } else if (response.status >= 400) {\n elizaLogger.warn(`[Semantic Scholar] HTTP ${response.status}: ${response.statusText}`);\n return [];\n }\n \n const results: SearchResult[] = [];\n \n for (const paper of response.data.data || []) {\n results.push({\n title: paper.title || 'Untitled',\n url: paper.url || `https://api.semanticscholar.org/paper/${paper.paperId}`,\n snippet: paper.abstract || 'No abstract available',\n score: this.calculateRelevanceScore(paper, query),\n provider: 'semantic-scholar',\n metadata: {\n type: 'academic',\n language: 'en',\n domain: 'semanticscholar.org',\n author: paper.authors?.map((a: any) => a.name),\n publishDate: paper.publicationDate,\n citationCount: paper.citationCount,\n venue: paper.venue,\n paperId: paper.paperId,\n } as any,\n });\n }\n \n elizaLogger.info(`[Semantic Scholar] Found ${results.length} results`);\n return results;\n } catch (error) {\n elizaLogger.error('[Semantic Scholar] Search error:', error);\n return [];\n }\n }\n\n private async searchArxiv(query: string, limit: number): Promise<SearchResult[]> {\n try {\n const url = 'http://export.arxiv.org/api/query';\n const params = {\n search_query: `all:${query}`,\n start: 0,\n max_results: limit,\n sortBy: 'relevance',\n sortOrder: 'descending',\n };\n \n const response = await axios.get(url, {\n params,\n timeout: this.config.timeout,\n });\n \n // Parse XML response\n const results: SearchResult[] = [];\n const entries = response.data.match(/<entry>([\\s\\S]*?)<\\/entry>/g) || [];\n \n for (const entry of entries) {\n const title = this.extractXmlValue(entry, 'title');\n const summary = this.extractXmlValue(entry, 'summary');\n const id = this.extractXmlValue(entry, 'id');\n const published = this.extractXmlValue(entry, 'published');\n const authors = this.extractXmlAuthors(entry);\n \n if (title && id) {\n results.push({\n title: title.trim(),\n url: id,\n snippet: summary?.trim() || 'No summary available',\n score: 0.85, // arXiv is highly reliable\n provider: 'arxiv',\n metadata: {\n type: 'academic',\n language: 'en',\n domain: 'arxiv.org',\n author: authors,\n publishDate: published,\n arxivId: id.split('/').pop(),\n } as any,\n });\n }\n }\n \n elizaLogger.info(`[arXiv] Found ${results.length} results`);\n return results;\n } catch (error) {\n elizaLogger.error('[arXiv] Search error:', error);\n return [];\n }\n }\n\n private async searchCrossRef(query: string, limit: number): Promise<SearchResult[]> {\n try {\n // CrossRef requires more specific queries, so enhance simple queries\n const enhancedQuery = query.length < 5 ? `${query} research paper` : query;\n \n const url = 'https://api.crossref.org/works';\n const params = {\n query: enhancedQuery,\n rows: limit,\n select: 'DOI,title,author,published-print,abstract,container-title,URL,cited-by-count',\n };\n \n const response = await axios.get(url, {\n params,\n headers: {\n 'User-Agent': 'ElizaOS/1.0 (mailto:research@eliza.ai)',\n },\n timeout: this.config.timeout,\n validateStatus: (status) => status < 500, // Don't throw on 4xx\n });\n \n if (response.status >= 400) {\n elizaLogger.warn(`[CrossRef] HTTP ${response.status}: Query too short or invalid`);\n return [];\n }\n \n const results: SearchResult[] = [];\n \n for (const item of response.data.message.items || []) {\n const title = Array.isArray(item.title) ? item.title[0] : item.title;\n const abstract = item.abstract?.replace(/<[^>]*>/g, ''); // Remove HTML tags\n \n results.push({\n title: title || 'Untitled',\n url: item.URL || `https://doi.org/${item.DOI}`,\n snippet: abstract || 'No abstract available',\n score: this.calculateCrossRefScore(item, query),\n provider: 'crossref',\n metadata: {\n type: 'academic',\n language: 'en',\n domain: 'crossref.org',\n doi: item.DOI,\n author: item.author?.map((a: any) => `${a.given} ${a.family}`),\n publishDate: item['published-print']?.['date-parts']?.[0]?.join('-'),\n citationCount: item['cited-by-count'],\n journal: item['container-title']?.[0],\n } as any,\n });\n }\n \n elizaLogger.info(`[CrossRef] Found ${results.length} results`);\n return results;\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n elizaLogger.error(`[CrossRef] API error: ${error.message}`, {\n status: error.response?.status,\n statusText: error.response?.statusText,\n data: error.response?.data,\n });\n } else {\n elizaLogger.error('[CrossRef] Search error:', error.message || error);\n }\n return [];\n }\n }\n\n private calculateRelevanceScore(paper: any, query: string): number {\n let score = 0.7; // Base score for academic papers\n \n // Boost for citation count\n if (paper.citationCount > 100) score += 0.1;\n else if (paper.citationCount > 50) score += 0.05;\n \n // Boost for recent papers\n if (paper.year && paper.year >= new Date().getFullYear() - 2) score += 0.05;\n \n // Boost for title match\n const queryTerms = query.toLowerCase().split(' ');\n const titleLower = paper.title?.toLowerCase() || '';\n const matchCount = queryTerms.filter(term => titleLower.includes(term)).length;\n score += (matchCount / queryTerms.length) * 0.1;\n \n return Math.min(score, 1.0);\n }\n\n private calculateCrossRefScore(item: any, query: string): number {\n let score = 0.65; // Base score\n \n if (item['cited-by-count'] > 50) score += 0.1;\n if (item.abstract) score += 0.1;\n \n // Title relevance\n const queryTerms = query.toLowerCase().split(' ');\n const titleLower = (item.title?.[0] || '').toLowerCase();\n const matchCount = queryTerms.filter(term => titleLower.includes(term)).length;\n score += (matchCount / queryTerms.length) * 0.15;\n \n return Math.min(score, 1.0);\n }\n\n private extractXmlValue(xml: string, tag: string): string | undefined {\n const regex = new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)<\\\\/${tag}>`, 'i');\n const match = xml.match(regex);\n return match ? match[1].trim() : undefined;\n }\n\n private extractXmlAuthors(xml: string): string[] {\n const authors: string[] = [];\n const authorMatches = xml.match(/<author>[\\s\\S]*?<\\/author>/g) || [];\n \n for (const authorXml of authorMatches) {\n const name = this.extractXmlValue(authorXml, 'name');\n if (name) authors.push(name);\n }\n \n return authors;\n }\n} ","import axios from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\n\nexport interface ExaConfig {\n apiKey: string;\n searchType?: 'neural' | 'keyword' | 'auto';\n category?: string;\n language?: string;\n}\n\nexport class ExaSearchProvider {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://api.exa.ai';\n private readonly config: ExaConfig;\n public readonly name = 'Exa';\n\n constructor(config: ExaConfig) {\n if (!config.apiKey) {\n throw new Error('Exa API key is required');\n }\n this.apiKey = config.apiKey;\n this.config = {\n searchType: 'auto',\n language: 'en',\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[Exa] Searching for: ${query}`);\n\n const response = await axios.post(\n `${this.baseUrl}/search`,\n {\n query,\n type: this.config.searchType || 'auto',\n numResults: maxResults || 10,\n text: true, // Get text content\n summary: {\n query: \"Key points and main findings\"\n },\n highlights: {\n numSentences: 3,\n highlightsPerUrl: 2\n }\n },\n {\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.data || !response.data.results) {\n elizaLogger.warn('[Exa] No results found');\n return [];\n }\n\n const results: SearchResult[] = response.data.results.map((result: any, index: number) => ({\n title: result.title || 'Untitled',\n url: result.url,\n snippet: result.summary || result.text?.substring(0, 200) || 'No description available',\n score: result.score || (0.95 - index * 0.05),\n provider: 'exa',\n metadata: {\n language: this.config.language || 'en',\n type: this.config.searchType || 'auto',\n resolvedSearchType: response.data.resolvedSearchType,\n author: result.author,\n publishedDate: result.publishedDate,\n highlights: result.highlights,\n image: result.image,\n favicon: result.favicon,\n },\n }));\n\n elizaLogger.info(`[Exa] Found ${results.length} results`);\n return results;\n } catch (error: any) {\n if (error.response) {\n elizaLogger.error(`[Exa] API error: ${error.response.status} - ${JSON.stringify(error.response.data)}`);\n if (error.response.status === 401) {\n throw new Error('Invalid Exa API key');\n }\n if (error.response.status === 429) {\n throw new Error('Exa API rate limit exceeded');\n }\n } else {\n elizaLogger.error(`[Exa] Search error:`, error);\n }\n throw error;\n }\n }\n\n async searchAcademic(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[Exa] Searching academic papers for: ${query}`);\n\n const response = await axios.post(\n `${this.baseUrl}/search`,\n {\n query,\n type: 'neural', // Neural search works better for academic content\n category: 'research paper',\n numResults: maxResults || 10,\n text: true,\n summary: {\n query: \"Main contributions and findings\"\n },\n highlights: {\n numSentences: 5,\n highlightsPerUrl: 3\n }\n },\n {\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.data || !response.data.results) {\n elizaLogger.warn('[Exa] No academic results found');\n return [];\n }\n\n const results: SearchResult[] = response.data.results.map((result: any, index: number) => ({\n title: result.title || 'Untitled',\n url: result.url,\n snippet: result.summary || result.text?.substring(0, 300) || 'No abstract available',\n score: result.score || (0.95 - index * 0.03),\n provider: 'exa',\n metadata: {\n language: 'en',\n type: 'research_paper',\n category: 'research paper',\n author: result.author,\n publishedDate: result.publishedDate,\n highlights: result.highlights,\n image: result.image,\n },\n }));\n\n elizaLogger.info(`[Exa] Found ${results.length} academic results`);\n return results;\n } catch (error: any) {\n elizaLogger.error(`[Exa] Academic search error:`, error);\n throw error;\n }\n }\n\n async findSimilar(url: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[Exa] Finding similar pages to: ${url}`);\n\n const response = await axios.post(\n `${this.baseUrl}/findSimilar`,\n {\n url,\n numResults: maxResults || 10,\n text: true,\n summary: {\n query: \"Key similarities and main points\"\n }\n },\n {\n headers: {\n 'x-api-key': this.apiKey,\n 'Content-Type': 'application/json',\n },\n }\n );\n\n if (!response.data || !response.data.results) {\n elizaLogger.warn('[Exa] No similar results found');\n return [];\n }\n\n const results: SearchResult[] = response.data.results.map((result: any, index: number) => ({\n title: result.title || 'Untitled',\n url: result.url,\n snippet: result.summary || result.text?.substring(0, 200) || 'No description available',\n score: result.score || (0.9 - index * 0.05),\n provider: 'exa',\n metadata: {\n language: 'en',\n type: 'similar',\n author: result.author,\n publishedDate: result.publishedDate,\n image: result.image,\n },\n }));\n\n elizaLogger.info(`[Exa] Found ${results.length} similar results`);\n return results;\n } catch (error: any) {\n elizaLogger.error(`[Exa] Find similar error:`, error);\n throw error;\n }\n }\n} ","import axios from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\n\nexport interface SerpAPIConfig {\n apiKey: string;\n country?: string;\n location?: string;\n language?: string;\n num?: number;\n}\n\nexport class SerpAPISearchProvider {\n private readonly apiKey: string;\n private readonly baseUrl = 'https://serpapi.com/search';\n private readonly config: SerpAPIConfig;\n public readonly name = 'SerpAPI';\n\n constructor(config: SerpAPIConfig) {\n if (!config.apiKey) {\n throw new Error('SerpAPI key is required');\n }\n this.apiKey = config.apiKey;\n this.config = {\n country: 'us',\n language: 'en', \n num: 10,\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[SerpAPI] Searching for: ${query}`);\n\n const params: any = {\n q: query,\n api_key: this.apiKey,\n engine: 'google',\n num: maxResults || this.config.num,\n gl: this.config.country,\n hl: this.config.language,\n };\n\n // Add location if specified\n if (this.config.location) {\n params['location'] = this.config.location;\n }\n\n const response = await axios.get(this.baseUrl, {\n params,\n timeout: 20000,\n });\n\n const data = response.data;\n const results: SearchResult[] = [];\n\n // Add answer box if available\n if (data.answer_box?.answer) {\n results.push({\n title: data.answer_box.title || 'Direct Answer',\n url: data.answer_box.link || '',\n snippet: data.answer_box.answer,\n score: 1.0,\n provider: 'serpapi',\n metadata: {\n language: this.config.language || 'en',\n type: 'answer_box',\n },\n });\n }\n\n // Add knowledge graph if available\n if (data.knowledge_graph) {\n const kg = data.knowledge_graph;\n results.push({\n title: kg.title,\n url: kg.source?.link || '',\n snippet: kg.description || '',\n content: JSON.stringify({\n ...kg,\n source: 'knowledge_graph',\n }),\n score: 0.9,\n provider: 'serpapi',\n metadata: {\n language: this.config.language || 'en',\n type: 'knowledge_graph',\n // Store kgmid in a generic property\n ...kg.kgmid ? { kgmid: kg.kgmid } : {},\n },\n });\n }\n\n // Add organic results\n if (data.organic_results) {\n results.push(\n ...data.organic_results.slice(0, maxResults || this.config.num).map((result: any, index: number) => ({\n title: result.title || 'Untitled',\n url: result.link,\n snippet: result.snippet || '',\n score: 0.8 - index * 0.05,\n provider: 'serpapi',\n metadata: {\n language: this.config.language || 'en',\n position: result.position,\n date: result.date,\n source: result.source,\n cached_page_link: result.cached_page_link,\n },\n }))\n );\n }\n\n elizaLogger.info(`[SerpAPI] Found ${results.length} results`);\n return results.slice(0, maxResults || this.config.num);\n } catch (error: any) {\n if (axios.isAxiosError(error)) {\n if (error.response?.status === 401) {\n elizaLogger.error('[SerpAPI] Invalid API key');\n throw new Error('Invalid SerpAPI key');\n } else if (error.response?.status === 429) {\n elizaLogger.error('[SerpAPI] Rate limit exceeded');\n throw new Error('SerpAPI rate limit exceeded');\n }\n elizaLogger.error(`[SerpAPI] API error: ${error.message}`, {\n status: error.response?.status,\n data: error.response?.data,\n });\n }\n throw error;\n }\n }\n\n async searchNews(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[SerpAPI] Searching news for: ${query}`);\n\n const params = {\n q: query,\n api_key: this.apiKey,\n engine: 'google',\n tbm: 'nws', // News search\n num: maxResults || this.config.num,\n gl: this.config.country,\n hl: this.config.language,\n };\n\n const response = await axios.get(this.baseUrl, {\n params,\n timeout: 20000,\n });\n\n const data = response.data;\n const results: SearchResult[] = [];\n\n if (data.news_results) {\n results.push(\n ...data.news_results.map((item: any, index: number) => ({\n title: item.title,\n url: item.link,\n snippet: item.snippet || '',\n score: 0.8 - index * 0.05,\n provider: 'serpapi',\n metadata: {\n language: this.config.language || 'en',\n type: 'news',\n date: item.date,\n source: item.source,\n thumbnail: item.thumbnail,\n },\n }))\n );\n }\n\n elizaLogger.info(`[SerpAPI] Found ${results.length} news results`);\n return results;\n } catch (error) {\n elizaLogger.error('[SerpAPI] News search error:', error);\n throw error;\n }\n }\n\n async searchScholar(query: string, maxResults?: number): Promise<SearchResult[]> {\n try {\n elizaLogger.info(`[SerpAPI] Searching Google Scholar for: ${query}`);\n\n const params = {\n q: query,\n api_key: this.apiKey,\n engine: 'google_scholar',\n num: maxResults || this.config.num,\n hl: this.config.language,\n };\n\n const response = await axios.get(this.baseUrl, {\n params,\n timeout: 20000,\n });\n\n const data = response.data;\n const results: SearchResult[] = [];\n\n if (data.organic_results) {\n results.push(\n ...data.organic_results.map((item: any, index: number) => ({\n title: item.title,\n url: item.link,\n snippet: item.snippet || item.publication_info?.summary || '',\n content: JSON.stringify({\n authors: item.publication_info?.authors,\n cited_by: item.inline_links?.cited_by?.total,\n related_pages_link: item.inline_links?.related_pages_link,\n pdf_link: item.resources?.find((r: any) => r.file_format === 'PDF')?.link,\n type: 'academic',\n }),\n score: 0.9 - index * 0.05,\n provider: 'serpapi',\n metadata: {\n language: this.config.language || 'en',\n type: 'academic',\n author: item.publication_info?.authors?.join(', '),\n publishDate: item.publication_info?.summary,\n citations: item.inline_links?.cited_by?.total,\n },\n }))\n );\n }\n\n elizaLogger.info(`[SerpAPI] Found ${results.length} scholar results`);\n return results;\n } catch (error) {\n elizaLogger.error('[SerpAPI] Scholar search error:', error);\n throw error;\n }\n }\n\n async searchImages(query: string, maxResults?: number): Promise<Array<{ url: string; title: string; source: string }>> {\n try {\n elizaLogger.info(`[SerpAPI] Searching images for: ${query}`);\n\n const params = {\n q: query,\n api_key: this.apiKey,\n engine: 'google',\n tbm: 'isch', // Image search\n num: maxResults || 10,\n gl: this.config.country,\n hl: this.config.language,\n };\n\n const response = await axios.get(this.baseUrl, {\n params,\n timeout: 20000,\n });\n\n const data = response.data;\n const results: Array<{ url: string; title: string; source: string }> = [];\n\n if (data.images_results) {\n results.push(\n ...data.images_results.slice(0, maxResults || 10).map((img: any) => ({\n url: img.original || img.link,\n title: img.title || 'Untitled',\n source: img.source || img.link,\n }))\n );\n }\n\n elizaLogger.info(`[SerpAPI] Found ${results.length} image results`);\n return results;\n } catch (error) {\n elizaLogger.error('[SerpAPI] Image search error:', error);\n throw error;\n }\n }\n} ","import axios, { AxiosError } from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\nimport { z } from 'zod';\n\n// PyPI API response schema validation\nconst PyPIPackageSchema = z.object({\n info: z.object({\n name: z.string(),\n summary: z.string().optional(),\n description: z.string().optional(),\n home_page: z.string().optional(),\n author: z.string().optional(),\n author_email: z.string().optional(),\n maintainer: z.string().optional(),\n version: z.string(),\n keywords: z.string().optional(),\n license: z.string().optional(),\n classifiers: z.array(z.string()).optional(),\n project_urls: z.record(z.string()).optional(),\n }),\n urls: z.array(z.object({\n filename: z.string(),\n url: z.string(),\n upload_time: z.string().optional(),\n })).optional(),\n});\n\nconst PyPISearchSchema = z.object({\n projects: z.array(z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n })),\n});\n\nexport interface PyPIConfig {\n maxResults?: number;\n includeClassifiers?: boolean;\n}\n\nexport class PyPISearchProvider {\n public readonly name = 'pypi';\n private readonly baseUrl = 'https://pypi.org/pypi';\n private readonly searchUrl = 'https://pypi.org/search/';\n private readonly config: PyPIConfig;\n\n constructor(config: PyPIConfig = {}) {\n this.config = {\n maxResults: 20,\n includeClassifiers: true,\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n const startTime = Date.now();\n const limit = maxResults || this.config.maxResults || 20;\n\n // Handle empty query\n if (!query || query.trim().length === 0) {\n elizaLogger.debug('[PyPI] Empty query, returning no results');\n return [];\n }\n\n try {\n elizaLogger.info(`[PyPI] Searching for: ${query}`);\n\n // Search PyPI (no official search API, using HTML scraping as fallback)\n // For production use, consider using a proper PyPI API client\n const searchUrl = `https://pypi.org/search/?q=${encodeURIComponent(query)}`;\n const searchResponse = await axios.get(searchUrl, {\n headers: {\n 'User-Agent': 'ElizaOS-Research-Agent/1.0',\n },\n timeout: 10000,\n });\n\n // Extract package names from search results\n const packageMatches = searchResponse.data.match(\n /href=\"\\/project\\/([^\\/]+)\\//g\n ) || [];\n\n const packages = packageMatches\n .map((match: string) => {\n const name = match.match(/href=\"\\/project\\/([^\\/]+)\\//)?.[1];\n return name ? { name } : null;\n })\n .filter(Boolean)\n .slice(0, limit);\n\n // Get detailed information for each package\n const results = await Promise.all(\n packages.map(async (pkg: any, index: number) => {\n const details = await this.getPackageDetails(pkg.name);\n if (details) {\n return this.convertToSearchResult(details, index);\n }\n return null;\n })\n );\n\n const validResults = results.filter(Boolean) as SearchResult[];\n const duration = Date.now() - startTime;\n elizaLogger.info(`[PyPI] Found ${validResults.length} results in ${duration}ms`);\n\n return validResults;\n } catch (error) {\n const duration = Date.now() - startTime;\n elizaLogger.error(`[PyPI] Search failed after ${duration}ms:`, error);\n \n // Wrap the error to prevent serialization issues\n if (axios.isAxiosError(error)) {\n throw new Error(`PyPI search failed: ${error.message} (${error.response?.status || 'no status'})`);\n }\n throw new Error(`PyPI search failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private async getPackageDetails(packageName: string): Promise<any | null> {\n try {\n const response = await axios.get(`${this.baseUrl}/${packageName}/json`, {\n headers: {\n 'User-Agent': 'ElizaOS-Research-Agent/1.0',\n },\n timeout: 5000,\n });\n\n return PyPIPackageSchema.parse(response.data);\n } catch (error) {\n if (axios.isAxiosError(error) && error.response?.status === 404) {\n elizaLogger.debug(`[PyPI] Package ${packageName} not found`);\n } else {\n elizaLogger.warn(`[PyPI] Failed to get details for ${packageName}:`, \n error instanceof Error ? error.message : String(error));\n }\n return null;\n }\n }\n\n private convertToSearchResult(pkg: any, index: number): SearchResult {\n const info = pkg.info;\n const packageUrl = `https://pypi.org/project/${info.name}/`;\n \n // Create a comprehensive description\n let description = info.summary || info.description || '';\n if (info.keywords) {\n description += `\\nKeywords: ${info.keywords}`;\n }\n if (info.license) {\n description += `\\nLicense: ${info.license}`;\n }\n\n // Extract relevant classifiers for additional context\n let classifiers = '';\n if (this.config.includeClassifiers && info.classifiers) {\n const relevantClassifiers = info.classifiers\n .filter((c: string) => \n c.includes('Development Status') || \n c.includes('Intended Audience') ||\n c.includes('Programming Language') ||\n c.includes('Topic')\n )\n .slice(0, 5);\n \n if (relevantClassifiers.length > 0) {\n classifiers = `\\nClassifiers: ${relevantClassifiers.join(', ')}`;\n }\n }\n\n return {\n title: `${info.name} v${info.version}`,\n url: packageUrl,\n snippet: description.substring(0, 300) + (description.length > 300 ? '...' : ''),\n content: description + classifiers,\n score: Math.max(0.1, 1.0 - (index * 0.05)), // Decrease score based on result order\n provider: 'pypi',\n metadata: {\n language: 'python',\n author: info.author || info.maintainer ? [info.author || info.maintainer] : [],\n type: 'package',\n domain: 'pypi.org',\n },\n };\n }\n\n /**\n * Get specific package information by name\n */\n async getPackage(packageName: string): Promise<SearchResult | null> {\n try {\n const pkg = await this.getPackageDetails(packageName);\n if (!pkg) return null;\n\n return this.convertToSearchResult(pkg, 0);\n } catch (error) {\n elizaLogger.error(`[PyPI] Failed to get package ${packageName}:`, error);\n return null;\n }\n }\n\n /**\n * Search for packages by category/classifier\n */\n async searchByCategory(category: string, maxResults?: number): Promise<SearchResult[]> {\n // This would require scraping PyPI's browse page or using alternative APIs\n // For now, return empty array and log the limitation\n elizaLogger.warn('[PyPI] Category search not implemented - use keyword search instead');\n return [];\n }\n}","import axios, { AxiosError } from 'axios';\nimport { SearchResult } from '../../types';\nimport { elizaLogger } from '@elizaos/core';\nimport { z } from 'zod';\n\n// NPM Registry API response schema validation\nconst NPMPackageSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n version: z.string(),\n keywords: z.array(z.string()).optional(),\n author: z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().optional(),\n })\n ]).optional(),\n maintainers: z.array(z.object({\n name: z.string(),\n email: z.string().optional(),\n })).optional(),\n repository: z.union([\n z.string(),\n z.object({\n type: z.string().optional(),\n url: z.string(),\n })\n ]).optional(),\n homepage: z.string().optional(),\n license: z.string().optional(),\n readme: z.string().optional(),\n 'dist-tags': z.object({\n latest: z.string(),\n }).optional(),\n time: z.record(z.string()).optional(),\n});\n\nconst NPMSearchSchema = z.object({\n objects: z.array(z.object({\n package: z.object({\n name: z.string(),\n version: z.string(),\n description: z.string().optional(),\n keywords: z.array(z.string()).optional(),\n author: z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().optional(),\n })\n ]).optional(),\n maintainers: z.array(z.object({\n username: z.string(),\n email: z.string().optional(),\n })).optional(),\n repository: z.union([\n z.string(),\n z.object({\n type: z.string().optional(),\n url: z.string(),\n })\n ]).optional(),\n links: z.object({\n npm: z.string().optional(),\n homepage: z.string().optional(),\n repository: z.string().optional(),\n bugs: z.string().optional(),\n }).optional(),\n }),\n score: z.object({\n final: z.number(),\n detail: z.object({\n quality: z.number(),\n popularity: z.number(),\n maintenance: z.number(),\n }),\n }),\n searchScore: z.number().optional(),\n })),\n total: z.number(),\n time: z.string(),\n});\n\nexport interface NPMConfig {\n maxResults?: number;\n includeDetails?: boolean;\n quality?: number; // Minimum quality score (0-1)\n popularity?: number; // Minimum popularity score (0-1)\n}\n\nexport class NPMSearchProvider {\n public readonly name = 'npm';\n private readonly registryUrl = 'https://registry.npmjs.org';\n private readonly searchUrl = 'https://registry.npmjs.com/-/v1/search';\n private readonly config: NPMConfig;\n\n constructor(config: NPMConfig = {}) {\n this.config = {\n maxResults: 20,\n includeDetails: true,\n quality: 0.3,\n popularity: 0.1,\n ...config,\n };\n }\n\n async search(query: string, maxResults?: number): Promise<SearchResult[]> {\n const startTime = Date.now();\n const limit = Math.min(maxResults || this.config.maxResults || 20, 100); // NPM search API limit\n\n // Handle empty query\n if (!query || query.trim().length === 0) {\n elizaLogger.debug('[NPM] Empty query, returning no results');\n return [];\n }\n\n try {\n elizaLogger.info(`[NPM] Searching for: ${query}`);\n\n const searchResponse = await axios.get(this.searchUrl, {\n params: {\n text: query,\n size: limit,\n quality: this.config.quality,\n popularity: this.config.popularity,\n },\n headers: {\n 'User-Agent': 'ElizaOS-Research-Agent/1.0',\n },\n timeout: 10000,\n });\n\n const searchData = NPMSearchSchema.parse(searchResponse.data);\n \n // Get detailed information if requested\n let results: SearchResult[] = [];\n \n if (this.config.includeDetails) {\n // Get detailed package info for top results\n const topPackages = searchData.objects.slice(0, Math.min(limit, 10));\n const detailedResults = await Promise.all(\n topPackages.map(async (item) => {\n const details = await this.getPackageDetails(item.package.name);\n return this.convertToSearchResult(item, details);\n })\n );\n results = detailedResults.filter(Boolean);\n } else {\n // Use search results directly\n results = searchData.objects\n .slice(0, limit)\n .map((item) => this.convertToSearchResult(item, null));\n }\n\n const duration = Date.now() - startTime;\n elizaLogger.info(`[NPM] Found ${results.length} results in ${duration}ms`);\n\n return results;\n } catch (error) {\n const duration = Date.now() - startTime;\n elizaLogger.error(`[NPM] Search failed after ${duration}ms:`, error);\n \n // Wrap the error to prevent serialization issues\n if (axios.isAxiosError(error)) {\n throw new Error(`NPM search failed: ${error.message} (${error.response?.status || 'no status'})`);\n }\n throw new Error(`NPM search failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private async getPackageDetails(packageName: string): Promise<any | null> {\n try {\n const response = await axios.get(`${this.registryUrl}/${encodeURIComponent(packageName)}`, {\n headers: {\n 'User-Agent': 'ElizaOS-Research-Agent/1.0',\n },\n timeout: 5000,\n });\n\n return NPMPackageSchema.parse(response.data);\n } catch (error) {\n if (axios.isAxiosError(error) && error.response?.status === 404) {\n elizaLogger.debug(`[NPM] Package ${packageName} not found`);\n } else {\n elizaLogger.warn(`[NPM] Failed to get details for ${packageName}:`, \n error instanceof Error ? error.message : String(error));\n }\n return null;\n }\n }\n\n private convertToSearchResult(item: any, details?: any): SearchResult {\n const pkg = item.package;\n const score = item.score || { final: 0.5, detail: { quality: 0.5, popularity: 0.5, maintenance: 0.5 } };\n \n // Use detailed info if available, fallback to search result data\n const packageData = details || pkg;\n const packageUrl = `https://www.npmjs.com/package/${pkg.name}`;\n \n // Extract author information\n let author = '';\n if (packageData.author) {\n if (typeof packageData.author === 'string') {\n author = packageData.author;\n } else if (packageData.author.name) {\n author = packageData.author.name;\n }\n }\n\n // Extract repository URL\n let repositoryUrl = '';\n if (packageData.repository) {\n if (typeof packageData.repository === 'string') {\n repositoryUrl = packageData.repository;\n } else if (packageData.repository.url) {\n repositoryUrl = packageData.repository.url\n .replace(/^git\\+/, '')\n .replace(/\\.git$/, '')\n .replace(/^git:\\/\\//, 'https://');\n }\n }\n\n // Create comprehensive description\n let description = pkg.description || packageData.description || '';\n if (pkg.keywords && pkg.keywords.length > 0) {\n description += `\\nKeywords: ${pkg.keywords.join(', ')}`;\n }\n if (packageData.license) {\n description += `\\nLicense: ${packageData.license}`;\n }\n\n // Add quality metrics\n let qualityInfo = '';\n if (score.detail) {\n qualityInfo = `\\nQuality: ${(score.detail.quality * 100).toFixed(0)}% | ` +\n `Popularity: ${(score.detail.popularity * 100).toFixed(0)}% | ` +\n `Maintenance: ${(score.detail.maintenance * 100).toFixed(0)}%`;\n }\n\n return {\n title: `${pkg.name} v${pkg.version}`,\n url: packageUrl,\n snippet: description.substring(0, 300) + (description.length > 300 ? '...' : ''),\n content: description + qualityInfo,\n score: score.final,\n provider: 'npm',\n metadata: {\n language: 'javascript',\n author: author ? [author] : [],\n type: 'package',\n domain: 'npmjs.com',\n },\n };\n }\n\n /**\n * Get specific package information by name\n */\n async getPackage(packageName: string): Promise<SearchResult | null> {\n try {\n const pkg = await this.getPackageDetails(packageName);\n if (!pkg) return null;\n\n // Create a mock search item for conversion\n const mockSearchItem = {\n package: {\n name: pkg.name,\n version: pkg['dist-tags']?.latest || pkg.version,\n description: pkg.description,\n keywords: pkg.keywords,\n author: pkg.author,\n links: {\n npm: `https://www.npmjs.com/package/${pkg.name}`,\n homepage: pkg.homepage,\n },\n },\n score: {\n final: 1.0, // Assume high relevance for direct lookup\n detail: {\n quality: 0.8,\n popularity: 0.7,\n maintenance: 0.8,\n },\n },\n };\n\n return this.convertToSearchResult(mockSearchItem, pkg);\n } catch (error) {\n elizaLogger.error(`[NPM] Failed to get package ${packageName}:`, error);\n return null;\n }\n }\n\n /**\n * Search for packages by scope (e.g., @types, @angular)\n */\n async searchByScope(scope: string, maxResults?: number): Promise<SearchResult[]> {\n const query = `scope:${scope}`;\n return this.search(query, maxResults);\n }\n\n /**\n * Search for packages by maintainer\n */\n async searchByMaintainer(maintainer: string, maxResults?: number): Promise<SearchResult[]> {\n const query = `maintainer:${maintainer}`;\n return this.search(query, maxResults);\n }\n\n /**\n * Search for packages with specific keywords\n */\n async searchByKeywords(keywords: string[], maxResults?: number): Promise<SearchResult[]> {\n const query = `keywords:${keywords.join(',')}`;\n return this.search(query, maxResults);\n }\n\n /**\n * Get trending/popular packages in a category\n */\n async getTrendingPackages(category?: string, maxResults?: number): Promise<SearchResult[]> {\n let query = 'boost-exact:false';\n if (category) {\n query += ` ${category}`;\n }\n \n return this.search(query, maxResults);\n }\n}","import { elizaLogger } from '@elizaos/core';\nimport axios from 'axios';\nimport { ExtractedContent } from './firecrawl';\n\n// Dynamic import to avoid pdf-parse test code execution\nlet pdfParse: any;\nconst loadPdfParse = async () => {\n if (!pdfParse) {\n try {\n pdfParse = (await import('pdf-parse')).default;\n } catch (error) {\n elizaLogger.warn('[PDFExtractor] pdf-parse not available, PDF extraction disabled');\n }\n }\n return pdfParse;\n};\n\nexport interface PDFMetadata {\n title?: string;\n author?: string[];\n subject?: string;\n keywords?: string[];\n creator?: string;\n producer?: string;\n creationDate?: Date;\n modificationDate?: Date;\n pages?: number;\n}\n\nexport interface AcademicPaperStructure {\n abstract?: string;\n introduction?: string;\n methodology?: string;\n results?: string;\n discussion?: string;\n conclusion?: string;\n references?: Reference[];\n figures?: Figure[];\n tables?: Table[];\n}\n\nexport interface Reference {\n id: string;\n text: string;\n authors?: string[];\n title?: string;\n year?: number;\n journal?: string;\n doi?: string;\n url?: string;\n}\n\nexport interface Figure {\n id: string;\n caption: string;\n pageNumber: number;\n mentioned: string[];\n}\n\nexport interface Table {\n id: string;\n caption: string;\n headers?: string[];\n rows?: string[][];\n pageNumber: number;\n}\n\nexport class PDFExtractor {\n private readonly maxFileSize = 50 * 1024 * 1024; // 50MB limit\n\n async extractFromURL(url: string): Promise<ExtractedContent | null> {\n try {\n elizaLogger.info(`[PDFExtractor] Downloading PDF from: ${url}`);\n \n // Download PDF\n const response = await axios.get(url, {\n responseType: 'arraybuffer',\n timeout: 30000,\n maxContentLength: this.maxFileSize,\n headers: {\n 'User-Agent': 'Mozilla/5.0 (compatible; ElizaOS/1.0)',\n },\n });\n \n const buffer = Buffer.from(response.data);\n return await this.extractFromBuffer(buffer, url);\n } catch (error) {\n elizaLogger.error('[PDFExtractor] Failed to download PDF:', error);\n return null;\n }\n }\n\n async extractFromBuffer(buffer: Buffer, sourceUrl?: string): Promise<ExtractedContent | null> {\n try {\n elizaLogger.info('[PDFExtractor] Parsing PDF buffer');\n \n const parser = await loadPdfParse();\n if (!parser) {\n elizaLogger.warn('[PDFExtractor] PDF parser not available');\n return null;\n }\n \n const data = await parser(buffer);\n \n // Extract metadata\n const metadata = this.extractMetadata(data.info);\n \n // Extract text content\n const text = data.text;\n \n // Extract academic structure\n const structure = this.extractAcademicStructure(text);\n \n // Extract references\n const references = this.extractReferences(text);\n \n // Format as markdown\n const markdown = this.formatAsMarkdown(structure, metadata, references);\n \n return {\n content: text,\n markdown,\n metadata: {\n ...metadata,\n pageCount: data.numpages,\n textLength: text.length,\n sourceUrl,\n },\n };\n } catch (error) {\n elizaLogger.error('[PDFExtractor] Failed to parse PDF:', error);\n return null;\n }\n }\n\n private extractMetadata(info: any): PDFMetadata {\n return {\n title: info.Title,\n author: info.Author ? [info.Author] : undefined,\n subject: info.Subject,\n keywords: info.Keywords ? info.Keywords.split(/[,;]/).map((k: string) => k.trim()) : undefined,\n creator: info.Creator,\n producer: info.Producer,\n creationDate: info.CreationDate ? new Date(info.CreationDate) : undefined,\n modificationDate: info.ModDate ? new Date(info.ModDate) : undefined,\n };\n }\n\n private extractAcademicStructure(text: string): AcademicPaperStructure {\n const structure: AcademicPaperStructure = {};\n \n // Extract abstract\n const abstractMatch = text.match(/abstract[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:introduction|keywords|1\\.|i\\.))/i);\n if (abstractMatch) {\n structure.abstract = this.cleanText(abstractMatch[1]);\n }\n \n // Extract introduction\n const introMatch = text.match(/(?:1\\.|i\\.|\\n)\\s*introduction[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:2\\.|ii\\.|method|related))/i);\n if (introMatch) {\n structure.introduction = this.cleanText(introMatch[1]);\n }\n \n // Extract methodology\n const methodMatch = text.match(/(?:method|methodology|approach)[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:\\d\\.|results|experiment))/i);\n if (methodMatch) {\n structure.methodology = this.cleanText(methodMatch[1]);\n }\n \n // Extract results\n const resultsMatch = text.match(/(?:results|findings|experiments)[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:discussion|conclusion|\\d\\.))/i);\n if (resultsMatch) {\n structure.results = this.cleanText(resultsMatch[1]);\n }\n \n // Extract discussion\n const discussionMatch = text.match(/discussion[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:conclusion|acknowledgment|references))/i);\n if (discussionMatch) {\n structure.discussion = this.cleanText(discussionMatch[1]);\n }\n \n // Extract conclusion\n const conclusionMatch = text.match(/conclusion[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:references|acknowledgment|appendix))/i);\n if (conclusionMatch) {\n structure.conclusion = this.cleanText(conclusionMatch[1]);\n }\n \n return structure;\n }\n\n private extractReferences(text: string): Reference[] {\n const references: Reference[] = [];\n \n // Find references section\n const refMatch = text.match(/(?:references|bibliography)[:\\s]*\\n([\\s\\S]*?)(?=\\n\\s*(?:appendix|$))/i);\n if (!refMatch) return references;\n \n const refText = refMatch[1];\n \n // Split into individual references (numbered or bulleted)\n const refLines = refText.split(/\\n(?:\\[\\d+\\]|\\d+\\.|\\•)/);\n \n for (const line of refLines) {\n if (line.trim().length < 20) continue; // Skip short lines\n \n const ref = this.parseReference(line.trim());\n if (ref) references.push(ref);\n }\n \n return references;\n }\n\n private parseReference(text: string): Reference | null {\n const ref: Reference = {\n id: `ref-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n text: text,\n };\n \n // Extract DOI\n const doiMatch = text.match(/(?:doi:|https?:\\/\\/doi\\.org\\/)(10\\.\\d{4,}\\/[-._;()\\/:a-zA-Z0-9]+)/i);\n if (doiMatch) {\n ref.doi = doiMatch[1];\n }\n \n // Extract year (look for 4-digit year in parentheses or after comma)\n const yearMatch = text.match(/\\((\\d{4})\\)|,\\s*(\\d{4})/);\n if (yearMatch) {\n ref.year = parseInt(yearMatch[1] || yearMatch[2]);\n }\n \n // Extract authors (before year or first period)\n const authorsMatch = text.match(/^([^.(]+?)(?:\\s*\\(\\d{4}\\)|\\.)/);\n if (authorsMatch) {\n ref.authors = authorsMatch[1].split(/,|&|and/).map(a => a.trim());\n }\n \n // Extract title (usually in quotes or after year)\n const titleMatch = text.match(/\"([^\"]+)\"|['\"]([^'\"]+)['\"]|\\d{4}\\)\\s*\\.?\\s*([^.]+)\\./);\n if (titleMatch) {\n ref.title = titleMatch[1] || titleMatch[2] || titleMatch[3];\n }\n \n // Extract journal (often in italics or after \"In\")\n const journalMatch = text.match(/(?:In\\s+|[.,]\\s*)([A-Z][^,.(]+(?:Journal|Conference|Proceedings|Review)[^,.]*)/);\n if (journalMatch) {\n ref.journal = journalMatch[1].trim();\n }\n \n return ref;\n }\n\n private cleanText(text: string): string {\n return text\n .replace(/\\s+/g, ' ')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n }\n\n private formatAsMarkdown(\n structure: AcademicPaperStructure,\n metadata: PDFMetadata,\n references: Reference[]\n ): string {\n const sections: string[] = [];\n \n // Title and metadata\n if (metadata.title) {\n sections.push(`# ${metadata.title}\\n`);\n }\n \n if (metadata.author?.length) {\n sections.push(`**Authors:** ${metadata.author.join(', ')}\\n`);\n }\n \n // Abstract\n if (structure.abstract) {\n sections.push(`## Abstract\\n\\n${structure.abstract}\\n`);\n }\n \n // Main sections\n if (structure.introduction) {\n sections.push(`## Introduction\\n\\n${structure.introduction}\\n`);\n }\n \n if (structure.methodology) {\n sections.push(`## Methodology\\n\\n${structure.methodology}\\n`);\n }\n \n if (structure.results) {\n sections.push(`## Results\\n\\n${structure.results}\\n`);\n }\n \n if (structure.discussion) {\n sections.push(`## Discussion\\n\\n${structure.discussion}\\n`);\n }\n \n if (structure.conclusion) {\n sections.push(`## Conclusion\\n\\n${structure.conclusion}\\n`);\n }\n \n // References\n if (references.length > 0) {\n sections.push(`## References\\n`);\n for (const ref of references) {\n const parts = [];\n if (ref.authors?.length) parts.push(ref.authors.join(', '));\n if (ref.year) parts.push(`(${ref.year})`);\n if (ref.title) parts.push(`\"${ref.title}\"`);\n if (ref.journal) parts.push(ref.journal);\n if (ref.doi) parts.push(`DOI: ${ref.doi}`);\n \n sections.push(`- ${parts.join('. ')}\\n`);\n }\n }\n \n return sections.join('\\n');\n }\n\n // Extract specific sections for targeted analysis\n async extractSection(buffer: Buffer, sectionName: string): Promise<string | null> {\n try {\n const parser = await loadPdfParse();\n if (!parser) {\n elizaLogger.warn('[PDFExtractor] PDF parser not available');\n return null;\n }\n \n const data = await parser(buffer);\n const text = data.text;\n \n const sectionRegex = new RegExp(\n `${sectionName}[:\\\\s]*\\\\n([\\\\s\\\\S]*?)(?=\\\\n\\\\s*(?:\\\\d+\\\\.|[A-Z][^\\\\n]*:|References|$))`,\n 'i'\n );\n \n const match = text.match(sectionRegex);\n return match ? this.cleanText(match[1]) : null;\n } catch (error) {\n elizaLogger.error(`[PDFExtractor] Failed to extract section ${sectionName}:`, error);\n return null;\n }\n }\n\n // Check if URL points to a PDF\n static isPDFUrl(url: string): boolean {\n return url.toLowerCase().endsWith('.pdf') || \n url.includes('pdf') ||\n url.includes('arxiv.org/pdf/');\n }\n} ","import { IAgentRuntime, elizaLogger, ModelType } from '@elizaos/core';\nimport {\n ResearchDomain,\n TaskType,\n ResearchDepth,\n QueryPlan,\n SubQuery,\n SearchStrategy,\n SearchApproach,\n DomainApproach,\n EvaluationCriteria,\n CriteriaDefinition,\n ScoringMethod,\n ResearchMetadata,\n ResultType,\n TemporalFocus,\n SourceType,\n RubricItem,\n} from '../types';\n\n// Domain-specific research configurations\nconst DOMAIN_CONFIGS: Record<ResearchDomain, DomainConfig> = {\n [ResearchDomain.PHYSICS]: {\n keyTerms: ['quantum', 'relativity', 'particle', 'mechanics', 'thermodynamics', 'electromagnetism'],\n authoritySource: ['arxiv.org', 'physics.aps.org', 'nature.com/nphys', 'science.org'],\n methodology: 'theoretical-experimental',\n evaluationFocus: ['mathematical rigor', 'experimental validation', 'theoretical consistency'],\n preferredSources: [SourceType.ACADEMIC, SourceType.TECHNICAL],\n },\n [ResearchDomain.CHEMISTRY]: {\n keyTerms: ['synthesis', 'reaction', 'compound', 'molecular', 'organic', 'inorganic'],\n authoritySource: ['acs.org', 'rsc.org', 'chemistry.nature.com', 'sciencedirect.com'],\n methodology: 'experimental-analytical',\n evaluationFocus: ['reproducibility', 'yield', 'purity', 'mechanism'],\n preferredSources: [SourceType.ACADEMIC, SourceType.TECHNICAL],\n },\n [ResearchDomain.BIOLOGY]: {\n keyTerms: ['cell', 'gene', 'protein', 'evolution', 'ecology', 'physiology'],\n authoritySource: ['ncbi.nlm.nih.gov', 'nature.com', 'cell.com', 'biology.plos.org'],\n methodology: 'observational-experimental',\n evaluationFocus: ['statistical significance', 'reproducibility', 'biological relevance'],\n preferredSources: [SourceType.ACADEMIC, SourceType.GOVERNMENT],\n },\n [ResearchDomain.ENVIRONMENTAL_SCIENCE]: {\n keyTerms: ['climate', 'ecosystem', 'pollution', 'sustainability', 'biodiversity', 'conservation'],\n authoritySource: ['ipcc.ch', 'epa.gov', 'nature.com/nclimate', 'unep.org'],\n methodology: 'observational-modeling',\n evaluationFocus: ['data quality', 'model accuracy', 'policy implications'],\n preferredSources: [SourceType.GOVERNMENT, SourceType.ACADEMIC, SourceType.ORGANIZATION],\n },\n [ResearchDomain.ENGINEERING]: {\n keyTerms: ['design', 'optimization', 'materials', 'systems', 'control', 'manufacturing'],\n authoritySource: ['ieee.org', 'asme.org', 'engineeringvillage.com', 'asce.org'],\n methodology: 'design-testing',\n evaluationFocus: ['performance', 'efficiency', 'cost-effectiveness', 'safety'],\n preferredSources: [SourceType.TECHNICAL, SourceType.ACADEMIC],\n },\n [ResearchDomain.COMPUTER_SCIENCE]: {\n keyTerms: ['algorithm', 'data structure', 'machine learning', 'network', 'security', 'software'],\n authoritySource: ['acm.org', 'ieee.org', 'arxiv.org/cs', 'github.com'],\n methodology: 'theoretical-implementation',\n evaluationFocus: ['complexity', 'correctness', 'scalability', 'performance'],\n preferredSources: [SourceType.TECHNICAL, SourceType.ACADEMIC, SourceType.WEB],\n },\n [ResearchDomain.MATHEMATICS]: {\n keyTerms: ['theorem', 'proof', 'equation', 'topology', 'algebra', 'analysis'],\n authoritySource: ['ams.org', 'arxiv.org/math', 'mathscinet.ams.org', 'zbmath.org'],\n methodology: 'theoretical-proof',\n evaluationFocus: ['rigor', 'generality', 'elegance', 'applicability'],\n preferredSources: [SourceType.ACADEMIC],\n },\n [ResearchDomain.MEDICINE]: {\n keyTerms: ['diagnosis', 'treatment', 'clinical', 'pathology', 'pharmacology', 'epidemiology'],\n authoritySource: ['pubmed.ncbi.nlm.nih.gov', 'nejm.org', 'thelancet.com', 'who.int'],\n methodology: 'clinical-evidence',\n evaluationFocus: ['clinical significance', 'safety', 'efficacy', 'evidence level'],\n preferredSources: [SourceType.ACADEMIC, SourceType.GOVERNMENT],\n },\n [ResearchDomain.PSYCHOLOGY]: {\n keyTerms: ['behavior', 'cognition', 'emotion', 'development', 'personality', 'disorder'],\n authoritySource: ['apa.org', 'psychologicalscience.org', 'nature.com/nathumbehav', 'ncbi.nlm.nih.gov'],\n methodology: 'empirical-theoretical',\n evaluationFocus: ['validity', 'reliability', 'generalizability', 'ethical considerations'],\n preferredSources: [SourceType.ACADEMIC, SourceType.ORGANIZATION],\n },\n [ResearchDomain.ECONOMICS]: {\n keyTerms: ['market', 'policy', 'growth', 'inflation', 'trade', 'behavioral'],\n authoritySource: ['nber.org', 'imf.org', 'worldbank.org', 'aeaweb.org'],\n methodology: 'theoretical-empirical',\n evaluationFocus: ['model validity', 'data quality', 'policy relevance', 'predictive power'],\n preferredSources: [SourceType.ACADEMIC, SourceType.GOVERNMENT, SourceType.ORGANIZATION],\n },\n [ResearchDomain.FINANCE]: {\n keyTerms: ['investment', 'risk', 'portfolio', 'derivatives', 'banking', 'cryptocurrency'],\n authoritySource: ['bloomberg.com', 'reuters.com', 'ft.com', 'wsj.com'],\n methodology: 'quantitative-analytical',\n evaluationFocus: ['return', 'risk assessment', 'market efficiency', 'regulatory compliance'],\n preferredSources: [SourceType.NEWS, SourceType.TECHNICAL, SourceType.GOVERNMENT],\n },\n [ResearchDomain.BUSINESS]: {\n keyTerms: ['strategy', 'management', 'innovation', 'leadership', 'operations', 'entrepreneurship'],\n authoritySource: ['hbr.org', 'mckinsey.com', 'bcg.com', 'forbes.com'],\n methodology: 'case-analytical',\n evaluationFocus: ['practicality', 'ROI', 'scalability', 'competitive advantage'],\n preferredSources: [SourceType.NEWS, SourceType.ORGANIZATION, SourceType.ACADEMIC],\n },\n [ResearchDomain.MARKETING]: {\n keyTerms: ['consumer', 'branding', 'digital', 'segmentation', 'campaign', 'analytics'],\n authoritySource: ['marketingland.com', 'adweek.com', 'warc.com', 'ama.org'],\n methodology: 'empirical-creative',\n evaluationFocus: ['ROI', 'engagement', 'conversion', 'brand impact'],\n preferredSources: [SourceType.NEWS, SourceType.WEB, SourceType.ORGANIZATION],\n },\n [ResearchDomain.HUMAN_RESOURCES]: {\n keyTerms: ['recruitment', 'performance', 'culture', 'compensation', 'development', 'retention'],\n authoritySource: ['shrm.org', 'cipd.co.uk', 'hbr.org', 'gallup.com'],\n methodology: 'empirical-practical',\n evaluationFocus: ['employee satisfaction', 'productivity', 'retention', 'compliance'],\n preferredSources: [SourceType.ORGANIZATION, SourceType.NEWS, SourceType.ACADEMIC],\n },\n [ResearchDomain.LAW]: {\n keyTerms: ['statute', 'precedent', 'jurisdiction', 'litigation', 'compliance', 'regulation'],\n authoritySource: ['westlaw.com', 'lexisnexis.com', 'law.cornell.edu', 'supremecourt.gov'],\n methodology: 'precedent-analytical',\n evaluationFocus: ['legal validity', 'precedent', 'jurisdiction', 'practical application'],\n preferredSources: [SourceType.GOVERNMENT, SourceType.ACADEMIC],\n },\n [ResearchDomain.POLITICS]: {\n keyTerms: ['policy', 'election', 'governance', 'ideology', 'diplomacy', 'legislation'],\n authoritySource: ['politico.com', 'foreignaffairs.com', 'brookings.edu', 'cfr.org'],\n methodology: 'analytical-comparative',\n evaluationFocus: ['objectivity', 'source diversity', 'historical context', 'impact analysis'],\n preferredSources: [SourceType.NEWS, SourceType.ORGANIZATION, SourceType.GOVERNMENT],\n },\n [ResearchDomain.HISTORY]: {\n keyTerms: ['period', 'civilization', 'event', 'source', 'interpretation', 'archaeology'],\n authoritySource: ['jstor.org', 'archives.gov', 'history.com', 'britannica.com'],\n methodology: 'source-analytical',\n evaluationFocus: ['source reliability', 'historiography', 'context', 'multiple perspectives'],\n preferredSources: [SourceType.ACADEMIC, SourceType.BOOK, SourceType.GOVERNMENT],\n },\n [ResearchDomain.PHILOSOPHY]: {\n keyTerms: ['ethics', 'metaphysics', 'epistemology', 'logic', 'aesthetics', 'phenomenology'],\n authoritySource: ['plato.stanford.edu', 'iep.utm.edu', 'philpapers.org', 'jstor.org'],\n methodology: 'analytical-dialectical',\n evaluationFocus: ['logical consistency', 'clarity', 'originality', 'practical implications'],\n preferredSources: [SourceType.ACADEMIC, SourceType.BOOK],\n },\n [ResearchDomain.ART_DESIGN]: {\n keyTerms: ['aesthetic', 'composition', 'medium', 'movement', 'technique', 'critique'],\n authoritySource: ['artforum.com', 'moma.org', 'tate.org.uk', 'designboom.com'],\n methodology: 'critical-creative',\n evaluationFocus: ['originality', 'technique', 'cultural impact', 'aesthetic value'],\n preferredSources: [SourceType.WEB, SourceType.ORGANIZATION, SourceType.BOOK],\n },\n [ResearchDomain.ENTERTAINMENT]: {\n keyTerms: ['media', 'audience', 'production', 'distribution', 'content', 'platform'],\n authoritySource: ['variety.com', 'hollywoodreporter.com', 'rottentomatoes.com', 'imdb.com'],\n methodology: 'analytical-critical',\n evaluationFocus: ['audience reception', 'critical analysis', 'commercial success', 'cultural impact'],\n preferredSources: [SourceType.NEWS, SourceType.WEB],\n },\n [ResearchDomain.TRANSPORTATION]: {\n keyTerms: ['mobility', 'infrastructure', 'logistics', 'autonomous', 'sustainability', 'urban'],\n authoritySource: ['transportation.gov', 'itf-oecd.org', 'apta.com', 'railway-technology.com'],\n methodology: 'systems-analytical',\n evaluationFocus: ['efficiency', 'safety', 'sustainability', 'cost-effectiveness'],\n preferredSources: [SourceType.GOVERNMENT, SourceType.TECHNICAL, SourceType.ORGANIZATION],\n },\n [ResearchDomain.GENERAL]: {\n keyTerms: [],\n authoritySource: ['wikipedia.org', 'britannica.com', 'scholar.google.com'],\n methodology: 'mixed-methods',\n evaluationFocus: ['accuracy', 'comprehensiveness', 'clarity', 'source diversity'],\n preferredSources: [SourceType.WEB, SourceType.ACADEMIC, SourceType.NEWS],\n },\n};\n\ninterface DomainConfig {\n keyTerms: string[];\n authoritySource: string[];\n methodology: string;\n evaluationFocus: string[];\n preferredSources: SourceType[];\n}\n\nexport class ResearchStrategyFactory {\n constructor(private runtime: IAgentRuntime) {}\n\n async createStrategy(\n query: string,\n domain: ResearchDomain,\n taskType: TaskType,\n depth: ResearchDepth\n ): Promise<SearchStrategy> {\n const domainConfig = DOMAIN_CONFIGS[domain];\n \n // Determine search approach based on task type and depth\n const approach = this.determineSearchApproach(taskType, depth);\n \n // Determine temporal focus based on query analysis\n const temporalFocus = await this.analyzeTemporalFocus(query);\n \n return {\n approach,\n sourceTypes: domainConfig.preferredSources,\n qualityThreshold: this.getQualityThreshold(depth),\n diversityRequirement: taskType === TaskType.COMPARATIVE || taskType === TaskType.EVALUATIVE,\n temporalFocus,\n geographicScope: await this.extractGeographicScope(query),\n languagePreferences: ['en'], // Can be extended based on query\n };\n }\n\n private determineSearchApproach(taskType: TaskType, depth: ResearchDepth): SearchApproach {\n if (depth === ResearchDepth.PHD_LEVEL) {\n return SearchApproach.CITATION_CHAINING;\n }\n \n switch (taskType) {\n case TaskType.EXPLORATORY:\n return SearchApproach.BREADTH_FIRST;\n case TaskType.ANALYTICAL:\n case TaskType.SYNTHETIC:\n return SearchApproach.DEPTH_FIRST;\n case TaskType.COMPARATIVE:\n case TaskType.EVALUATIVE:\n return SearchApproach.ITERATIVE_REFINEMENT;\n case TaskType.PREDICTIVE:\n return SearchApproach.HYPOTHESIS_DRIVEN;\n default:\n return SearchApproach.BREADTH_FIRST;\n }\n }\n\n private getQualityThreshold(depth: ResearchDepth): number {\n switch (depth) {\n case ResearchDepth.SURFACE:\n return 0.6;\n case ResearchDepth.MODERATE:\n return 0.7;\n case ResearchDepth.DEEP:\n return 0.8;\n case ResearchDepth.PHD_LEVEL:\n return 0.9;\n }\n }\n\n private async analyzeTemporalFocus(query: string): Promise<TemporalFocus | undefined> {\n const prompt = `Analyze this research query and determine its temporal focus:\nQuery: \"${query}\"\n\nOptions:\n- historical: Focus on past events, history, origins\n- current: Focus on present state, current situation\n- recent: Focus on recent developments (last 1-2 years)\n- future-oriented: Focus on predictions, trends, future scenarios\n\nRespond with just the option name.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a temporal focus analyzer. Respond with only the temporal focus option, nothing else.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n });\n\n const focus = (typeof response === 'string' ? response : (response as any).content || '').trim().toLowerCase();\n \n if (focus.includes('historical')) return TemporalFocus.HISTORICAL;\n if (focus.includes('current')) return TemporalFocus.CURRENT;\n if (focus.includes('recent')) return TemporalFocus.RECENT;\n if (focus.includes('future')) return TemporalFocus.FUTURE_ORIENTED;\n \n return undefined;\n } catch (error) {\n elizaLogger.error('Error analyzing temporal focus:', error);\n return undefined;\n }\n }\n\n private async extractGeographicScope(query: string): Promise<string[]> {\n const prompt = `Extract any geographic locations or regions mentioned in this query:\nQuery: \"${query}\"\n\nList any countries, regions, cities, or geographic areas mentioned. If none, return \"global\".\nRespond with a comma-separated list.`;\n\n try {\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a geographic scope extractor. Return only a comma-separated list of locations or \"global\".' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.3,\n });\n\n const locations = (typeof response === 'string' ? response : (response as any).content || '')\n .split(',')\n .map((s: string) => s.trim())\n .filter((s: string) => s && s !== 'global');\n \n return locations.length > 0 ? locations : [];\n } catch (error) {\n elizaLogger.error('Error extracting geographic scope:', error);\n return [];\n }\n }\n}\n\nexport class QueryPlanner {\n constructor(private runtime: IAgentRuntime) {}\n\n async createQueryPlan(\n mainQuery: string,\n metadata: Partial<ResearchMetadata>\n ): Promise<QueryPlan> {\n const domain = metadata.domain || ResearchDomain.GENERAL;\n const taskType = metadata.taskType || TaskType.EXPLORATORY;\n const depth = metadata.depth || ResearchDepth.MODERATE;\n \n const domainConfig = DOMAIN_CONFIGS[domain];\n \n // Generate sub-queries based on domain and task type\n const subQueries = await this.generateSubQueries(\n mainQuery,\n domain,\n taskType,\n domainConfig\n );\n \n // Create search strategy\n const strategyFactory = new ResearchStrategyFactory(this.runtime);\n const searchStrategy = await strategyFactory.createStrategy(\n mainQuery,\n domain,\n taskType,\n depth\n );\n \n // Determine iteration count based on depth\n const iterationCount = this.getIterationCount(depth);\n \n return {\n mainQuery,\n subQueries,\n searchStrategy,\n expectedSources: this.getExpectedSources(depth),\n iterationCount,\n adaptiveRefinement: depth === ResearchDepth.DEEP || depth === ResearchDepth.PHD_LEVEL,\n domainSpecificApproach: {\n methodology: domainConfig.methodology,\n keyTerms: domainConfig.keyTerms,\n authoritySource: domainConfig.authoritySource,\n evaluationFocus: domainConfig.evaluationFocus,\n },\n };\n }\n\n private async generateSubQueries(\n mainQuery: string,\n domain: ResearchDomain,\n taskType: TaskType,\n domainConfig: DomainConfig\n ): Promise<SubQuery[]> {\n // Try to use AI model if available\n if (this.runtime.useModel) {\n try {\n const prompt = `Generate sub-queries for this research task:\nMain Query: \"${mainQuery}\"\nDomain: ${domain}\nTask Type: ${taskType}\nKey Terms: ${domainConfig.keyTerms.join(', ')}\n\nGenerate 3-7 specific sub-queries that will help answer the main query comprehensively.\nConsider different aspects based on the task type:\n- Exploratory: broad coverage of the topic\n- Comparative: queries for each item being compared\n- Analytical: queries for different analytical dimensions\n- Synthetic: queries for different perspectives to synthesize\n- Evaluative: queries for criteria and evidence\n- Predictive: queries for historical patterns and indicators\n\nFormat each sub-query as:\nPURPOSE: [why this query is needed]\nQUERY: [the actual search query]\nTYPE: [factual/statistical/theoretical/practical/comparative]\nPRIORITY: [high/medium/low]\n\nSeparate each sub-query with ---`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are an expert research query planner. Generate detailed sub-queries following the exact format requested.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.7,\n });\n\n const responseText = typeof response === 'string' ? response : (response as any).content || '';\n const subQueryTexts = responseText.split('---').filter((s: string) => s.trim());\n \n const subQueries: SubQuery[] = [];\n \n for (let i = 0; i < subQueryTexts.length; i++) {\n const text = subQueryTexts[i];\n const purposeMatch = text.match(/PURPOSE:\\s*(.+)/i);\n const queryMatch = text.match(/QUERY:\\s*(.+)/i);\n const typeMatch = text.match(/TYPE:\\s*(.+)/i);\n const priorityMatch = text.match(/PRIORITY:\\s*(.+)/i);\n \n if (queryMatch && purposeMatch) {\n const resultType = this.parseResultType(typeMatch?.[1] || 'factual');\n const priority = this.parsePriority(priorityMatch?.[1] || 'medium');\n \n subQueries.push({\n id: `sq_${i + 1}`,\n query: queryMatch[1].trim(),\n purpose: purposeMatch[1].trim(),\n priority,\n dependsOn: this.determineDependencies(i, subQueries),\n searchProviders: this.selectSearchProviders(resultType, domain),\n expectedResultType: resultType,\n completed: false,\n });\n }\n }\n \n if (subQueries.length > 0) {\n return subQueries;\n }\n } catch (error) {\n elizaLogger.warn('Error generating sub-queries with AI, using fallback:', error);\n }\n }\n \n // Fallback: Generate sub-queries based on task type\n return this.generateFallbackSubQueries(mainQuery, domain, taskType, domainConfig);\n }\n \n private generateFallbackSubQueries(\n mainQuery: string,\n domain: ResearchDomain,\n taskType: TaskType,\n domainConfig: DomainConfig\n ): SubQuery[] {\n const subQueries: SubQuery[] = [];\n \n // Base sub-queries based on task type\n switch (taskType) {\n case TaskType.COMPARATIVE:\n // Extract items to compare from query\n const items = mainQuery.match(/compare\\s+(\\w+)\\s+and\\s+(\\w+)/i);\n if (items) {\n subQueries.push({\n id: 'sq_1',\n query: `${items[1]} ${domainConfig.keyTerms[0] || 'overview'}`,\n purpose: `Understand first item: ${items[1]}`,\n priority: 1,\n dependsOn: [],\n searchProviders: ['web'],\n expectedResultType: ResultType.FACTUAL,\n completed: false,\n });\n subQueries.push({\n id: 'sq_2',\n query: `${items[2]} ${domainConfig.keyTerms[0] || 'overview'}`,\n purpose: `Understand second item: ${items[2]}`,\n priority: 1,\n dependsOn: [],\n searchProviders: ['web'],\n expectedResultType: ResultType.FACTUAL,\n completed: false,\n });\n }\n break;\n \n case TaskType.ANALYTICAL:\n subQueries.push({\n id: 'sq_1',\n query: `${mainQuery} analysis`,\n purpose: 'Find analytical perspectives',\n priority: 1,\n dependsOn: [],\n searchProviders: ['web', 'academic'],\n expectedResultType: ResultType.THEORETICAL,\n completed: false,\n });\n break;\n \n default:\n // Generic sub-queries\n subQueries.push({\n id: 'sq_1',\n query: mainQuery,\n purpose: 'General search for main topic',\n priority: 1,\n dependsOn: [],\n searchProviders: ['web'],\n expectedResultType: ResultType.FACTUAL,\n completed: false,\n });\n }\n \n // Add domain-specific sub-query\n if (domainConfig.keyTerms.length > 0) {\n subQueries.push({\n id: `sq_${subQueries.length + 1}`,\n query: `${mainQuery} ${domainConfig.keyTerms[0]}`,\n purpose: `Domain-specific search for ${domain}`,\n priority: 2,\n dependsOn: [],\n searchProviders: this.selectSearchProviders(ResultType.THEORETICAL, domain),\n expectedResultType: ResultType.THEORETICAL,\n completed: false,\n });\n }\n \n return subQueries;\n }\n\n private parseResultType(type: string): ResultType {\n const normalized = type.toLowerCase().trim();\n if (normalized.includes('statistical')) return ResultType.STATISTICAL;\n if (normalized.includes('theoretical')) return ResultType.THEORETICAL;\n if (normalized.includes('practical')) return ResultType.PRACTICAL;\n if (normalized.includes('comparative')) return ResultType.COMPARATIVE;\n return ResultType.FACTUAL;\n }\n\n private parsePriority(priority: string): number {\n const normalized = priority.toLowerCase().trim();\n if (normalized === 'high') return 3;\n if (normalized === 'low') return 1;\n return 2; // medium\n }\n\n private determineDependencies(index: number, existingQueries: SubQuery[]): string[] {\n // First query has no dependencies\n if (index === 0) return [];\n \n // Comparative queries might depend on factual queries\n // This is a simplified logic - in production, would use more sophisticated dependency analysis\n const dependencies: string[] = [];\n \n for (let i = 0; i < index && i < existingQueries.length; i++) {\n if (existingQueries[i].priority > 2) {\n dependencies.push(existingQueries[i].id);\n }\n }\n \n return dependencies;\n }\n\n private selectSearchProviders(resultType: ResultType, domain: ResearchDomain): string[] {\n const providers: string[] = ['web']; // Always include general web search\n \n // Add specialized providers based on result type and domain\n if (resultType === ResultType.STATISTICAL || domain === ResearchDomain.ECONOMICS) {\n providers.push('statistics');\n }\n \n if ([ResearchDomain.PHYSICS, ResearchDomain.MATHEMATICS, ResearchDomain.COMPUTER_SCIENCE].includes(domain)) {\n providers.push('arxiv');\n }\n \n if ([ResearchDomain.MEDICINE, ResearchDomain.BIOLOGY, ResearchDomain.PSYCHOLOGY].includes(domain)) {\n providers.push('pubmed');\n }\n \n if (resultType === ResultType.COMPARATIVE || resultType === ResultType.PRACTICAL) {\n providers.push('news');\n }\n \n return providers;\n }\n\n private getIterationCount(depth: ResearchDepth): number {\n switch (depth) {\n case ResearchDepth.SURFACE:\n return 1;\n case ResearchDepth.MODERATE:\n return 2;\n case ResearchDepth.DEEP:\n return 3;\n case ResearchDepth.PHD_LEVEL:\n return 5;\n }\n }\n\n private getExpectedSources(depth: ResearchDepth): number {\n switch (depth) {\n case ResearchDepth.SURFACE:\n return 10;\n case ResearchDepth.MODERATE:\n return 25;\n case ResearchDepth.DEEP:\n return 50;\n case ResearchDepth.PHD_LEVEL:\n return 100;\n }\n }\n\n async refineQuery(\n originalQuery: string,\n currentFindings: string[],\n iteration: number\n ): Promise<string[]> {\n const prompt = `Based on the current research findings, generate refined search queries for iteration ${iteration + 1}.\n\nOriginal Query: \"${originalQuery}\"\n\nCurrent Findings Summary:\n${currentFindings.join('\\n\\n')}\n\nGenerate 2-4 refined queries that:\n1. Address gaps in the current findings\n2. Explore new angles or perspectives\n3. Seek more specific or technical information\n4. Verify or challenge existing findings\n\nFormat: One query per line`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are a research query refinement expert. Generate refined queries based on current findings.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.7,\n });\n\n const responseText = typeof response === 'string' ? response : (response as any).content || '';\n return responseText\n .split('\\n')\n .map((s: string) => s.trim())\n .filter((s: string) => s && !s.match(/^\\d+\\./)); // Remove numbering\n }\n}\n\nexport class EvaluationCriteriaGenerator {\n constructor(private runtime: IAgentRuntime) {}\n\n async generateCriteria(\n query: string,\n domain?: ResearchDomain\n ): Promise<EvaluationCriteria> {\n const domainConfig = domain ? DOMAIN_CONFIGS[domain] : DOMAIN_CONFIGS[ResearchDomain.GENERAL];\n \n // Generate base criteria\n const baseCriteria: EvaluationCriteria = {\n comprehensiveness: await this.generateCriterion(\n 'Comprehensiveness',\n 'How thoroughly the research covers all relevant aspects of the query',\n 0.25\n ),\n depth: await this.generateCriterion(\n 'Depth',\n 'The level of detail and expertise demonstrated in the analysis',\n 0.25\n ),\n instructionFollowing: await this.generateCriterion(\n 'Instruction Following',\n 'How well the research addresses the specific requirements of the query',\n 0.25\n ),\n readability: await this.generateCriterion(\n 'Readability',\n 'The clarity, organization, and accessibility of the research report',\n 0.25\n ),\n };\n \n // Add domain-specific criteria if applicable\n if (domain && domain !== ResearchDomain.GENERAL) {\n baseCriteria.domainSpecific = {};\n \n for (const focus of domainConfig.evaluationFocus) {\n baseCriteria.domainSpecific[focus] = await this.generateCriterion(\n focus,\n `Domain-specific evaluation of ${focus} for ${domain} research`,\n 0.2\n );\n }\n }\n \n return baseCriteria;\n }\n\n private async generateCriterion(\n name: string,\n description: string,\n weight: number\n ): Promise<CriteriaDefinition> {\n // Try to use AI model if available\n if (this.runtime.useModel) {\n try {\n const prompt = `Generate a detailed evaluation rubric for the following criterion:\nName: ${name}\nDescription: ${description}\n\nCreate a 5-point rubric (0-4) with specific descriptions for each score level.\nFormat:\n0: [Description of failing/missing]\n1: [Description of poor/minimal]\n2: [Description of adequate/satisfactory]\n3: [Description of good/strong]\n4: [Description of excellent/exceptional]`;\n\n const response = await this.runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [\n { \n role: 'system', \n content: 'You are an evaluation criteria expert. Generate a detailed rubric following the exact format requested.' \n },\n { role: 'user', content: prompt }\n ],\n temperature: 0.5,\n });\n\n const responseText = typeof response === 'string' ? response : (response as any).content || '';\n const rubricItems = this.parseRubric(responseText);\n \n return {\n name,\n description,\n weight,\n rubric: rubricItems,\n scoringMethod: ScoringMethod.RUBRIC,\n };\n } catch (error) {\n elizaLogger.warn('Error generating criterion with AI, using fallback:', error);\n }\n }\n \n // Fallback: Generate default rubric\n return {\n name,\n description,\n weight,\n rubric: [\n { score: 0, description: `${name} is completely missing or fails to meet any requirements` },\n { score: 1, description: `${name} shows minimal effort with significant gaps` },\n { score: 2, description: `${name} meets basic requirements but lacks depth` },\n { score: 3, description: `${name} is good with solid coverage and analysis` },\n { score: 4, description: `${name} is excellent with comprehensive and insightful treatment` }\n ],\n scoringMethod: ScoringMethod.RUBRIC,\n };\n }\n\n private parseRubric(rubricText: string): RubricItem[] {\n const items: RubricItem[] = [];\n const lines = rubricText.split('\\n');\n \n for (const line of lines) {\n const match = line.match(/^(\\d):\\s*(.+)/);\n if (match) {\n const score = parseInt(match[1]);\n const description = match[2].trim();\n items.push({ score, description });\n }\n }\n \n // Ensure we have all scores 0-4\n for (let i = 0; i <= 4; i++) {\n if (!items.find(item => item.score === i)) {\n items.push({\n score: i,\n description: `Score level ${i}`,\n });\n }\n }\n \n return items.sort((a, b) => a.score - b.score);\n }\n} ","import { IAgentRuntime, elizaLogger } from '@elizaos/core';\nimport crypto from 'crypto';\nimport { RESEARCH_PROMPTS, formatPrompt, getPromptConfig } from '../prompts/research-prompts';\nimport {\n FactualClaim,\n ResearchSource,\n VerificationStatus\n} from '../types';\n\nexport interface VerificationEvidence {\n sourceUrl: string;\n relevantExcerpt: string;\n supports: boolean;\n confidence: number;\n reasoning: string;\n}\n\nexport interface CrossReferenceResult {\n claim: FactualClaim;\n primaryEvidence: VerificationEvidence;\n corroboratingEvidence: VerificationEvidence[];\n contradictingEvidence: VerificationEvidence[];\n overallVerificationStatus: VerificationStatus;\n aggregateConfidence: number;\n consensusLevel: 'strong' | 'moderate' | 'weak' | 'disputed';\n}\n\nexport interface SourceReliability {\n domain: string;\n score: number;\n factors: {\n peerReviewed: boolean;\n authorCredentials: boolean;\n publicationReputation: number;\n citationCount: number;\n };\n}\n\n/**\n * Advanced claim verification system that actually checks sources\n */\nexport class ClaimVerifier {\n private verificationCache = new Map<string, CrossReferenceResult>();\n private sourceReliabilityCache = new Map<string, SourceReliability>();\n\n constructor(\n private runtime: IAgentRuntime,\n private contentExtractor: any\n ) {}\n\n /**\n * Verify a claim by retrieving actual source content and cross-referencing\n */\n async verifyClaim(\n claim: FactualClaim,\n primarySource: ResearchSource,\n allSources: ResearchSource[]\n ): Promise<CrossReferenceResult> {\n const cacheKey = this.generateCacheKey(claim);\n \n // Check cache first\n if (this.verificationCache.has(cacheKey)) {\n return this.verificationCache.get(cacheKey)!;\n }\n\n elizaLogger.info(`[ClaimVerifier] Verifying claim: \"${claim.statement}\"`);\n\n // Step 1: Verify against primary source\n const primaryEvidence = await this.verifyAgainstSource(claim, primarySource);\n\n // Step 2: Find corroborating sources\n const relatedSources = this.findRelatedSources(claim, allSources, primarySource);\n const corroboratingEvidence: VerificationEvidence[] = [];\n const contradictingEvidence: VerificationEvidence[] = [];\n\n // Step 3: Cross-reference with related sources\n for (const source of relatedSources) {\n const evidence = await this.verifyAgainstSource(claim, source);\n \n if (evidence.supports) {\n corroboratingEvidence.push(evidence);\n } else if (evidence.confidence > 0.6) {\n // Only count as contradicting if we're confident it contradicts\n contradictingEvidence.push(evidence);\n }\n }\n\n // Step 4: Determine overall verification status\n const result = this.aggregateVerificationResults(\n claim,\n primaryEvidence,\n corroboratingEvidence,\n contradictingEvidence\n );\n\n // Cache the result\n this.verificationCache.set(cacheKey, result);\n\n elizaLogger.info(`[ClaimVerifier] Verification complete: ${result.overallVerificationStatus} (${result.aggregateConfidence})`);\n\n return result;\n }\n\n /**\n * Verify claim against a specific source by retrieving content\n */\n private async verifyAgainstSource(\n claim: FactualClaim,\n source: ResearchSource\n ): Promise<VerificationEvidence> {\n try {\n // Get source content (from cache or fresh extraction)\n let sourceContent = source.fullContent;\n \n if (!sourceContent || sourceContent.length < 1000) {\n // Re-extract if we don't have enough content\n elizaLogger.info(`[ClaimVerifier] Extracting content from ${source.url}`);\n const extracted = await this.contentExtractor.extractContent(source.url);\n sourceContent = extracted?.content || source.snippet || '';\n }\n\n // Ensure sourceContent is defined\n if (!sourceContent) {\n sourceContent = '';\n }\n\n // Find relevant excerpt\n const relevantExcerpt = this.findRelevantExcerpt(claim.statement, sourceContent);\n\n // Use advanced prompt to verify\n const verificationPrompt = formatPrompt(RESEARCH_PROMPTS.CLAIM_VERIFICATION, {\n claim: claim.statement,\n sourceUrl: source.url,\n evidence: claim.supportingEvidence.join(' '),\n sourceContent: relevantExcerpt\n });\n\n const config = getPromptConfig('verification');\n const response = await this.runtime.useModel(config.modelType, {\n messages: [\n { \n role: 'system', \n content: 'You are a rigorous fact-checker. Be extremely strict about verification.' \n },\n { role: 'user', content: verificationPrompt }\n ],\n temperature: config.temperature,\n max_tokens: config.maxTokens || 1500,\n });\n\n const result = this.parseVerificationResponse(response);\n\n return {\n sourceUrl: source.url,\n relevantExcerpt,\n supports: result.status === 'VERIFIED' || result.status === 'PARTIAL',\n confidence: result.confidence,\n reasoning: result.reasoning\n };\n\n } catch (error) {\n elizaLogger.error(`[ClaimVerifier] Error verifying against ${source.url}:`, error);\n return {\n sourceUrl: source.url,\n relevantExcerpt: '',\n supports: false,\n confidence: 0,\n reasoning: 'Failed to verify due to extraction error'\n };\n }\n }\n\n /**\n * Find the most relevant excerpt from source content\n */\n private findRelevantExcerpt(claim: string, content: string): string {\n const claimTerms = claim.toLowerCase().split(/\\s+/).filter(term => term.length > 3);\n const sentences = content.split(/[.!?]+/);\n \n // Score each sentence by term overlap\n const scoredSentences = sentences.map(sentence => {\n const sentenceLower = sentence.toLowerCase();\n const termMatches = claimTerms.filter(term => sentenceLower.includes(term)).length;\n const score = termMatches / claimTerms.length;\n return { sentence, score };\n });\n\n // Sort by relevance\n scoredSentences.sort((a, b) => b.score - a.score);\n\n // Take top 5 most relevant sentences and their context\n const relevantSentences = scoredSentences.slice(0, 5);\n \n // Build excerpt with context\n let excerpt = '';\n for (const { sentence } of relevantSentences) {\n const sentenceIndex = sentences.indexOf(sentence);\n const contextStart = Math.max(0, sentenceIndex - 1);\n const contextEnd = Math.min(sentences.length - 1, sentenceIndex + 1);\n \n const contextualExcerpt = sentences.slice(contextStart, contextEnd + 1).join('. ');\n if (!excerpt.includes(contextualExcerpt)) {\n excerpt += contextualExcerpt + '\\n\\n[...]\\n\\n';\n }\n }\n\n return excerpt.substring(0, 5000); // Limit to 5k chars\n }\n\n /**\n * Find sources that might corroborate or contradict the claim\n */\n private findRelatedSources(\n claim: FactualClaim,\n allSources: ResearchSource[],\n excludeSource: ResearchSource\n ): ResearchSource[] {\n // Extract key entities and concepts from claim\n const claimTerms = this.extractKeyTerms(claim.statement);\n \n return allSources\n .filter(source => source.id !== excludeSource.id)\n .map(source => {\n // Score relevance based on term overlap\n const sourceText = (source.title + ' ' + source.snippet).toLowerCase();\n const matchCount = claimTerms.filter(term => sourceText.includes(term.toLowerCase())).length;\n const relevanceScore = matchCount / claimTerms.length;\n \n return { source, relevanceScore };\n })\n .filter(item => item.relevanceScore > 0.3)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, 5) // Top 5 most relevant\n .map(item => item.source);\n }\n\n /**\n * Extract key terms from a claim for matching\n */\n private extractKeyTerms(claim: string): string[] {\n // Remove common words and extract significant terms\n const stopWords = new Set(['the', 'is', 'at', 'which', 'on', 'and', 'a', 'an', 'as', 'are', 'was', 'were', 'been', 'be', 'have', 'has', 'had', 'that', 'with', 'for', 'of', 'in', 'to']);\n \n return claim\n .split(/\\s+/)\n .map(word => word.toLowerCase().replace(/[^a-z0-9]/g, ''))\n .filter(word => word.length > 3 && !stopWords.has(word));\n }\n\n /**\n * Parse LLM verification response\n */\n private parseVerificationResponse(response: any): {\n status: string;\n confidence: number;\n reasoning: string;\n } {\n try {\n const content = typeof response === 'string' ? response : response.content || '';\n \n // Try to parse as JSON first\n if (content.includes('{') && content.includes('}')) {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n return {\n status: parsed.status || 'UNVERIFIED',\n confidence: parsed.confidence || 0,\n reasoning: parsed.reasoning || parsed.justification || ''\n };\n }\n }\n \n // Fallback: Extract from text\n const statusMatch = content.match(/Status:\\s*(VERIFIED|PARTIALLY_VERIFIED|UNVERIFIED|CONTRADICTED)/i);\n const confidenceMatch = content.match(/Confidence:\\s*([0-9.]+)/i);\n \n return {\n status: statusMatch?.[1] || 'UNVERIFIED',\n confidence: confidenceMatch ? parseFloat(confidenceMatch[1]) : 0,\n reasoning: content\n };\n } catch (error) {\n elizaLogger.error('[ClaimVerifier] Error parsing verification response:', error);\n return {\n status: 'UNVERIFIED',\n confidence: 0,\n reasoning: 'Failed to parse verification response'\n };\n }\n }\n\n /**\n * Aggregate verification results from multiple sources\n */\n private aggregateVerificationResults(\n claim: FactualClaim,\n primaryEvidence: VerificationEvidence,\n corroboratingEvidence: VerificationEvidence[],\n contradictingEvidence: VerificationEvidence[]\n ): CrossReferenceResult {\n // Calculate aggregate confidence\n const supportingEvidence = primaryEvidence.supports \n ? [primaryEvidence, ...corroboratingEvidence]\n : corroboratingEvidence;\n \n const totalSupporting = supportingEvidence.length;\n const totalContradicting = contradictingEvidence.length;\n const totalEvidence = totalSupporting + totalContradicting;\n\n // Weighted confidence calculation\n let aggregateConfidence = 0;\n if (totalEvidence > 0) {\n const supportWeight = supportingEvidence.reduce((sum, e) => sum + e.confidence, 0);\n const contradictWeight = contradictingEvidence.reduce((sum, e) => sum + e.confidence, 0);\n \n aggregateConfidence = (supportWeight - contradictWeight * 0.5) / totalEvidence;\n aggregateConfidence = Math.max(0, Math.min(1, aggregateConfidence));\n }\n\n // Determine verification status\n let overallStatus: VerificationStatus;\n let consensusLevel: 'strong' | 'moderate' | 'weak' | 'disputed';\n\n if (totalContradicting > totalSupporting) {\n overallStatus = VerificationStatus.DISPUTED;\n consensusLevel = 'disputed';\n } else if (totalSupporting === 0) {\n overallStatus = VerificationStatus.UNVERIFIED;\n consensusLevel = 'weak';\n } else if (totalContradicting === 0 && totalSupporting >= 2) {\n overallStatus = VerificationStatus.VERIFIED;\n consensusLevel = 'strong';\n } else if (totalSupporting > totalContradicting) {\n overallStatus = VerificationStatus.PARTIAL;\n consensusLevel = totalContradicting > 0 ? 'moderate' : 'weak';\n } else {\n overallStatus = VerificationStatus.UNVERIFIED;\n consensusLevel = 'weak';\n }\n\n return {\n claim,\n primaryEvidence,\n corroboratingEvidence,\n contradictingEvidence,\n overallVerificationStatus: overallStatus,\n aggregateConfidence,\n consensusLevel\n };\n }\n\n /**\n * Generate cache key for claim\n */\n private generateCacheKey(claim: FactualClaim): string {\n return crypto\n .createHash('md5')\n .update(claim.statement + claim.sourceUrls.join(','))\n .digest('hex');\n }\n\n /**\n * Batch verify multiple claims efficiently\n */\n async batchVerifyClaims(\n claims: Array<{\n claim: FactualClaim;\n primarySource: ResearchSource;\n }>,\n allSources: ResearchSource[]\n ): Promise<CrossReferenceResult[]> {\n elizaLogger.info(`[ClaimVerifier] Batch verifying ${claims.length} claims`);\n\n // Process in parallel with rate limiting\n const batchSize = 5;\n const results: CrossReferenceResult[] = [];\n\n for (let i = 0; i < claims.length; i += batchSize) {\n const batch = claims.slice(i, i + batchSize);\n const batchResults = await Promise.all(\n batch.map(({ claim, primarySource }) => \n this.verifyClaim(claim, primarySource, allSources)\n )\n );\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Get verification summary statistics\n */\n getVerificationStats(results: CrossReferenceResult[]): {\n verified: number;\n partiallyVerified: number;\n unverified: number;\n disputed: number;\n averageConfidence: number;\n strongConsensus: number;\n } {\n const stats = {\n verified: 0,\n partiallyVerified: 0,\n unverified: 0,\n disputed: 0,\n totalConfidence: 0,\n strongConsensus: 0,\n };\n\n for (const result of results) {\n switch (result.overallVerificationStatus) {\n case VerificationStatus.VERIFIED:\n stats.verified++;\n break;\n case VerificationStatus.PARTIAL:\n stats.partiallyVerified++;\n break;\n case VerificationStatus.UNVERIFIED:\n stats.unverified++;\n break;\n case VerificationStatus.DISPUTED:\n stats.disputed++;\n break;\n }\n\n stats.totalConfidence += result.aggregateConfidence;\n if (result.consensusLevel === 'strong') {\n stats.strongConsensus++;\n }\n }\n\n return {\n verified: stats.verified,\n partiallyVerified: stats.partiallyVerified,\n unverified: stats.unverified,\n disputed: stats.disputed,\n averageConfidence: results.length > 0 ? stats.totalConfidence / results.length : 0,\n strongConsensus: stats.strongConsensus,\n };\n }\n} ","import { ModelType } from '@elizaos/core';\n\n/**\n * Advanced prompt templates for deep research\n * These prompts are designed to elicit comprehensive, evidence-based responses\n */\n\nexport const RESEARCH_PROMPTS = {\n /**\n * Query Analysis - Extract deep understanding of research intent\n */\n QUERY_ANALYSIS: `Analyze this research query with academic rigor:\n\nQuery: \"{query}\"\n\nProvide a comprehensive analysis including:\n\n1. PRIMARY RESEARCH QUESTION\n - Core inquiry (what is being asked)\n - Implicit assumptions\n - Scope boundaries\n \n2. KEY CONCEPTS & ENTITIES\n - Primary concepts (with definitions)\n - Secondary concepts\n - Named entities (people, organizations, places)\n - Technical terms requiring clarification\n\n3. RESEARCH DIMENSIONS\n - Temporal scope (historical/current/predictive)\n - Geographic scope\n - Disciplinary lens\n - Theoretical vs. practical focus\n \n4. METHODOLOGICAL REQUIREMENTS\n - Type of evidence needed (empirical/theoretical/mixed)\n - Required data types (quantitative/qualitative)\n - Appropriate research methods\n \n5. POTENTIAL BIASES & LIMITATIONS\n - Query biases to be aware of\n - Potential blind spots\n - Alternative framings to consider\n\n6. SUCCESS CRITERIA\n - What constitutes a complete answer\n - Required depth of analysis\n - Expected deliverables\n\nFormat as structured JSON with all sections.`,\n\n /**\n * Sub-query Generation - Create comprehensive search strategy\n */\n SUB_QUERY_GENERATION: `Generate a comprehensive search strategy for this research:\n\nMain Query: \"{query}\"\nDomain: {domain}\nTask Type: {taskType}\nTemporal Focus: {temporalFocus}\n\nCreate 7-10 highly specific sub-queries that:\n1. Cover all aspects of the main query\n2. Target different types of sources (academic, industry, government)\n3. Include methodological variations\n4. Address potential counter-arguments\n5. Seek quantitative data and statistics\n6. Find case studies and real-world examples\n7. Identify theoretical frameworks\n8. Explore historical context\n9. Investigate future implications\n\nFor EACH sub-query provide:\n- QUERY: The exact search query (optimized for search engines)\n- PURPOSE: Why this query is essential (2-3 sentences)\n- EXPECTED_SOURCES: Types of sources likely to have this information\n- KEYWORDS: Additional keywords and synonyms\n- PRIORITY: critical/high/medium/low\n- DEPENDENCIES: Other queries that must be completed first\n- VERIFICATION_NEEDS: What claims will need fact-checking\n\nUse advanced search operators where appropriate (site:, filetype:, intitle:, etc.)`,\n\n /**\n * Finding Extraction - Deep content analysis\n */\n FINDING_EXTRACTION: `Extract comprehensive research findings from this source:\n\nSource: {title} ({url})\nOriginal Query: \"{query}\"\nContent Length: {contentLength} characters\n\nContent:\n{content}\n\nExtract ALL significant findings following this structure:\n\nFor EACH finding:\n1. CORE CLAIM\n - Main assertion (precise statement)\n - Supporting evidence (quotes with context)\n - Confidence level (0-1) with justification\n \n2. CONTEXT & NUANCE\n - Conditions under which claim holds\n - Exceptions or limitations mentioned\n - Conflicting viewpoints presented\n \n3. METHODOLOGY (if applicable)\n - How was this finding derived?\n - Sample size/data sources\n - Statistical significance\n - Potential methodological weaknesses\n \n4. CONNECTIONS\n - How this relates to the main research query\n - Connections to other findings\n - Implications for further research\n \n5. VERIFICATION REQUIREMENTS\n - What needs to be cross-checked\n - Other sources that might confirm/refute\n - Data that should be verified\n\nExtract 5-15 findings, prioritizing:\n- Direct answers to research question\n- Surprising or counterintuitive insights \n- Methodologically robust claims\n- Recent developments\n- Quantitative data\n- Expert opinions with credentials\n\nFormat as JSON array with all fields populated.`,\n\n /**\n * Category Synthesis - Deep thematic analysis\n */\n CATEGORY_SYNTHESIS: `Synthesize findings within this thematic category:\n\nCategory: {category}\nOriginal Query: \"{query}\"\nNumber of Findings: {findingCount}\n\nFindings:\n{findings}\n\nCreate a comprehensive synthesis (1000-1500 words) that:\n\n1. THEMATIC OVERVIEW\n - Define the category's scope\n - Explain relevance to research question\n - Identify major themes and sub-themes\n\n2. EVIDENCE INTEGRATION\n - Synthesize findings into coherent narrative\n - Identify patterns across sources\n - Note frequency of similar claims\n - Highlight strongest evidence\n\n3. CRITICAL ANALYSIS\n - Evaluate quality of evidence\n - Identify methodological strengths/weaknesses\n - Discuss conflicting findings\n - Assess generalizability\n\n4. THEORETICAL FRAMEWORK\n - Connect to established theories\n - Identify new theoretical contributions\n - Discuss paradigm shifts\n\n5. GAPS & LIMITATIONS\n - What questions remain unanswered\n - Methodological gaps in literature\n - Geographic/demographic blind spots\n - Temporal limitations\n\n6. PRACTICAL IMPLICATIONS\n - Real-world applications\n - Policy recommendations\n - Industry implications\n - Future research directions\n\nUse academic writing style with:\n- Topic sentences for each paragraph\n- Evidence-based arguments\n- Balanced perspective\n- Clear transitions\n- Precise language`,\n\n /**\n * Report Enhancement - Second pass deep dive\n */\n REPORT_ENHANCEMENT: `Enhance this research section using detailed source analysis:\n\nSection: {sectionTitle}\nOriginal Content ({originalLength} words):\n{originalContent}\n\nTop 10 Source Excerpts (50,000 characters total):\n{detailedSources}\n\nYour task is to create a dramatically improved section (1500-2000 words) that:\n\n1. DEPTH ENHANCEMENT\n - Add specific examples from sources\n - Include relevant statistics and data\n - Cite exact studies with methodologies\n - Add historical context\n - Include expert quotes with credentials\n\n2. ANALYTICAL RIGOR\n - Compare conflicting viewpoints\n - Evaluate strength of different arguments\n - Discuss methodological approaches\n - Identify consensus vs. debate areas\n - Address potential biases\n\n3. EVIDENCE INTEGRATION\n - Weave source material naturally\n - Use variety of integration techniques\n - Balance paraphrasing and direct quotes\n - Maintain clear attribution\n - Build arguments progressively\n\n4. CRITICAL INSIGHTS\n - Identify patterns not obvious in sources\n - Make connections between disparate findings\n - Propose new interpretations\n - Highlight surprising discoveries\n - Challenge conventional wisdom where warranted\n\n5. SCHOLARLY APPARATUS\n - Use proper academic citations\n - Include footnotes for tangential points\n - Define technical terms\n - Provide context for specialized knowledge\n - Acknowledge limitations\n\nMaintain sophisticated academic tone while ensuring clarity. Every major claim must be supported by evidence from the provided sources.`,\n\n /**\n * Verification Check - Fact verification system\n */\n CLAIM_VERIFICATION: `Verify this factual claim against source evidence:\n\nClaim: \"{claim}\"\nClaimed Source: {sourceUrl}\nSupporting Evidence Provided: \"{evidence}\"\n\nSource Content (relevant excerpt):\n{sourceContent}\n\nPerform rigorous verification:\n\n1. EXACT MATCH ANALYSIS\n - Does the source contain this exact claim? (quote if yes)\n - Is the claim a reasonable interpretation? (explain)\n - Are there qualifiers in source not in claim?\n \n2. CONTEXT EVALUATION \n - What is the broader context in the source?\n - Could the claim be misleading out of context?\n - Are there contradicting statements nearby?\n \n3. PRECISION CHECK\n - Are numbers/dates/names exactly correct?\n - Is the scope accurately represented?\n - Are correlations presented as causations?\n \n4. SOURCE CREDIBILITY\n - Is this a primary or secondary source?\n - What are the author's credentials?\n - Is this peer-reviewed/officially published?\n - Are there potential conflicts of interest?\n \n5. VERIFICATION RESULT\n - Status: VERIFIED/PARTIALLY_VERIFIED/UNVERIFIED/CONTRADICTED\n - Confidence: 0-1 with detailed justification\n - Corrections needed (if any)\n - Additional sources needed for confirmation\n\nBe extremely rigorous - default to \"unverified\" unless evidence is clear.`,\n\n /**\n * Gap Analysis - Identify research gaps\n */\n GAP_ANALYSIS: `Analyze research completeness and identify gaps:\n\nOriginal Query: \"{query}\"\nResearch Summary: {researchSummary}\nCategories Covered: {categories}\nSources Analyzed: {sourceCount}\nKey Findings: {keyFindings}\n\nPerform comprehensive gap analysis:\n\n1. COVERAGE ASSESSMENT\n - Which aspects of the query are well-covered?\n - Which aspects have limited coverage?\n - What perspectives are missing?\n - Geographic/temporal gaps?\n\n2. EVIDENCE QUALITY GAPS\n - Where is evidence weak or outdated?\n - Which claims lack sufficient support?\n - Where are better methodologies needed?\n - What quantitative data is missing?\n\n3. THEORETICAL GAPS\n - Missing theoretical frameworks?\n - Unaddressed assumptions?\n - Alternative explanations not considered?\n - Interdisciplinary perspectives needed?\n\n4. PRACTICAL GAPS\n - Real-world applications not explored?\n - Implementation challenges not addressed?\n - Cost-benefit analyses missing?\n - Stakeholder perspectives absent?\n\n5. PRIORITIZED RECOMMENDATIONS\n For each gap, specify:\n - Specific searches needed\n - Types of sources to target\n - Experts to consult\n - Data to acquire\n - Estimated impact on research quality\n\nFormat as actionable gap-filling strategy.`,\n\n /**\n * Claim Extraction - Extract verifiable claims from text\n */\n CLAIM_EXTRACTION: `Extract specific, verifiable claims from the following text.\n\nText: \"{text}\"\n\nNumber of available sources: {sourceCount}\n\nExtract claims that are:\n1. SPECIFIC and factual (not vague statements)\n2. VERIFIABLE against sources\n3. IMPORTANT to the topic\n\nFor each claim, provide:\n- statement: The exact claim being made\n- confidence: Confidence level (0-1)\n- sources: URLs of sources that might support this\n- evidence: Key supporting evidence snippets\n- category: Category of the claim\n\nReturn as JSON:\n{\n \"claims\": [\n {\n \"statement\": \"specific factual claim\",\n \"confidence\": 0.8,\n \"sources\": [\"url1\", \"url2\"],\n \"evidence\": [\"supporting snippet 1\", \"supporting snippet 2\"],\n \"category\": \"category name\"\n }\n ]\n}\n\nExtract at least 5-10 key claims from the text.`,\n};\n\n/**\n * Helper function to format prompts with variables\n */\nexport function formatPrompt(template: string, variables: Record<string, any>): string {\n let formatted = template;\n for (const [key, value] of Object.entries(variables)) {\n formatted = formatted.replace(new RegExp(`{${key}}`, 'g'), String(value));\n }\n return formatted;\n}\n\n/**\n * Get prompt configuration for different research phases\n */\nexport function getPromptConfig(phase: string): {\n temperature: number;\n maxTokens: number;\n modelType: string;\n} {\n switch (phase) {\n case 'analysis':\n return {\n temperature: 0.3,\n maxTokens: 2000,\n modelType: ModelType.TEXT_LARGE,\n };\n case 'extraction':\n return {\n temperature: 0.2,\n maxTokens: 4000,\n modelType: ModelType.TEXT_LARGE,\n };\n case 'synthesis':\n return {\n temperature: 0.7,\n maxTokens: 4000,\n modelType: ModelType.TEXT_LARGE,\n };\n case 'verification':\n return {\n temperature: 0.1,\n maxTokens: 1500,\n modelType: ModelType.TEXT_LARGE,\n };\n default:\n return {\n temperature: 0.5,\n maxTokens: 2000,\n modelType: ModelType.TEXT_LARGE,\n };\n }\n} ","import {\n Provider,\n IAgentRuntime,\n Memory,\n State,\n ProviderResult,\n} from '@elizaos/core';\nimport { ResearchService } from './service';\nimport { ResearchStatus, ResearchPhase } from './types';\nimport { validateActionKeywords, validateActionRegex } from \"@elizaos/core\";\n\nexport const activeResearchProvider: Provider = {\n name: 'active_research',\n description: 'Provides information about active research projects',\n\n dynamic: true,\n relevanceKeywords: [\n \"active\",\n \"research\",\n \"activeresearchprovider\",\n \"plugin\",\n \"status\",\n \"state\",\n \"context\",\n \"info\",\n \"details\",\n \"chat\",\n \"conversation\",\n \"agent\",\n \"room\",\n \"channel\",\n ],\nasync get(runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> { const __providerKeywords = [\"active\", \"research\", \"activeresearchprovider\", \"plugin\", \"status\", \"state\", \"context\", \"info\", \"details\", \"chat\", \"conversation\", \"agent\", \"room\", \"channel\"];\n const __providerRegex = new RegExp(`\\\\b(${__providerKeywords.join(\"|\")})\\\\b`, \"i\");\n const __recentMessages = state?.recentMessagesData || [];\n const __isRelevant =\n validateActionKeywords(message, __recentMessages, __providerKeywords) ||\n validateActionRegex(message, __recentMessages, __providerRegex);\n if (!__isRelevant) {\n return { text: \"\" };\n }\n\n\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return { text: '' };\n\n const activeProjects = await researchService.getActiveProjects();\n if (activeProjects.length === 0) return { text: '' };\n\n const projectInfo = activeProjects.map(project => {\n const phaseProgress = Math.floor(\n (Object.keys(ResearchPhase).indexOf(project.phase) / (Object.keys(ResearchPhase).length - 1)) * 100\n );\n \n return `- Research on \"${project.query}\" (ID: ${project.id})\n Status: ${project.status}\n Phase: ${project.phase} (${phaseProgress}% complete)\n Findings collected: ${project.findings.length}\n Sources: ${project.sources.length}`;\n }).join('\\n\\n');\n\n return { text: `Active Research Projects:\\n${projectInfo}` };\n },\n};\n\nexport const completedResearchProvider: Provider = {\n name: 'completed_research',\n description: 'Provides information about completed research projects with reports',\n\n dynamic: true,\n relevanceKeywords: [\n \"completed\",\n \"research\",\n \"completedresearchprovider\",\n \"plugin\",\n \"status\",\n \"state\",\n \"context\",\n \"info\",\n \"details\",\n \"chat\",\n \"conversation\",\n \"agent\",\n \"room\",\n \"channel\",\n ],\nasync get(runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> { const __providerKeywords = [\"completed\", \"research\", \"completedresearchprovider\", \"plugin\", \"status\", \"state\", \"context\", \"info\", \"details\", \"chat\", \"conversation\", \"agent\", \"room\", \"channel\"];\n const __providerRegex = new RegExp(`\\\\b(${__providerKeywords.join(\"|\")})\\\\b`, \"i\");\n const __recentMessages = state?.recentMessagesData || [];\n const __isRelevant =\n validateActionKeywords(message, __recentMessages, __providerKeywords) ||\n validateActionRegex(message, __recentMessages, __providerRegex);\n if (!__isRelevant) {\n return { text: \"\" };\n }\n\n\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return { text: '' };\n\n const allProjects = await researchService.getAllProjects();\n const completedProjects = allProjects.filter(p => p.status === ResearchStatus.COMPLETED);\n \n if (completedProjects.length === 0) return { text: '' };\n\n const projectInfo = completedProjects\n .slice(-5) // Show last 5 completed projects\n .map(project => {\n const reportSummary = project.report \n ? `Report available (${project.report.sections.length} sections)`\n : 'Report generation pending';\n \n return `- \"${project.query}\" (ID: ${project.id})\n Completed: ${new Date(project.completedAt || project.updatedAt).toLocaleDateString()}\n ${reportSummary}\n Findings: ${project.findings.length}, Sources: ${project.sources.length}`;\n }).join('\\n\\n');\n\n return { text: `Recently Completed Research:\\n${projectInfo}` };\n },\n};\n\nexport const researchCapabilitiesProvider: Provider = {\n name: 'research_capabilities',\n description: 'Provides information about research service capabilities',\n\n dynamic: true,\n relevanceKeywords: [\n \"research\",\n \"capabilities\",\n \"researchcapabilitiesprovider\",\n \"plugin\",\n \"status\",\n \"state\",\n \"context\",\n \"info\",\n \"details\",\n \"chat\",\n \"conversation\",\n \"agent\",\n \"room\",\n \"channel\",\n ],\nasync get(runtime: IAgentRuntime, message: Memory, state: State): Promise<ProviderResult> { const __providerKeywords = [\"research\", \"capabilities\", \"researchcapabilitiesprovider\", \"plugin\", \"status\", \"state\", \"context\", \"info\", \"details\", \"chat\", \"conversation\", \"agent\", \"room\", \"channel\"];\n const __providerRegex = new RegExp(`\\\\b(${__providerKeywords.join(\"|\")})\\\\b`, \"i\");\n const __recentMessages = state?.recentMessagesData || [];\n const __isRelevant =\n validateActionKeywords(message, __recentMessages, __providerKeywords) ||\n validateActionRegex(message, __recentMessages, __providerRegex);\n if (!__isRelevant) {\n return { text: \"\" };\n }\n\n\n const researchService = runtime.getService<ResearchService>('research');\n \n // Always return capabilities info, even if service is not currently available\n return { text: `Research Capabilities:\n- Deep multi-phase internet research\n- Automatic source collection and verification\n- Intelligent analysis and synthesis\n- Comprehensive report generation with citations\n- Research phases: planning, searching, analyzing, synthesizing, reporting\n- Can pause and resume research projects\n- Supports multiple concurrent research projects` };\n },\n};\n\nexport const researchProviders = [\n activeResearchProvider,\n completedResearchProvider,\n researchCapabilitiesProvider,\n]; \n","import {\n Action,\n ActionExample,\n IAgentRuntime,\n Memory,\n State,\n HandlerCallback,\n ModelType,\n elizaLogger,\n} from '@elizaos/core';\nimport { ResearchService } from './service';\nimport {\n ResearchStatus,\n ResearchPhase,\n ResearchDomain,\n TaskType,\n ResearchDepth,\n ActionResult,\n ActionContext,\n ResearchProject,\n} from './types';\n\n// Helper function to extract domain from text\nasync function extractDomain(runtime: IAgentRuntime, text: string): Promise<ResearchDomain> {\n try {\n const prompt = `Analyze this text and determine the most appropriate research domain:\nText: \"${text}\"\n\nDomains: ${Object.values(ResearchDomain).join(', ')}\n\nRespond with just the domain name.`;\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n messages: [{ role: 'user', content: prompt }],\n });\n\n const domainText = (typeof response === 'string' ? response : (response as any).content || '')\n .toLowerCase()\n .trim();\n\n // Map response to enum\n for (const domain of Object.values(ResearchDomain)) {\n if (domainText.includes(domain)) {\n return domain as ResearchDomain;\n }\n }\n\n return ResearchDomain.GENERAL;\n } catch (error) {\n elizaLogger.error('Error extracting domain:', error);\n // Default to GENERAL if model call fails\n return ResearchDomain.GENERAL;\n }\n}\n\n// Helper function to extract task type\nasync function extractTaskType(runtime: IAgentRuntime, text: string): Promise<TaskType> {\n try {\n const prompt = `Analyze this research query and determine the task type:\nQuery: \"${text}\"\n\nTask Types:\n- exploratory: General exploration of a topic\n- comparative: Comparing multiple items/concepts\n- analytical: Deep analysis of a specific aspect\n- synthetic: Combining multiple perspectives\n- evaluative: Assessing or judging something\n- predictive: Forecasting or trend analysis\n\nRespond with just the task type.`;\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n messages: [{ role: 'user', content: prompt }],\n });\n\n const taskText = (typeof response === 'string' ? response : (response as any).content || '')\n .toLowerCase()\n .trim();\n\n if (taskText.includes('comparative')) return TaskType.COMPARATIVE;\n if (taskText.includes('analytical')) return TaskType.ANALYTICAL;\n if (taskText.includes('synthetic')) return TaskType.SYNTHETIC;\n if (taskText.includes('evaluative')) return TaskType.EVALUATIVE;\n if (taskText.includes('predictive')) return TaskType.PREDICTIVE;\n\n return TaskType.EXPLORATORY;\n } catch (error) {\n elizaLogger.error('Error extracting task type:', error);\n // Default to EXPLORATORY if model call fails\n return TaskType.EXPLORATORY;\n }\n}\n\n// Helper function to extract research depth\nasync function extractDepth(runtime: IAgentRuntime, text: string): Promise<ResearchDepth> {\n try {\n const prompt = `Analyze this research query and determine the appropriate depth:\nQuery: \"${text}\"\n\nDepths:\n- surface: Quick overview, basic information\n- moderate: Standard research with good coverage\n- deep: Comprehensive research with detailed analysis\n- phd-level: Expert-level research with citations and academic rigor\n\nLook for keywords like: quick, overview, detailed, comprehensive, expert, academic, thorough\n\nRespond with just the depth level.`;\n\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n messages: [{ role: 'user', content: prompt }],\n });\n\n const depthText = (typeof response === 'string' ? response : (response as any).content || '')\n .toLowerCase()\n .trim();\n\n if (depthText.includes('surface')) return ResearchDepth.SURFACE;\n if (depthText.includes('deep')) return ResearchDepth.DEEP;\n if (depthText.includes('phd')) return ResearchDepth.PHD_LEVEL;\n\n return ResearchDepth.MODERATE;\n } catch (error) {\n elizaLogger.error('Error extracting depth:', error);\n // Default to MODERATE if model call fails\n return ResearchDepth.MODERATE;\n }\n}\n\n/**\n * Start a new research project\n */\nexport const startResearchAction: Action = {\n name: 'start_research',\n description: 'Start a new deep research project on any topic across 22+ domains',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['start', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:start|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n return !!researchService && (message.content.text?.trim().length || 0) > 3;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n const query = message.content.text?.trim() || '';\n\n // Extract research parameters\n const [domain, taskType, depth] = await Promise.all([\n extractDomain(runtime, query),\n extractTaskType(runtime, query),\n extractDepth(runtime, query),\n ]);\n\n elizaLogger.info(`Starting research: domain=${domain}, type=${taskType}, depth=${depth}`);\n\n try {\n const project = await researchService.createResearchProject(query, {\n domain,\n researchDepth: depth,\n });\n\n const response = {\n text: `I've initiated a ${depth}-level ${taskType} research project in the ${domain} domain.\n\n📋 **Research Details:**\n- Query: \"${project.query}\"\n- Domain: ${domain}\n- Task Type: ${taskType}\n- Depth: ${depth}\n- Project ID: ${project.id}\n\n🔄 **Research Phases:**\n1. Planning - Developing research strategy\n2. Searching - Gathering sources\n3. Analyzing - Extracting insights\n4. Synthesizing - Connecting findings\n5. Evaluating - Quality assessment\n6. Reporting - Creating comprehensive report\n\nThe research will follow DeepResearch Bench standards for quality. I'll notify you when complete.`,\n metadata: {\n projectId: project.id,\n project,\n action: 'start_research',\n },\n };\n\n if (callback) {\n await callback(response);\n }\n\n return {\n success: true,\n data: project,\n nextActions: ['check_research_status', 'refine_research_query', 'pause_research'],\n metadata: {\n projectId: project.id,\n domain,\n taskType,\n depth,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to start research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['start_research'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Research the impact of quantum computing on cryptography with academic rigor',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll start a comprehensive research project on quantum computing's impact on cryptography.\",\n action: 'start_research',\n },\n },\n ],\n [\n {\n name: '{{user}}',\n content: {\n text: 'Give me a quick overview of sustainable urban transportation solutions',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll conduct a surface-level exploratory research on sustainable urban transportation.\",\n action: 'start_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Check research status\n */\nexport const checkResearchStatusAction: Action = {\n name: 'check_research_status',\n description: 'Check the status and progress of research projects',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['check', 'research', 'status'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:check|research|status)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n return !!researchService;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n // Check if a specific project ID is mentioned\n const projectIdMatch = message.content.text?.match(/project[:\\s]+([a-zA-Z0-9-]+)/i);\n let projects: any[] = [];\n\n if (projectIdMatch) {\n const project = await researchService.getProject(projectIdMatch[1]);\n if (project) projects = [project];\n } else {\n // Get all active projects\n projects = await researchService.getActiveProjects();\n\n // If no active, get recent completed\n if (projects.length === 0) {\n const allProjects = await researchService.getAllProjects();\n projects = allProjects.slice(-3); // Last 3 projects\n }\n }\n\n if (projects.length === 0) {\n const response = {\n text: 'No research projects found. Would you like to start a new research project?',\n metadata: { status: 'no_projects' },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: { projects: [] },\n nextActions: ['start_research'],\n metadata: { count: 0 },\n };\n }\n\n // Format status report\n const statusReports = projects\n .map((project) => {\n const phaseProgress =\n Object.values(ResearchPhase).indexOf(project.phase) /\n (Object.values(ResearchPhase).length - 1);\n const percentComplete = Math.round(phaseProgress * 100);\n\n return `📊 **${project.query}**\n- Status: ${project.status} (${percentComplete}% complete)\n- Phase: ${project.phase}\n- Domain: ${project.metadata.domain}\n- Sources: ${project.sources.length} collected\n- Findings: ${project.findings.length} extracted\n- Started: ${new Date(project.createdAt).toLocaleString()}`;\n })\n .join('\\n\\n');\n\n const response = {\n text: `# Research Status Report\\n\\n${statusReports}`,\n metadata: { projects },\n };\n\n if (callback) await callback(response);\n\n // Determine next actions based on project states\n const hasActive = projects.some((p) => p.status === ResearchStatus.ACTIVE);\n const hasCompleted = projects.some((p) => p.status === ResearchStatus.COMPLETED);\n\n const nextActions = [];\n if (hasActive) {\n nextActions.push('pause_research', 'refine_research_query');\n }\n if (hasCompleted) {\n nextActions.push('get_research_report', 'evaluate_research', 'export_research');\n }\n nextActions.push('start_research');\n\n return {\n success: true,\n data: { projects },\n nextActions,\n metadata: {\n activeCount: projects.filter((p) => p.status === ResearchStatus.ACTIVE).length,\n completedCount: projects.filter((p) => p.status === ResearchStatus.COMPLETED).length,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to check research status:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['start_research'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: \"What's the status of my research projects?\",\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll check the status of your research projects.\",\n action: 'check_research_status',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Refine research query\n */\nexport const refineResearchQueryAction: Action = {\n name: 'refine_research_query',\n description: 'Refine or expand the research query based on findings',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['refine', 'research', 'query'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:refine|research|query)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const activeProjects = await researchService.getActiveProjects();\n return activeProjects.length > 0;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const activeProjects = await researchService.getActiveProjects();\n if (activeProjects.length === 0) {\n return {\n success: false,\n error: 'No active research projects to refine',\n nextActions: ['start_research'],\n metadata: {},\n };\n }\n\n const project = activeProjects[activeProjects.length - 1];\n\n // Extract refinement direction from message\n const refinementPrompt = `Analyze this refinement request for the research query \"${project.query}\":\nUser request: \"${message.content.text || ''}\"\n\nDetermine:\n1. Refinement type (narrow/broaden/pivot/deepen)\n2. New focus areas (2-3 specific areas)\n3. Additional queries (2-3 refined queries)\n\nRespond with JSON:\n{\n \"refinementType\": \"type\",\n \"focusAreas\": [\"area1\", \"area2\"],\n \"queries\": [\"query1\", \"query2\"]\n}`;\n\n const response = await runtime.useModel(ModelType.TEXT_LARGE, {\n messages: [{ role: 'user', content: refinementPrompt }],\n });\n\n let refinement;\n try {\n const content = typeof response === 'string' ? response : (response as any).content || '';\n refinement = JSON.parse(content);\n } catch (e) {\n refinement = {\n refinementType: 'deepen',\n focusAreas: ['specific aspects', 'detailed analysis'],\n queries: [`${project.query} detailed analysis`, `${project.query} case studies`],\n };\n }\n\n // Add refined queries to the project\n await researchService.addRefinedQueries(project.id, refinement.queries);\n\n const responseText = {\n text: `I've refined the research focus for your project.\n\n🎯 **Refinement Applied:**\n- Type: ${refinement.refinementType}\n- New Focus Areas: ${refinement.focusAreas.join(', ')}\n\n📝 **Additional Queries:**\n${refinement.queries.map((q: string, i: number) => `${i + 1}. ${q}`).join('\\n')}\n\nThe research will now explore these refined aspects while maintaining the original scope.`,\n metadata: { project, refinement },\n };\n\n if (callback) await callback(responseText);\n\n return {\n success: true,\n data: { project, refinement },\n nextActions: ['check_research_status', 'get_research_report'],\n metadata: {\n projectId: project.id,\n refinementType: refinement.refinementType,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to refine research query:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Focus more on the security implications and recent breakthroughs',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll refine the research to focus on security implications and recent breakthroughs.\",\n action: 'refine_research_query',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Get research report\n */\nexport const getResearchReportAction: Action = {\n name: 'get_research_report',\n description: 'Get the comprehensive research report with citations',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['get', 'research', 'report'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:get|research|report)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const projects = await researchService.getAllProjects();\n return projects.some((p: ResearchProject) => p.status === ResearchStatus.COMPLETED);\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const allProjects = await researchService.getAllProjects();\n const completedProjects = allProjects.filter((p: ResearchProject) => p.status === ResearchStatus.COMPLETED);\n\n if (completedProjects.length === 0) {\n return {\n success: false,\n error: 'No completed research projects found',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n const project = completedProjects[completedProjects.length - 1];\n if (!project.report) {\n return {\n success: false,\n error: 'Report generation in progress, please try again shortly',\n nextActions: ['check_research_status'],\n metadata: { projectId: project.id },\n };\n }\n\n // Format the report\n let reportText = `# ${project.report.title}\\n\\n`;\n reportText += `**Generated:** ${new Date(project.report.generatedAt).toLocaleString()}\\n`;\n reportText += `**Domain:** ${project.metadata.domain}\\n`;\n reportText += `**Word Count:** ${project.report.wordCount.toLocaleString()}\\n`;\n reportText += `**Reading Time:** ${project.report.readingTime} minutes\\n\\n`;\n\n // Add evaluation scores if available\n if (project.report.evaluationMetrics) {\n const race = project.report.evaluationMetrics.raceScore;\n const fact = project.report.evaluationMetrics.factScore;\n\n reportText += `## Quality Metrics\\n`;\n reportText += `**RACE Score:** ${(race.overall * 100).toFixed(1)}%\\n`;\n reportText += `**FACT Score:** ${(fact.citationAccuracy * 100).toFixed(1)}% accuracy\\n\\n`;\n }\n\n reportText += `## Executive Summary\\n\\n${project.report.summary}\\n\\n`;\n\n // Add sections\n for (const section of project.report.sections) {\n reportText += `## ${section.heading}\\n\\n`;\n reportText += `${section.content}\\n\\n`;\n\n if (section.subsections) {\n for (const subsection of section.subsections) {\n reportText += `### ${subsection.heading}\\n\\n`;\n reportText += `${subsection.content}\\n\\n`;\n }\n }\n }\n\n // Add references\n reportText += `## References (${project.report.citations.length})\\n\\n`;\n const bibliography = project.report.bibliography || [];\n bibliography.forEach((entry: any, idx: number) => {\n reportText += `${idx + 1}. ${entry.citation}\\n`;\n });\n\n const response = {\n text: reportText,\n metadata: { project, report: project.report },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: { project, report: project.report },\n nextActions: ['evaluate_research', 'export_research', 'compare_research', 'start_research'],\n metadata: {\n projectId: project.id,\n wordCount: project.report.wordCount,\n citationCount: project.report.citations.length,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to get research report:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Show me the research report',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll retrieve the comprehensive research report for you.\",\n action: 'get_research_report',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Evaluate research quality\n */\nexport const evaluateResearchAction: Action = {\n name: 'evaluate_research',\n description: 'Evaluate research quality using RACE and FACT frameworks',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['evaluate', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:evaluate|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const projects = await researchService.getAllProjects();\n return projects.some((p: ResearchProject) => p.status === ResearchStatus.COMPLETED && p.report);\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const allProjects = await researchService.getAllProjects();\n const evaluableProjects = allProjects.filter(\n (p: ResearchProject) => p.status === ResearchStatus.COMPLETED && p.report && !p.evaluationResults\n );\n\n if (evaluableProjects.length === 0) {\n const alreadyEvaluated = allProjects.filter((p: ResearchProject) => p.evaluationResults);\n if (alreadyEvaluated.length > 0) {\n const project = alreadyEvaluated[alreadyEvaluated.length - 1];\n const evaluation = project.evaluationResults!;\n\n const response = {\n text: `This research has already been evaluated:\n\n**Overall Score:** ${(evaluation.overallScore * 100).toFixed(1)}%\n\n**RACE Scores:**\n- Comprehensiveness: ${(evaluation.raceEvaluation.scores.comprehensiveness * 100).toFixed(1)}%\n- Depth: ${(evaluation.raceEvaluation.scores.depth * 100).toFixed(1)}%\n- Instruction Following: ${(evaluation.raceEvaluation.scores.instructionFollowing * 100).toFixed(1)}%\n- Readability: ${(evaluation.raceEvaluation.scores.readability * 100).toFixed(1)}%\n\n**FACT Scores:**\n- Citation Accuracy: ${(evaluation.factEvaluation.scores.citationAccuracy * 100).toFixed(1)}%\n- Effective Citations: ${evaluation.factEvaluation.scores.effectiveCitations}\n- Source Credibility: ${(evaluation.factEvaluation.scores.sourceCredibility * 100).toFixed(1)}%`,\n metadata: { evaluation },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: evaluation,\n nextActions: ['export_research', 'compare_research', 'start_research'],\n metadata: { projectId: project.id },\n };\n }\n\n return {\n success: false,\n error: 'No completed research projects available for evaluation',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n const project = evaluableProjects[0];\n elizaLogger.info(`Starting evaluation for project ${project.id}`);\n\n // Run evaluation\n const evaluation = await researchService.evaluateProject(project.id);\n\n const response = {\n text: `# Research Evaluation Complete\n\n**Overall Score:** ${(evaluation.overallScore * 100).toFixed(1)}%\n\n## RACE Evaluation (Research Quality)\n- **Comprehensiveness:** ${(evaluation.raceEvaluation.scores.comprehensiveness * 100).toFixed(1)}%\n- **Depth:** ${(evaluation.raceEvaluation.scores.depth * 100).toFixed(1)}%\n- **Instruction Following:** ${(evaluation.raceEvaluation.scores.instructionFollowing * 100).toFixed(1)}%\n- **Readability:** ${(evaluation.raceEvaluation.scores.readability * 100).toFixed(1)}%\n\n## FACT Evaluation (Citation Quality)\n- **Citation Accuracy:** ${(evaluation.factEvaluation.scores.citationAccuracy * 100).toFixed(1)}%\n- **Verified Citations:** ${evaluation.factEvaluation.scores.verifiedCitations}/${evaluation.factEvaluation.scores.totalCitations}\n- **Source Credibility:** ${(evaluation.factEvaluation.scores.sourceCredibility * 100).toFixed(1)}%\n\n## Recommendations\n${evaluation.recommendations.map((r: string, i: number) => `${i + 1}. ${r}`).join('\\n')}`,\n metadata: { project, evaluation },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: evaluation,\n nextActions: ['export_research', 'compare_research', 'start_research'],\n metadata: {\n projectId: project.id,\n overallScore: evaluation.overallScore,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to evaluate research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['get_research_report'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Evaluate the quality of my research',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll evaluate your research using RACE and FACT frameworks.\",\n action: 'evaluate_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Export research in various formats\n */\nexport const exportResearchAction: Action = {\n name: 'export_research',\n description: 'Export research report in various formats including DeepResearch Bench',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['export', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:export|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const projects = await researchService.getAllProjects();\n return projects.some((p: ResearchProject) => p.status === ResearchStatus.COMPLETED && p.report);\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n // Extract format from message\n const formatMatch = message.content.text?.match(\n /\\b(json|markdown|deepresearch|pdf|latex|docx)\\b/i\n );\n const format = (formatMatch?.[1]?.toLowerCase() || 'markdown') as any;\n\n const allProjects = await researchService.getAllProjects();\n const exportableProjects = allProjects.filter(\n (p: ResearchProject) => p.status === ResearchStatus.COMPLETED && p.report\n );\n\n if (exportableProjects.length === 0) {\n return {\n success: false,\n error: 'No completed research projects available for export',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n const project = exportableProjects[exportableProjects.length - 1];\n const exported = await researchService.exportProject(project.id, format);\n\n let responseText = `Research exported successfully in ${format.toUpperCase()} format.\\n\\n`;\n\n if (format === 'deepresearch') {\n responseText += `**DeepResearch Bench Format:**\n- ID: ${project.id}\n- Domain: ${project.metadata.domain}\n- Task Type: ${project.metadata.taskType}\n- Ready for submission to DeepResearch Bench evaluation\\n\\n`;\n }\n\n // For text formats, include a preview\n if (['json', 'markdown'].includes(format)) {\n const preview = exported.substring(0, 500);\n responseText += `**Preview:**\\n\\`\\`\\`${format}\\n${preview}...\\n\\`\\`\\``;\n }\n\n const response = {\n text: responseText,\n metadata: {\n project,\n format,\n exported: format === 'json' || format === 'markdown' ? exported : '[Binary data]',\n },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: { format, content: exported },\n nextActions: ['compare_research', 'start_research'],\n metadata: {\n projectId: project.id,\n format,\n size: exported.length,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to export research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['get_research_report'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Export my research in DeepResearch format',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll export your research in DeepResearch Bench format.\",\n action: 'export_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Compare multiple research projects\n */\nexport const compareResearchAction: Action = {\n name: 'compare_research',\n description: 'Compare multiple research projects on similar topics',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['compare', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:compare|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const projects = await researchService.getAllProjects();\n const completedProjects = projects.filter((p: ResearchProject) => p.status === ResearchStatus.COMPLETED);\n return completedProjects.length >= 2;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const allProjects = await researchService.getAllProjects();\n const completedProjects = allProjects.filter((p: ResearchProject) => p.status === ResearchStatus.COMPLETED);\n\n if (completedProjects.length < 2) {\n return {\n success: false,\n error: 'Need at least 2 completed research projects to compare',\n nextActions: ['start_research', 'check_research_status'],\n metadata: { availableProjects: completedProjects.length },\n };\n }\n\n // Get the most recent projects or specific ones mentioned\n const projectsToCompare = completedProjects.slice(-2);\n const projectIds = projectsToCompare.map((p: ResearchProject) => p.id);\n\n const comparison = await researchService.compareProjects(projectIds);\n\n const response = {\n text: `# Research Comparison\n\n## Projects Compared:\n${projectsToCompare.map((p: ResearchProject, i: number) => `${i + 1}. **${p.query}** (${p.metadata.domain})`).join('\\n')}\n\n## Similarity Score: ${(comparison.similarity * 100).toFixed(1)}%\n\n## Key Differences:\n${comparison.differences.map((d: string, i: number) => `${i + 1}. ${d}`).join('\\n')}\n\n## Unique Insights:\n${Object.entries(comparison.uniqueInsights)\n .map(([id, insights]) => {\n const project = projectsToCompare.find((p: ResearchProject) => p.id === id);\n return `\\n**${project?.query}:**\\n${(insights as string[]).map((insight, i) => `- ${insight}`).join('\\n')}`;\n })\n .join('\\n')}\n\n## Quality Comparison:\n${comparison.qualityComparison.map((q: any) => `- ${q.metric}: ${q.comparison}`).join('\\n')}\n\n## Recommendation:\n${comparison.recommendation}`,\n metadata: { comparison, projects: projectsToCompare },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: comparison,\n nextActions: ['start_research', 'export_research'],\n metadata: {\n projectIds,\n similarity: comparison.similarity,\n },\n };\n } catch (error) {\n elizaLogger.error('Failed to compare research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Compare my recent research projects',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll compare your recent research projects for similarities and differences.\",\n action: 'compare_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Pause ongoing research\n */\nexport const pauseResearchAction: Action = {\n name: 'pause_research',\n description: 'Pause an active research project',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['pause', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:pause|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const activeProjects = await researchService.getActiveProjects();\n return activeProjects.length > 0;\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const activeProjects = await researchService.getActiveProjects();\n if (activeProjects.length === 0) {\n return {\n success: false,\n error: 'No active research projects to pause',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n const project = activeProjects[activeProjects.length - 1];\n await researchService.pauseResearch(project.id);\n\n const response = {\n text: `Research project paused successfully.\n\n**Project:** ${project.query}\n**Phase:** ${project.phase}\n**Progress:** ${project.sources.length} sources, ${project.findings.length} findings\n\nYou can resume this research at any time.`,\n metadata: { project },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: project,\n nextActions: ['resume_research', 'check_research_status'],\n metadata: { projectId: project.id },\n };\n } catch (error) {\n elizaLogger.error('Failed to pause research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Pause the current research',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll pause the active research project.\",\n action: 'pause_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Resume paused research\n */\nexport const resumeResearchAction: Action = {\n name: 'resume_research',\n description: 'Resume a paused research project',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['resume', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:resume|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const allProjects = await researchService.getAllProjects();\n return allProjects.some((p: ResearchProject) => p.status === ResearchStatus.PAUSED);\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n const allProjects = await researchService.getAllProjects();\n const pausedProjects = allProjects.filter((p: ResearchProject) => p.status === ResearchStatus.PAUSED);\n\n if (pausedProjects.length === 0) {\n return {\n success: false,\n error: 'No paused research projects to resume',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n const project = pausedProjects[pausedProjects.length - 1];\n await researchService.resumeResearch(project.id);\n\n const response = {\n text: `Research project resumed successfully.\n\n**Project:** ${project.query}\n**Resuming from:** ${project.phase}\n**Current progress:** ${project.sources.length} sources, ${project.findings.length} findings\n\nThe research will continue from where it left off.`,\n metadata: { project },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: project,\n nextActions: ['check_research_status', 'pause_research', 'refine_research_query'],\n metadata: { projectId: project.id },\n };\n } catch (error) {\n elizaLogger.error('Failed to resume research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Resume the paused research',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll resume the paused research project.\",\n action: 'resume_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n/**\n * Cancel a research project\n */\nexport const cancelResearchAction: Action = {\n name: 'cancel_research',\n description: 'Cancel an active or paused research project',\n\n validate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n \tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n \tconst __avText = __avTextRaw.toLowerCase();\n \tconst __avKeywords = ['cancel', 'research'];\n \tconst __avKeywordOk =\n \t\t__avKeywords.length > 0 &&\n \t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n \tconst __avRegex = new RegExp('\\\\b(?:cancel|research)\\\\b', 'i');\n \tconst __avRegexOk = __avRegex.test(__avText);\n \tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n \tconst __avExpectedSource = '';\n \tconst __avSourceOk = __avExpectedSource\n \t\t? __avSource === __avExpectedSource\n \t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n \tconst __avOptions = options && typeof options === 'object' ? options : {};\n \tconst __avInputOk =\n \t\t__avText.trim().length > 0 ||\n \t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n \t\tBoolean(message?.content && typeof message.content === 'object');\n\n \tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n \t\treturn false;\n \t}\n\n \tconst __avLegacyValidate = async (runtime: IAgentRuntime, message: Memory, state?: State) => {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) return false;\n\n const allProjects = await researchService.getAllProjects();\n return allProjects.some((p: ResearchProject) => \n p.status === ResearchStatus.ACTIVE || \n p.status === ResearchStatus.PAUSED ||\n p.status === ResearchStatus.PENDING\n );\n };\n \ttry {\n \t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n \t} catch {\n \t\treturn false;\n \t}\n },\n\n async handler(\n runtime: IAgentRuntime,\n message: Memory,\n state?: State,\n options?: Record<string, unknown>,\n callback?: HandlerCallback\n ): Promise<ActionResult> {\n const researchService = runtime.getService<ResearchService>('research');\n if (!researchService) {\n throw new Error('Research service not available');\n }\n\n try {\n // Check for specific project ID in message\n const projectIdMatch = message.content.text?.match(/project[:\\s]+([a-zA-Z0-9-]+)/i);\n let projectToCancel: any = null;\n\n if (projectIdMatch) {\n const projectId = projectIdMatch[1];\n projectToCancel = await researchService.getProject(projectId);\n \n if (!projectToCancel) {\n return {\n success: false,\n error: `Project ${projectId} not found`,\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n } else {\n // Get all cancellable projects\n const allProjects = await researchService.getAllProjects();\n const cancellableProjects = allProjects.filter((p: ResearchProject) => \n p.status === ResearchStatus.ACTIVE || \n p.status === ResearchStatus.PAUSED ||\n p.status === ResearchStatus.PENDING\n );\n\n if (cancellableProjects.length === 0) {\n return {\n success: false,\n error: 'No active or paused research projects to cancel',\n nextActions: ['check_research_status', 'start_research'],\n metadata: {},\n };\n }\n\n // Cancel the most recent cancellable project\n projectToCancel = cancellableProjects[cancellableProjects.length - 1];\n }\n\n // Cancel the project by setting status to FAILED\n projectToCancel.status = ResearchStatus.FAILED;\n projectToCancel.error = 'Cancelled by user';\n projectToCancel.updatedAt = Date.now();\n \n // Stop active research if running\n await researchService.pauseResearch(projectToCancel.id);\n\n const response = {\n text: `Research project cancelled successfully.\n\n**Project:** ${projectToCancel.query}\n**Status was:** ${projectToCancel.status}\n**Phase was:** ${projectToCancel.phase}\n**Progress:** ${projectToCancel.sources.length} sources collected, ${projectToCancel.findings.length} findings extracted\n\nThe project has been permanently cancelled and cannot be resumed.`,\n metadata: { project: projectToCancel },\n };\n\n if (callback) await callback(response);\n\n return {\n success: true,\n data: projectToCancel,\n nextActions: ['start_research', 'check_research_status'],\n metadata: { \n projectId: projectToCancel.id,\n cancelledFrom: projectToCancel.status \n },\n };\n } catch (error) {\n elizaLogger.error('Failed to cancel research:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n nextActions: ['check_research_status'],\n metadata: {},\n };\n }\n },\n\n examples: [\n [\n {\n name: '{{user}}',\n content: {\n text: 'Cancel the current research project',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll cancel the active research project.\",\n action: 'cancel_research',\n },\n },\n ],\n [\n {\n name: '{{user}}',\n content: {\n text: 'Cancel project: abc-123-def',\n },\n },\n {\n name: '{{assistant}}',\n content: {\n text: \"I'll cancel the specified research project.\",\n action: 'cancel_research',\n },\n },\n ],\n ] as ActionExample[][],\n};\n\n// Export all actions\nexport const researchActions = [\n startResearchAction,\n checkResearchStatusAction,\n refineResearchQueryAction,\n getResearchReportAction,\n evaluateResearchAction,\n exportResearchAction,\n compareResearchAction,\n pauseResearchAction,\n resumeResearchAction,\n cancelResearchAction,\n];\n\nexport const allResearchActions = researchActions;\n","import { IAgentRuntime, UUID } from '@elizaos/core';\nimport { v4 as uuidv4 } from 'uuid';\nimport { ResearchService } from '../service';\nimport { \n ResearchStatus, \n ResearchPhase, \n ResearchDomain,\n TaskType,\n ResearchDepth \n} from '../types';\n\n// Simplified DeepResearch Bench test queries\nconst DEEPRESEARCH_BENCH_QUERIES = [\n {\n domain: ResearchDomain.PHYSICS,\n query: \"quantum error correction surface codes\",\n expectedDepth: ResearchDepth.PHD_LEVEL,\n expectedTaskType: TaskType.ANALYTICAL\n },\n {\n domain: ResearchDomain.COMPUTER_SCIENCE,\n query: \"machine learning drug discovery comparison\",\n expectedDepth: ResearchDepth.DEEP,\n expectedTaskType: TaskType.COMPARATIVE\n }\n];\n\nexport class DeepResearchBenchSimplifiedTestSuite {\n name = 'deepresearch-bench-simplified-e2e';\n description = 'Simplified E2E tests for DeepResearch Bench without runtime.useModel dependencies';\n\n tests = [\n {\n name: 'Should create and track research projects',\n fn: async (runtime: IAgentRuntime) => {\n const service = runtime.getService('research') as ResearchService;\n \n if (!service) {\n throw new Error('Research service not available');\n }\n \n console.log(`\\n🔬 Testing Research Project Creation`);\n \n // Test 1: Create a research project with explicit metadata\n const query = DEEPRESEARCH_BENCH_QUERIES[0];\n const project = await service.createResearchProject(query.query, {\n domain: query.domain,\n researchDepth: query.expectedDepth,\n maxSearchResults: 5,\n evaluationEnabled: false, // Skip evaluation to avoid useModel calls\n // Disable features that require useModel\n maxDepth: 1,\n timeout: 30000\n });\n \n console.log(`✅ Created project: ${project.id}`);\n console.log(`📊 Query: ${project.query}`);\n console.log(`📊 Status: ${project.status}`);\n \n // Verify project creation\n if (!project.id) {\n throw new Error('Project ID not generated');\n }\n \n if (project.status !== ResearchStatus.PENDING && project.status !== ResearchStatus.ACTIVE) {\n throw new Error(`Unexpected project status: ${project.status}`);\n }\n \n // Test 2: Retrieve project\n const retrieved = await service.getProject(project.id);\n if (!retrieved) {\n throw new Error('Could not retrieve project');\n }\n \n console.log(`✅ Retrieved project successfully`);\n \n // Test 3: Get active projects\n const activeProjects = await service.getActiveProjects();\n console.log(`📊 Active projects: ${activeProjects.length}`);\n \n // Test 4: Create multiple projects\n const project2 = await service.createResearchProject(\n DEEPRESEARCH_BENCH_QUERIES[1].query,\n {\n domain: DEEPRESEARCH_BENCH_QUERIES[1].domain,\n researchDepth: DEEPRESEARCH_BENCH_QUERIES[1].expectedDepth,\n maxSearchResults: 3,\n evaluationEnabled: false\n }\n );\n \n console.log(`✅ Created second project: ${project2.id}`);\n \n // Test 5: Get all projects\n const allProjects = await service.getAllProjects();\n if (allProjects.length < 2) {\n throw new Error(`Expected at least 2 projects, got ${allProjects.length}`);\n }\n \n console.log(`✅ Total projects: ${allProjects.length}`);\n \n // Test 6: Pause and resume\n if (project.status === ResearchStatus.ACTIVE) {\n await service.pauseResearch(project.id);\n const paused = await service.getProject(project.id);\n if (paused?.status !== ResearchStatus.PAUSED) {\n throw new Error('Failed to pause research');\n }\n console.log(`✅ Paused research successfully`);\n \n await service.resumeResearch(project.id);\n const resumed = await service.getProject(project.id);\n if (resumed?.status !== ResearchStatus.ACTIVE) {\n throw new Error('Failed to resume research');\n }\n console.log(`✅ Resumed research successfully`);\n }\n \n console.log(`\\n✨ Research service basic operations test passed!`);\n }\n },\n \n {\n name: 'Should handle research metadata and configuration',\n fn: async (runtime: IAgentRuntime) => {\n const service = runtime.getService('research') as ResearchService;\n \n if (!service) {\n throw new Error('Research service not available');\n }\n \n console.log(`\\n🔬 Testing Research Metadata Handling`);\n \n // Test different research configurations\n const configs = [\n {\n query: \"compare React and Vue.js performance\",\n domain: ResearchDomain.COMPUTER_SCIENCE,\n depth: ResearchDepth.MODERATE,\n expectedTaskType: TaskType.COMPARATIVE\n },\n {\n query: \"analyze climate change impact on agriculture\",\n domain: ResearchDomain.ENVIRONMENTAL_SCIENCE,\n depth: ResearchDepth.DEEP,\n expectedTaskType: TaskType.ANALYTICAL\n },\n {\n query: \"predict cryptocurrency market trends 2025\",\n domain: ResearchDomain.FINANCE,\n depth: ResearchDepth.SURFACE,\n expectedTaskType: TaskType.PREDICTIVE\n }\n ];\n \n for (const config of configs) {\n const project = await service.createResearchProject(config.query, {\n domain: config.domain,\n researchDepth: config.depth,\n maxSearchResults: 2,\n evaluationEnabled: false\n });\n \n console.log(`\\n📋 Project: ${config.query.substring(0, 50)}...`);\n console.log(` - Domain: ${project.metadata.domain || 'auto-detected'}`);\n console.log(` - Depth: ${project.metadata.depth}`);\n console.log(` - Language: ${project.metadata.language}`);\n \n // Verify metadata\n if (project.metadata.domain && project.metadata.domain !== config.domain) {\n console.warn(` ⚠️ Domain mismatch: expected ${config.domain}, got ${project.metadata.domain}`);\n }\n \n if (project.metadata.depth !== config.depth) {\n throw new Error(`Depth mismatch: expected ${config.depth}, got ${project.metadata.depth}`);\n }\n }\n \n console.log(`\\n✨ Metadata handling test passed!`);\n }\n },\n \n {\n name: 'Should export research in different formats',\n fn: async (runtime: IAgentRuntime) => {\n const service = runtime.getService('research') as ResearchService;\n \n if (!service) {\n throw new Error('Research service not available');\n }\n \n console.log(`\\n🔬 Testing Research Export Functionality`);\n \n // Create a simple project\n const project = await service.createResearchProject(\n \"test export functionality\",\n {\n domain: ResearchDomain.GENERAL,\n researchDepth: ResearchDepth.SURFACE,\n maxSearchResults: 1,\n evaluationEnabled: false\n }\n );\n \n // Manually set project to completed state for testing\n const projectInternal = (service as any).projects.get(project.id);\n if (projectInternal) {\n projectInternal.status = ResearchStatus.COMPLETED;\n projectInternal.report = {\n title: \"Test Export Report\",\n summary: \"This is a test report for export functionality\",\n sections: [\n {\n heading: \"Introduction\",\n content: \"Test content for export\",\n subsections: []\n }\n ],\n citations: [],\n bibliography: [],\n methodology: \"Test methodology\",\n limitations: [],\n futureWork: [],\n keywords: [\"test\", \"export\"],\n generatedAt: Date.now(),\n wordCount: 100,\n readingTime: 1,\n confidence: 0.8,\n completeness: 0.9\n };\n projectInternal.findings = [\n {\n id: uuidv4(),\n content: \"Test finding\",\n source: {\n id: uuidv4(),\n url: \"https://example.com\",\n title: \"Test Source\",\n snippet: \"Test snippet\",\n relevance: 0.8,\n credibility: 0.9,\n publicationDate: new Date().toISOString(),\n type: 'web' as const,\n metadata: {}\n },\n relevance: 0.8,\n confidence: 0.9,\n category: \"test\",\n timestamp: Date.now()\n }\n ];\n }\n \n // Test different export formats\n const formats = ['json', 'markdown', 'deepresearch'] as const;\n \n for (const format of formats) {\n try {\n const exported = await service.exportProject(project.id, format);\n console.log(`✅ Exported in ${format} format - length: ${exported.length} chars`);\n \n // Verify export content\n if (format === 'json') {\n const parsed = JSON.parse(exported);\n if (!parsed.id || !parsed.query) {\n throw new Error('Invalid JSON export structure');\n }\n } else if (format === 'markdown') {\n if (!exported.includes('#') || !exported.includes('Test Export Report')) {\n throw new Error('Invalid Markdown export');\n }\n } else if (format === 'deepresearch') {\n const parsed = JSON.parse(exported);\n if (!parsed.id || !parsed.article) {\n throw new Error('Invalid DeepResearch format');\n }\n }\n } catch (error) {\n console.error(`❌ Failed to export in ${format} format:`, error);\n throw error;\n }\n }\n \n console.log(`\\n✨ Export functionality test passed!`);\n }\n }\n ];\n}\n\nexport default new DeepResearchBenchSimplifiedTestSuite();","import { Plugin } from '@elizaos/core';\nimport { ResearchService } from './service';\nimport { researchProviders } from './providers';\nimport { researchActions } from './actions';\nimport deepResearchBenchSimplifiedTests from './__tests__/deepresearch-bench-simplified.e2e.test';\n\nexport * from './types';\nexport * from './service';\nexport * from './actions';\nexport * from './providers';\nexport * from './integrations';\nexport * from './strategies/research-strategies';\nexport * from './evaluation/research-evaluator';\n\nexport const researchPlugin: Plugin = {\n name: 'research',\n description: 'PhD-level deep research across 22 domains with RACE/FACT evaluation',\n \n services: [ResearchService],\n actions: researchActions,\n providers: researchProviders,\n \n tests: [\n deepResearchBenchSimplifiedTests\n ],\n};\n\nexport default researchPlugin;\n"],"mappings":"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","names":["elizaLogger","ModelType","ResearchDomain","TaskType","ResearchDepth","ResultType","SearchApproach","TemporalFocus","ResearchStatus","ResearchPhase","VerificationStatus","SourceType","ScoringMethod","elizaLogger","elizaLogger","ModelType","elizaLogger","elizaLogger","axios","elizaLogger","z","elizaLogger","searchResults","axios","elizaLogger","z","elizaLogger","elizaLogger","elizaLogger","elizaLogger","elizaLogger","axios","axios","elizaLogger","axios","elizaLogger","axios","elizaLogger","z","axios","elizaLogger","z","elizaLogger","elizaLogger","axios","elizaLogger","ModelType","ModelType","elizaLogger","fs","path","elizaLogger","crypto","ModelType","elizaLogger","crypto","elizaLogger","ModelType","path","fs","ModelType","elizaLogger","ModelType","elizaLogger","runtime","message","state","response","project","evaluation","uuidv4","uuidv4"]}