{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/core/web-research/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAgC,KAAK,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EACX,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,0BAA0B,EAC1B,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,wBAAwB;IACxC,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAoBD,qBAAa,iBAAiB;IAC7B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAE1C,YAAY,OAAO,GAAE,wBAA6B,EAkBjD;IAEK,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYzG;IAED,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAEzD;IAED,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEpE;IAEK,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAChD,kBAAkB,EAAE,0BAA0B,CAAC;QAC/C,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,uBAAuB,EAAE,CAAC;QACrC,gBAAgB,EAAE,iBAAiB,CAAC;QACpC,yBAAyB,EAAE,OAAO,CAAC;QACnC,sBAAsB,EAAE,IAAI,CAAC;QAC7B,yBAAyB,EAAE,IAAI,CAAC;QAChC,wBAAwB,EAAE,IAAI,CAAC;QAC/B,yBAAyB,EAAE,IAAI,CAAC;QAChC,yBAAyB,EAAE,IAAI,CAAC;QAChC,OAAO,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACvC,SAAS,EAAE,oBAAoB,CAAC;KAChC,CAAC,CAgBD;CACD;AAID,wBAAgB,2BAA2B,IAAI,iBAAiB,CAG/D;AAED,wBAAgB,6BAA6B,IAAI,IAAI,CAEpD","sourcesContent":["import { loadWebResearchConfig } from \"./config.js\";\nimport { SecureWebFetcher } from \"./fetch.js\";\nimport { DeepResearchEngine } from \"./research.js\";\nimport { createSearchProviderRegistry, type WebSearchProviderRegistry } from \"./search.js\";\nimport type {\n\tDeepResearchRequest,\n\tDeepResearchResponse,\n\tWebFetchRequest,\n\tWebFetchResponse,\n\tWebResearchConfig,\n\tWebResearchTelemetry,\n\tWebSearchProviderHealth,\n\tWebSearchProviderSelection,\n\tWebSearchRequest,\n\tWebSearchResponse,\n} from \"./types.js\";\n\nexport interface WebResearchEngineOptions {\n\tconfig?: WebResearchConfig;\n\tregistry?: WebSearchProviderRegistry;\n\tfetcher?: SecureWebFetcher;\n}\n\nfunction createTelemetry(): WebResearchTelemetry {\n\treturn {\n\t\tsearches: 0,\n\t\tqueries: 0,\n\t\tresults: 0,\n\t\tdeduplicatedResults: 0,\n\t\tfallbacks: 0,\n\t\tfetches: 0,\n\t\tfetchFailures: 0,\n\t\tbytesDownloaded: 0,\n\t\tbytesExtracted: 0,\n\t\trenderFallbacks: 0,\n\t\tssrfBlocks: 0,\n\t\ttimeouts: 0,\n\t\tevidenceRecords: 0,\n\t};\n}\n\nexport class WebResearchEngine {\n\treadonly config: WebResearchConfig;\n\treadonly telemetry: WebResearchTelemetry;\n\treadonly registry: WebSearchProviderRegistry;\n\treadonly fetcher: SecureWebFetcher;\n\treadonly deepResearch: DeepResearchEngine;\n\n\tconstructor(options: WebResearchEngineOptions = {}) {\n\t\tthis.config = options.config ?? loadWebResearchConfig();\n\t\tthis.telemetry = createTelemetry();\n\t\tthis.registry =\n\t\t\toptions.registry ??\n\t\t\tcreateSearchProviderRegistry({\n\t\t\t\tbaseUrl: this.config.searxngUrl,\n\t\t\t\ttimeoutMs: this.config.searchTimeoutMs,\n\t\t\t\tmaxResults: this.config.maxSearchResults,\n\t\t\t\tuserAgent: this.config.userAgent,\n\t\t\t});\n\t\tthis.fetcher = options.fetcher ?? new SecureWebFetcher(this.config, this.telemetry);\n\t\tthis.deepResearch = new DeepResearchEngine(\n\t\t\tthis.registry,\n\t\t\tthis.config.primarySearchProvider,\n\t\t\tthis.fetcher,\n\t\t\tthis.config.research,\n\t\t);\n\t}\n\n\tasync search(request: WebSearchRequest, provider?: WebSearchProviderSelection): Promise<WebSearchResponse> {\n\t\tthis.telemetry.searches++;\n\t\tthis.telemetry.queries++;\n\t\tconst response = await this.registry.search(provider ?? this.config.primarySearchProvider, {\n\t\t\t...request,\n\t\t\tmaxResults: Math.min(request.maxResults ?? 5, this.config.maxSearchResults),\n\t\t\tsafeSearch: request.safeSearch ?? this.config.safeSearch,\n\t\t});\n\t\tthis.telemetry.results += response.results.length;\n\t\tthis.telemetry.deduplicatedResults += response.deduplicatedCount;\n\t\tif (response.fallbackFrom) this.telemetry.fallbacks++;\n\t\treturn response;\n\t}\n\n\tfetch(request: WebFetchRequest): Promise<WebFetchResponse> {\n\t\treturn this.fetcher.fetch(request);\n\t}\n\n\tresearch(request: DeepResearchRequest): Promise<DeepResearchResponse> {\n\t\treturn this.deepResearch.run(request);\n\t}\n\n\tasync diagnostics(signal?: AbortSignal): Promise<{\n\t\tconfiguredProvider: WebSearchProviderSelection;\n\t\tsearxngEndpoint: string;\n\t\tproviders: WebSearchProviderHealth[];\n\t\tfallbackProvider: \"duckduckgo-lite\";\n\t\tbrowserRenderingAvailable: boolean;\n\t\tpdfExtractionAvailable: true;\n\t\tcitationRendererAvailable: true;\n\t\tnumericVerifierAvailable: true;\n\t\ttemporalResolverAvailable: true;\n\t\tsecureFetchUsedByResearch: true;\n\t\tbudgets: WebResearchConfig[\"research\"];\n\t\ttelemetry: WebResearchTelemetry;\n\t}> {\n\t\tconst providers = await Promise.all(this.registry.list().map((provider) => provider.healthCheck(signal)));\n\t\treturn {\n\t\t\tconfiguredProvider: this.config.primarySearchProvider,\n\t\t\tsearxngEndpoint: this.config.searxngUrl,\n\t\t\tproviders,\n\t\t\tfallbackProvider: \"duckduckgo-lite\",\n\t\t\tbrowserRenderingAvailable: this.fetcher.browserAvailable,\n\t\t\tpdfExtractionAvailable: true,\n\t\t\tcitationRendererAvailable: true,\n\t\t\tnumericVerifierAvailable: true,\n\t\t\ttemporalResolverAvailable: true,\n\t\t\tsecureFetchUsedByResearch: true,\n\t\t\tbudgets: { ...this.config.research },\n\t\t\ttelemetry: { ...this.telemetry },\n\t\t};\n\t}\n}\n\nlet defaultEngine: WebResearchEngine | undefined;\n\nexport function getDefaultWebResearchEngine(): WebResearchEngine {\n\tdefaultEngine ??= new WebResearchEngine();\n\treturn defaultEngine;\n}\n\nexport function resetDefaultWebResearchEngine(): void {\n\tdefaultEngine = undefined;\n}\n"]}